MiUpdateLargePageSectionPfns

NTSTATUS __stdcall MiUpdateLargePageSectionPfns(INT64 a1, INT64 a2, INT64 a3){
  char v3; 
  unsigned __int64 v4; 
  INT64 v6; 
  unsigned __int64 v7; 
  unsigned __int64 v8; 
  __int64 v9; 
  NTSTATUS PfnPageSizeIndex; 
  __int64 v11; 
  unsigned __int64 v12; 
  NTSTATUS result; 
  UINT64 v14; 
  INT64 v15; 
  INT64 v16; 
  unsigned __int64 v17; 
  unsigned __int64 v18; 
  int v19; 
  UINT8 v20; 
  __int64 v21; 
  unsigned __int64 v22; 
  char v23; 
  INT64 v24; 
  INT64 v25; 
  unsigned __int64 v26; 

  v25 = a2;
  v3 = a3;
  v4 = a2;
  LODWORD(a3) = a3 | 0x80000000;
  v6 = (a1 - (__int64)MmGetPfnDb()) / 48;
  LODWORD(v7) = MiMakeValidPte(0i64, v6, a3);
  v8 = v7;
  v9 = MiSwizzleInvalidPte(32i64 * (v3 & 0x1F));
  PfnPageSizeIndex = MiGetPfnPageSizeIndex(a1);
  v11 = -1i64;
  v26 = v4 + 8 * MiLargePageSizes[PfnPageSizeIndex];
  v12 = v26;
  result = MiConvertEntireLargePageToSmall((_KQUEUE *)a1, PfnPageSizeIndex, 0, (_LARGE_INTEGER *)1, 0i64, 0i64);
  v14 = v4;
  if( v4 < v12 )
  {
    v15 = a1 + 24;
    do
    {
      if( v11 == -1 || (v14 & 0xFFF) == 0 )
      {
        LODWORD(v16) = MI_READ_PTE_LOCK_FREE((INT64)MmGetPteBase() + ((v4 >> 9) & 0x7FFFFFFFF8i64));
        v24 = v16;
        LODWORD(v17) = MI_READ_PTE_LOCK_FREE((INT64)&v24);
        v11 = (v17 >> 12) & 0xFFFFFFFFFi64;
      }
      v8 ^= (v8 ^ (v6 << 12)) & 0xFFFFFFFFF000i64;
      v18 = v8;
      LOBYTE(v19) = MiPteInShadowRange(v14);
      if( v19 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v8 & 1) != 0 )
        v18 = v8 | 0x8000000000000000ui64;
      *(_QWORD *)v14 = v18;
      v20 = MiLockPageInline((_MMPFN *)(v15 - 24));
      MiSetPfnTbFlushStamp((_MMPFN *)(v15 - 24), 0i64, 1ui64);
      MiSetPfnNodeBlinkHigh((_MMPFN *)(v15 - 24), 0i64, 1ui64);
      v21 = *(_QWORD *)(v15 + 16);
      v22 = *(_QWORD *)v15 & 0xC000000000000001ui64;
      *(_QWORD *)(v15 - 24) = 0i64;
      *(_QWORD *)v15 = v22 | 1;
      *(_WORD *)(v15 + 8) = 2;
      *(_QWORD *)(v15 - 8) = v9;
      *(_QWORD *)(v15 - 16) = v14;
      v23 = *(_BYTE *)(v15 + 10);
      *(_QWORD *)(v15 + 16) = v11 & 0xFFFFFFFFFi64 | v21 & 0xFFFFFFF000000000ui64 | 0x8000000000000000ui64;
      *(_BYTE *)(v15 + 10) = v23 & 0xF8 | 6;
      MiUnlockPage((_MMPFN *)(v15 - 24), v20);
      v4 = v25;
      ++v6;
      v15 += 48i64;
      v14 += 8i64;
    }
    while( v14 < v26 );
  }
  return result;
}

Referenced by:

MiCreatePagingFileMap