SmFpPreAllocate
INT64 __fastcall SmFpPreAllocate(volatile INT64 *SpinLock, UINT64 *a2, UINT64 a3){
__int64 v4;
UINT64 *v6;
int v7;
unsigned int v8;
__int64 v9;
_OWORD *PoolWithTag;
_QWORD *v11;
unsigned __int64 v12;
unsigned int v13;
void *MdlForLock;
unsigned int v15;
KIRQL v16;
__int128 v17;
int v18;
unsigned __int64 v19;
__int128 v20;
unsigned int v21;
INT64 result;
__int16 v24;
char v25;
int v26;
__int64 v27[2];
__int128 v28[3];
__int64 v29;
int v30;
v4 = (unsigned int)a3;
memset((INT64)&result, 0i64);
v26 = 0;
v27[1] = (__int64)v27;
v6 = (UINT64 *)((char *)a2 + 4 * v4);
v24 = 1;
v27[0] = (__int64)v27;
v25 = 6;
while( 1 )
{
if( a2 >= v6 )
{
v16 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)SpinLock);
v17 = v28[1];
v18 = v30;
*((_QWORD *)SpinLock + 11) = v29;
*((_OWORD *)SpinLock + 2) = v28[0];
v19 = v16;
v20 = v28[2];
*((_OWORD *)SpinLock + 3) = v17;
*((_DWORD *)SpinLock + 24) = v18;
*((_OWORD *)SpinLock + 4) = v20;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)SpinLock);
__writecr8(v19);
return 0;
}
v7 = *(_DWORD *)a2;
v8 = 0;
v9 = *(_DWORD *)a2 & 0xF;
*((_WORD *)&v29 + v9) = *(_DWORD *)a2 >> 4;
if( (v7 & 0xFF00000) != 0 )
break;
LABEL_11:
a2 = (UINT64 *)((char *)a2 + 4);
}
while( 1 )
{
PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x10ui64, 0x70466D73ui64);
v11 = PoolWithTag;
if( !PoolWithTag )
break;
*PoolWithTag = 0i64;
v12 = *(unsigned int *)a2;
v13 = *(_DWORD *)a2 & 0xF;
if( v13 == 2 )
{
MdlForLock = SmKmAllocateMdlForLock((unsigned __int64)(unsigned __int16)(v12 >> 4) << 12);
goto LABEL_9;
}
if( v13 != 3 )
{
if( v13 >= 5 )
MdlForLock = MmAllocateMappingAddress((unsigned __int16)((unsigned int)v12 >> 4) << 12, 0x6D526D73ui64);
else
MdlForLock = ExAllocatePoolWithTag(NonPagedPoolNx, (unsigned __int16)(v12 >> 4), 0x70466D73ui64);
LABEL_9:
if( !MdlForLock )
break;
goto LABEL_10;
}
if( !(unsigned int)SmAcquireReleaseCharges((unsigned __int64)(unsigned __int16)(v12 >> 4) << 12, 1ui64, 0i64) )
break;
MdlForLock = (void *)(8i64 * (v8 + 1));
LABEL_10:
v11[1] = MdlForLock;
++v8;
*v11 = *((_QWORD *)v28 + v9);
v15 = (unsigned __int8)(*(_DWORD *)a2 >> 20);
*((_QWORD *)v28 + v9) = v11;
if( v8 >= v15 )
goto LABEL_11;
}
SmFpCleanup((INT64)&result);
v21 = -1073741670;
if( v11 )
ExFreePoolWithTag(v11, 0);
return v21;
}Referenced by:
SMKM_STORE::SmStStart
SMKM_STORE_MGR::SmStorePrepare
SmFirstTimeInit