ExpAllocateHandleTableEntrySlow
UINT8 __stdcall ExpAllocateHandleTableEntrySlow(_HANDLE_TABLE *HandleTable, _HANDLE_TABLE_FREE_LIST *FreeList){
volatile unsigned __int64 TableCode;
_EXHANDLE NextHandleNeedingPool;
char v6;
unsigned __int64 v7;
int v8;
__int64 v9;
_HANDLE_TABLE_ENTRY *LowLevelTable;
_HANDLE_TABLE_ENTRY **v12;
__int64 v13;
__int64 v14;
__int64 v15;
unsigned __int64 TablePagedPool;
_HANDLE_TABLE_ENTRY **v17;
_HANDLE_TABLE_ENTRY **v18;
_HANDLE_TABLE_ENTRY *NewLowLevel;
TableCode = HandleTable->TableCode;
NewLowLevel = 0i64;
NextHandleNeedingPool = (_EXHANDLE)HandleTable->NextHandleNeedingPool;
v6 = TableCode;
v7 = TableCode & 0xFFFFFFFFFFFFFFFCui64;
v8 = v6 & 3;
if( !v8 )
{
v12 = ExpAllocateMidLevelTable(HandleTable, &NewLowLevel, (_EXHANDLE)HandleTable->NextHandleNeedingPool);
if( !v12 )
return 0;
v12[1] = *v12;
*v12 = (_HANDLE_TABLE_ENTRY *)v7;
_InterlockedExchange64((volatile __int64 *)&HandleTable->TableCode, (unsigned __int64)v12 | 1);
goto LABEL_9;
}
if( v8 != 1 )
{
v13 = (unsigned __int32)NextHandleNeedingPool._bf_0 >> 19;
if( (unsigned int)v13 >= 0x80 )
return 0;
v14 = *(_QWORD *)(v7 + 8 * v13);
v15 = (unsigned int)v13;
if( v14 )
{
LowLevelTable = ExpAllocateLowLevelTable(HandleTable, (_EXHANDLE)HandleTable->NextHandleNeedingPool);
NewLowLevel = LowLevelTable;
if( LowLevelTable )
{
*(_QWORD *)(v14 + 8 * ((NextHandleNeedingPool.Value >> 10) & 0x1FF)) = LowLevelTable;
goto LABEL_6;
}
return 0;
}
v18 = ExpAllocateMidLevelTable(HandleTable, &NewLowLevel, (_EXHANDLE)HandleTable->NextHandleNeedingPool);
if( !v18 )
return 0;
*(_QWORD *)(v7 + 8 * v15) = v18;
LABEL_9:
LowLevelTable = NewLowLevel;
goto LABEL_6;
}
v9 = (unsigned __int32)NextHandleNeedingPool._bf_0 >> 10;
if( (unsigned int)v9 >= 0x200 )
{
TablePagedPool = (unsigned __int64)ExpAllocateTablePagedPool(HandleTable->QuotaProcess, 0x400ui64);
if( !TablePagedPool )
return 0;
v17 = ExpAllocateMidLevelTable(HandleTable, &NewLowLevel, NextHandleNeedingPool);
if( !v17 )
{
ExpFreeTablePagedPool((ULONG_PTR)HandleTable->QuotaProcess, (VOID *)TablePagedPool, 0x400u);
return 0;
}
*(_QWORD *)TablePagedPool = v7;
*(_QWORD *)(TablePagedPool + 8) = v17;
_InterlockedExchange64((volatile __int64 *)&HandleTable->TableCode, TablePagedPool | 2);
goto LABEL_9;
}
LowLevelTable = ExpAllocateLowLevelTable(HandleTable, (_EXHANDLE)(unsigned int)NextHandleNeedingPool._bf_0);
NewLowLevel = LowLevelTable;
if( LowLevelTable )
{
*(_QWORD *)(v7 + 8 * v9) = LowLevelTable;
LABEL_6:
ExpInsertLowLevelTableIntoFreeList(HandleTable, LowLevelTable, FreeList, FreeList != 0i64);
return 1;
}
return 0;
}Referenced by:
ExDupHandleTable
ExpAllocateHandleTableEntry
ObpCreateHandle