SmKmStoreHelperCommandProcess
VOID __stdcall SmKmStoreHelperCommandProcess(
_SMKM_STORE_HELPER *Helper,
_SMKM_STORE_HELPER_COMMAND Command,
_SMKM_STORE_HELPER_PARAMS *Params){
__int32 v5;
__int32 v6;
__int32 v7;
struct _MDL *v8;
UINT64 v9;
unsigned int v10;
NTSTATUS v11;
VOID *v12;
VOID *v13;
_SMKM_STORE_HELPER_PARAMS v14;
VOID *v15;
__int32 v16;
_MDL *v17;
NTSTATUS v18;
UINT64 DontFail;
UINT64 DontFaila;
VOID *ThreadPtr[2];
VOID *BaseAddress;
UINT64 RegionSize;
BaseAddress = 0i64;
RegionSize = 0i64;
v5 = Command - 2;
if( !v5 )
{
RegionSize = *((_QWORD *)Params + 1);
BaseAddress = MmStoreAllocateVirtualMemory(RegionSize);
v12 = BaseAddress;
if( BaseAddress )
{
if( *((_QWORD *)Helper + 14) )
{
if( (Params[8] & 1) == 0 )
{
v18 = SmKmVirtualLockCtxLockMemory(*((VOID **)Helper + 14), BaseAddress, RegionSize);
v12 = BaseAddress;
v11 = v18;
if( v18 < 0 )
{
MmStoreFreeVirtualMemory(BaseAddress);
goto LABEL_12;
}
}
}
*((_QWORD *)Params + 3) = v12;
goto LABEL_11;
}
goto LABEL_24;
}
v6 = v5 - 1;
if( !v6 )
{
v13 = *(VOID **)Params;
RegionSize = *((_QWORD *)Params + 1);
v14 = Params[4];
BaseAddress = v13;
if( (v14 & 1) == 0 )
{
MmStoreFreeVirtualMemory(v13);
v15 = (VOID *)*((_QWORD *)Helper + 14);
if( v15 )
SmKmVirtualLockCtxMemoryUnlocked(v15, RegionSize);
}
goto LABEL_11;
}
v7 = v6 - 1;
if( !v7 )
{
BaseAddress = *(VOID **)Params;
RegionSize = *((_QWORD *)Params + 1);
LODWORD(DontFail) = Params[5] & 1;
v8 = (struct _MDL *)SmFpAllocate(
*((_SM_FORWARD_PROGRESS_CTX **)Helper + 15),
SmFpResourceLockMdl,
Helper,
0i64,
DontFail);
if( v8 )
{
v9 = (unsigned int)Params[4];
ThreadPtr[0] = KeGetCurrentThread();
v10 = SmSetThreadPagePriority(ThreadPtr, v9);
v11 = SmKmProbeAndLockAddress(BaseAddress, RegionSize, v8, 0);
if( v11 == -1073741395 && (Params[5] & 1) != 0 )
{
LODWORD(DontFaila) = 1;
v17 = (_MDL *)SmFpAllocate(
*((_SM_FORWARD_PROGRESS_CTX **)Helper + 15),
SmFpResourceReserveMmPages,
Helper,
0i64,
DontFaila);
v11 = SmKmProbeAndLockAddress(BaseAddress, RegionSize, v8, 1u);
if( v11 >= 0 )
v8->Next = v17;
else
SmFpFree(*((_SM_FORWARD_PROGRESS_CTX **)Helper + 15), SmFpResourceReserveMmPages, Helper, v17);
}
if( v10 != Params[4] )
SmSetThreadPagePriority(ThreadPtr, v10);
if( v11 >= 0 )
{
LODWORD(DontFaila) = Params[5] & 1;
BaseAddress = SmFpAllocate(
*((_SM_FORWARD_PROGRESS_CTX **)Helper + 15),
SmFpResourceMapping,
Helper,
v8,
DontFaila);
if( BaseAddress )
{
*((_QWORD *)Params + 3) = v8;
goto LABEL_11;
}
v11 = -1073741670;
SmKmUnlockMdl(v8, *((_SM_FORWARD_PROGRESS_CTX **)Helper + 15), Helper);
}
SmFpFree(*((_SM_FORWARD_PROGRESS_CTX **)Helper + 15), SmFpResourceLockMdl, Helper, v8);
goto LABEL_12;
}
LABEL_24:
v11 = -1073741670;
goto LABEL_12;
}
v16 = v7 - 1;
if( !v16 )
{
v11 = (*(__int64(__fastcall **)(_SMKM_STORE_HELPER *, _QWORD, _QWORD))Params)(
Helper,
*((_QWORD *)Params + 1),
0i64);
goto LABEL_12;
}
if( v16 != 1 )
{
v11 = -1073741811;
goto LABEL_12;
}
BaseAddress = *(VOID **)Params;
RegionSize = *((_QWORD *)Params + 1);
ZwUnlockVirtualMemory((VOID *)0xFFFFFFFFFFFFFFFFi64, &BaseAddress, &RegionSize, 1ui64);
LABEL_11:
v11 = 0;
LABEL_12:
Params[10] = v11;
}Referenced by:
SmKmStoreHelperCommandCleanup
SmKmStoreHelperWorker