MiFillSystemPtes

NTSTATUS __stdcall MiFillSystemPtes(UINT64 PointerPte, UINT64 NumberOfPages, INT64 a3, UINT64 a4, INT64 a5, INT64 a6){
  void *BugCheckParameter4; 
  unsigned int v8; 
  int v9; 
  UINT64 v11; 
  UINT64 PteBase; 
  unsigned __int64 v13; 
  _MMPTE *PteLimit; 
  unsigned __int64 v15; 
  NTSTATUS v16; 
  __int64 v17; 
  unsigned __int64 v18; 
  int v19; 
  unsigned __int64 v20; 
  __int64 v21; 
  unsigned __int64 v22; 
  UINT64 v23; 
  unsigned __int16 v24; 
  unsigned __int64 v25; 
  __int64 v26; 
  unsigned __int64 v27; 
  unsigned __int64 v28; 
  __int64 v29; 
  UINT8 v30; 
  union {$8D9ED47C9F2F2CD645B633E301950288 __s0;unsigned __int64 EntireField;} *p_u4; 
  INT64 v32; 
  _MMPFN *PfnDb; 
  unsigned __int64 v34; 
  int v35; 
  UINT64 *v36; 
  INT64 v37; 
  _UNICODE_STRING *v38; 
  int v39; 
  int v40; 
  int v41; 
  _MMPFN *v42; 
  int v43; 
  __int64 v44; 
  NTSTATUS v45; 
  unsigned __int64 v46; 
  unsigned __int64 v48; 
  char v49; 
  unsigned __int8 v50; 
  __int64 v51; 
  unsigned int v52; 
  unsigned int v53; 
  INT64 v54; 
  int v55; 
  INT64 v56; 
  _RTL_BALANCED_NODE *v57; 
  INT64 a3a; 
  _RTL_BALANCED_NODE *v59; 
  INT64 v60; 
  _RTL_BALANCED_NODE *v61; 
  unsigned __int64 v62; 
  int NewCacheAttribute; 
  INT64 a2; 
  unsigned __int16 v66; 

  BugCheckParameter4 = 0i64;
  v61 = 0i64;
  v8 = a4;
  v59 = 0i64;
  v9 = 1;
  NewCacheAttribute = 1;
  *(_DWORD *)a6 = 0;
  v11 = NumberOfPages;
  if( (_DWORD)a4 )
  {
    if( (_DWORD)a4 != 31 )
    {
      if( (unsigned int)a4 >> 3 == 3 )
      {
        if( (a4 & 7) != 0 )
          NewCacheAttribute = 2;
        goto LABEL_10;
      }
      if( (unsigned int)a4 >> 3 == 1 )
        v9 = 0;
    }
    NewCacheAttribute = v9;
  }
  else
  {
    NewCacheAttribute = 3;
  }
LABEL_10:
  PteBase = (UINT64)MmGetPteBase();
  v13 = MmProtectToPteMask[a4 & 0x1F] & 0xFFFF000000000E5Eui64 | 0x21;
  PteLimit = MmGetPteLimit();
  if( PointerPte < PteBase || PointerPte > (unsigned __int64)PteLimit )
  {
    v20 = MmProtectToPteMask[a4 & 0x1F] & 0xFFFF000000000E5Eui64 | 0x121;
  }
  else
  {
    v15 = (__int64)((PointerPte << 25) - (PteBase << 25)) >> 16;
    if( PointerPte >= (unsigned __int64)MmGetPdeBase() && PointerPte <= (unsigned __int64)MmGetPdeLimit() )
    {
      if( (_MMPTE *)PointerPte == MmGetPxeSelfRef() )
      {
        v13 = MmProtectToPteMask[a4 & 0x1F] & 0x7FFF000000000E5Ei64 | 0x8000000000000021ui64;
      }
      else if( (a4 & 0x4000000) == 0 )
      {
        v13 = MmProtectToPteMask[a4 & 0x1F] & 0x7FFF000000000E5Ei64 | 0x21;
      }
      v16 = MiUserPdeOrAbove(PointerPte);
      v11 = NumberOfPages;
      if( v16 )
        v13 |= 4ui64;
      BugCheckParameter4 = 0i64;
    }
    v17 = v13 | 4;
    if( PointerPte > PteBase + 0x3FFFFFFF78i64 )
      v17 = v13;
    if( (v8 & 0x4000000) != 0 )
    {
      LODWORD(v18) = MiGetLeafVa((__int64)((PointerPte << 25) - (PteBase << 25)) >> 16);
      v15 = v18;
    }
    if( v15 >= 0xFFFF800000000000ui64 )
    {
      if( *((_BYTE *)&stru_140C4DB30 + ((v15 >> 39) & 0x1FF) + 6872) == 1 )
      {
        v19 = (int)BugCheckParameter4;
      }
      else if( v15 < PteBase || v15 > (unsigned __int64)MmGetPteLimit() )
      {
        if( v15 < *(&stru_140C4DB30 + 937) || (v19 = *(&stru_140C4DB30 + 537), v15 > *(&stru_140C4DB30 + 175)) )
          v19 = *(&stru_140C4DB30 + 536);
      }
      else
      {
        v19 = (int)BugCheckParameter4;
      }
    }
    else
    {
      v19 = *(&stru_140C4DB30 + 537);
    }
    v20 = v17 | 0x100;
    if( !v19 )
      v20 = v17;
  }
  v60 = (INT64)BugCheckParameter4;
  v21 = v20 | 0x42;
  v22 = (unsigned __int64)BugCheckParameter4;
  v23 = v11;
  if( (v8 & 5) != 4 )
    v21 = v20;
  v24 = v21 & 0xFFFB;
  if( (v8 & 0x40000000) == 0 )
    v24 = v21;
  v25 = v21 & 0xFFFFFFFFFFFFFFFBui64;
  v26 = ((unsigned __int16)(*(&stru_140C4DB30 + 536) << 8) ^ v24) & 0x100;
  if( (v8 & 0x40000000) == 0 )
    v25 = v21;
  v27 = v25 ^ v26;
  v28 = v27 & 0xFFFFFFFFFFFFFEFFui64;
  if( (v8 & 0x8000000) == 0 )
    v28 = v27;
  v29 = v28 | 0x80;
  if( (v8 & 0x4000000) == 0 )
    v29 = v28;
  v62 = v29 & 0xFAFFFFFFFFFFFFFFui64;
  if( !v11 )
    return 0;
  v30 = a5;
  p_u4 = &MmGetPfnDb()->u4;
  v32 = a3 - 8;
  PfnDb = MmGetPfnDb();
  v34 = (unsigned __int64)BugCheckParameter4;
  if( a3 >= 0 )
    v34 = a3 - 1;
  if( a3 >= 0 )
    v32 = (INT64)BugCheckParameter4;
  v35 = a5 & 4;
  HIDWORD(a3a) = v35;
  while( 1 )
  {
    if( v32 )
      v34 = *(_QWORD *)(v32 + 8);
    else
      ++v34;
    v36 = (UINT64 *)(v32 + 8);
    if( !v32 )
      v36 = 0i64;
    v32 = (INT64)v36;
    if( v35 && v34 == *(&stru_140C4DB30 + 497) )
      goto LABEL_114;
    if( v34 > 0xFFFFFFFFFi64 || (((unsigned __int64)p_u4[6 * v34]._bf_0 >> 50) & 1) == 0 )
    {
      if( v22 || (v22 = (unsigned __int64)MiIoSpaceRunIsConstant(v34, v36, v23)) != 0 )
      {
        if( v22 > 1 )
        {
          v55 = *(_DWORD *)(v22 + 40);
LABEL_107:
          v8 &= 7u;
          if( v55 )
          {
            if( v55 == 2 )
              v8 |= 0x18u;
          }
          else
          {
            v8 |= 8u;
          }
          v53 = v8;
          goto LABEL_112;
        }
      }
      else
      {
        v22 = 1i64;
      }
      v54 = v60;
      if( v60 )
      {
        v57 = v61;
      }
      else
      {
        if( v32 )
        {
          v54 = 1i64;
        }
        else
        {
          LODWORD(v56) = MiIoPagesInRun(v34, v23);
          v54 = v56;
        }
        v45 = MiReferenceIoPages(1u, v34, v54, NewCacheAttribute, 0i64, &v59);
        if( v45 < 0 )
          goto LABEL_77;
        *(_DWORD *)a6 |= 1u;
        v57 = v59;
      }
      v60 = v54 - 1;
      v66 = *((_WORD *)v57[2].Children[0]->Children + (v34 & 0xFFFFFFFFFi64) - v57[1].ParentValue);
      v61 = v59;
      v55 = v66 >> 14;
      goto LABEL_107;
    }
    v37 = (INT64)&PfnDb[v34];
    v38 = (_UNICODE_STRING *)(v30 & 2);
    if( (v30 & 2) != 0 )
    {
      if( (*(_BYTE *)(v37 + 34) & 7) != 5 || (LOBYTE(v39) = MiIsPfnFileOnly((INT64)&PfnDb[v34]), !v39) )
        KeBugCheckEx(0x1Au, (PVOID)0x1160C, (PVOID)v34, 0i64, BugCheckParameter4);
    }
    if( !*(_WORD *)(v37 + 32) )
    {
      if( !(_DWORD)v38 || (*(_BYTE *)(v37 + 34) & 7) != 5 || (LOBYTE(v40) = MiIsPfnFileOnly(v37), !v40) )
        MiShowBadMapper(v34, 5ui64);
    }
    LOBYTE(v41) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v37, v38, v30, (PWCHAR)p_u4);
    if( v41 )
      goto LABEL_89;
    v44 = *(_QWORD *)(v37 + 40);
    if( (v44 & 0x1000000000i64) == 0 )
      break;
    LODWORD(a2) = v43;
    LODWORD(a3a) = v43;
    if( MiGetPfnPageSizeIndexUnsynchronized(v42, &a2, &a3a) == 3 || (_DWORD)a2 != 6 )
    {
      v45 = -1073741800;
LABEL_77:
      v46 = (unsigned __int64)MmGetPteBase();
      goto LABEL_78;
    }
LABEL_89:
    v50 = *(_BYTE *)(v37 + 34);
    if( (v50 & 0xC0) == 0xC0 )
    {
      MiAssignInitialPageAttribute((_MMPFN *)v37, (_MI_PFN_CACHE_ATTRIBUTE)NewCacheAttribute);
      v50 = *(_BYTE *)(v37 + 34);
    }
    if( NewCacheAttribute != v50 >> 6 )
    {
      MiMakeProtectionPfnCompatible((_BYTE *)v8, (_MMPFN *)v37);
      v8 = v52;
      v53 = v52;
LABEL_112:
      LODWORD(v51) = MiMakeValidPte((_XSTATE_CONFIGURATION *)PointerPte, v34, v53 | 0xA0000000);
      goto LABEL_113;
    }
    v51 = v62 | ((v34 & 0xFFFFFFFFFi64 | 0xA00000000000i64) << 12);
LABEL_113:
    v35 = HIDWORD(a3a);
    BugCheckParameter4 = 0i64;
    v30 = a5;
    *(_QWORD *)PointerPte = v51;
    p_u4 = &MmGetPfnDb()->u4;
    PfnDb = MmGetPfnDb();
LABEL_114:
    PointerPte += 8i64;
    if( !--v23 )
      return 0;
  }
  v46 = (unsigned __int64)MmGetPteBase();
  v48 = (__int64)((*(_QWORD *)(v37 + 8) << 25) - (v46 << 25)) >> 16;
  if( v48 < v46 )
    goto LABEL_89;
  if( v48 > (unsigned __int64)MmGetPteLimit() )
    goto LABEL_89;
  if( (v44 & 0xFFFFFFFFFi64) == 0xFFFFFFFFDi64 )
    goto LABEL_89;
  v49 = *(_BYTE *)(v37 + 34);
  if( (v49 & 0x20) != 0 && (*(_QWORD *)(v37 + 24) & 0x3FFFFFFFFFFFFFFFi64) == 0 && *(_WORD *)(v37 + 32) )
    goto LABEL_89;
  if( (v49 & 8) != 0 || ((*(_QWORD *)v37 >> 13) & 0x7FFFFFFFFFF0i64 | 0xFFFF800000000000ui64) == 0xFFFF800000000030ui64 )
    goto LABEL_89;
  v45 = -1073741800;
LABEL_78:
  if( (*(_DWORD *)a6 & 1) != 0 )
    MiZeroAndFlushPtes(
      (VOID *)((__int64)((PointerPte << 25) + ((v23 - NumberOfPages) << 28) - (v46 << 25)) >> 16),
      NumberOfPages - v23);
  return v45;
}

Referenced by:

MiLockAndMapEntireDriver
MiMapContiguousMemory
MiMapHotPatchImageInSystemSpace
MmMapLockedPagesSpecifyCache
MmMapMdl