SmKmStoreHelperCommandProcess
VOID __fastcall SmKmStoreHelperCommandProcess(INT64 a1, INT64 a2, INT64 a3){
int v5;
int v6;
int v7;
MDL *v8;
MDL *v9;
UINT64 v10;
unsigned int v11;
NTSTATUS v12;
void *v13;
void *v14;
PVOID v15;
PVOID v16;
int v17;
void *v18;
int v19;
INT64 v20;
INT64 v21;
int v22;
VOID *Context;
VOID *Contexta;
_MDL *v25;
_MDL *v26;
PVOID ThreadPtr[2];
PVOID BaseAddress;
ULONG_PTR NumberOfBytesToUnlock;
BaseAddress = 0i64;
NumberOfBytesToUnlock = 0i64;
v5 = a2 - 2;
if( !v5 )
{
NumberOfBytesToUnlock = *(_QWORD *)(a3 + 8);
LODWORD(v14) = MmStoreAllocateVirtualMemory(NumberOfBytesToUnlock);
BaseAddress = v14;
v15 = v14;
if( v14 )
{
if( *(_QWORD *)(a1 + 112) )
{
if( (*(_DWORD *)(a3 + 32) & 1) == 0 )
{
v22 = SmKmVirtualLockCtxLockMemory(*(PVOID *)(a1 + 112), v14, NumberOfBytesToUnlock);
v15 = BaseAddress;
v12 = v22;
if( v22 < 0 )
{
MmStoreFreeVirtualMemory(BaseAddress);
goto LABEL_12;
}
}
}
*(_QWORD *)(a3 + 24) = v15;
goto LABEL_11;
}
goto LABEL_24;
}
v6 = v5 - 1;
if( !v6 )
{
v16 = *(PVOID *)a3;
NumberOfBytesToUnlock = *(_QWORD *)(a3 + 8);
v17 = *(_DWORD *)(a3 + 16);
BaseAddress = v16;
if( (v17 & 1) == 0 )
{
MmStoreFreeVirtualMemory(v16);
v18 = *(void **)(a1 + 112);
if( v18 )
SmKmVirtualLockCtxMemoryUnlocked(v18, NumberOfBytesToUnlock);
}
goto LABEL_11;
}
v7 = v6 - 1;
if( !v7 )
{
BaseAddress = *(PVOID *)a3;
NumberOfBytesToUnlock = *(_QWORD *)(a3 + 8);
LODWORD(Context) = *(_DWORD *)(a3 + 20) & 1;
SmFpAllocate(*(_QWORD *)(a1 + 120), 2i64, a1, 0i64, Context, v25, (UINT64)ThreadPtr[0]);
v9 = v8;
if( v8 )
{
v10 = *(unsigned int *)(a3 + 16);
ThreadPtr[0] = KeGetCurrentThread();
v11 = SmSetThreadPagePriority(ThreadPtr, v10);
v12 = SmKmProbeAndLockAddress(BaseAddress, NumberOfBytesToUnlock, v9, 0);
if( v12 == -1073741395 && (*(_DWORD *)(a3 + 20) & 1) != 0 )
{
LODWORD(Contexta) = 1;
SmFpAllocate(*(_QWORD *)(a1 + 120), 4i64, a1, 0i64, Contexta, v26, (UINT64)ThreadPtr[0]);
v21 = v20;
v12 = SmKmProbeAndLockAddress(BaseAddress, NumberOfBytesToUnlock, v9, 1);
if( v12 >= 0 )
v9->Next = (_MDL *)v21;
else
SmFpFree(*(_QWORD *)(a1 + 120), 4i64, a1, v21);
}
if( v11 != *(_DWORD *)(a3 + 16) )
SmSetThreadPagePriority(ThreadPtr, v11);
if( v12 >= 0 )
{
LODWORD(Contexta) = *(_DWORD *)(a3 + 20) & 1;
SmFpAllocate(*(_QWORD *)(a1 + 120), 5i64, a1, (INT64)v9, Contexta, v26, (UINT64)ThreadPtr[0]);
BaseAddress = v13;
if( v13 )
{
*(_QWORD *)(a3 + 24) = v9;
goto LABEL_11;
}
v12 = -1073741670;
SmKmUnlockMdl(v9, *(_QWORD *)(a1 + 120), a1);
}
SmFpFree(*(_QWORD *)(a1 + 120), 2i64, a1, (INT64)v9);
goto LABEL_12;
}
LABEL_24:
v12 = -1073741670;
goto LABEL_12;
}
v19 = v7 - 1;
if( !v19 )
{
v12 = (*(__int64(__fastcall **)(INT64, _QWORD, _QWORD))a3)(a1, *(_QWORD *)(a3 + 8), 0i64);
goto LABEL_12;
}
if( v19 != 1 )
{
v12 = -1073741811;
goto LABEL_12;
}
BaseAddress = *(PVOID *)a3;
NumberOfBytesToUnlock = *(_QWORD *)(a3 + 8);
ZwUnlockVirtualMemory((PVOID)0xFFFFFFFFFFFFFFFFi64, &BaseAddress, &NumberOfBytesToUnlock, 1ui64);
LABEL_11:
v12 = 0;
LABEL_12:
*(_DWORD *)(a3 + 40) = v12;
}Referenced by:
SmKmStoreHelperCommandCleanup
SmKmStoreHelperWorker