ExQueryProcessHandleInformation

NTSTATUS __stdcall ExQueryProcessHandleInformation(
        _HANDLE_TABLE *HandleTable,
        PROCESS_HANDLE_SNAPSHOT_INFORMATION *ProcessHandleInformation,
        UINT64 Length,
        UINT64 *RequiredLength){
  PROCESS_HANDLE_SNAPSHOT_INFORMATION *v5; 
  unsigned int v6; 
  int v7; 
  NTSTATUS v8; 
  _HANDLE_TABLE_ENTRY *v9; 
  _HANDLE_TABLE_ENTRY *NextHandleTableEntry; 
  unsigned int v11; 
  _HANDLE_TABLE_ENTRY *v12; 
  __int64 *v13; 
  __int32 bf_0; 
  int v15; 
  int v16; 
  int v17; 
  __int64 v18; 
  __int64 v19; 
  int v20; 
  int v22[8]; 
  int v23; 
  int v24; 
  _EXHANDLE pHandle; 
  unsigned __int64 v26; 
  __int64 v27; 
  __int64 v28; 
  _HANDLE_TABLE *HandleTablea; 
  int v31; 

  HandleTablea = HandleTable;
  pHandle = 0i64;
  v5 = ProcessHandleInformation + 4;
  v26 = (unsigned int)(Length - 16) / 0x28ui64;
  v6 = 0;
  v7 = 16;
  v8 = 0;
  v9 = 0i64;
  while( 1 )
  {
    NextHandleTableEntry = ExpGetNextHandleTableEntry(HandleTable, v9, &pHandle);
    v12 = NextHandleTableEntry;
    if( !NextHandleTableEntry )
      break;
    if( v6 >= v11 )
    {
      if( (pHandle._bf_0 & 0x3FC) != 0 && NextHandleTableEntry->LowValue )
      {
        v7 += 40;
        v8 = -1073741820;
      }
    }
    else if( ExLockHandleTableEntry(HandleTablea, NextHandleTableEntry) )
    {
      v13 = (__int64 *)((v12->LowValue >> 16) & 0xFFFFFFFFFFFFFFF0ui64);
      bf_0 = v12->LeafHandleValue.$E5B3C52FE72490EE6A49ADBB8529F30E::_bf_0;
      v15 = (v12->LowValue >> 17) & 7 | 8;
      if( (bf_0 & 0x2000000) == 0 )
        LOBYTE(v15) = (v12->LowValue >> 17) & 7;
      v16 = v15 & 7;
      v31 = v16;
      v17 = *(unsigned __int8 *)(ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ *(unsigned __int8 *)(((v12->LowValue >> 16) & 0xFFFFFFFFFFFFFFF0ui64) + 0x18) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)(WORD1(v12->LowValue) & 0xFFF0) >> 8)]
                               + 40);
      v24 = v17;
      v18 = *v13;
      v27 = *v13;
      v19 = v13[1];
      v28 = v19;
      v20 = bf_0 & 0x1FFFFFF;
      v23 = v20;
      _InterlockedExchangeAdd64(&v12->VolatileLowValue, 1ui64);
      _InterlockedOr(v22, 0);
      if( HandleTablea->HandleContentionEvent._bf_0 )
      {
        ExfUnblockPushLock(&HandleTablea->HandleContentionEvent._bf_0, 0i64);
        v16 = v31;
        v20 = v23;
        v17 = v24;
        v18 = v27;
        v19 = v28;
      }
      v7 += 40;
      ++v6;
      *(_EXHANDLE *)v5 = pHandle;
      *((_QWORD *)v5 + 1) = v19;
      *((_QWORD *)v5 + 2) = v18;
      v5[6] = v20;
      v5[7] = v17;
      v5[8] = v16;
      v5[9] = 0;
      *(_QWORD *)ProcessHandleInformation = v6;
      v5 += 10;
    }
    v9 = v12;
    HandleTable = HandleTablea;
  }
  if( RequiredLength )
    *(_DWORD *)RequiredLength = v7;
  return v8;
}

Referenced by:

NtQueryInformationProcess