MiHandleTransitionFault

NTSTATUS __stdcall MiHandleTransitionFault(){
  _MMPTE *v0; 
  UINT64 *v1; 
  _MMPFN *v2; 
  _UNICODE_STRING *v3; 
  _MMPTE *v4; 
  VOID **v5; 
  INT64 Vm; 
  _MMPFN *Pfn1; 
  int v8; 
  _MMVAD *v9; 
  unsigned __int64 v10; 
  int v11; 
  _MMVAD *Address; 
  unsigned __int64 v13; 
  VOID *v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  VOID *v17; 
  int v18; 
  _MMVAD *v19; 
  __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  int v24; 
  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;} v26; 
  int v27; 
  UINT8 v28; 
  wchar_t *v29; 
  __int64 v30; 
  int v31; 
  __int64 v32; 
  UINT8 v33; 
  wchar_t *v34; 
  bool v35; 
  int v36; 
  int v37; 
  int v38; 
  UINT64 *v39; 
  _MMPFN *v40; 
  __int64 v41; 
  __int64 v42; 
  CHAR v43; 
  _MMPFN LockedProtoPfn; 
  UINT64 *VirtualAddress; 
  _QWORD *v46; 
  _MMPTE ComparePte; 
  __int64 *v48; 

  VirtualAddress = v1;
  v4 = v0;
  v5 = (VOID **)v1;
  LockedProtoPfn.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::gap0[0] = 0;
  Vm = (INT64)v3;
  *v48 = 0i64;
  Pfn1 = v2;
  *v46 = 0i64;
  LOBYTE(v8) = MI_PFN_IS_PROTO(v3, 0i64, (UINT8)v2, &v3->Length);
  v11 = v8;
  if( !v8 )
  {
    v10 = *(_QWORD *)(v10 + 8);
    if( v4 != (_MMPTE *)(v10 | 0x8000000000000000ui64) )
      KeBugCheckEx(0x1Au, (PVOID)0x888A, v4, (PVOID)v10, (PVOID)Vm);
  }
  Address = v9;
  v13 = *(_QWORD *)(Vm + 16);
  v14 = *v5;
  v15 = v13 >> 11;
  v16 = v13 >> 3;
  if( (*(_QWORD *)(Vm + 16) & 0x400i64) != 0 )
    v16 = (unsigned int)v15;
  if( (v16 & 1) != 0 )
  {
    if( (unsigned __int64)v14 <= 0x7FFFFFFEFFFFi64 && !v11 )
      Address = MiLocateAddress(*v5);
    LODWORD(v17) = MiMakeTransitionHeatBatch(Vm);
    v5[14] = v17;
    if( v17 )
    {
LABEL_25:
      _InterlockedAnd64((volatile signed __int64 *)(Vm + 24), 0x7FFFFFFFFFFFFFFFui64);
      if( Pfn1 )
      {
        MiUnlockProtoPoolPage((ULONG_PTR)Pfn1, 0x11u);
        return -1073740748;
      }
      return -1073740748;
    }
  }
  LOBYTE(v18) = MI_PFN_IS_PROTO((_UNICODE_STRING *)Vm, (_UNICODE_STRING *)v16, (UINT8)Address, (PWCHAR)v10);
  if( !v18 )
    goto LABEL_23;
  v20 = *(_QWORD *)(Vm + 16);
  if( (v20 & 0x400) == 0 || ((*(_QWORD *)(Vm + 40) >> 60) & 7) == 3 )
    goto LABEL_23;
  v21 = *(_QWORD *)(Vm + 16);
  if( *(&stru_140C4DB30 + 42) && (v20 & 0x10) == 0 )
    v21 = ~*(&stru_140C4DB30 + 42) & v20;
  v22 = v21 >> 16;
  if( (*(_DWORD *)(*(_QWORD *)v22 + 56i64) & 0x20) == 0 )
    goto LABEL_23;
  v23 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)v22 + 96i64) + 40i64);
  if( !v23 || (v23 & 0xFFFFFFFFFFFFFFF8ui64) == 8 || (v23 & 3) == 2 )
    goto LABEL_23;
  if( (unsigned __int64)v14 < 0xFFFF800000000000ui64 )
  {
    if( Address )
    {
LABEL_30:
      v26.LongFlags = (unsigned int)v19->Core.u;
      if( (v26.LongFlags & 0x70) != 32
        || (v26.LongFlags & 0xF80) != 128
        && ((v19->u2.LongFlags2 & 0x8000000) == 0 || (v23 & 4) != 0)
        && ((MiFlags & 0x400) == 0 || (*(_BYTE *)(v22 + 34) & 2) == 0) )
      {
        goto LABEL_36;
      }
LABEL_23:
      MiUnlinkPageFromList((_MMPFN *)Vm, 0i64);
      if( !v24 )
      {
        MiDiscardTransitionPteEx((_MMPFN *)Vm, 0i64);
        goto LABEL_25;
      }
      LOBYTE(v27) = MiIsPfnFileOnly(Vm);
      if( v27 )
      {
LABEL_71:
        v42 = *(_QWORD *)(Vm + 24);
        ++*(_WORD *)(Vm + 32);
        *(_QWORD *)(Vm + 24) = v42 & 0xC000000000000000ui64 | 1;
        *(_BYTE *)(Vm + 34) = *(_BYTE *)(Vm + 34) & 0xF8 | 6;
        return 0;
      }
      v30 = 1i64;
      if( (unsigned __int64)v14 > 0x7FFFFFFEFFFFi64 || *(_WORD *)(Vm + 32) )
        goto LABEL_63;
      LOBYTE(v31) = MI_PFN_IS_PROTO(
                      (_UNICODE_STRING *)Vm,
                      (_UNICODE_STRING *)KeGetCurrentThread()->ApcState.Process->Vm.Instance.VmWorkingSetList,
                      v28,
                      v29);
      if( v31 )
      {
        if( (*(_DWORD *)(Vm + 16) & 0x400i64) != 0 )
          goto LABEL_63;
        v35 = *(_QWORD *)(v32 + 432) == 0i64;
      }
      else
      {
        v35 = *(_QWORD *)(v32 + 424) == 0i64;
      }
      if( !v35 )
      {
        if( (Address || (Address = MiLocateAddress(v14)) != 0i64)
          && MiVadPageSizes[(Address->Core.u.LongFlags >> 18) & 3] == 16 )
        {
          LOBYTE(v36) = MI_PFN_IS_PROTO((_UNICODE_STRING *)Vm, (_UNICODE_STRING *)Address->Core.u.LongFlags, v33, v34);
          v38 = v37 & 0x100000;
          if( v36 )
          {
            if( !v38 )
            {
LABEL_54:
              v39 = VirtualAddress;
              v40 = MiIdealClusterPage(
                      VirtualAddress,
                      Address,
                      v4,
                      ComparePte,
                      (_MMSUPPORT_INSTANCE *)Vm,
                      Pfn1,
                      &LockedProtoPfn,
                      v43,
                      (UINT8 *)LockedProtoPfn.ListEntry.Flink);
              v30 = (__int64)v40;
              if( v40 )
              {
                if( (_MMPFN *)Vm != v40 )
                {
                  Vm = (INT64)v40;
                  *v46 = v40;
                }
              }
              else
              {
                _InterlockedAnd64((volatile signed __int64 *)(Vm + 24), 0x7FFFFFFFFFFFFFFFui64);
                if( Pfn1 )
                  MiUnlockProtoPoolPage((ULONG_PTR)Pfn1, 0x11u);
              }
              goto LABEL_60;
            }
          }
          else if( v38 )
          {
            goto LABEL_54;
          }
        }
        v39 = VirtualAddress;
LABEL_60:
        if( LockedProtoPfn.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::gap0[0] )
          goto LABEL_65;
        if( !v30 )
          goto LABEL_66;
LABEL_64:
        v30 = (__int64)MiMigratePfn(v39, Vm, (__int64)Pfn1, v48);
        *v46 = v30;
        Vm = v30;
LABEL_65:
        if( !v30 )
        {
LABEL_66:
          v41 = *v48;
          if( *v48 )
          {
            if( *(int *)(v41 + 176) > 1 )
              KeSetEvent((PRKEVENT)(v41 + 56), 0, 0);
            MiFreeInPageSupportBlock((_MMINPAGE_SUPPORT *)v41);
            *v48 = 0i64;
          }
          return -1073740748;
        }
        goto LABEL_71;
      }
LABEL_63:
      v39 = VirtualAddress;
      goto LABEL_64;
    }
    v19 = MiLocateAddress(v14);
  }
  else if( (MiFlags & 0x10000) == 0 || (v20 & 0x40) == 0 )
  {
    goto LABEL_23;
  }
  if( v19 )
    goto LABEL_30;
LABEL_36:
  _InterlockedAnd64((volatile signed __int64 *)(Vm + 24), 0x7FFFFFFFFFFFFFFFui64);
  if( Pfn1 )
    MiUnlockProtoPoolPage((ULONG_PTR)Pfn1, 0x11u);
  return -1073740760;
}

Referenced by:

MiResolveTransitionFault