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