Implement registry handle closing notifications in ntoskrnl

svn path=/trunk/; revision=24003
This commit is contained in:
Hervé Poussineau
2006-09-09 19:08:37 +00:00
parent 4246de3191
commit 0f51b5f0bc
2 changed files with 22 additions and 1 deletions
+6 -1
View 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
);
+16
View 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);
}