ExInsertPoolTag
UINT64 __stdcall ExInsertPoolTag(UINT64 Tag, VOID *Va, UINT64 NumberOfBytes, POOL_TYPE PoolType, UINT64 Flags){
UINT8 Pattern;
__int64 v9;
UINT64 v10;
__int64 v11;
int v12;
__int64 v13;
UINT8 *v14;
unsigned int v15;
int v16;
__int64 v17;
volatile signed __int32 *v18;
int v19;
__int64 v20;
volatile signed __int32 v22;
INT64 v23;
INT64 v24;
__int64 v25;
struct _KLOCK_QUEUE_HANDLE LockHandle;
UINT8 *v27;
Pattern = 0;
LOWORD(v9) = 0;
if( (Flags & 1) != 0 )
{
v23 = (INT64)Va + NumberOfBytes;
if( (((_DWORD)Va + (_DWORD)NumberOfBytes) & 0xFFF) != 0 )
{
v9 = (unsigned __int16)(4096 - (v23 & 0xFFF));
Pattern = LOBYTE(KUSER_SHARED_DATA.TickCount.LowPart) | 1;
memset(v23, LOBYTE(KUSER_SHARED_DATA.TickCount.LowPart) | 1u);
}
}
if( NumberOfBytes >= NumberOfBytes + 4095 )
return 0i64;
v10 = (NumberOfBytes + 4095) & 0xFFFFFFFFFFFFF000ui64;
LOWORD(v24) = v9;
if( !(unsigned int)ExpAddTagForBigPages(Va, 0x546E6F43ui64, v10, PoolType, v24, Pattern) )
return 0i64;
memset(&LockHandle, 0, sizeof(LockHandle));
if( PoolHitTag == 1416523587 )
__debugbreak();
v11 = 8i64;
if( (PoolType & 0x20) != 0 )
{
v14 = (UINT8 *)ExpSessionPoolTrackTable;
v12 = ExpSessionPoolTrackTableMask;
v13 = ExpSessionPoolTrackTableSize;
}
else
{
v12 = PoolTrackTableMask;
v13 = PoolTrackTableSize;
v14 = (&ExPoolTagTables)[*((unsigned int *)KeGetPcr() + 105)];
}
v25 = v13;
v15 = v12 & 0x7DA697E6;
v27 = v14;
v16 = v12 & 0x7DA697E6;
while( 1 )
{
v17 = 56i64 * v15;
v18 = (volatile signed __int32 *)&v14[v17];
v19 = *(_DWORD *)&v14[v17];
if( v19 == 1416523587 )
break;
if( v19 )
{
LABEL_16:
v14 = v27;
v15 = v12 & (v15 + 1);
if( v15 == v16 )
{
ExpInsertPoolTrackerExpansion(0x546E6F43ui64, v10, PoolType);
return 1i64;
}
}
else
{
if( (PoolType & 0x20) != 0 )
goto LABEL_22;
v22 = *(_DWORD *)((char *)PoolTrackTable + v17);
if( v22 )
{
v14 = v27;
*v18 = v22;
v16 = v12 & 0x7DA697E6;
}
else
{
v16 = v12 & 0x7DA697E6;
LABEL_22:
if( v15 == v13 - 1 )
goto LABEL_16;
if( (PoolType & 0x20) != 0 )
{
_InterlockedCompareExchange(v18, 1416523587, 0);
v14 = v27;
}
else
{
KeAcquireInStackQueuedSpinLock(&ExpTaggedPoolLock, &LockHandle);
if( !*(_DWORD *)((char *)PoolTrackTable + v17) )
{
*(_DWORD *)((char *)PoolTrackTable + v17) = 1416523587;
*v18 = 1416523587;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
v13 = v25;
v14 = v27;
v16 = v12 & 0x7DA697E6;
}
}
}
}
if( (PoolType & 1) != 0 )
{
v20 = 10i64;
}
else
{
v11 = 2i64;
v20 = 4i64;
}
_InterlockedIncrement64((volatile signed __int64 *)&v18[v20]);
_InterlockedExchangeAdd64((volatile signed __int64 *)&v18[v11], v10);
return 1i64;
}Referenced by:
MiAllocateContiguousMemory