MmPrefetchVirtualMemory
NTSTATUS __stdcall MmPrefetchVirtualMemory(CHAR *Handle, UINT64 a2, INT64 a3, INT64 a4){
unsigned int v4;
int v6;
_ADAPTER_OBJECT *v7;
_ADAPTER_OBJECT *v8;
_ETHREAD *CurrentThread;
_DWORD *v10;
__int64 SessionVm;
NTSTATUS v12;
NTSTATUS result;
_LIST_ENTRY *v14;
INT64 v15;
INT64 v16;
INT16 v17;
UINT64 Tag;
PVOID Process;
PVOID v20;
INT64 v21;
UINT64 v22;
_KAPC_STATE ApcState;
v21 = a3;
v22 = a2;
Process = 0i64;
v4 = a4;
v6 = 0;
v7 = 0i64;
v8 = 0i64;
memset(&ApcState, 0, sizeof(ApcState));
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( !Handle )
{
SessionVm = 1i64;
goto LABEL_31;
}
if( Handle != (CHAR *)-1i64 )
{
if( Handle == (CHAR *)-3i64 )
{
v10 = CurrentThread->Tcb.ApcState.Process->Pcb.gap0;
if( (v10[281] & 0x10000) == 0 )
return -1073741799;
SessionVm = (__int64)MiGetSessionVm(-3i64, a2, a3);
goto LABEL_6;
}
if( !ObIsKernelHandle(Handle) )
return -1073741585;
LODWORD(Tag) = 1716546893;
if( ObpReferenceObjectByHandleWithTag(Handle, 8ui64, (_OBJECT_TYPE *)PsProcessType, 0, Tag, &Process, 0i64, 0i64) >= 0 )
{
v10 = Process;
if( CurrentThread->Tcb.ApcState.Process != Process )
{
KiStackAttachProcess(Process, 0i64, &ApcState);
v6 = 1;
}
goto LABEL_15;
}
v20 = 0i64;
result = ObReferenceObjectByHandle(Handle, 1ui64, MmSessionObjectType, 0, &v20, 0i64);
v7 = (_ADAPTER_OBJECT *)v20;
if( result < 0 )
return result;
v14 = MiLockAndSelectSessionAttachProcess(*((_MM_SESSION_SPACE **)v20 + 3));
v8 = (_ADAPTER_OBJECT *)v14;
if( !v14 )
{
LABEL_29:
HalPutDmaAdapter(v7);
return 0;
}
if( MmAttachSession(v14, &ApcState) < 0 )
{
HalPutDmaAdapter(v8);
goto LABEL_29;
}
SessionVm = (__int64)MiGetSessionVm(v16, v15, v17);
LABEL_31:
v10 = Process;
goto LABEL_6;
}
v10 = CurrentThread->Tcb.ApcState.Process->Pcb.gap0;
LABEL_15:
SessionVm = (__int64)(v10 + 416);
LABEL_6:
v12 = MiPrefetchVirtualMemory(v22, v21, (CHAR *)SessionVm, v4);
if( v6 )
KiUnstackDetachProcess(&ApcState, 0i64);
if( v8 )
{
MmDetachSession(v8, &ApcState);
HalPutDmaAdapter(v8);
}
if( Handle == (CHAR *)-2i64 || (unsigned __int64)(Handle - 1) <= 0xFFFFFFFFFFFFFFFBui64 )
{
if( v10 )
{
ObfDereferenceObjectWithTag(v10, 0x66506D4Dui64);
}
else if( v7 )
{
HalPutDmaAdapter(v7);
}
}
return v12;
}Referenced by:
ExpDebuggerWorker
MiProcessWsInSwapRanges
MmPrefetchVirtualAddresses
PfpPrefetchPrivatePages