From 0f51b5f0bc5ec5546ad10577b82dfdc1eceb017d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Sat, 9 Sep 2006 19:08:37 +0000 Subject: [PATCH] Implement registry handle closing notifications in ntoskrnl svn path=/trunk/; revision=24003 --- reactos/include/ddk/winddk.h | 7 ++++++- reactos/ntoskrnl/cm/regobj.c | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/reactos/include/ddk/winddk.h b/reactos/include/ddk/winddk.h index a29a81703c9..b97d6ab0664 100644 --- a/reactos/include/ddk/winddk.h +++ b/reactos/include/ddk/winddk.h @@ -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 ); diff --git a/reactos/ntoskrnl/cm/regobj.c b/reactos/ntoskrnl/cm/regobj.c index 1868c1e562c..6ed5f62ca10 100644 --- a/reactos/ntoskrnl/cm/regobj.c +++ b/reactos/ntoskrnl/cm/regobj.c @@ -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); }