MmStoreProbeAndLockPages
NTSTATUS __stdcall MmStoreProbeAndLockPages(MDL *MemoryDescriptorList, UINT64 UseReservedPages){
int v2;
_ETHREAD *CurrentThread;
int v5;
unsigned int v6;
_QWORD *v7;
int v8;
unsigned __int8 *v9;
NTSTATUS v10;
char *v11;
_QWORD *v12;
UINT64 v13;
INT64 v15;
INT64 v16;
ULONG_PTR BugCheckParameter3[2];
unsigned __int64 v18;
unsigned __int64 v19;
_QWORD *v20;
__int64 v21;
UINT64 SpinCount;
v2 = UseReservedPages;
memset((INT64)BugCheckParameter3, 0i64);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v5 = *((_DWORD *)CurrentThread + 325);
if( v2 )
v6 = v5 & 0xFFFFFFF3 | 8;
else
v6 = v5 & 0xFFFFFFF3 | 4;
LODWORD(v16) = 0;
LODWORD(v15) = 0;
*((_DWORD *)CurrentThread + 325) = v6;
MiProbeAndLockPrepare(
(INT64)BugCheckParameter3,
(INT64)MemoryDescriptorList,
(UINT64)MemoryDescriptorList->StartVa + MemoryDescriptorList->ByteOffset,
MemoryDescriptorList->ByteCount,
1,
v15,
v16);
v7 = v20;
do
{
*v7 = -1i64;
v8 = MiProbeLeafFrame((INT64)BugCheckParameter3);
v10 = v8;
if( v8 == -1073741801 )
break;
if( v8 < 0 )
KeBugCheckEx(0x1Au, 0x6001ui64, v8, BugCheckParameter3[0], (ULONG_PTR)MemoryDescriptorList);
v11 = (char *)MmGetPfnDb() + 48 * v21;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v11 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v11 + 3) < 0 );
}
if( (v11[34] & 8) != 0 )
{
_InterlockedAnd64((volatile signed __int64 *)v11 + 3, 0x7FFFFFFFFFFFFFFFui64);
v10 = -1073740749;
break;
}
MiReferencePageForModifiedWrite((_MMPFN *)v11, 0xDu, v9);
_InterlockedAnd64((volatile signed __int64 *)v11 + 3, 0x7FFFFFFFFFFFFFFFui64);
v12 = v20;
BugCheckParameter3[0] += 4096i64;
*v20 = v21;
v7 = v12 + 1;
v20 = v7;
v18 += 8i64;
}
while( v18 <= v19 );
MiUnlockProbePacketWorkingSet((INT64)BugCheckParameter3);
if( v10 < 0 )
MiUnlockStoreLockedPages(MemoryDescriptorList, v13);
else
MiStoreMarkLockedPagesModified(MemoryDescriptorList);
*((_DWORD *)CurrentThread + 325) &= 0xFFFFFFF3;
return v10;
}Referenced by:
SmKmProbeAndLockAddress