MiLockDriverPageRange
NTSTATUS __stdcall MiLockDriverPageRange(INT64 *a1, INT64 a2, UINT64 er8_0, UINT64 a4, CHAR a5, INT64 WsIrql){
__int64 v7;
INT64 *v8;
INT64 v9;
NTSTATUS v10;
unsigned __int64 v11;
_MMPTE *PteBase;
unsigned __int64 v13;
unsigned __int64 v14;
char *v15;
char v16;
unsigned __int64 v17;
INT64 v18;
UINT64 v19;
UINT64 v20;
unsigned __int64 v22;
_UNICODE_STRING *v23;
UINT8 v24;
wchar_t *v25;
__int64 v26;
_MMPFN *v27;
int v28;
NTSTATUS v29;
unsigned int v30;
UINT64 v31;
UINT64 v32;
_MMPTE v33;
_MI_PARTITION *v34;
PVOID VirtualAddress;
UINT64 SpinCount;
_MI_PARTITION *Partition;
INT64 v38;
INT64 v39;
_STRING FullName;
__int64 v41[18];
unsigned int v43;
unsigned int v44;
char WsIrqla;
v44 = a4;
v43 = er8_0;
v7 = (unsigned int)er8_0;
v8 = a1;
memset(v41, 0i64, 0x60u);
v9 = *v8;
v10 = 0;
*(_QWORD *)&FullName.Length = 0i64;
Partition = 0i64;
v11 = *(_QWORD *)(v9 + 48) + (v7 << 12);
VirtualAddress = (PVOID)v11;
PteBase = MmGetPteBase();
v13 = (unsigned __int64)PteBase + ((v11 >> 9) & 0x7FFFFFFFF8i64);
v14 = v13;
if( (v8[7] & 2) != 0 )
v14 = (unsigned __int64)PteBase + ((v13 >> 9) & 0x7FFFFFFFF8i64);
FullName.Buffer = 0i64;
v39 = (WsIrql + 48) & -(__int64)(WsIrql != 0);
LABEL_4:
v15 = 0i64;
MiLockWorkingSetShared();
WsIrqla = v16;
LABEL_27:
v17 = v43;
while( (unsigned int)v17 <= v44 )
{
if( v15 )
{
if( (v13 & 0xFFF) != 0 )
goto LABEL_11;
MiUnlockPageTableInternal(a2, (UINT64)v15);
}
v15 = (char *)MmGetPteBase() + ((v14 >> 9) & 0x7FFFFFFFF8i64);
MiLockPageTableInternal(a2, (UINT64)v15, 0i64);
v17 = v43;
LABEL_11:
if( v8[6] && v17 < v8[5] && _bittest64((const signed __int64 *)v8[6], v17) )
goto LABEL_45;
LODWORD(v18) = MI_READ_PTE_LOCK_FREE(v14);
v38 = v18;
if( (v18 & 1) != 0 )
{
LODWORD(v22) = MI_READ_PTE_LOCK_FREE((INT64)&v38);
v26 = (v22 >> 12) & 0xFFFFFFFFFi64;
if( (v8[7] & 2) != 0 )
v26 += (v13 >> 3) & 0x1FF;
v27 = &MmGetPfnDb()[v26];
LOBYTE(v28) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v27, v23, v24, v25);
if( !v28 )
{
if( _bittest64((const signed __int64 *)a1[4], v43) )
{
v8 = a1;
}
else
{
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v27->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v27->u2._bf_0 < 0 );
}
MiReferenceDriverPage((INT64)v27);
if( (a5 & 1) != 0 && (((unsigned __int64)v27->u4._bf_0 >> 60) & 7) != 3 )
{
*(_QWORD *)&FullName.Length = VirtualAddress;
KeSetPagePrivilege((_PREFIX_TABLE *)v26, &FullName, 256);
*((_DWORD *)a1 + 14) |= 1u;
}
if( v39 )
*(_QWORD *)(v39 + 8i64 * v43) = v26;
MiCaptureDirtyBitToPfn();
if( v33.u.Long )
{
v34 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v27->u4._bf_0 >> 39) & 0x3FF));
Partition = v34;
}
else
{
v34 = Partition;
}
_InterlockedAnd64(&v27->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( v33.u.Long )
MiReleasePageFileInfo(v34, v33, 1ui64);
v8 = a1;
_bittestandset64((signed __int64 *)a1[4], v43);
}
v11 = (unsigned __int64)VirtualAddress;
goto LABEL_45;
}
if( (v27->u4._bf_0 & 0x1000000000i64) != 0 || (__int64)v27->ListEntry.Blink <= 0 )
{
MiUnlockPageTableInternal(a2, (UINT64)v15);
LOBYTE(v32) = WsIrqla;
MiUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)a2, v32);
v8 = a1;
MiMakeDriverPagesPrivate(
(_KLDR_DATA_TABLE_ENTRY *)*a1,
(_MMPTE *)v14,
(_MMPTE *)(v14 + 8i64 * (v44 - v43)),
8u,
(UINT64)VirtualAddress);
MiLockWorkingSetShared();
MiLockPageTableInternal(a2, (UINT64)v15, 0i64);
v11 = (unsigned __int64)VirtualAddress;
goto LABEL_27;
}
v11 = (unsigned __int64)VirtualAddress;
v29 = MiCopyOnWrite((UINT64)VirtualAddress, (INT64 *)v14, 0xFFFFFFFFFFFFFFFFui64, 0i64);
v17 = v43;
v30 = v29;
if( v29 < 0 )
{
MiUnlockPageTableInternal(a2, (UINT64)v15);
LOBYTE(v31) = WsIrqla;
MiUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)a2, v31);
MiCopyOnWriteCheckConditions(a2, v30);
MiLockWorkingSetShared();
MiLockPageTableInternal(a2, (UINT64)v15, 0i64);
v8 = a1;
goto LABEL_27;
}
v8 = a1;
}
else
{
MiUnlockPageTableInternal(a2, (UINT64)v15);
LOBYTE(v19) = WsIrqla;
MiUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)a2, v19);
LOWORD(v41[0]) = 6;
memset(&v41[1], 0, 32);
if( MmAccessFault(0i64, (PVOID)v11, 0, (char *)v41 + 1) >= 0 )
goto LABEL_4;
MiLockWorkingSetShared();
MiLockPageTableInternal(a2, (UINT64)v15, 0i64);
if( (a5 & 2) == 0 )
{
v10 = -1073741701;
break;
}
LABEL_45:
v11 += 4096i64;
v17 = v43 + 1;
v13 += 8i64;
VirtualAddress = (PVOID)v11;
++v43;
if( (v8[7] & 2) == 0 || (v13 & 0xFFF) == 0 )
v14 += 8i64;
}
}
MiUnlockPageTableInternal(a2, (UINT64)v15);
LOBYTE(v20) = WsIrqla;
MiUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)a2, v20);
return v10;
}Referenced by:
MiLockAndMapEntireDriver
MiLockHotPatchPages
MiLockHotPatchUndoPages
MmWriteSystemImageTracepoint