SmFpPreAllocate
NTSTATUS __fastcall SmFpPreAllocate(INT64 *SpinLock, UINT64 *a2, UINT64 a3){
__int64 v4;
UINT64 *v6;
int v7;
unsigned int v8;
__int64 v9;
VOID **PoolWithTag;
VOID **v11;
unsigned __int64 v12;
unsigned int v13;
void *MdlForLock;
unsigned int v15;
unsigned __int8 v16;
__int128 v17;
_SM_FORWARD_PROGRESS_CTX v18;
unsigned __int64 v19;
__int128 v20;
NTSTATUS v21;
_SM_FORWARD_PROGRESS_CTX FpContext[28];
v4 = (unsigned int)a3;
memset(FpContext, 0i64, sizeof(FpContext));
FpContext[3] = 0;
*(_QWORD *)&FpContext[6] = &FpContext[4];
v6 = (UINT64 *)((char *)a2 + 4 * v4);
LOWORD(FpContext[2]) = 1;
*(_QWORD *)&FpContext[4] = &FpContext[4];
BYTE2(FpContext[2]) = 6;
while( 1 )
{
if( a2 >= v6 )
{
v16 = ExAcquireSpinLockExclusive(SpinLock);
v17 = *(_OWORD *)&FpContext[12];
v18 = FpContext[24];
SpinLock[11] = *(_QWORD *)&FpContext[22];
*((_OWORD *)SpinLock + 2) = *(_OWORD *)&FpContext[8];
v19 = v16;
v20 = *(_OWORD *)&FpContext[16];
*((_OWORD *)SpinLock + 3) = v17;
*((_DWORD *)SpinLock + 24) = v18;
*((_OWORD *)SpinLock + 4) = v20;
ExReleaseSpinLockExclusiveFromDpcLevel(SpinLock);
__writecr8(v19);
return 0;
}
v7 = *(_DWORD *)a2;
v8 = 0;
v9 = *(_DWORD *)a2 & 0xF;
*((_WORD *)&FpContext[22] + v9) = *(_DWORD *)a2 >> 4;
if( (v7 & 0xFF00000) != 0 )
break;
LABEL_11:
a2 = (UINT64 *)((char *)a2 + 4);
}
while( 1 )
{
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x10ui64, 1883663731i64);
v11 = PoolWithTag;
if( !PoolWithTag )
break;
*(_OWORD *)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(0x200ui64, (unsigned __int16)(v12 >> 4), 1883663731i64);
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 = *(VOID **)&FpContext[2 * v9 + 8];
v15 = (unsigned __int8)(*(_DWORD *)a2 >> 20);
*(_QWORD *)&FpContext[2 * v9 + 8] = v11;
if( v8 >= v15 )
goto LABEL_11;
}
SmFpCleanup(FpContext);
v21 = -1073741670;
if( v11 )
ExFreePoolWithTag(v11, 0);
return v21;
}Referenced by:
SMKM_STORE::SmStStart
SMKM_STORE_MGR::SmStorePrepare
SmFirstTimeInit