PspIumGetPhysicalPage
INT64 __fastcall PspIumGetPhysicalPage(INT64 a1){
unsigned int v1;
unsigned __int64 v2;
_KPROCESS *v4;
INT64 v5;
_EPROCESS *v6;
UINT64 v7;
NTSTATUS v8;
INT64 result;
UINT64 FaultTypeFlags;
__int64 VirtualAddress[2];
_KAPC_STATE ApcState;
v1 = *(_DWORD *)(a1 + 8);
v2 = *(_QWORD *)(a1 + 16);
v4 = *(_EPROCESS **)(a1 + 24);
v5 = *(_QWORD *)(a1 + 32);
FaultTypeFlags = 0i64;
memset(&ApcState, 0, sizeof(ApcState));
if( v5 && *(_DWORD *)(v5 + 4) < 8u )
PspIumReplenishPartitionPages(v5, 3ui64);
if( v2 >= 0x7FFFFFFF0000i64 )
{
v8 = -1073741819;
}
else
{
VirtualAddress[1] = 4096i64;
VirtualAddress[0] = v2 & 0xFFFFFFFFFFFFF000ui64;
v6 = (_EPROCESS *)*((_QWORD *)KeGetCurrentThread() + 23);
if( v6 != v4 )
KiStackAttachProcess((_KPROCESS *)v4, 0i64, &ApcState);
v7 = FaultTypeFlags;
while( 1 )
{
FaultTypeFlags = v7 & 0xFFFFFFFFFFFFFi64;
v8 = MmVirtualAccessFault(VirtualAddress, (UINT64)&FaultTypeFlags, (UINT64 *)v1);
if( v8 < 0 )
break;
v7 = FaultTypeFlags;
if( (FaultTypeFlags & 0x10000000000000i64) != 0 )
{
*(_QWORD *)(a1 + 16) = FaultTypeFlags & 0xFFFFFFFFFFFFFi64;
break;
}
}
if( v6 != v4 )
KiUnstackDetachProcess(&ApcState, 0i64);
}
result = v8;
*(_QWORD *)(a1 + 8) = v8;
return result;
}Referenced by:
PsDispatchIumService