MiZeroLargePage

VOID __stdcall MiZeroLargePage(_MI_ZERO_THREAD_CONTEXT *ThreadContext){
  unsigned int v1; 
  _MI_PFN_CACHE_ATTRIBUTE v2; 
  _MI_PFN_CACHE_ATTRIBUTE v3; 
  unsigned int v4; 
  __int64 v5; 
  unsigned __int64 v6; 
  unsigned __int64 v7; 
  int v8; 
  int v9; 
  unsigned __int64 v10; 
  _MMPTE *v11; 
  _MMPTE *v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  _MMPTE *v15; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  unsigned __int64 v18; 
  int v19; 
  _KTBFLUSH_TYPE v20; 
  unsigned __int64 v21; 
  VOID *v22; 
  UINT64 v23; 
  _MMPTE *PteBase; 
  __int64 v25; 
  __int64 v26; 
  __int64 v27; 
  int v28; 
  int v29; 
  unsigned __int64 Long; 
  _MMPTE *v31; 
  INT64 v32[16]; 

  v3 = v2;
  v4 = v1;
  v5 = v1;
  v6 = ((char *)ThreadContext - (char *)MmGetPfnDb()) / 48;
  v7 = MiLargePageSizes[v1];
  if( v6 <= 0xFFFFFFFFFi64 && (((unsigned __int64)MmGetPfnDb()[v6].u4._bf_0 >> 50) & 1) != 0 )
  {
    MiMakeProtectionPfnCompatible((_BYTE *)4, (_MMPFN *)ThreadContext);
    v9 = v8;
  }
  else
  {
    v9 = 4;
  }
  v10 = 0i64;
  if( v4 <= 1
    && (memset(v32, 0i64, sizeof(v32)), MiCreateUltraThreadContext((INT64)v32, 0i64, 2 - (unsigned int)(v4 == 0))) )
  {
    MiGetUltraMapping((_MI_ZERO_THREAD_CONTEXT *)&v32[4 * v5], v4);
    v22 = (VOID *)v21;
    v23 = (UINT64)MmGetPdeBase() + ((v21 >> 18) & 0x3FFFFFF8);
    if( !v4 )
    {
      PteBase = MmGetPteBase();
      v25 = 1i64;
      do
      {
        v23 = (UINT64)PteBase + ((v23 >> 9) & 0x7FFFFFFFF8i64);
        --v25;
      }
      while( v25 );
    }
    LODWORD(v26) = MiMakeValidPte((_XSTATE_CONFIGURATION *)v23, v6, v9 | 0xA4000000);
    v27 = v26;
    LOBYTE(v28) = MiPteInShadowRange(v23);
    v29 = v28;
    if( v28 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v27 & 1) != 0 )
      v27 |= 0x8000000000000000ui64;
    *(_QWORD *)v23 = v27;
    KeZeroPages(v22, v7 << 12);
    Long = ZeroPte.u.Long;
    if( v29 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
      Long = ZeroPte.u.Long | 0x8000000000000000ui64;
    *(_QWORD *)v23 = Long;
    MiDeleteUltraThreadContext((INT64)v32);
  }
  else
  {
    v11 = MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), (unsigned int)v7);
    v31 = v11;
    v12 = v11;
    if( v11 )
    {
      LODWORD(v13) = MiMakeValidPte((_XSTATE_CONFIGURATION *)v11, v6, v9 | 0xA0000000);
      v14 = v13;
      if( v7 )
      {
        v15 = v12;
        v16 = v6 << 12;
        v17 = v7;
        do
        {
          v14 ^= (v14 ^ v16) & 0xFFFFFFFFF000i64;
          v18 = v14;
          LOBYTE(v19) = MiPteInShadowRange((UINT64)v15);
          if( v19 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v14 & 1) != 0 )
            v18 = v14 | 0x8000000000000000ui64;
          v15->u.Long = v18;
          v16 += 4096i64;
          ++v15;
          --v17;
        }
        while( v17 );
        v12 = v31;
      }
      KeZeroPages((VOID *)((__int64)(((_QWORD)v12 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16), v7 << 12);
      MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), v12, (unsigned int)v7, v20);
    }
    else if( v7 )
    {
      do
        MiZeroPhysicalPage(v6 + v10++, 0i64, v3);
      while( v10 < v7 );
    }
  }
}

Referenced by:

MiAllocateLargeZeroPages
MiAllocatePartitionPhysicalPages
MiGetLargePage
MiZeroAndConvertPage