ObpInsertHandleCount

char *__fastcall ObpInsertHandleCount(_OBJECT_HEADER *a1){
  _OBJECT_HEADER_HANDLE_INFO *v2; 
  _OBJECT_HANDLE_COUNT_DATABASE *HandleCountDataBase; 
  size_t v4; 
  int v5; 
  unsigned int v6; 
  VOID **PoolWithTag; 
  _OBJECT_HANDLE_COUNT_DATABASE *v8; 
  unsigned __int8 Flags; 
  char *result; 
  unsigned int CountEntries; 
  _QWORD Src[3]; 

  memset(Src, 0, sizeof(Src));
  v2 = OBJECT_HEADER_TO_HANDLE_INFO(a1);
  if( !v2 )
    return 0i64;
  if( (a1->Flags & 0x40) != 0 )
  {
    LODWORD(Src[0]) = 1;
    HandleCountDataBase = (_OBJECT_HANDLE_COUNT_DATABASE *)Src;
    v4 = 24;
    v5 = 2;
    *(_OBJECT_HEADER_HANDLE_INFO *)&Src[1] = *v2;
    v6 = 40;
  }
  else
  {
    HandleCountDataBase = v2->HandleCountDataBase;
    CountEntries = v2->HandleCountDataBase->CountEntries;
    v5 = CountEntries + 4;
    v4 = 16 * CountEntries + 8;
    v6 = 16 * v5 + 8;
  }
  PoolWithTag = ExAllocatePoolWithTag(1ui64, v6, 1682465359i64);
  v8 = (_OBJECT_HANDLE_COUNT_DATABASE *)PoolWithTag;
  if( !PoolWithTag )
    return 0i64;
  memmove(PoolWithTag, HandleCountDataBase, v4);
  Flags = a1->Flags;
  if( (Flags & 0x40) != 0 )
    a1->Flags = Flags & 0xBF;
  else
    ExFreePoolWithTag(HandleCountDataBase, 0);
  memset((char *)v8 + v4, 0i64, v6 - v4);
  v8->CountEntries = v5;
  result = (char *)v8 + v4;
  v2->HandleCountDataBase = v8;
  return result;
}

Referenced by:

ObpLockHandleDataBaseEntry