MiMapSinglePage

VOID *__stdcall MiMapSinglePage(VOID *VirtualAddress, UINT64 PageFrameIndex, UINT64 Priority){
  char v3; 
  char v4; 
  int v5; 
  UINT64 v7; 
  VOID *result; 
  _XSTATE_CONFIGURATION *v9; 
  _MMPFN *v10; 
  _BYTE *v11; 
  int v12; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v13; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v14; 
  int v15; 
  __int64 v16; 
  unsigned __int64 Long; 
  int v18; 

  v4 = v3;
  v5 = Priority;
  v7 = (UINT64)VirtualAddress;
  if( VirtualAddress )
  {
    v9 = (_XSTATE_CONFIGURATION *)((char *)MmGetPteBase() + (((unsigned __int64)VirtualAddress >> 9) & 0x7FFFFFFFF8i64));
    LODWORD(v16) = MI_READ_PTE_LOCK_FREE((INT64)v9);
    if( v16 )
    {
      Long = ZeroPte.u.Long;
      LOBYTE(v18) = MiPteInShadowRange((UINT64)v9);
      if( v18 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
        Long = ZeroPte.u.Long | 0x8000000000000000ui64;
      v9->EnabledFeatures = Long;
      KeFlushSingleTb(v7, FlushKernel, 1i64);
    }
LABEL_4:
    v10 = &MmGetPfnDb()[PageFrameIndex];
    v11 = (_BYTE *)((((v5 >> 31) & 0xFFFFFFFD) + 4) | 2);
    if( (v5 & 0x40000000) != 0 )
      v11 = (_BYTE *)(((v5 >> 31) & 0xFFFFFFFD) + 4);
    MiMakeProtectionPfnCompatible(v11, v10);
    LODWORD(v13.Long) = MiMakeValidPte(v9, PageFrameIndex, v12 | 0xA0000000);
    v14.Long = v13.Long;
    goto LABEL_7;
  }
  result = MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), 1ui64);
  v9 = (_XSTATE_CONFIGURATION *)result;
  if( !result )
    return result;
  v7 = (__int64)(((_QWORD)result << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
  if( (v4 & 2) == 0 )
    goto LABEL_4;
  v14.Long = ZeroPte.u.Long;
LABEL_7:
  LOBYTE(v15) = MiPteInShadowRange((UINT64)v9);
  if( v15 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v14.Long & 1) != 0 )
    v14.Long |= 0x8000000000000000ui64;
  v9->EnabledFeatures = v14.Long;
  return(VOID *)v7;
}

Referenced by:

MiFillCombinePage
MiInitializeForkMaps
MiUpdateForkMaps