MiProbeAndLockPages
VOID __fastcall MiProbeAndLockPages(INT64 rcx0, CHAR dl0, INT64 a3){
int v3;
char v6;
NTSTATUS v7;
INT64 v8;
INT64 v9;
NTSTATUS v10;
UINT64 *v11;
unsigned __int64 v12;
bool v13;
INT64 v14;
LONG *v15;
struct _KPRCB *CurrentPrcb;
int v17;
int v18;
__int64 v19;
int i;
UINT64 v21;
UINT64 *v22;
INT64 v23;
_MDL *v24;
_BYTE *v25;
unsigned __int64 v26;
UINT64 v27;
int v28;
int v29;
INT64 *v30;
INT64 **v31;
__int64 v32;
unsigned __int64 v33;
__int64 v34;
unsigned __int64 v35;
INT64 v36;
INT64 a6;
INT64 a6a;
INT64 v39;
CHAR v40;
INT64 result[2];
UINT64 *v42;
unsigned __int64 v43;
UINT64 a2;
UINT64 v45;
UINT64 *v46;
PMDL MemoryDescriptorList;
char v48;
UINT8 v49;
ULONG_PTR v50;
INT64 a1;
__int64 v52;
__int64 v53;
PVOID P;
UINT64 v55;
unsigned __int64 v56;
unsigned __int64 v57;
__int64 v58;
UINT64 v59;
UINT64 v60;
v3 = a3;
memset((INT64)result, 0i64);
v6 = 0;
LODWORD(v39) = 1;
LODWORD(a6) = v3;
v7 = MiProbeAndLockPrepare(
(INT64)result,
rcx0,
*(_QWORD *)(rcx0 + 32) + *(unsigned int *)(rcx0 + 44),
*(unsigned int *)(rcx0 + 40),
dl0,
a6,
v39);
v10 = v7;
if( v7 < 0 )
RtlRaiseStatus(v7);
v11 = v42;
v12 = result[0];
while( 1 )
{
v13 = (v48 & 0x20) == 0;
*v46 = -1i64;
if( v13 )
break;
v26 = v56;
if( v12 > v57 || v12 < v56 )
break;
if( (v6 & 0x3F) != 0 || !(unsigned int)MiProbePacketContended(result) )
{
if( v58 == -1 )
{
v60 = *v11;
v27 = v60;
MiPteInShadowRange((UINT64)&v60);
v55 = (v27 >> 12) & 0xFFFFFFFFFi64;
}
else
{
v55 = v58 + ((v12 - v26) >> 12);
}
LABEL_18:
v10 = MiProbeLockFrame((__int64)result);
if( v10 < 0 )
goto LABEL_21;
v22 = v46;
v12 = result[0] + 4096;
++v46;
v11 = ++v42;
*v22 = v55;
result[0] = v12;
goto LABEL_20;
}
LABEL_45:
MiUnlockProbePacketWorkingSet((INT64)result);
MiLockProbePacketWorkingSet((INT64)result, v30, v31);
v11 = v42;
v12 = result[0];
LABEL_20:
++v6;
if( (unsigned __int64)v11 > v43 )
goto LABEL_21;
}
if( (v6 & 0xF) != 0 )
goto LABEL_14;
v14 = a1;
if( a2 )
{
MiPageTableLockIsContended(a1, a2, v8, v9, v36, a6a, v40);
if( v28 )
goto LABEL_45;
}
v15 = (*(_BYTE *)(v14 + 184) & 7) == 2 ? &dword_140C4F4C0 : (LONG *)(v14 + 192);
if( (*v15 & 0x40000000) != 0 )
goto LABEL_45;
CurrentPrcb = KeGetCurrentPrcb();
v17 = *((_DWORD *)CurrentPrcb + 3147);
if( (v17 & 1) != 0 )
{
v18 = 1;
if( *((_DWORD *)CurrentPrcb + 8103) <= 7u )
goto LABEL_13;
if( !*((_BYTE *)CurrentPrcb + 12585) )
goto LABEL_64;
v29 = 1;
}
else
{
v18 = 0;
if( (v17 & 0x1E) != 0 )
{
v29 = 2;
goto LABEL_44;
}
if( *((_BYTE *)CurrentPrcb + 12585) )
{
v29 = 3;
goto LABEL_44;
}
v19 = *((_QWORD *)CurrentPrcb + 2);
if( v19 && v19 != *((_QWORD *)CurrentPrcb + 1) )
{
v29 = 4;
goto LABEL_44;
}
LABEL_13:
if( *((_DWORD *)CurrentPrcb + 7931) <= 7u )
goto LABEL_14;
if( !v18 )
{
LABEL_51:
_disable();
*((_DWORD *)CurrentPrcb + 7931) = 0;
*((_DWORD *)CurrentPrcb + 8103) = 0;
KiResetGlobalDpcWatchdogProfiler((INT64)CurrentPrcb);
_enable();
v29 = 0;
goto LABEL_44;
}
LABEL_64:
if( (v17 & 0x1E) != 0 )
{
v29 = 5;
}
else
{
if( *((_QWORD *)CurrentPrcb + 1) == *((_QWORD *)CurrentPrcb + 3) )
goto LABEL_51;
v29 = 6;
}
}
LABEL_44:
if( v29 )
goto LABEL_45;
LABEL_14:
LODWORD(v59) = 0;
for( i = MiLockPageLeafPageTable((INT64)result); v45 != ZeroPte; i = MiLockPageLeafPageTable((INT64)result) )
{
i = MiProbeLeafPteAccess((INT64)result, (UINT64)&v59);
if( i < 0 )
break;
if( !(_DWORD)v59 )
{
v21 = v45;
MiPteInShadowRange((UINT64)&v45);
v55 = (v21 >> 12) & 0xFFFFFFFFFi64;
MiSetProbePagesAhead((INT64)result);
goto LABEL_18;
}
if( (_DWORD)v59 != 1 )
{
i = MiFaultInProbeAddress((INT64)result);
if( i < 0 )
{
++dword_140C4E4BC;
break;
}
}
}
v10 = i;
if( i >= 0 )
goto LABEL_18;
LABEL_21:
v23 = a1;
if( a2 )
MiUnlockPageTableInternal(a1, a2);
MiUnlockWorkingSetShared(v23, v49);
v24 = MemoryDescriptorList;
if( (MmTrackLockedPages & 1) != 0 )
MiAddMdlTracker(
MemoryDescriptorList,
(MemoryDescriptorList->ByteCount
+ 4095i64
+ (unsigned __int64)((LODWORD(MemoryDescriptorList->StartVa) + MemoryDescriptorList->ByteOffset) & 0xFFF)) >> 12,
3ui64);
if( v10 < 0 )
{
MmUnlockPages(v24);
++dword_140C4E4E0;
}
v25 = P;
if( P )
{
v32 = *((unsigned int *)P + 13);
LODWORD(v32) = v32 & 0x7FFFFFFF;
v33 = (v52 + (v32 | ((unsigned __int64)*((unsigned __int8 *)P + 34) << 31))) >> 31;
v34 = v53;
*((_DWORD *)P + 13) ^= (*((_DWORD *)P + 13) ^ (v52 + (v32 | (*((unsigned __int8 *)P + 34) << 31)))) & 0x7FFFFFFF;
v25[34] = v33;
v35 = v34 - v52;
if( v35 )
MiReturnFullProcessCommitment(v50, v35);
MiUnlockAndDereferenceVad(v25);
}
if( v10 < 0 )
RtlRaiseStatus(v10);
}Referenced by:
CcLockSystemCacheBuffer
CcPrepareMdlWrite
CcZeroDataInCache
IopProbeAndLockPages
IopProbeAndLockPages_0
IopProbeAndLockPages_1
IopProbeAndLockPages_2
KiOpPatchCode
MiGetWorkingSetInfo
MiGetWorkingSetInfoList
MiLockRetpolineStubs
MiPrepareImagePagesForHotPatch
MmProbeAndLockPages
MmProbeAndLockPagesPrivate
PspIumAllocatePartitionState
SmPrepareForFatalPageError
VmProbeAndLockPages
VslFinalizeSecureImageHash
VslValidateDynamicCodePages
VslpLockMdlForTransfer
VslpLockPagesForTransfer