ObpReleaseHandleInfo

VOID __stdcall ObpReleaseHandleInfo(_OBJECT_HEADER *ObjectHeader, _EPROCESS *Process, UINT64 *ProcessHandleCount){
  _OBJECT_HEADER_HANDLE_INFO *v3; 
  int *v4; 
  _OBJECT_HANDLE_COUNT_DATABASE *v5; 
  __int64 v6; 
  _OBJECT_HEADER_HANDLE_INFO *HandleCountEntries; 
  _OBJECT_HANDLE_COUNT_DATABASE *HandleCountDataBase; 
  unsigned int CountEntries; 
  int v10; 
  int v11; 

  v3 = OBJECT_HEADER_TO_HANDLE_INFO(ObjectHeader);
  HandleCountEntries = v3;
  if( (*(_BYTE *)(v6 + 27) & 0x40) != 0 )
  {
    v11 = *((_DWORD *)&v3->SingleEntry + 2);
    *v4 = v11 & 0xFFFFFF;
    *((_DWORD *)&v3->SingleEntry + 2) = v11 ^ (v11 ^ (v11 - 1)) & 0xFFFFFF;
  }
  else
  {
    HandleCountDataBase = v3->HandleCountDataBase;
    CountEntries = HandleCountDataBase->CountEntries;
    HandleCountEntries = (_OBJECT_HEADER_HANDLE_INFO *)HandleCountDataBase->HandleCountEntries;
    if( HandleCountDataBase->CountEntries )
    {
      while( 1 )
      {
        v10 = *((_DWORD *)&HandleCountEntries->SingleEntry + 2);
        if( (v10 & 0xFFFFFF) != 0 && HandleCountEntries->HandleCountDataBase == v5 )
          break;
        ++HandleCountEntries;
        if( !--CountEntries )
          goto LABEL_6;
      }
      *v4 = *((_DWORD *)&HandleCountEntries->SingleEntry + 2) & 0xFFFFFF;
      *((_DWORD *)&HandleCountEntries->SingleEntry + 2) = v10 ^ (v10 ^ (v10 - 1)) & 0xFFFFFF;
    }
  }
LABEL_6:
  if( !*((_BYTE *)&HandleCountEntries->SingleEntry + 11)
    && (*((_DWORD *)&HandleCountEntries->SingleEntry + 2) & 0xFFFFFF) == 0 )
  {
    HandleCountEntries->HandleCountDataBase = 0i64;
  }
}

Referenced by:

ObpDecrementHandleCount