CmpDeleteKeyObject
VOID __stdcall CmpDeleteKeyObject(VOID *Object){
char v2;
INT64 v3;
INT64 v4;
_ETHREAD *CurrentThread;
UINT8 v6;
_CM_KEY_CONTROL_BLOCK *v7;
_HHIVE *KeyHive;
_PRIVILEGE_SET *v9;
_HHIVE *v10;
_LIST_ENTRY DeferredPostAsync;
LIST_ENTRY ThList;
_QWORD a1[2];
__int128 Argument[2];
ThList.Blink = &ThList;
v2 = 0;
ThList.Flink = &ThList;
memset(Argument, 0, sizeof(Argument));
*(_OWORD *)a1 = 0i64;
CmpInitializeDelayDerefContext(a1);
if( (*((_DWORD *)Object + 12) & 4) == 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
if( dword_140C5083C )
{
if( !ExIsResourceAcquiredSharedLite((UINT64)&CmpRegistryLock, v3, v4) )
{
*(_QWORD *)&Argument[0] = Object;
CmpCallCallBacks(RegNtKeyHandleClose, Argument, v6, RegNtPostKeyHandleClose, Object, &ThList);
if( *(_DWORD *)Object == 1803104306 && *((VOID **)Object + 9) != (char *)Object + 72 )
{
CmpFireCleanupNotifications((CM_KEY_BODY *)Object);
CmpFreeCallbackObjectContexts((CM_KEY_BODY *)Object);
}
}
}
if( *((_QWORD *)Object + 7) )
CmpTransDereferenceTransaction(*((_QWORD *)Object + 7));
DeferredPostAsync.Blink = &DeferredPostAsync;
DeferredPostAsync.Flink = &DeferredPostAsync;
CmpLockRegistry();
v7 = (_CM_KEY_CONTROL_BLOCK *)*((_QWORD *)Object + 1);
if( v7 )
{
if( *(_DWORD *)Object == 1803104306 )
{
if( *((_QWORD *)Object + 2) )
{
CmpLockKcbExclusive(*((_QWORD *)Object + 1));
CmpFlushNotify((__int64)Object, 0i64, (__int128 *)&DeferredPostAsync);
CmpUnlockKcb(v7);
}
DelistKeyBodyFromKCB((_EPROCESS *)Object, 0);
KeyHive = v7->KeyHash.KeyHive;
if( LOBYTE(KeyHive[1].Storage[1].FreeDisplay[19].Display.SizeOfBitMap) == 1 )
{
v2 = 1;
*(&KeyHive[2].Storage[1].FreeDisplay[11].Display.SizeOfBitMap
+ (_InterlockedExchangeAdd((volatile signed __int32 *)&KeyHive[2].Storage[1].FreeDisplay[11].Hint, 1u) & 0x7F)) = 16;
}
v9 = (_PRIVILEGE_SET *)*((_QWORD *)Object + 11);
if( v9 )
{
CmpKeyEnumStackFreeResumeContext(v9);
CmpDrainDelayDerefContext((UINT64 **)a1);
}
}
else
{
v10 = v7->KeyHash.KeyHive;
if( LOBYTE(v10[1].Storage[1].FreeDisplay[19].Display.SizeOfBitMap) == 1 )
{
v2 = 1;
*(&v10[2].Storage[1].FreeDisplay[11].Display.SizeOfBitMap
+ (_InterlockedExchangeAdd((volatile signed __int32 *)&v10[2].Storage[1].FreeDisplay[11].Hint, 1u) & 0x7F)) = 17;
}
}
CmpDereferenceKeyControlBlock((UINT64)v7);
}
CmpUnlockRegistry();
CmpSignalDeferredPosts(&DeferredPostAsync);
CmPostCallbackNotification(RegNtPostKeyHandleClose, 0i64, 0i64, Argument, &ThList);
if( v2 )
{
if( *((char *)Object - 21) < 0 )
CmpWaitForLateUnloadWorker();
}
KeLeaveCriticalRegion();
}
}Referenced by:
No references.