Implement registry handle closing notifications in ntoskrnl
authorHervé Poussineau <hpoussin@reactos.org>
Sat, 9 Sep 2006 19:08:37 +0000 (19:08 +0000)
committerHervé Poussineau <hpoussin@reactos.org>
Sat, 9 Sep 2006 19:08:37 +0000 (19:08 +0000)
svn path=/trunk/; revision=24003

reactos/include/ddk/winddk.h
reactos/ntoskrnl/cm/regobj.c

index a29a817..b97d6ab 100644 (file)
@@ -4990,6 +4990,11 @@ typedef struct _REG_POST_OPERATION_INFORMATION
     NTSTATUS Status;
 } REG_POST_OPERATION_INFORMATION,*PREG_POST_OPERATION_INFORMATION;
 
+typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION
+{
+    PVOID Object;
+} REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION;
+
 /*
 ** Storage structures
 */
@@ -8988,7 +8993,7 @@ KeWaitForSingleObject(
 
 typedef
 ULONG_PTR
-(*NTAPI PKIPI_BROADCAST_WORKER)(
+(NTAPI *PKIPI_BROADCAST_WORKER)(
     IN ULONG_PTR Argument
 );
 
index 1868c1e..6ed5f62 100644 (file)
@@ -482,6 +482,9 @@ CmiObjectDelete(PVOID DeletedObject)
 {
   PKEY_OBJECT ParentKeyObject;
   PKEY_OBJECT KeyObject;
+  REG_KEY_HANDLE_CLOSE_INFORMATION KeyHandleCloseInfo;
+  REG_POST_OPERATION_INFORMATION PostOperationInfo;
+  NTSTATUS Status;
 
   DPRINT("Delete key object (%p)\n", DeletedObject);
 
@@ -490,6 +493,17 @@ CmiObjectDelete(PVOID DeletedObject)
 
   ObReferenceObject (ParentKeyObject);
 
+  PostOperationInfo.Object = (PVOID)KeyObject;
+  KeyHandleCloseInfo.Object = (PVOID)KeyObject;
+  Status = CmiCallRegisteredCallbacks(RegNtPreKeyHandleClose, &KeyHandleCloseInfo);
+  if (!NT_SUCCESS(Status))
+    {
+      PostOperationInfo.Status = Status;
+      CmiCallRegisteredCallbacks(RegNtPostKeyHandleClose, &PostOperationInfo);
+      ObDereferenceObject (ParentKeyObject);
+      return;
+    }
+
   /* Acquire hive lock */
   KeEnterCriticalRegion();
   ExAcquireResourceExclusiveLite(&CmiRegistryLock, TRUE);
@@ -535,6 +549,8 @@ CmiObjectDelete(PVOID DeletedObject)
 
   ExReleaseResourceLite(&CmiRegistryLock);
   KeLeaveCriticalRegion();
+  PostOperationInfo.Status = STATUS_SUCCESS;
+  CmiCallRegisteredCallbacks(RegNtPostKeyHandleClose, &PostOperationInfo);
 }