MiCompleteRestrictedImageFault

INT64 __fastcall MiCompleteRestrictedImageFault(INT64 rcx0, INT64 rdx0, INT64 *a3, UINT64 a4){
  unsigned int v4; 
  INT64 *v5; 
  UINT64 v6; 
  _MMPFN *PfnDb; 
  unsigned int v9; 
  INT64 v10; 
  unsigned __int64 v11; 
  __int64 v12; 
  _CONTROL_AREA *v13; 
  _FILE_OBJECT *v14; 
  _FILE_OBJECT *v15; 
  unsigned int v16; 
  INT64 v17; 
  char *v18; 
  unsigned __int64 v19; 
  __int64 v20; 
  unsigned __int64 v21; 
  UINT64 v22; 
  unsigned int SessionIdForVa; 
  unsigned __int64 v24; 
  _ETHREAD *CurrentThread; 
  UINT64 v26; 
  UINT64 v27; 
  struct _EX_RUNDOWN_REF *v28; 
  struct _EX_RUNDOWN_REF *v29; 
  int v30; 
  int v31; 
  unsigned __int64 v32; 
  UINT64 ValidPte; 
  WCHAR *v34; 
  UNICODE_STRING *v35; 
  __int64 v36; 
  int v37; 
  __int16 v38; 
  int v39; 
  __int16 v40; 
  __int16 v41; 
  UINT8 v42; 
  int v43; 
  char v44; 
  char v45; 
  int Wsle; 
  _MMPFN *v47; 
  UINT64 v48; 
  _MMPFN *UsedPtesHandle; 
  INT64 a5; 
  _FILE_OBJECT *a2; 
  INT64 *v53; 
  INT64 v54; 
  unsigned __int64 v55; 
  __int64 v56; 
  __int64 v57; 
  UINT64 SpinCount; 
  UINT64 a1; 
  INT64 *v60; 
  unsigned int v61; 
  v61 = a4;
  v60 = a3;
  a1 = rdx0;
  v4 = a4;
  v56 = *(_QWORD *)rcx0;
  v5 = a3;
  v6 = rdx0;
  PfnDb = MmGetPfnDb();
  v9 = 1;
  v10 = (INT64)PfnDb + 48 * *a3;
  v11 = *(_QWORD *)(v10 + 8) | 0x8000000000000000ui64;
  v12 = *(_QWORD *)(v10 + 16);
  v55 = v11;
  if( qword_140C4DC80 && (v12 & 0x10) == 0 )
    v12 &= ~qword_140C4DC80;
  v13 = *(_CONTROL_AREA **)(v12 >> 16);
  v57 = (__int64)v13;
  if( PfSnNumActiveTraces )
  {
    v14 = MiReferenceControlAreaFile(v13);
    v11 = v55;
    v15 = v14;
    PfnDb = MmGetPfnDb();
  }
  else
  {
    v15 = 0i64;
  }
  a2 = v15;
  v16 = 0;
  if( v4 )
  {
    v53 = v5;
    while( 1 )
    {
      v17 = *v5;
      v54 = *v5;
      v18 = (char *)PfnDb + 48 * *v5;
      v19 = *((_QWORD *)v18 + 2);
      v20 = v19;
      if( qword_140C4DC80 && (v19 & 0x10) == 0 )
        v20 = v19 & ~qword_140C4DC80;
      v21 = *((_QWORD *)v18 + 1) | 0x8000000000000000ui64;
      v22 = v6 + 8 * ((__int64)(v21 - v11) >> 3);
      if( !v15 )
        goto LABEL_19;
      SessionIdForVa = MiGetSessionIdForVa((PVOID)((__int64)((v22 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16));
      v24 = MiStartingOffset(v20 >> 16, v21, SessionIdForVa);
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      v26 = v24;
      v28 = PfSnReferenceProcessTrace(*((_QWORD *)CurrentThread + 23), v27);
      v29 = v28;
      if( !v28 )
        break;
      v30 = PfSnCheckLoggingForThread((INT64)CurrentThread, (INT64)v28, 1);
      v32 = (unsigned __int64)a2;
      if( v30 )
      {
        LODWORD(a5) = v31;
        PfSnLogPageFaultCommon((INT64)v29, a2, (UINT64)a2->FsContext, v26, a5);
      }
      ExReleaseRundownProtection(v29 + 45);
      v17 = v54;
      v5 = v53;
LABEL_20:
      ValidPte = MiMakeValidPte(v22, v17, (v19 >> 5) & 0x1F);
      v35 = (UNICODE_STRING *)*(unsigned __int8 *)(rcx0 + 13);
      v36 = ValidPte & 0xFFFFFFFFFFFFFFDFui64;
      if( ((unsigned __int8)v35 & 5) != 4 || ((unsigned __int8)v35 & 2) != 0 )
      {
        v9 = 1;
        goto LABEL_35;
      }
      v37 = *(unsigned __int16 *)(rcx0 + 10);
      v38 = 511;
      if( (_WORD)v37 )
      {
        if( v37 + *(unsigned __int16 *)(rcx0 + 8) == (((unsigned int)v22 >> 3) & 0x1FF) )
        {
          LOBYTE(v35) = (unsigned __int8)v35 & 0x10;
          LOBYTE(v39) = MI_PFN_IS_PROTO((UNICODE_STRING *)v18, v35, 0xFFu, v34);
          if( v39 )
          {
            if( !(_BYTE)v35 )
              goto LABEL_29;
          }
          else if( (_BYTE)v35 )
          {
            goto LABEL_29;
          }
        }
        MiEmptyDeferredWorkingSetEntries(rcx0);
        v38 = 511;
      }
LABEL_29:
      v40 = *(_WORD *)(rcx0 + 10);
      v9 = 1;
      if( v40 )
      {
        *(_WORD *)(rcx0 + 10) = v40 + 1;
      }
      else
      {
        *(_WORD *)(rcx0 + 10) = 1;
        v41 = v38 & ((unsigned int)v22 >> 3);
        v42 = *(_BYTE *)(rcx0 + 13);
        *(_WORD *)(rcx0 + 8) = v41;
        LOBYTE(v43) = MI_PFN_IS_PROTO((UNICODE_STRING *)v18, v35, v42, v34);
        v45 = v44 & 0xEF;
        if( !v43 )
          v45 = v44 | 0x10;
        *(_BYTE *)(rcx0 + 13) = v45;
      }
LABEL_35:
      Wsle = MiAllocateWsle(v56, v22, v18, 0, v36, 12, 0i64);
      v4 = v61;
      v6 = a1;
      if( !Wsle )
      {
        v5 = v60;
        v9 = 0;
        goto LABEL_40;
      }
      v11 = v55;
      ++v5;
      ++v16;
      v53 = v5;
      PfnDb = MmGetPfnDb();
      if( v16 >= v61 )
      {
        v5 = v60;
        goto LABEL_40;
      }
      v15 = a2;
    }
    v17 = v54;
    v5 = v53;
LABEL_19:
    v32 = (unsigned __int64)a2;
    goto LABEL_20;
  }
  v32 = (unsigned __int64)v15;
LABEL_40:
  if( v16 )
  {
    if( *(_WORD *)(rcx0 + 10) )
      MiEmptyDeferredWorkingSetEntries(rcx0);
    v47 = MmGetPfnDb();
    v48 = (UINT64)v47 + 48 * MiGetContainingPageTable(v6);
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)(v48 + 24), 0x3Fui64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( *(__int64 *)(v48 + 24) < 0 );
    }
    *(_QWORD *)(v48 + 24) ^= (*(_QWORD *)(v48 + 24) ^ (*(_QWORD *)(v48 + 24) + v16)) & 0x3FFFFFFFFFFFFFFFi64;
    _InterlockedAnd64((volatile signed __int64 *)(v48 + 24), 0x7FFFFFFFFFFFFFFFui64);
    UsedPtesHandle = MiGetUsedPtesHandle((__int64)((v6 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16);
    MiIncreaseUsedPtesCount(UsedPtesHandle, v16);
  }
  else
  {
    *(_WORD *)(rcx0 + 10) = 0;
    v47 = MmGetPfnDb();
  }
  for( ; v16 != v4; ++v16 )
    MiLockAndDecrementShareCount((UINT64)v47 + 48 * v5[v16], 0);
  if( v32 )
    MiDereferenceControlAreaFile(v57, v32);
  return v9;
}

Referenced by:

MiSoftFaultMappedView