MiCompleteRestrictedImageFault

NTSTATUS __stdcall MiCompleteRestrictedImageFault(INT64 a1, INT64 a2, INT64 *a3, UINT64 a4){
  unsigned int v4; 
  INT64 *v5; 
  UINT64 v6; 
  _MMPFN *PfnDb; 
  NTSTATUS v9; 
  _MMPFN *v10; 
  unsigned __int64 v11; 
  __int64 bf_0; 
  _CONTROL_AREA *v13; 
  _FILE_OBJECT *v14; 
  _FILE_OBJECT *v15; 
  unsigned int v16; 
  INT64 v17; 
  _MMPFN *v18; 
  unsigned __int64 Long; 
  __int64 v20; 
  _MMPTE *v21; 
  UINT64 v22; 
  unsigned int v23; 
  UINT64 v24; 
  _ETHREAD *CurrentThread; 
  UINT64 v26; 
  _PFSN_TRACE_HEADER *v27; 
  _PFSN_TRACE_HEADER *v28; 
  int v29; 
  int v30; 
  _FILE_OBJECT *v31; 
  __int64 v32; 
  wchar_t *v33; 
  _UNICODE_STRING *v34; 
  unsigned __int64 v35; 
  int v36; 
  __int16 v37; 
  int v38; 
  __int16 v39; 
  __int16 v40; 
  UINT8 v41; 
  int v42; 
  char v43; 
  char v44; 
  NTSTATUS Wsle; 
  _MMPFN *v46; 
  __int64 v47; 
  _MMPFN *v48; 
  VOID *v49; 
  UINT64 Flags; 
  _MI_FAULT_VA_LIST *VirtualFaultInfo; 
  _FILE_OBJECT *FileObject; 
  INT64 *v54; 
  INT64 v55; 
  unsigned __int64 v56; 
  _MMSUPPORT_INSTANCE *Vm; 
  _CONTROL_AREA *ControlArea; 
  UINT64 SpinCount; 
  UINT64 v60; 
  INT64 *v61; 
  unsigned int v62; 

  v62 = a4;
  v61 = a3;
  v60 = a2;
  v4 = a4;
  Vm = *(_MMSUPPORT_INSTANCE **)a1;
  v5 = a3;
  v6 = a2;
  PfnDb = MmGetPfnDb();
  v9 = 1;
  v10 = &PfnDb[*a3];
  v11 = v10->PteLong | 0x8000000000000000ui64;
  bf_0 = v10->OriginalPte.u.Hard.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0;
  v56 = v11;
  if( *(&stru_140C4DB30 + 42) && (bf_0 & 0x10) == 0 )
    bf_0 &= ~*(&stru_140C4DB30 + 42);
  v13 = *(_CONTROL_AREA **)(bf_0 >> 16);
  ControlArea = v13;
  if( PfSnNumActiveTraces )
  {
    v14 = MiReferenceControlAreaFile(v13);
    v11 = v56;
    v15 = v14;
    PfnDb = MmGetPfnDb();
  }
  else
  {
    v15 = 0i64;
  }
  FileObject = v15;
  v16 = 0;
  if( v4 )
  {
    v54 = v5;
    while( 1 )
    {
      v17 = *v5;
      v55 = *v5;
      v18 = &PfnDb[*v5];
      Long = v18->OriginalPte.u.Long;
      v20 = Long;
      if( *(&stru_140C4DB30 + 42) && (Long & 0x10) == 0 )
        v20 = Long & ~*(&stru_140C4DB30 + 42);
      v21 = (_MMPTE *)(v18->PteLong | 0x8000000000000000ui64);
      v22 = v6 + 8 * ((__int64)((__int64)v21 - v11) >> 3);
      if( !v15 )
        goto LABEL_19;
      MiGetSessionIdForVa((VOID *)((__int64)((v22 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16), v11);
      LODWORD(v24) = MiStartingOffset((_SUBSECTION *)(v20 >> 16), v21, v23);
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      v26 = v24;
      v27 = PfSnReferenceProcessTrace(CurrentThread->Tcb.ApcState.Process);
      v28 = v27;
      if( !v27 )
        break;
      v29 = PfSnCheckLoggingForThread(CurrentThread, v27, 1ui64);
      v31 = FileObject;
      if( v29 )
      {
        LODWORD(Flags) = v30;
        PfSnLogPageFaultCommon(v28, FileObject, (UINT64)FileObject->FsContext, v26, Flags);
      }
      ExReleaseRundownProtection((_EX_RUNDOWN_REF *)v28 + 45);
      v17 = v55;
      v5 = v54;
LABEL_20:
      LODWORD(v32) = MiMakeValidPte((_XSTATE_CONFIGURATION *)v22, v17, (Long >> 5) & 0x1F);
      v34 = (_UNICODE_STRING *)*(unsigned __int8 *)(a1 + 13);
      v35 = v32 & 0xFFFFFFFFFFFFFFDFui64;
      if( ((unsigned __int8)v34 & 5) != 4 || ((unsigned __int8)v34 & 2) != 0 )
      {
        v9 = 1;
        goto LABEL_35;
      }
      v36 = *(unsigned __int16 *)(a1 + 10);
      v37 = 511;
      if( (_WORD)v36 )
      {
        if( v36 + *(unsigned __int16 *)(a1 + 8) == (((unsigned int)v22 >> 3) & 0x1FF) )
        {
          LOBYTE(v34) = (unsigned __int8)v34 & 0x10;
          LOBYTE(v38) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v18, v34, 0xFFu, v33);
          if( v38 )
          {
            if( !(_BYTE)v34 )
              goto LABEL_29;
          }
          else if( (_BYTE)v34 )
          {
            goto LABEL_29;
          }
        }
        MiEmptyDeferredWorkingSetEntries(a1);
        v37 = 511;
      }
LABEL_29:
      v39 = *(_WORD *)(a1 + 10);
      v9 = 1;
      if( v39 )
      {
        *(_WORD *)(a1 + 10) = v39 + 1;
      }
      else
      {
        *(_WORD *)(a1 + 10) = 1;
        v40 = v37 & ((unsigned int)v22 >> 3);
        v41 = *(_BYTE *)(a1 + 13);
        *(_WORD *)(a1 + 8) = v40;
        LOBYTE(v42) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v18, v34, v41, v33);
        v44 = v43 & 0xEF;
        if( !v42 )
          v44 = v43 | 0x10;
        *(_BYTE *)(a1 + 13) = v44;
      }
LABEL_35:
      LODWORD(VirtualFaultInfo) = 12;
      Wsle = MiAllocateWsle(Vm, (_MMPTE *)v22, v18, 0i64, (_MMPTE)v35, VirtualFaultInfo);
      v4 = v62;
      v6 = v60;
      if( !Wsle )
      {
        v5 = v61;
        v9 = 0;
        goto LABEL_40;
      }
      v11 = v56;
      ++v5;
      ++v16;
      v54 = v5;
      PfnDb = MmGetPfnDb();
      if( v16 >= v62 )
      {
        v5 = v61;
        goto LABEL_40;
      }
      v15 = FileObject;
    }
    v17 = v55;
    v5 = v54;
LABEL_19:
    v31 = FileObject;
    goto LABEL_20;
  }
  v31 = v15;
LABEL_40:
  if( v16 )
  {
    if( *(_WORD *)(a1 + 10) )
      MiEmptyDeferredWorkingSetEntries(a1);
    LODWORD(v47) = MiGetContainingPageTable(v6);
    v46 = MmGetPfnDb();
    v48 = &v46[v47];
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)&v48->u2, 0x3Fui64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( v48->u2._bf_0 < 0 );
    }
    v48->u2._bf_0 ^= (v48->u2._bf_0 ^ (v48->u2._bf_0 + v16)) & 0x3FFFFFFFFFFFFFFFi64;
    _InterlockedAnd64(&v48->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
    LODWORD(v49) = MiGetUsedPtesHandle((PSLIST_ENTRY)((__int64)((v6 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16));
    MiIncreaseUsedPtesCount(v49, (VOID *)v16);
  }
  else
  {
    *(_WORD *)(a1 + 10) = 0;
    v46 = MmGetPfnDb();
  }
  for( ; v16 != v4; ++v16 )
    MiLockAndDecrementShareCount(&v46[v5[v16]], 0i64);
  if( v31 )
    MiDereferenceControlAreaFile(ControlArea, v31);
  return v9;
}

Referenced by:

MiSoftFaultMappedView