MiWaitForInPageComplete

NTSTATUS __stdcall MiWaitForInPageComplete(
        _MMINPAGE_SUPPORT *InPageSupport,
        PVOID ProtoContents,
        _MMSUPPORT_INSTANCE *Vm,
        VOID *PreviousMode,
        INT64 HardFaultInfo,
        PF_HARD_FAULT_INFO **a6){
  _MMSUPPORT_INSTANCE *Blink; 
  char *v7; 
  _MMINPAGE_SUPPORT *v8; 
  __int64 v9; 
  __int64 v10; 
  unsigned __int64 v12; 
  _MMPFN *PfnDb; 
  UINT64 *v14; 
  __int64 v15; 
  void *v16; 
  int v17; 
  _MI_PARTITION *v18; 
  VOID(__stdcall *v19)(VOID *); 
  __int64 v20; 
  int v21; 
  int v22; 
  _LIST_ENTRY *Flink; 
  _MI_FAULT_VA_LIST *v24; 
  INT64 v25; 
  int v26; 
  __int64 v27; 
  unsigned __int8 v28; 
  NTSTATUS v29; 
  int v30; 
  int v31; 
  int v32; 
  _MMSUPPORT_INSTANCE *v33; 
  int v34; 
  bool v35; 
  void *v36; 
  unsigned __int64 v37; 
  unsigned int v38; 
  char *v39; 
  unsigned __int64 v40; 
  _MMPFN *v41; 
  unsigned __int64 v42; 
  NTSTATUS result; 
  __int64 v44; 
  UINT64 PreferredNode; 
  UINT64 Flags; 
  UINT64 *StartingPfn; 
  int v48; 
  _MMSUPPORT_INSTANCE *v49; 
  _BOOL4 IsRetryIoStatus; 
  void *v51; 
  void *v52; 
  unsigned __int64 v53; 
  __int64 v54; 
  void *v55; 
  unsigned int v57; 
  unsigned __int64 v58; 
  UINT8 OldIrql; 
  _MMSUPPORT_INSTANCE *v60; 
  _MI_STORE_INPAGE_COMPLETE_FLAGS OutFlags; 

  v60 = Vm;
  Blink = (_MMSUPPORT_INSTANCE *)InPageSupport->ListHead[2].Blink;
  v7 = (char *)ProtoContents + 272;
  OldIrql = 0;
  OutFlags.EntireFlags = 0;
  v8 = InPageSupport;
  v9 = -1i64;
  v10 = *((_QWORD *)ProtoContents + 31);
  v55 = (void *)*((_QWORD *)ProtoContents + 29);
  v51 = (void *)*((_QWORD *)ProtoContents + 28);
  v12 = *(_QWORD *)(v10 + 40);
  if( *((_QWORD *)ProtoContents + 32) )
    v7 = (char *)*((_QWORD *)ProtoContents + 32);
  v49 = Blink;
  v54 = *((_QWORD *)ProtoContents + 31);
  PfnDb = MmGetPfnDb();
  v14 = (UINT64 *)(v7 + 48);
  if( (v12 & 0x1000000000i64) == 0 && *(__int64 *)(v10 + 8) > 0 )
  {
    v15 = (unsigned __int128)((v10 - (__int64)PfnDb) * (__int128)0x2AAAAAAAAAAAAAABi64) >> 64;
    v16 = (void *)(((unsigned __int64)v15 >> 63) + (v15 >> 3));
    v52 = v16;
    if( (unsigned __int64)v16 < 0xFFFFFFFFFi64 )
    {
      v17 = ~(v8->IoStatus.Status << 11) & 0x20000 | 0x40000000;
      v18 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * ((v12 >> 39) & 0x3FF));
      v19 = (VOID(__stdcall *)(VOID *))KeGetCurrentThread()[1].ApcState.ApcListHead[0].Blink;
      LODWORD(v20) = MiSearchNumaNodeTable(v16);
      v21 = v17 | 8;
      v22 = *(_DWORD *)(v20 + 8);
      if( v19 != KeSwapProcessOrStack )
        v21 = v17;
      LODWORD(StartingPfn) = v21;
      LODWORD(Flags) = 0x80000000;
      LODWORD(PreferredNode) = v22;
      MiFindContiguousPages(
        v18,
        (UINT64)v52 + 1,
        0xFFFFFFFFFui64,
        0i64,
        1ui64,
        (_MI_PFN_CACHE_ATTRIBUTE)(*(unsigned __int8 *)(v54 + 34) >> 6),
        PreferredNode,
        Flags,
        StartingPfn);
      v8 = InPageSupport;
      Blink = v49;
    }
  }
  Flink = v8->ListHead[0].Flink;
  if( ((unsigned __int8)Flink & 1) != 0 )
  {
    v24 = (_MI_FAULT_VA_LIST *)((unsigned __int64)Flink & 0xFFFFFFFFFFFFFFFEui64);
    if( *(_BYTE *)v24 == 2 )
    {
      if( Blink )
        MiPrefetchRestOfCluster((_MMINPAGE_SUPPORT *)ProtoContents, v24, Blink);
    }
  }
  KeWaitForSingleObject((UINT64)ProtoContents + 32, 9, 0, 0, 0i64);
  if( *((_QWORD *)ProtoContents + 33) )
    KeBugCheckEx(0x1Au, (PVOID)0x61947, ProtoContents, *((PVOID *)ProtoContents + 33), 0i64);
  if( Blink && (Blink->Flags._bf_0 & 0x60) == 96 && !MiGetSharedVm(Blink)->CommitReleaseContext )
    KiUnstackDetachProcess((_KAPC_STATE *)((char *)ProtoContents + 104), 0i64);
  if( (*((_WORD *)v7 + 5) & 0x200) != 0 )
  {
    MiRetardMdl((_MDL *)v7);
    *((_DWORD *)ProtoContents + 20) = -1073741670;
    *((_QWORD *)ProtoContents + 11) = 0i64;
  }
  v26 = *((_DWORD *)ProtoContents + 48);
  if( (v26 & 0x10) != 0 )
  {
    v27 = *((_QWORD *)ProtoContents + 42);
    if( v27 )
    {
      v28 = ExAcquireSpinLockExclusive((INT64 *)(v27 + 232));
      RtlAvlRemoveNode((UINT64 *)(v27 + 240), (INT64 *)ProtoContents + 44);
      ExReleaseSpinLockExclusive((PEX_SPIN_LOCK)(v27 + 232), v28);
      v26 = *((_DWORD *)ProtoContents + 48);
      Blink = v49;
    }
  }
  v29 = 0;
  v57 = *((_DWORD *)ProtoContents + 46);
  v53 = (unsigned __int64)&v14[((((*((_DWORD *)v7 + 8) + *((_DWORD *)v7 + 11)) & 0xFFF)
                               + (unsigned __int64)*((unsigned int *)v7 + 10)
                               + 4095) >> 12)
                             - 1];
  if( (v26 & 0x100) != 0 )
    MiStoreFaultComplete((ULONG_PTR)ProtoContents, &OutFlags);
  v30 = *((_DWORD *)ProtoContents + 20);
  if( *((_QWORD *)ProtoContents + 26) )
  {
    if( v30 >= 0 )
    {
      v29 = MiValidateInPage((_MMINPAGE_SUPPORT *)ProtoContents);
      if( v29 == -1073740748 )
        *((_DWORD *)ProtoContents + 48) |= 0x100000u;
    }
    MiDereferenceControlAreaProbe(*((_CONTROL_AREA **)ProtoContents + 26), 0i64);
  }
  else if( v30 >= 0 && (*((_DWORD *)ProtoContents + 48) & 0x400000) != 0 )
  {
    v29 = MiValidatePagefilePageHash((_MMINPAGE_SUPPORT *)ProtoContents);
  }
  v31 = *((_DWORD *)ProtoContents + 20);
  v32 = OutFlags.EntireFlags & 1;
  v48 = v32;
  if( (OutFlags.EntireFlags & 1) == 0 )
  {
    __incgsdword(0x2EA4u);
    __addgsdword(0x2EA0u, (v57 >> 12) + ((v57 & 0xFFF) != 0));
    if( Blink )
    {
      if( (*((_DWORD *)ProtoContents + 48) & 8) == 0 )
        _InterlockedIncrement((volatile signed __int32 *)&Blink->HardFaultCount);
    }
  }
  v33 = v60;
  v34 = 2 * v32;
  if( *(_QWORD *)&v60->NextPageColor )
  {
    PfHardFaultLog(*(_QWORD **)&v60->NextPageColor, v34, v25);
    v33 = v60;
  }
  v35 = (v7[10] & 1) == 0;
  v33->NextPageColor = v34;
  if( !v35 )
    MmUnmapLockedPages(*((VOID **)v7 + 3), (_MDL *)v7);
  IsRetryIoStatus = 0;
  *((_DWORD *)ProtoContents + 47) = -1;
  if( v31 < 0 )
  {
    if( v31 != -1073741807 )
    {
      if( v31 == -2147483626 )
        goto LABEL_75;
      IsRetryIoStatus = MiIsRetryIoStatus((unsigned int)v31, *((unsigned int *)v7 + 10));
      if( IsRetryIoStatus && !*(&stru_140C4DB30 + 948) && (!v48 || (OutFlags.EntireFlags & 2) != 0) )
        *(&stru_140C4DB30 + 948) = 32;
      if( (*((_DWORD *)ProtoContents + 48) & 8) != 0 )
      {
        v31 = -1073741801;
        goto LABEL_75;
      }
      goto LABEL_53;
    }
    if( (*((_DWORD *)ProtoContents + 48) & 0x200000) != 0 )
      KeBugCheckEx(0x7Au, (PVOID)3, (PVOID)0xFFFFFFFFC0000011i64, ProtoContents, v51);
    v40 = 1i64;
    v41 = MmGetPfnDb();
    v42 = (v53 - (unsigned __int64)v14 + 8) >> 3;
    if( (unsigned __int64)v14 > v53 )
      v42 = 0i64;
    if( v42 )
    {
      do
      {
        MiZeroPhysicalPage(*v14, 3ui64, (_MI_PFN_CACHE_ATTRIBUTE)(*((unsigned __int8 *)&v41[*v14].u3 + 2) >> 6));
        ++v40;
        ++v14;
      }
      while( v40 <= v42 );
    }
    v31 = 0;
  }
  else
  {
    v36 = (void *)*((_QWORD *)ProtoContents + 11);
    if( v36 != (void *)v57 )
    {
      if( v36 || (*((_DWORD *)ProtoContents + 48) & 8) == 0 )
      {
        if( (*((_DWORD *)ProtoContents + 48) & 0x200000) != 0 && !v48 )
          KeBugCheckEx(0x7Au, (PVOID)4, v36, ProtoContents, v51);
        v37 = 8
            * (((unsigned __int64)v36
              + ((*((_DWORD *)v7 + 8) + *((_DWORD *)v7 + 11)) & 0xFFF)
              - (unsigned __int64)(v57 - *((_DWORD *)v7 + 10))
              + 4095) >> 12)
            + 40;
        v58 = v37;
        v38 = (unsigned __int16)v36 & 0xFFF;
        if( v38 )
        {
          v39 = (char *)MiMapPageInHyperSpaceWorker(*(_QWORD *)&v7[v37], &OldIrql, 0x80000000ui64) + v38;
          memset(v39, 0i64, 4096 - v38);
          MiUnmapPageInHyperSpaceWorker(v39, OldIrql, 0x80000000ui64);
          v37 = v58;
        }
        if( (unsigned __int64)&v7[v37 + 8] <= v53 )
          *((_DWORD *)ProtoContents + 47) = ((__int64)(v37 - 48) >> 3) + 1;
      }
      else
      {
        v31 = -1073741801;
      }
    }
    if( v29 == -1073741761 )
    {
LABEL_53:
      if( (unsigned __int64)v51 > 0x7FFFFFFEFFFFi64
        && MiGetSystemRegionType((UINT64)v51) != 8
        && !MiExceptionForMappedVa(v51) )
      {
        if( !IsRetryIoStatus )
        {
          if( MmIsAddressValidEx((INT64)v55) )
          {
            LODWORD(v44) = MI_READ_PTE_LOCK_FREE((INT64)v55);
            v9 = v44;
          }
          MiFlushAllFilesystemPages();
          if( v29 >= 0 )
            v29 = v31;
          KeBugCheckEx(0x7Au, v55, (PVOID)v29, (PVOID)v9, v51);
        }
        if( v29 != -1073741761 )
          v31 = -1073741801;
      }
    }
  }
LABEL_75:
  result = OutFlags._bf_0;
  *((_MI_STORE_INPAGE_COMPLETE_FLAGS *)ProtoContents + 28) = OutFlags;
  *((_QWORD *)ProtoContents + 13) = 0i64;
  *((_DWORD *)ProtoContents + 20) = v31;
  return result;
}

Referenced by:

MiIssueHardFault
MiPfCompleteInPageSupport