MiUpdateImportRelocationsOnDriverPrivatePages

INT64 __fastcall MiUpdateImportRelocationsOnDriverPrivatePages(INT64 a1, INT64 a2, UINT64 a3){
  UINT64 v3; 
  UINT64 v4; 
  __int64 v5; 
  CHAR *AnyMultiplexedVm; 
  _MMPTE *PteBase; 
  unsigned __int64 v8; 
  UINT8 v9; 
  __int64 v10; 
  INT64 v11; 
  ULONG_PTR v12; 
  NTSTATUS v13; 
  unsigned __int64 v14; 
  char *v15; 
  UNICODE_STRING *v16; 
  UINT8 v17; 
  PWCHAR v18; 
  int v19; 
  int updated; 
  UINT64 v21; 
  INT64 v22; 
  INT64 v23; 
  ULONG_PTR BugCheckParameter4; 
  INT64 v26; 
  INT64 v27; 
  unsigned __int64 v28; 
  INT64 v29; 
  INT64 v30; 
  INT64 v31; 
  INT64 v32; 
  UINT8 v33; 
  UINT64 SpinCount; 
  v3 = 0i64;
  v4 = a3;
  AnyMultiplexedVm = MiGetAnyMultiplexedVm(1i64);
  PteBase = MmGetPteBase();
  v8 = (unsigned __int64)PteBase + ((*(_QWORD *)(v5 + 48) >> 9) & 0x7FFFFFFFF8i64);
  v28 = v8 + 8 * ((unsigned __int64)*(unsigned int *)(v5 + 64) >> 12);
  v33 = MiLockWorkingSetShared((INT64)AnyMultiplexedVm);
  v9 = v33;
  if( v8 >= v28 )
    return MiUnlockWorkingSetShared((INT64)AnyMultiplexedVm, v9);
  v10 = 0i64;
  do
  {
    if( v3 )
    {
      if( (v8 & 0xFFF) != 0 )
        goto LABEL_7;
      MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, v3);
    }
    v3 = (UINT64)PteBase + ((v8 >> 9) & 0x7FFFFFFFF8i64);
    MiLockPageTableInternal((INT64)AnyMultiplexedVm, v3, 0i64);
LABEL_7:
    v11 = MI_READ_PTE_LOCK_FREE(v8);
    v27 = v11;
    v12 = v11;
    if( !v11 )
      goto LABEL_22;
    if( (v11 & 1) != 0 )
    {
      v14 = ((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v27) >> 12) & 0xFFFFFFFFFi64;
      v15 = (char *)MmGetPfnDb() + 48 * v14;
      LOBYTE(v19) = MI_PFN_IS_PROTO((UNICODE_STRING *)v15, v16, v17, v18);
      if( !v19 )
      {
        LODWORD(SpinCount) = 0;
        while( _interlockedbittestandset64((volatile signed __int32 *)v15 + 6, 0x3Fui64) )
        {
          do
            KeYieldProcessorEx(&SpinCount);
          while( *((__int64 *)v15 + 3) < 0 );
        }
        MiReferenceDriverPage((INT64)v15);
        _InterlockedAnd64((volatile signed __int64 *)v15 + 3, 0x7FFFFFFFFFFFFFFFui64);
        MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, v3);
        v3 = 0i64;
        MiUnlockWorkingSetShared((INT64)AnyMultiplexedVm, v9);
        updated = MiUpdateImagePfnImportRelocations(a2, v4, v10 >> 3, v14);
        MiLockPageInline((INT64)v15);
        v21 = 0i64;
        v22 = 0i64;
        if( updated != 1 )
        {
          v21 = MiCaptureDirtyBitToPfn((INT64)v15);
          v22 = *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v15 + 5) >> 39) & 0x3FFi64));
        }
        MiRemoveLockedPageChargeAndDecRef((_MMPFN *)v15);
        _InterlockedAnd64((volatile signed __int64 *)v15 + 3, 0x7FFFFFFFFFFFFFFFui64);
        if( v21 )
          MiReleasePageFileInfo(v22, v21, 1, v23, BugCheckParameter4, v26, v27, v28, v29, v30, v31, v32);
        MiLockWorkingSetShared((INT64)AnyMultiplexedVm);
        v9 = v33;
        v4 = a3;
      }
      PteBase = MmGetPteBase();
LABEL_22:
      v8 += 8i64;
      v10 += 8i64;
      continue;
    }
    if( (v11 & 0x400) != 0 )
      goto LABEL_22;
    MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, v3);
    v3 = 0i64;
    MiUnlockWorkingSetShared((INT64)AnyMultiplexedVm, v9);
    v13 = MmAccessFault(0i64, (PVOID)((__int64)((v8 << 25) - ((_QWORD)PteBase << 25)) >> 16), 0, 0i64);
    if( v13 < 0 )
      KeBugCheckEx(0x1Au, 0x1081ui64, (__int64)((v8 << 25) - ((_QWORD)PteBase << 25)) >> 16, v12, v13);
    MiLockWorkingSetShared((INT64)AnyMultiplexedVm);
    v9 = v33;
  }
  while( v8 < v28 );
  if( v3 )
    MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, v3);
  return MiUnlockWorkingSetShared((INT64)AnyMultiplexedVm, v9);
}

Referenced by:

MiApplyImportOptimizationToRuntimeDriver