MmStoreProbeAndLockPages
NTSTATUS __stdcall MmStoreProbeAndLockPages(_MDL *MemoryDescriptorList, UINT64 UseReservedPages){
int v2;
_ETHREAD *CurrentThread;
unsigned int SameThreadPassiveFlags;
unsigned int v6;
_QWORD *v7;
NTSTATUS v8;
NTSTATUS v9;
_MMPFN *v10;
__int64 v11;
UINT64 v12;
UINT64 v14;
_MI_PROBE_PACKET Packet[44];
UINT64 SpinCount;
v2 = UseReservedPages;
memset(Packet, 0i64, 0xA8u);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
SameThreadPassiveFlags = CurrentThread->SameThreadPassiveFlags;
if( v2 )
v6 = SameThreadPassiveFlags & 0xFFFFFFF3 | 8;
else
v6 = SameThreadPassiveFlags & 0xFFFFFFF3 | 4;
LODWORD(v14) = 0;
CurrentThread->SameThreadPassiveFlags = v6;
MiProbeAndLockPrepare(
Packet,
MemoryDescriptorList,
(char *)MemoryDescriptorList->StartVa + MemoryDescriptorList->ByteOffset,
MemoryDescriptorList->ByteCount,
1,
IoReadAccess,
v14);
v7 = *(_QWORD **)&Packet[12];
do
{
*v7 = -1i64;
v8 = MiProbeLeafFrame(Packet);
v9 = v8;
if( v8 == -1073741801 )
break;
if( v8 < 0 )
KeBugCheckEx(0x1Au, (PVOID)0x6001, (PVOID)v8, *(PVOID *)Packet, MemoryDescriptorList);
v10 = &MmGetPfnDb()[*(_QWORD *)&Packet[32]];
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v10->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v10->u2._bf_0 < 0 );
}
if( (*(_BYTE *)(&v10->u3 + 1) & 8) != 0 )
{
_InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
v9 = -1073740749;
break;
}
MiReferencePageForModifiedWrite(v10, 0xDui64);
_InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
v11 = *(_QWORD *)&Packet[12];
*(_QWORD *)Packet += 4096i64;
**(_QWORD **)&Packet[12] = *(_QWORD *)&Packet[32];
v7 = (_QWORD *)(v11 + 8);
*(_QWORD *)&Packet[12] = v7;
*(_QWORD *)&Packet[4] += 8i64;
}
while( *(_QWORD *)&Packet[4] <= *(_QWORD *)&Packet[6] );
MiUnlockProbePacketWorkingSet(Packet);
if( v9 < 0 )
MiUnlockStoreLockedPages(MemoryDescriptorList, v12);
else
MiStoreMarkLockedPagesModified(MemoryDescriptorList);
CurrentThread->SameThreadPassiveFlags &= 0xFFFFFFF3;
return v9;
}Referenced by:
SmKmProbeAndLockAddress