MiDemoteValidLargePageOneLevel

INT64 __fastcall MiDemoteValidLargePageOneLevel(UINT64 Va){
  unsigned int v2; 
  UINT64 v3; 
  _MMPTE *PteBase; 
  unsigned __int64 v5; 
  __int64 v6; 
  __int16 v7; 
  unsigned __int64 v8; 
  void *v9; 
  __int64 v10; 
  INT64 v12; 
  __int64 v13; 
  unsigned __int64 v14; 
  INT64 v15; 
  INT64 v16; 
  void *v17; 
  INT64 *v18; 
  INT64 v19; 
  unsigned int v20; 
  unsigned int v21; 
  INT64 v22; 
  INT64 v23; 
  INT64 v24; 
  UINT64 v25; 
  INT64 v26; 
  INT64 v27; 
  char *v28; 
  UINT64 v29; 
  __int64 v30; 
  __int64 v31; 
  INT64 i; 
  INT64 v33; 
  INT64 v34; 
  UINT64 BitsMustBeChanged; 
  UINT8 OldIrql[8]; 
  INT64 ValidPte; 
  INT64 v38; 
  unsigned int v39; 
  int v40; 
  UINT64 SpinCount; 
  UINT64 PageFrameIndex; 
  INT64 v43; 
  PVOID VirtualAddress; 
  INT64 a2; 
  UINT64 ContainingPageFrame; 
  __int64 v47; 
  INT64 v48[7]; 
  int v49; 
  INT64 v50[4]; 
  INT64 result; 
  int v52; 
  __int64 v53; 
  v38 = 0i64;
  OldIrql[0] = 0;
  memset((INT64)&result, 0i64);
  memset((INT64)v48, 0i64);
  v52 = 20;
  v53 = 0i64;
  v39 = MI_IS_PHYSICAL_ADDRESS((PVOID)Va);
  v2 = v39;
  v3 = (UINT64)MmGetPdeBase() + ((Va >> 18) & 0x3FFFFFF8);
  PteBase = MmGetPteBase();
  v5 = 0x200000i64;
  if( v39 != 1 )
  {
    v6 = v39 - 1;
    do
    {
      v3 = (UINT64)PteBase + ((v3 >> 9) & 0x7FFFFFFFF8i64);
      v5 <<= 9;
      --v6;
    }
    while( v6 );
  }
  v43 = MI_READ_PTE_LOCK_FREE(v3);
  v7 = v43;
  v8 = MI_READ_PTE_LOCK_FREE((INT64)&v43);
  v49 = 4;
  v9 = (void *)((v8 >> 12) & 0xFFFFFFFFFi64);
  v48[4] = (INT64)&MiSystemPartition;
  a2 = (INT64)v9;
  LODWORD(v10) = MiSearchNumaNodeTable(v9);
  MiInitializeColorBase(Va, (unsigned int)(*(_DWORD *)(v10 + 8) + 1), (INT64)v50);
  if( (int)MiGetPageTablePages((__int64)v48, 1ui64, &v38) < 0 )
    return 0i64;
  v12 = v38;
  *(_QWORD *)v38 = 0i64;
  v13 = (v12 - (__int64)MmGetPfnDb()) / 48;
  PageFrameIndex = v13;
  ValidPte = MI_READ_PTE_LOCK_FREE((INT64)MmGetPteBase() + ((v3 >> 9) & 0x7FFFFFFFF8i64));
  v14 = MI_READ_PTE_LOCK_FREE((INT64)&ValidPte);
  v15 = 2147483652i64;
  ContainingPageFrame = (v14 >> 12) & 0xFFFFFFFFFi64;
  if( (v7 & 0x100) != 0 && v2 == 1 )
    v15 = 2684354564i64;
  v47 = (v3 << 25) - ((_QWORD)MmGetPteBase() << 25);
  ValidPte = MiMakeValidPte(v47 >> 16, (INT64)v9, v15);
  v16 = ValidPte;
  LODWORD(v17) = MiMapPageInHyperSpaceWorker(v13, OldIrql, 0x80000000ui64);
  VirtualAddress = v17;
  v18 = (INT64 *)v17;
  v19 = v16;
  do
  {
    *(_DWORD *)&OldIrql[4] = 0;
    *v18++ = v19;
    v16 ^= (v16 ^ ((v16 & 0xFFFFFFFFFFFFF000ui64) + 4096)) & 0xFFFFFFFFF000i64;
    ValidPte = v16;
    v19 = v16;
  }
  while( ((unsigned __int16)v18 & 0xFFF) != 0 );
  MiUnmapPageInHyperSpaceWorker(VirtualAddress, OldIrql[0], 0x80000000ui64);
  v20 = v39;
  v21 = -2080374780;
  v22 = a2;
  if( v39 == 1 )
    v21 = -2147483644;
  v23 = v21;
  LODWORD(v23) = v21 | 0x20000000;
  if( (v43 & 0x100) == 0 )
    v23 = v21;
  LODWORD(v23) = v23 | 0x8000000;
  v24 = MiMakeValidPte(v3, a2, v23);
  v25 = PageFrameIndex;
  ValidPte = v24;
  MiInitializePfnForOtherProcess(PageFrameIndex, (MMPTE *)v3, ContainingPageFrame, 0xA00ui64);
  v40 = 0;
  v26 = v38;
  while( _interlockedbittestandset64((volatile signed __int32 *)(v26 + 24), 0x3Fui64) )
  {
    do
      KeYieldProcessorEx((UINT64 *)&v40);
    while( *(__int64 *)(v26 + 24) < 0 );
  }
  *(_QWORD *)(v26 + 24) ^= (*(_QWORD *)(v26 + 24) ^ (*(_QWORD *)(v26 + 24) + 512i64)) & 0x3FFFFFFFFFFFFFFFi64;
  _InterlockedAnd64((volatile signed __int64 *)(v26 + 24), 0x7FFFFFFFFFFFFFFFui64);
  PageFrameIndex = v25 & 0xFFFFFFFFFi64;
  ValidPte = ((v25 & 0xFFFFFFFFFi64) << 12) | ValidPte & 0xFFFF000000000FFFui64;
  MiTransformValidPteInPlace((volatile INT64 *)v3, v3, ValidPte, v20);
  if( v20 == 3 )
    MiInsertLargeTbFlushEntry((INT64)&result, 3ui64, v3);
  v28 = (char *)MmGetPfnDb() + 48 * v22;
  v29 = PageFrameIndex;
  v30 = (v47 + 0x10000000) >> 16;
  v31 = 512i64;
  for( i = (INT64)(v28 + 24576); ; i = v38 )
  {
    v33 = i - 48;
    v30 -= 8i64;
    LODWORD(SpinCount) = 0;
    v38 = v33;
    while( _interlockedbittestandset64((volatile signed __int32 *)(v33 + 24), 0x3Fui64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( *(__int64 *)(v33 + 24) < 0 );
    }
    v34 = v38;
    if( (*(_BYTE *)(v38 + 35) & 0x10) == 0 )
    {
      if( (*(_QWORD *)(v38 + 40) & 0x1000000000i64) != 0 )
        MiConvertLargePfnToSmall((INT64)v28, v38, v27, 0i64);
      *(_QWORD *)(v34 + 8) = v30;
      *(_QWORD *)(v34 + 40) = v29 | *(_QWORD *)(v34 + 40) & 0xFFFFFFF000000000ui64;
    }
    _InterlockedAnd64((volatile signed __int64 *)(v34 + 24), 0x7FFFFFFFFFFFFFFFui64);
    if( !--v31 )
      break;
  }
  if( v39 == 1 )
  {
    LODWORD(BitsMustBeChanged) = 1;
    MiUpdateLargePageBitMap((UINT64)&MiSystemPartition, v22, v5 >> 12, 0i64, BitsMustBeChanged);
  }
  MiFlushTbList((__int64)&result);
  return 1i64;
}

Referenced by:

MiPfnRangeIsZero