CmpCloseKeyObject

VOID __stdcall CmpCloseKeyObject(_EPROCESS *Process, PVOID Object, UINT64 ProcessHandleCount, UINT64 SystemHandleCount){
  __int64 v4; 
  _ETHREAD *CurrentThread; 
  __int64 v8; 
  char IsKeyDeletedForKeyBody; 
  UINT64 v10; 
  _UNICODE_STRING *v11; 
  UINT64 v12; 
  _CM_NOTIFY_BLOCK *v13; 
  __int64 v14; 
  _LIST_ENTRY DelayedDeref; 
  _LIST_ENTRY ExternalDeferredPostAsync; 
  LARGE_INTEGER v17[2]; 
  __int128 v18; 
  v4 = 0i64;
  ExternalDeferredPostAsync = 0i64;
  DelayedDeref = 0i64;
  *(_OWORD *)&v17[0].LowPart = 0i64;
  v18 = 0i64;
  if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) )
  {
    EtwGetKernelTraceTimestamp(v17, 0x20000ui64);
    if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) )
    {
      if( Object )
        v4 = *((_QWORD *)Object + 1);
    }
  }
  if( SystemHandleCount <= 1 && *(_DWORD *)Object == 1803104306 && *((_QWORD *)Object + 2) )
  {
    ExternalDeferredPostAsync.Blink = &ExternalDeferredPostAsync;
    ExternalDeferredPostAsync.Flink = &ExternalDeferredPostAsync;
    DelayedDeref.Blink = &DelayedDeref;
    DelayedDeref.Flink = &DelayedDeref;
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 242);
    CmpLockRegistry();
    v8 = *((_QWORD *)Object + 1);
    ExAcquirePushLockSharedEx(v8 + 48, 0i64);
    _InterlockedIncrement((volatile signed __int32 *)(v8 + 56));
    IsKeyDeletedForKeyBody = CmpIsKeyDeletedForKeyBody((__int64)Object, 0i64);
    v10 = *((_QWORD *)Object + 1);
    if( IsKeyDeletedForKeyBody )
    {
      CmpUnlockKcb(v10);
      CmpUnlockRegistry();
    }
    else
    {
      ExAcquirePushLockExclusiveEx(*(_QWORD *)(v10 + 32) + 1672i64, 0i64);
      v13 = (_CM_NOTIFY_BLOCK *)*((_QWORD *)Object + 2);
      if( v13 && v13->PostList.Flink != &v13->PostList )
        CmpPostNotify(v13, v11, v12, 267i64, 0, &DelayedDeref, &ExternalDeferredPostAsync);
      v14 = *(_QWORD *)(*((_QWORD *)Object + 1) + 32i64);
      if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v14 + 1672), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)(v14 + 1672));
      KeAbPostRelease((PVOID)(v14 + 1672));
      CmpUnlockKcb(*((_QWORD *)Object + 1));
      CmpUnlockRegistry();
      CmpDelayedDerefKeys(&DelayedDeref);
      CmpSignalDeferredPosts(&ExternalDeferredPostAsync);
    }
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  }
  if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) )
  {
    LOBYTE(Process) = 27;
    (*(void(__fastcall **)(_EPROCESS *, LARGE_INTEGER *, _QWORD, _QWORD, __int64, _QWORD))((char *)&NlsMbCodePageTag + 7))(
      Process,
      v17,
      0i64,
      0i64,
      v4,
      0i64);
  }
}

Referenced by:

No references.