ExpInsertLowLevelTableIntoFreeList
VOID __stdcall ExpInsertLowLevelTableIntoFreeList(
_HANDLE_TABLE *HandleTable,
_HANDLE_TABLE_ENTRY *NewLowLevel,
_HANDLE_TABLE_FREE_LIST *FreeList,
UINT8 DoInit){
__m128i v5;
_HANDLE_TABLE_ENTRY *v7;
unsigned int v8;
__int64 *p_HighValue;
unsigned __int64 v10;
__m128i v11;
unsigned int v12;
__m128i v13;
_HANDLE_TABLE_ENTRY *v14;
__m128i v15;
v5 = _mm_unpacklo_epi64((__m128i)(unsigned __int64)NewLowLevel, (__m128i)(unsigned __int64)NewLowLevel);
if( DoInit )
{
v8 = 1;
p_HighValue = &NewLowLevel[1].HighValue;
v10 = _mm_srli_si128((__m128i)0i64, 8).m128i_u64[0];
v11 = _mm_cvtsi32_si128(4u);
do
{
v12 = v8 + 1;
v15.m128i_i64[0] = _xmm;
v8 += 2;
*(p_HighValue - 1) = 0i64;
p_HighValue[1] = v10;
v13 = _mm_add_epi64(
_mm_sll_epi64(
_mm_unpacklo_epi32(_mm_add_epi32(_mm_shuffle_epi32(_mm_cvtsi32_si128(v12), 0), v15), (__m128i)0i64),
v11),
v5);
*p_HighValue = v13.m128i_i64[0];
p_HighValue += 4;
*(p_HighValue - 2) = _mm_srli_si128(v13, 8).m128i_u64[0];
}
while( v8 < 0xFF );
v7 = NewLowLevel + 255;
NewLowLevel[255].LowValue = 0i64;
NewLowLevel[255].HighValue = 0i64;
}
else
{
v7 = NewLowLevel + 255;
}
_InterlockedExchangeAdd((volatile signed __int32 *)HandleTable, 0x400u);
if( DoInit )
{
ExAcquirePushLockExclusiveEx(&FreeList->FreeListLock, 0i64);
v14 = NewLowLevel + 1;
if( FreeList->FirstFreeHandleEntry )
FreeList->LastFreeHandleEntry->HighValue = (__int64)v14;
else
FreeList->FirstFreeHandleEntry = v14;
FreeList->LastFreeHandleEntry = v7;
if( (_InterlockedExchangeAdd64(&FreeList->FreeListLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&FreeList->FreeListLock);
KeAbPostRelease(FreeList);
}
}Referenced by:
ExpAllocateHandleTable
ExpAllocateHandleTableEntrySlow