NtMapUserPhysicalPages

NTSTATUS __stdcall NtMapUserPhysicalPages(VOID *VirtualAddress, UINT64 NumberOfPages, UINT64 *UserPfnArray){
  INT64 v3; 
  _ETHREAD *CurrentThread; 
  unsigned __int64 v7; 
  VOID *v8; 
  INT64 v9; 
  char *Pool; 
  int v11; 
  _MMPTE *AweNode; 
  _EX_CALLBACK_ROUTINE_BLOCK *Long; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  __int64 v18; 
  unsigned __int64 v19; 
  _MMPTE *PteAddress; 
  __int64 v21; 
  int v22; 
  VOID *v23; 
  INT64 v24; 
  INT64 *v25; 
  __int64 v26; 
  INT64 a5; 
  INT64 a6; 
  INT64 a7; 
  INT64 v30; 
  VOID *LockHandle; 
  INT64 v32[2]; 
  char Destination[4096]; 

  *(_OWORD *)v32 = 0i64;
  if( NumberOfPages - 1 > 0xFFFFFFFFFFFFEi64 )
    return -1073741584;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v7 = (unsigned __int64)VirtualAddress & 0xFFFFFFFFFFFFF000ui64;
  v8 = 0i64;
  v9 = 0i64;
  Pool = 0i64;
  if( !UserPfnArray )
    goto LABEL_6;
  if( NumberOfPages > 0x200 )
  {
    Pool = (char *)MiAllocatePool(64i64, 8 * NumberOfPages, 0x77526D4Dui64);
    if( !Pool )
      return -1073741670;
  }
  else
  {
    Pool = Destination;
  }
  v11 = MiCaptureUlongPtrArray(Pool, UserPfnArray, NumberOfPages, v3, a5, a6, a7, v30);
  if( v11 >= 0 )
  {
LABEL_6:
    LockHandle = MiLockAweVadsShared(&CurrentThread->Tcb);
    AweNode = MiGetAweNode(v7);
    v9 = (INT64)AweNode;
    if( !AweNode )
      goto LABEL_7;
    Long = (_EX_CALLBACK_ROUTINE_BLOCK *)AweNode[4].u.Long;
    LODWORD(v15) = MiGetAweViewPageSize((INT64)AweNode);
    v17 = v15;
    if( !v15 )
    {
      ExGetCallBackBlockRoutine(Long);
      v17 = v18;
    }
    if( v17 == 1 || (((v17 << 12) - 1) & v7) == 0 )
    {
      v19 = ((v17 * NumberOfPages) << 12) + v7 - 1;
      if( v19 > v7 )
      {
        if( v7 < (*(unsigned int *)(v16 + 24) | ((unsigned __int64)*(unsigned __int8 *)(v16 + 32) << 32)) << 12
          || v19 > (((*(unsigned int *)(v16 + 28) | ((unsigned __int64)*(unsigned __int8 *)(v16 + 33) << 32)) << 12) | 0xFFF) )
        {
          v11 = -1073741585;
        }
        else
        {
          PteAddress = MiGetPteAddress((VOID *)v7);
          if( v21 == 512 )
          {
            do
              PteAddress = MiGetPteAddress(PteAddress);
            while( v22 != 1 );
          }
          LODWORD(v23) = MiLockAwePagesShared((INT64)Long, (INT64)CurrentThread);
          v8 = v23;
          if( !Pool
            || (v11 = MiReferenceIncomingPhysicalPages(
                        Long,
                        (INT64)Pool,
                        NumberOfPages,
                        0i64,
                        (INT64)v32,
                        v9,
                        (INT64)PteAddress),
                v11 >= 0) )
          {
            LODWORD(v24) = MiWriteAwePtes(v9, (INT64)Pool, NumberOfPages, 0i64, (UINT64)PteAddress, 1);
            v32[1] = v24;
            v11 = 0;
          }
        }
        if( v8 )
          MiUnlockAweVadsShared(&CurrentThread->Tcb, v8);
      }
      else
      {
        v11 = -1073741584;
      }
    }
    else
    {
LABEL_7:
      v11 = -1073741585;
    }
    if( LockHandle )
      MiUnlockAweVadsShared(&CurrentThread->Tcb, LockHandle);
  }
  v25 = v32;
  v26 = 2i64;
  do
  {
    if( *v25 )
      MiFreePhysicalPageChain(v9, *v25, 0i64);
    ++v25;
    --v26;
  }
  while( v26 );
  if( UserPfnArray )
  {
    if( Pool != Destination )
      ExFreePoolWithTag(Pool, 0);
  }
  return v11;
}

Referenced by:

No references.