MiResolvePrivateZeroFault

INT64 __fastcall MiResolvePrivateZeroFault(INT64 rcx0){
  int v1; 
  INT64 v2; 
  unsigned __int64 v3; 
  __int64 v4; 
  unsigned int v5; 
  __int64 v7; 
  __int64 v8; 
  _ETHREAD *v9; 
  unsigned int v10; 
  __int64 v11; 
  unsigned int v12; 
  char *v13; 
  _MMPFN *PageChain; 
  unsigned __int64 v15; 
  int v16; 
  int v17; 
  unsigned __int64 v18; 
  unsigned int v19; 
  _MMPFN *ClusterPage; 
  unsigned __int64 v21; 
  unsigned __int64 v22; 
  char *v23; 
  UINT64 i; 
  int v25; 
  __int64 *v26; 
  __int64 v27; 
  bool v28; 
  unsigned __int64 v29; 
  unsigned int v30; 
  UINT64 v31; 
  KQUEUE *LargePage; 
  __int64 v33; 
  _MI_PARTITION *v34; 
  unsigned int v35; 
  UINT8 *SuboptimalPage; 
  INT64 v37; 
  UINT64 NumberOfPages; 
  unsigned __int64 v39; 
  INT64 a1; 
  INT64 v41[2]; 
  __int64 v42[2]; 
  _QWORD v43[2]; 
  __int128 v44; 
  __int128 v45; 
  __int128 v46; 
  __int128 v47; 
  __int128 v48; 
  int v50; 
  _MMPFN *v51; 
  _MMPFN *v52; 
  v1 = *(_DWORD *)rcx0;
  v2 = rcx0;
  v3 = *(_QWORD *)(rcx0 + 16);
  v4 = *(_QWORD *)(rcx0 + 56);
  if( (*(_DWORD *)rcx0 & 2) != 0 )
  {
    v5 = *(_DWORD *)(rcx0 + 32);
    if( v5 >> 3 == 3 )
    {
      if( (v5 & 7) == 0 )
      {
LABEL_4:
        MiAdvanceFaultList(*(_QWORD **)(rcx0 + 56));
        return 0i64;
      }
    }
    else if( v5 >> 3 != 1 )
    {
      goto LABEL_4;
    }
    if( (v1 & 4) == 0 )
      goto LABEL_4;
  }
  if( (v1 & 8) != 0 && (*(_DWORD *)(v4 + 56) & 8) != 0 )
    return 3221225495i64;
  v7 = *(_QWORD *)(rcx0 + 8);
  v8 = *(_QWORD *)(v7 + 56);
  v37 = v8;
  a1 = *(_QWORD *)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(v8 + 174));
  if( (v1 & 0x40) != 0 )
  {
    v9 = *(_ETHREAD **)(*((_QWORD *)KeGetCurrentThread() + 23) + 1248i64);
    if( v9 )
    {
      if( v9 != (_ETHREAD *)KeGetCurrentThread() )
      {
        *(_DWORD *)(v7 + 80) |= 4u;
        return 0i64;
      }
    }
  }
  v10 = 1;
  NumberOfPages = 1i64;
  v39 = -1i64;
  v11 = *(_QWORD *)(rcx0 + 64);
  v12 = *(_DWORD *)(rcx0 + 48);
  v13 = (char *)MmGetPteBase() + ((v3 >> 9) & 0x7FFFFFFFF8i64);
  v50 = 0;
  PageChain = 0i64;
  v51 = 0i64;
  if( v11 )
  {
    v17 = v1 & 0x15;
    if( v17 )
    {
      v18 = MiComputeZeroClusterMaximum(v4, v8, v11);
      PageChain = 0i64;
      v8 = v37;
      v39 = v18;
      v50 = 1;
    }
    v19 = *(_DWORD *)(v11 + 48);
    v12 = (v19 >> 12) & 0x3F;
    if( (v19 & 0x100000) != 0 && MiVadPageSizes[(v19 >> 18) & 3] == 16 )
    {
      LODWORD(SuboptimalPage) = *(_DWORD *)(v2 + 36);
      ClusterPage = MiGetClusterPage((_MMVAD *)v11, (VOID *)v3, 0x10ui64, *(unsigned int *)(v2 + 32), SuboptimalPage);
      v51 = ClusterPage;
      PageChain = ClusterPage;
      if( ClusterPage && (*((_QWORD *)ClusterPage + 3) & 0xFFFFFFFFFi64) != 0xFFFFFFFFFi64 )
      {
        v21 = v3 & 0xFFFFFFFFFFFF0000ui64;
        NumberOfPages = 16i64;
        *(_QWORD *)(v2 + 16) = v21;
        v13 = (char *)MmGetPteBase() + ((v21 >> 9) & 0x7FFFFFFFF8i64);
      }
    }
    else if( !v17
           && ((unsigned __int8)v13 & 0x7F) == 0
           && (*(_DWORD *)(v11 + 48) & 0x100000) != 0
           && (v19 & 0x300000) != 3145728
           && !*(_DWORD *)(v2 + 36)
           && v3 >= ((*(unsigned int *)(v11 + 24) | ((unsigned __int64)*(unsigned __int8 *)(v11 + 32) << 32)) + 16) << 12
           && ((unsigned __int16)v13 & 0xFFF) != 0
           && (v3 < (unsigned __int64)MmGetPteBase() || v3 > (unsigned __int64)MmGetPteLimit()) )
    {
      v22 = 0i64;
      v23 = v13 - 8;
      do
      {
        if( (*(_QWORD *)v23 & 1) == 0 )
          break;
        if( (*(_QWORD *)v23 & 0x20) == 0 )
          break;
        ++v22;
        v23 -= 8;
      }
      while( v22 < 0x10 );
      v2 = rcx0;
      if( v22 == 16 )
      {
        v42[1] = 0x10000i64;
        v44 = 1ui64;
        v43[0] = 0i64;
        v43[1] = v42;
        v45 = 0ui64;
        v46 = 0i64;
        v42[0] = v3 & 0xFFFFFFFFFFFFF000ui64;
        v47 = 0i64;
        v48 = 0i64;
        if( MiComputeZeroClusterMaximum((__int64)v43, v8, v11) >= 0x10 )
        {
          v16 = 2;
          v15 = 16i64;
LABEL_48:
          v25 = *(_DWORD *)(v2 + 36);
          v26 = (__int64 *)(v13 + 8);
          for( i = 1i64; i < v15; ++i )
          {
            v27 = *v26;
            if( v25 )
            {
              if( IS_PTE_NOT_DEMAND_ZERO(v27) )
                break;
              v28 = v25 == ((v29 >> 5) & 0x1F);
            }
            else
            {
              v28 = v27 == 0;
            }
            if( !v28 )
              break;
            ++v26;
          }
          v2 = rcx0;
          v10 = 1;
LABEL_56:
          if( v16 == 2 )
          {
            if( i == v15 )
            {
              *(_OWORD *)v41 = 0i64;
              MiInitializePageColorBase(v37, v12, (INT64)v41);
              _InterlockedExchangeAdd((volatile signed __int32 *)v41[0], 1u);
              v30 = MiProtectionToCacheAttribute(*(unsigned int *)(v2 + 32));
              LODWORD(SuboptimalPage) = 4;
              LargePage = (KQUEUE *)MiGetLargePage(a1, 2ui64, v30, v31, (INT64)SuboptimalPage, 0i64);
              v52 = (_MMPFN *)LargePage;
              PageChain = (_MMPFN *)LargePage;
              if( LargePage )
              {
                *(_DWORD *)v2 |= 0x80u;
                MiConvertEntireLargePageToSmall(LargePage, 2, 2u, (LARGE_INTEGER *)1, 0i64, 0i64);
                PageChain = v52;
                NumberOfPages = i;
LABEL_64:
                v8 = v37;
                goto LABEL_65;
              }
LABEL_62:
              NumberOfPages = i;
              goto LABEL_64;
            }
            i = 1i64;
          }
          PageChain = v51;
          goto LABEL_62;
        }
        goto LABEL_63;
      }
      PageChain = 0i64;
    }
    v16 = v50;
    if( !v50 || PageChain )
      goto LABEL_64;
    v15 = v39;
LABEL_47:
    i = 1i64;
    if( v15 <= 1 )
      goto LABEL_56;
    goto LABEL_48;
  }
  if( (v1 & 0x40) == 0 && (v1 & 1) != 0 && (*(_BYTE *)(v8 + 184) & 7u) >= 2 )
  {
    v15 = MiComputeZeroClusterMaximum(v4, v8, 0i64);
    if( v15 > 1 )
    {
      v16 = 1;
      goto LABEL_47;
    }
LABEL_63:
    PageChain = 0i64;
    goto LABEL_64;
  }
LABEL_65:
  v33 = *(_QWORD *)(v2 + 72);
  if( v33 )
    v34 = *(_MI_PARTITION **)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(*(_QWORD *)(v33 + 544) + 1838i64));
  else
    v34 = (_MI_PARTITION *)a1;
  if( !PageChain )
  {
    v35 = *(_DWORD *)(v2 + 32);
    if( v35 )
    {
      if( v35 != 31 )
      {
        if( v35 >> 3 == 3 )
        {
          if( (v35 & 7) != 0 )
            v10 = 2;
        }
        else if( v35 >> 3 == 1 )
        {
          v10 = 0;
        }
      }
    }
    else
    {
      v10 = 3;
    }
    LODWORD(SuboptimalPage) = 258;
    PageChain = MiGetPageChain(
                  v34,
                  (_MMSUPPORT_INSTANCE *)v8,
                  v12,
                  v10,
                  (UINT64)SuboptimalPage,
                  0xFFFFFFFFFFFFFFFFui64,
                  &NumberOfPages);
    if( !PageChain )
      return 3221225495i64;
  }
  return MiCompletePrivateZeroFault(v2, (INT64)PageChain, NumberOfPages);
}

Referenced by:

MiResolveDemandZeroFault
MiZeroFault