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