CmpCloseKeyObject
VOID __stdcall CmpCloseKeyObject(EPROCESS *Process, VOID *Object, UINT64 ProcessHandleCount, UINT64 SystemHandleCount){
__int64 v4;
_ETHREAD *CurrentThread;
__int64 v8;
UINT8 IsKeyDeletedForKeyBody;
_CM_KEY_CONTROL_BLOCK *v10;
INT64 v11;
UINT8 v12;
CM_NOTIFY_BLOCK *v13;
_EX_PUSH_LOCK *v14;
LIST_ENTRY *ExternalDeferredPostAsync;
_LIST_ENTRY DelayedDeref;
_LIST_ENTRY DeferredPostAsync;
_LARGE_INTEGER TimeStamp[2];
__int128 v19;
v4 = 0i64;
DeferredPostAsync = 0i64;
DelayedDeref = 0i64;
*(_OWORD *)&TimeStamp[0].anonymous_0.LowPart = 0i64;
v19 = 0i64;
if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) )
{
EtwGetKernelTraceTimestamp(TimeStamp, 0x20000ui64);
if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) )
{
if( Object )
v4 = *((_QWORD *)Object + 1);
}
}
if( SystemHandleCount <= 1 && *(_DWORD *)Object == 1803104306 && *((_QWORD *)Object + 2) )
{
DeferredPostAsync.Blink = &DeferredPostAsync;
DeferredPostAsync.Flink = &DeferredPostAsync;
DelayedDeref.Blink = &DelayedDeref;
DelayedDeref.Flink = &DelayedDeref;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
CmpLockRegistry();
v8 = *((_QWORD *)Object + 1);
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)(v8 + 48), 0i64);
_InterlockedIncrement((volatile signed __int32 *)(v8 + 56));
IsKeyDeletedForKeyBody = CmpIsKeyDeletedForKeyBody((CM_KEY_BODY *)Object, 0i64);
v10 = (_CM_KEY_CONTROL_BLOCK *)*((_QWORD *)Object + 1);
if( IsKeyDeletedForKeyBody )
{
CmpUnlockKcb(v10);
CmpUnlockRegistry();
}
else
{
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&v10->KeyHash.KeyHive[1].Cluster, 0i64);
v13 = (CM_NOTIFY_BLOCK *)*((_QWORD *)Object + 2);
if( v13 && v13->PostList.Flink != &v13->PostList )
{
LOBYTE(ExternalDeferredPostAsync) = 0;
CmpPostNotify(v13, v11, v12, (LIST_ENTRY *)0x10B, ExternalDeferredPostAsync);
}
v14 = *(_EX_PUSH_LOCK **)(*((_QWORD *)Object + 1) + 32i64);
if( (_InterlockedExchangeAdd64(&v14[209]._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v14 + 209);
KeAbPostRelease(&v14[209]);
CmpUnlockKcb(*((_CM_KEY_CONTROL_BLOCK **)Object + 1));
CmpUnlockRegistry();
CmpDelayedDerefKeys(&DelayedDeref);
CmpSignalDeferredPosts(&DeferredPostAsync);
}
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) )
{
LOBYTE(Process) = 27;
(*(void(__fastcall **)(EPROCESS *, _LARGE_INTEGER *, _QWORD, _QWORD, __int64, _QWORD))((char *)&NlsMbCodePageTag + 7))(
Process,
TimeStamp,
0i64,
0i64,
v4,
0i64);
}
}Referenced by:
No references.