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