Author: hpoussin Date: Wed Aug 30 03:01:52 2006 New Revision: 23792
URL: http://svn.reactos.org/svn/reactos?rev=23792&view=rev Log: Implement RegNtPreEnumerateValueKey/RegNtPostEnumerateValueKey registry callbacks. Add missing callbacks in some paths Fix a few typos
Modified: trunk/reactos/ntoskrnl/cm/ntfunc.c
Modified: trunk/reactos/ntoskrnl/cm/ntfunc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cm/ntfunc.c?rev=23... ============================================================================== --- trunk/reactos/ntoskrnl/cm/ntfunc.c (original) +++ trunk/reactos/ntoskrnl/cm/ntfunc.c Wed Aug 30 03:01:52 2006 @@ -359,6 +359,9 @@ Status = CmiCallRegisteredCallbacks(RegNtPreCreateKey, &PreCreateKeyInfo); if (!NT_SUCCESS(Status)) { + PostCreateKeyInfo.Object = NULL; + PostCreateKeyInfo.Status = Status; + CmiCallRegisteredCallbacks(RegNtPostCreateKey, &PostCreateKeyInfo); goto Cleanup; }
@@ -612,11 +615,11 @@
PostOperationInfo.Object = (PVOID)KeyObject; DeleteKeyInfo.Object = (PVOID)KeyObject; - Status = CmiCallRegisteredCallbacks(RegNtPreSetValueKey, &DeleteKeyInfo); + Status = CmiCallRegisteredCallbacks(RegNtPreDeleteKey, &DeleteKeyInfo); if (!NT_SUCCESS(Status)) { PostOperationInfo.Status = Status; - CmiCallRegisteredCallbacks(RegNtDeleteKey, &PostOperationInfo); + CmiCallRegisteredCallbacks(RegNtPostDeleteKey, &PostOperationInfo); ObDereferenceObject(KeyObject); return Status; } @@ -728,9 +731,11 @@ EnumerateKeyInfo.Length = Length; EnumerateKeyInfo.ResultLength = ResultLength;
- Status = CmiCallRegisteredCallbacks(RegNtEnumerateKey, &EnumerateKeyInfo); - if (!NT_SUCCESS(Status)) - { + Status = CmiCallRegisteredCallbacks(RegNtPreEnumerateKey, &EnumerateKeyInfo); + if (!NT_SUCCESS(Status)) + { + PostOperationInfo.Status = Status; + CmiCallRegisteredCallbacks(RegNtPostEnumerateKey, &PostOperationInfo); ObDereferenceObject(KeyObject); return Status; } @@ -752,7 +757,7 @@ ExReleaseResourceLite(&CmiRegistryLock); KeLeaveCriticalRegion(); PostOperationInfo.Status = STATUS_NO_MORE_ENTRIES; - CmiCallRegisteredCallbacks(RegNtPostDeleteKey, &PostOperationInfo); + CmiCallRegisteredCallbacks(RegNtPostEnumerateKey, &PostOperationInfo); ObDereferenceObject(KeyObject); DPRINT("No more volatile entries\n"); return STATUS_NO_MORE_ENTRIES; @@ -990,6 +995,8 @@ PCM_KEY_VALUE ValueCell; PVOID DataCell; ULONG NameSize, DataSize; + REG_ENUMERATE_VALUE_KEY_INFORMATION EnumerateValueKeyInfo; + REG_POST_OPERATION_INFORMATION PostOperationInfo; PKEY_VALUE_BASIC_INFORMATION ValueBasicInformation; PKEY_VALUE_PARTIAL_INFORMATION ValuePartialInformation; PKEY_VALUE_FULL_INFORMATION ValueFullInformation; @@ -1017,6 +1024,23 @@ return Status; }
+ PostOperationInfo.Object = (PVOID)KeyObject; + EnumerateValueKeyInfo.Object = (PVOID)KeyObject; + EnumerateValueKeyInfo.Index = Index; + EnumerateValueKeyInfo.KeyValueInformationClass = KeyValueInformationClass; + EnumerateValueKeyInfo.KeyValueInformation = KeyValueInformation; + EnumerateValueKeyInfo.Length = Length; + EnumerateValueKeyInfo.ResultLength = ResultLength; + + Status = CmiCallRegisteredCallbacks(RegNtPreEnumerateValueKey, &EnumerateValueKeyInfo); + if (!NT_SUCCESS(Status)) + { + PostOperationInfo.Status = Status; + CmiCallRegisteredCallbacks(RegNtPostEnumerateValueKey, &PostOperationInfo); + ObDereferenceObject(KeyObject); + return Status; + } + /* Acquire hive lock */ KeEnterCriticalRegion(); ExAcquireResourceSharedLite(&CmiRegistryLock, TRUE); @@ -1038,6 +1062,8 @@ ExReleaseResourceLite(&CmiRegistryLock); KeLeaveCriticalRegion(); ObDereferenceObject(KeyObject); + PostOperationInfo.Status = Status; + CmiCallRegisteredCallbacks(RegNtPostEnumerateValueKey, &PostOperationInfo); return Status; }
@@ -1217,6 +1243,8 @@ ExReleaseResourceLite(&CmiRegistryLock); KeLeaveCriticalRegion(); ObDereferenceObject(KeyObject); + PostOperationInfo.Status = Status; + CmiCallRegisteredCallbacks(RegNtPostEnumerateValueKey, &PostOperationInfo);
return Status; } @@ -1351,6 +1379,9 @@ Status = CmiCallRegisteredCallbacks(RegNtPreOpenKey, &PreOpenKeyInfo); if (!NT_SUCCESS(Status)) { + PostOpenKeyInfo.Object = NULL; + PostOpenKeyInfo.Status = Status; + CmiCallRegisteredCallbacks (RegNtPostOpenKey, &PostOpenKeyInfo); ObpReleaseCapturedAttributes(&ObjectCreateInfo); if (ObjectName.Buffer) ObpReleaseCapturedName(&ObjectName); return Status; @@ -1475,9 +1506,11 @@ QueryKeyInfo.Length = Length; QueryKeyInfo.ResultLength = ResultLength;
- Status = CmiCallRegisteredCallbacks(RegNtQueryKey, &QueryKeyInfo); - if (!NT_SUCCESS(Status)) - { + Status = CmiCallRegisteredCallbacks(RegNtPreQueryKey, &QueryKeyInfo); + if (!NT_SUCCESS(Status)) + { + PostOperationInfo.Status = Status; + CmiCallRegisteredCallbacks(RegNtPostQueryKey, &PostOperationInfo); ObDereferenceObject(KeyObject); return Status; } @@ -1704,6 +1737,8 @@ Status = CmiCallRegisteredCallbacks(RegNtPreQueryValueKey, &QueryValueKeyInfo); if (!NT_SUCCESS(Status)) { + PostOperationInfo.Status = Status; + CmiCallRegisteredCallbacks(RegNtPostQueryValueKey, &PostOperationInfo); ObDereferenceObject(KeyObject); return Status; } @@ -1962,6 +1997,8 @@ Status = CmiCallRegisteredCallbacks(RegNtPreSetValueKey, &SetValueKeyInfo); if (!NT_SUCCESS(Status)) { + PostOperationInfo.Status = Status; + CmiCallRegisteredCallbacks(RegNtPostSetValueKey, &PostOperationInfo); ObDereferenceObject(KeyObject); return Status; } @@ -2141,6 +2178,9 @@ Status = CmiCallRegisteredCallbacks(RegNtPreDeleteValueKey, &DeleteValueKeyInfo); if (!NT_SUCCESS(Status)) { + PostOperationInfo.Object = (PVOID)KeyObject; + PostOperationInfo.Status = Status; + CmiCallRegisteredCallbacks(RegNtPostDeleteValueKey, &PostOperationInfo); ReleaseCapturedUnicodeString(&CapturedValueName, PreviousMode); Fail: @@ -2411,6 +2451,8 @@ Status = CmiCallRegisteredCallbacks(RegNtPreQueryMultipleValueKey, &QueryMultipleValueKeyInfo); if (!NT_SUCCESS(Status)) { + PostOperationInfo.Status = Status; + CmiCallRegisteredCallbacks(RegNtPostQueryMultipleValueKey, &PostOperationInfo); ObDereferenceObject(KeyObject); return Status; } @@ -2658,9 +2700,11 @@ SetInformationKeyInfo.KeySetInformation = KeyInformation; SetInformationKeyInfo.KeySetInformationLength = KeyInformationLength;
- Status = CmiCallRegisteredCallbacks(RegNtSetInformationKey, &SetInformationKeyInfo); - if (!NT_SUCCESS(Status)) - { + Status = CmiCallRegisteredCallbacks(RegNtPreSetInformationKey, &SetInformationKeyInfo); + if (!NT_SUCCESS(Status)) + { + PostOperationInfo.Status = Status; + CmiCallRegisteredCallbacks(RegNtPostSetInformationKey, &PostOperationInfo); ObDereferenceObject (KeyObject); return Status; }