VmPrefetchVirtualAddresses
NTSTATUS __stdcall VmPrefetchVirtualAddresses(VOID *Src){
void(__fastcall *v1)(void *);
int v2;
NTSTATUS v4;
void(__fastcall *v5)(void *);
_EPROCESS *Process;
volatile int *VmContext;
VOID **PoolWithTag;
_WORK_QUEUE_ITEM *v9;
_LIST_ENTRY *v10;
v4 = 0;
v5 = v1;
Process = KeGetCurrentThread()->ApcState.Process;
VmContext = (volatile int *)Process->VmContext;
if( !VmContext )
return -1073741667;
if( v2 )
return VmpPrefetchVirtualAddresses(VmContext);
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 16i64 * ((_QWORD)v1 + 4), 1666215254i64);
v9 = (_WORK_QUEUE_ITEM *)PoolWithTag;
if( !PoolWithTag )
return -1073741670;
PoolWithTag[1] = 0i64;
PoolWithTag[4] = 0i64;
PoolWithTag[5] = 0i64;
PoolWithTag[6] = 0i64;
PoolWithTag[2] = VmpPrefetchWorker;
PoolWithTag[3] = PoolWithTag;
*PoolWithTag = 0i64;
ObfReferenceObject(Process);
v9[1].WorkerRoutine = v5;
v10 = (_LIST_ENTRY *)(((unsigned __int64)&v9[1].Parameter + 7) & 0xFFFFFFFFFFFFFFF8ui64);
v9[1].List.Blink = v10;
v9[1].List.Flink = (_LIST_ENTRY *)Process;
memmove(v10, Src, 16 * (_DWORD)v5);
ExQueueWorkItem(v9, DelayedWorkQueue);
return v4;
}Referenced by:
MmInSwapWorkingSet
NtSetInformationVirtualMemory