ExpAllocateHandleTableEntry
_HANDLE_TABLE_ENTRY *__fastcall ExpAllocateHandleTableEntry(_HANDLE_TABLE *HandleTable, _EXHANDLE *Handle){
$674F156C788F89EBCBFDC1492D6BA90B v2;
unsigned int v5;
unsigned int v6;
unsigned int v7;
unsigned int v8;
$04A1C50C0EA344B0A9CE9732A4AEB0AE *v9;
unsigned int v10;
UINT8 HandleTableEntrySlow;
_HANDLE_TABLE_ENTRY *result;
_HANDLE_TABLE_ENTRY *FirstFreeHandleEntry;
_HANDLE_TABLE_ENTRY *NextFreeHandleEntry;
signed int v15;
unsigned int NextHandleNeedingPool;
v2 = HandleTable->1;
if( (*(_BYTE *)&v2 & 4) == 0 )
{
if( (*(_BYTE *)&v2 & 1) != 0 )
v5 = 0;
else
v5 = *((_DWORD *)KeGetPcr() + 105);
v6 = ExpFreeListCount;
do
{
v7 = 0;
NextHandleNeedingPool = HandleTable->NextHandleNeedingPool;
v8 = v5;
do
{
v9 = &HandleTable->64 + v8;
if( v9->FreeLists[0].FirstFreeHandleEntry )
{
ExAcquirePushLockExclusiveEx((UINT64)&HandleTable->FreeLists[v8].FreeListLock.Value, 0i64);
FirstFreeHandleEntry = v9->FreeLists[0].FirstFreeHandleEntry;
if( FirstFreeHandleEntry )
{
NextFreeHandleEntry = FirstFreeHandleEntry->NextFreeHandleEntry;
v9->FreeLists[0].FirstFreeHandleEntry = NextFreeHandleEntry;
if( !NextFreeHandleEntry )
v9->FreeLists[0].LastFreeHandleEntry = 0i64;
v15 = ++v9->FreeLists[0].HandleCount;
if( v15 > (signed int)v9->FreeLists[0].HighWaterMark )
v9->FreeLists[0].HighWaterMark = v15;
}
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v9, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&HandleTable->FreeLists[v8].FreeListLock.Value);
KeAbPostRelease(&HandleTable->FreeLists[v8]);
if( FirstFreeHandleEntry )
{
result = FirstFreeHandleEntry;
Handle->Value = *(_QWORD *)(((unsigned __int64)FirstFreeHandleEntry & 0xFFFFFFFFFFFFF000ui64) + 8)
+ 4
* ((__int64)((__int64)FirstFreeHandleEntry
- ((unsigned __int64)FirstFreeHandleEntry & 0xFFFFFFFFFFFFF000ui64)) >> 4);
return result;
}
}
v10 = v8 + 1;
++v7;
v8 = 0;
if( v10 != v6 )
v8 = v10;
}
while( v7 < v6 );
HandleTableEntrySlow = 1;
ExAcquirePushLockExclusiveEx((UINT64)&HandleTable->HandleTableLock, 0i64);
if( NextHandleNeedingPool == HandleTable->NextHandleNeedingPool )
HandleTableEntrySlow = ExpAllocateHandleTableEntrySlow(HandleTable, &HandleTable->FreeLists[v5]);
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&HandleTable->HandleTableLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&HandleTable->HandleTableLock);
KeAbPostRelease(&HandleTable->HandleTableLock);
}
while( HandleTableEntrySlow );
}
return 0i64;
}Referenced by:
ExCreateHandleEx