MiResolvePrivateZeroFault

NTSTATUS __stdcall MiResolvePrivateZeroFault(_MI_ZERO_FAULT_PACKET *ZeroPacket){
  _MI_ZERO_FAULT_PACKET v1; 
  _MI_ZERO_FAULT_PACKET *v2; 
  unsigned __int64 v3; 
  _MI_FAULT_VA_LIST *v4; 
  unsigned int v5; 
  __int64 v7; 
  _MMSUPPORT_INSTANCE *v8; 
  _ETHREAD *ForkInProgress; 
  unsigned int v10; 
  _MMVAD *v11; 
  unsigned int v12; 
  char *v13; 
  _MMPFN *PageChain; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  int v17; 
  int v18; 
  __int64 v19; 
  union {unsigned int LongFlags;_MMVAD_FLAGS VadFlags;_MM_PRIVATE_VAD_FLAGS PrivateVadFlags;_MM_GRAPHICS_VAD_FLAGS GraphicsVadFlags;_MM_SHARED_VAD_FLAGS SharedVadFlags;volatile unsigned int VolatileVadLong;} v20; 
  _MMPFN *ClusterPage; 
  unsigned __int64 v22; 
  unsigned __int64 v23; 
  char *v24; 
  unsigned __int64 v25; 
  UINT64 i; 
  _MI_ZERO_FAULT_PACKET v27; 
  _QWORD *v28; 
  bool v29; 
  unsigned __int64 v30; 
  int v31; 
  _MI_PFN_CACHE_ATTRIBUTE v32; 
  unsigned int v33; 
  _KQUEUE *LargePage; 
  __int64 v35; 
  PVOID *v36; 
  unsigned int v37; 
  UINT8 *SuboptimalPage; 
  _MMSUPPORT_INSTANCE *Vm; 
  UINT64 NumberOfPages; 
  __int64 v41; 
  INT64 v42; 
  _MI_COLOR_BASE ColorBase[4]; 
  __int64 v44[2]; 
  _MI_FAULT_VA_LIST FaultHead[4]; 
  __int128 v46; 
  __int128 v47; 
  __int128 v48; 
  __int128 v49; 
  __int128 v50; 
  int v52; 
  _MMPFN *v53; 
  _KQUEUE *v54; 

  v1 = *ZeroPacket;
  v2 = ZeroPacket;
  v3 = *((_QWORD *)ZeroPacket + 2);
  v4 = (_MI_FAULT_VA_LIST *)*((_QWORD *)ZeroPacket + 7);
  if( (*ZeroPacket & 2) != 0 )
  {
    v5 = ZeroPacket[8];
    if( v5 >> 3 == 3 )
    {
      if( (v5 & 7) == 0 )
      {
LABEL_4:
        MiAdvanceFaultList(*((_MI_FAULT_VA_LIST **)ZeroPacket + 7));
        return 0;
      }
    }
    else if( v5 >> 3 != 1 )
    {
      goto LABEL_4;
    }
    if( (v1 & 4) == 0 )
      goto LABEL_4;
  }
  if( (v1 & 8) != 0 && (v4[14] & 8) != 0 )
    return -1073741801;
  v7 = *((_QWORD *)ZeroPacket + 1);
  v8 = *(_MMSUPPORT_INSTANCE **)(v7 + 56);
  Vm = v8;
  v42 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8i64 * v8->PartitionId);
  if( (v1 & 0x40) != 0 )
  {
    ForkInProgress = KeGetCurrentThread()->ApcState.Process->ForkInProgress;
    if( ForkInProgress )
    {
      if( ForkInProgress != (_ETHREAD *)KeGetCurrentThread() )
      {
        *(_DWORD *)(v7 + 80) |= 4u;
        return 0;
      }
    }
  }
  v10 = 1;
  NumberOfPages = 1i64;
  v41 = -1i64;
  v11 = (_MMVAD *)*((_QWORD *)ZeroPacket + 8);
  v12 = ZeroPacket[12];
  v13 = (char *)MmGetPteBase() + ((v3 >> 9) & 0x7FFFFFFFF8i64);
  v52 = 0;
  PageChain = 0i64;
  v53 = 0i64;
  if( v11 )
  {
    v18 = v1 & 0x15;
    if( v18 )
    {
      LODWORD(v19) = MiComputeZeroClusterMaximum(v4, (_MMVAD *)v8);
      PageChain = 0i64;
      v8 = Vm;
      v41 = v19;
      v52 = 1;
    }
    v20.LongFlags = (unsigned int)v11->Core.u;
    v12 = (v20.LongFlags >> 12) & 0x3F;
    if( (v20.LongFlags & 0x100000) != 0 && MiVadPageSizes[(v20.LongFlags >> 18) & 3] == 16 )
    {
      LODWORD(SuboptimalPage) = v2[9];
      ClusterPage = MiGetClusterPage(v11, (VOID *)v3, 0x10ui64, (unsigned int)v2[8], SuboptimalPage);
      v53 = ClusterPage;
      PageChain = ClusterPage;
      if( ClusterPage && (ClusterPage->u2._bf_0 & 0xFFFFFFFFFi64) != 0xFFFFFFFFFi64 )
      {
        v22 = v3 & 0xFFFFFFFFFFFF0000ui64;
        NumberOfPages = 16i64;
        *((_QWORD *)v2 + 2) = v22;
        v13 = (char *)MmGetPteBase() + ((v22 >> 9) & 0x7FFFFFFFF8i64);
      }
    }
    else if( !v18
           && ((unsigned __int8)v13 & 0x7F) == 0
           && (v11->Core.u.LongFlags & 0x100000) != 0
           && (v20.LongFlags & 0x300000) != 3145728
           && !v2[9]
           && v3 >= ((v11->Core.StartingVpn | ((unsigned __int64)v11->Core.StartingVpnHigh << 32)) + 16) << 12
           && ((unsigned __int16)v13 & 0xFFF) != 0
           && (v3 < (unsigned __int64)MmGetPteBase() || v3 > (unsigned __int64)MmGetPteLimit()) )
    {
      v23 = 0i64;
      v24 = v13 - 8;
      do
      {
        if( (*(_QWORD *)v24 & 1) == 0 )
          break;
        if( (*(_QWORD *)v24 & 0x20) == 0 )
          break;
        ++v23;
        v24 -= 8;
      }
      while( v23 < 0x10 );
      v2 = ZeroPacket;
      if( v23 == 16 )
      {
        v44[1] = 0x10000i64;
        v46 = 1ui64;
        *(_QWORD *)FaultHead = 0i64;
        *(_QWORD *)&FaultHead[2] = v44;
        v47 = 0ui64;
        v48 = 0i64;
        v44[0] = v3 & 0xFFFFFFFFFFFFF000ui64;
        v49 = 0i64;
        v50 = 0i64;
        LODWORD(v25) = MiComputeZeroClusterMaximum(FaultHead, (_MMVAD *)v8);
        if( v25 >= 0x10 )
        {
          v17 = 2;
          v16 = 16i64;
LABEL_48:
          v27 = v2[9];
          v28 = v13 + 8;
          for( i = 1i64; i < v16; ++i )
          {
            if( v27 )
            {
              IS_PTE_NOT_DEMAND_ZERO();
              if( v31 )
                break;
              v29 = v27 == ((v30 >> 5) & 0x1F);
            }
            else
            {
              v29 = *v28 == 0i64;
            }
            if( !v29 )
              break;
            ++v28;
          }
          v2 = ZeroPacket;
          v10 = 1;
LABEL_56:
          if( v17 == 2 )
          {
            if( i == v16 )
            {
              *(_OWORD *)ColorBase = 0i64;
              MiInitializePageColorBase(Vm, v12, ColorBase);
              _InterlockedExchangeAdd(*(volatile signed __int32 **)ColorBase, 1u);
              v32 = MiProtectionToCacheAttribute((unsigned int)v2[8]);
              LargePage = (_KQUEUE *)MiGetLargePage(v42, 2u, v32, v33, 4, 0i64);
              v54 = LargePage;
              PageChain = (_MMPFN *)LargePage;
              if( LargePage )
              {
                *v2 |= 0x80u;
                MiConvertEntireLargePageToSmall(LargePage, 2, 2u, (_LARGE_INTEGER *)1, 0i64, 0i64);
                PageChain = (_MMPFN *)v54;
                NumberOfPages = i;
LABEL_64:
                v8 = Vm;
                goto LABEL_65;
              }
LABEL_62:
              NumberOfPages = i;
              goto LABEL_64;
            }
            i = 1i64;
          }
          PageChain = v53;
          goto LABEL_62;
        }
        goto LABEL_63;
      }
      PageChain = 0i64;
    }
    v17 = v52;
    if( !v52 || PageChain )
      goto LABEL_64;
    v16 = v41;
LABEL_47:
    i = 1i64;
    if( v16 <= 1 )
      goto LABEL_56;
    goto LABEL_48;
  }
  if( (v1 & 0x40) == 0 && (v1 & 1) != 0 && (v8->Flags._bf_0 & 7u) >= 2 )
  {
    LODWORD(v15) = MiComputeZeroClusterMaximum(v4, (_MMVAD *)v8);
    v16 = v15;
    if( v15 > 1 )
    {
      v17 = 1;
      goto LABEL_47;
    }
LABEL_63:
    PageChain = 0i64;
    goto LABEL_64;
  }
LABEL_65:
  v35 = *((_QWORD *)v2 + 9);
  if( v35 )
    v36 = *(PVOID **)(*(&stru_140C4DB30 + 267) + 8i64 * *(unsigned __int16 *)(*(_QWORD *)(v35 + 544) + 1838i64));
  else
    v36 = (PVOID *)v42;
  if( !PageChain )
  {
    v37 = v2[8];
    if( v37 )
    {
      if( v37 != 31 )
      {
        if( v37 >> 3 == 3 )
        {
          if( (v37 & 7) != 0 )
            v10 = 2;
        }
        else if( v37 >> 3 == 1 )
        {
          v10 = 0;
        }
      }
    }
    else
    {
      v10 = 3;
    }
    LODWORD(SuboptimalPage) = 258;
    PageChain = MiGetPageChain(v36, v8, v12, v10, (UINT64)SuboptimalPage, 0xFFFFFFFFFFFFFFFFui64, &NumberOfPages);
    if( !PageChain )
      return -1073741801;
  }
  return MiCompletePrivateZeroFault(v2, PageChain, NumberOfPages);
}

Referenced by:

MiResolveDemandZeroFault
MiZeroFault