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