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
*/
typedef
ULONG_PTR
-(*NTAPI PKIPI_BROADCAST_WORKER)(
+(NTAPI *PKIPI_BROADCAST_WORKER)(
IN ULONG_PTR Argument
);
{
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);
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);
ExReleaseResourceLite(&CmiRegistryLock);
KeLeaveCriticalRegion();
+ PostOperationInfo.Status = STATUS_SUCCESS;
+ CmiCallRegisteredCallbacks(RegNtPostKeyHandleClose, &PostOperationInfo);
}