ObQueryObjectAuditingByHandle

NTSTATUS __stdcall ObQueryObjectAuditingByHandle(PVOID Handle, UINT8 *GenerateOnClose){
  _ETHREAD *CurrentThread; 
  unsigned __int64 v4; 
  char v5; 
  struct _EX_RUNDOWN_REF *v6; 
  void *v7; 
  INT64 v8; 
  _HANDLE_TABLE *Count; 
  _HANDLE_TABLE_ENTRY *v10; 
  __int64 v11; 
  NTSTATUS v12; 
  int v14[14]; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v4 = (unsigned __int64)Handle;
  v5 = 0;
  v6 = (struct _EX_RUNDOWN_REF *)*((_QWORD *)CurrentThread + 23);
  if( ObpIsKernelHandle(Handle, *((_BYTE *)CurrentThread + 562)) )
  {
    Count = (_HANDLE_TABLE *)ObpKernelHandleTable;
    v4 ^= 0xFFFFFFFF80000000ui64;
  }
  else if( *((_BYTE *)KeGetCurrentThread() + 586) == 1 )
  {
    Count = (_HANDLE_TABLE *)ObReferenceProcessHandleTable(v6);
    if( !Count )
      return -1073741816;
    v5 = 1;
  }
  else
  {
    Count = (_HANDLE_TABLE *)v6[174].Count;
  }
  --*((_WORD *)CurrentThread + 242);
  v10 = ExMapHandleToPointer(Count, (VOID *)v4, v7, v8, *(INT64 *)&v14[8], *(INT64 *)&v14[10], *(PVOID *)&v14[12]);
  if( v10 )
  {
    v11 = v10->LowValue >> 17;
    _InterlockedExchangeAdd64(&v10->VolatileLowValue, 1ui64);
    _InterlockedOr(v14, 0);
    if( Count->HandleContentionEvent.Value )
      ExfUnblockPushLock(&Count->HandleContentionEvent, 0i64);
    *GenerateOnClose = (v11 & 4) != 0;
    v12 = 0;
  }
  else
  {
    v12 = -1073741816;
  }
  KeLeaveCriticalRegionThread((__int64)CurrentThread);
  if( v5 )
    ExReleaseRundownProtection(v6 + 139);
  return v12;
}

Referenced by:

No references.