MiUnlockStoreLockedPages
VOID __stdcall MiUnlockStoreLockedPages(_MDL *MemoryDescriptorList, UINT64 UnlockAfterFailure){
_MDL *v2;
unsigned int v4;
_MDL *v5;
_MMPFN *v6;
UINT8 v7;
unsigned int v8;
unsigned __int64 v9;
_MMPTE v10;
_MI_PARTITION *v11;
v2 = MemoryDescriptorList + 1;
v4 = 0;
v5 = (_MDL *)((char *)MemoryDescriptorList
+ 8
* ((MemoryDescriptorList->ByteCount
+ 4095i64
+ (unsigned __int64)((LODWORD(MemoryDescriptorList->StartVa) + MemoryDescriptorList->ByteOffset) & 0xFFF)) >> 12)
+ 48);
do
{
if( v2->Next == (_MDL *)-1i64 )
break;
v6 = &MmGetPfnDb()[(__int64)v2->Next];
v7 = MiLockPageInline(v6);
v8 = v4 & 0xFFFFFFFD;
v9 = v7;
v4 |= 2u;
if( (*(_BYTE *)(&v6->u3 + 1) & 0x10) == 0 )
v4 = v8;
LODWORD(v10.u.Long) = MiWriteCompletePfn(v6);
v11 = v10.u.Long ? *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267)
+ 8 * (((unsigned __int64)v6->u4._bf_0 >> 39) & 0x3FF)) : 0i64;
_InterlockedAnd64(&v6->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v9);
if( v10.u.Long )
MiReleasePageFileInfo(v11, v10, 0i64);
v2 = (_MDL *)((char *)v2 + 8);
}
while( v2 < v5 );
MemoryDescriptorList->MdlFlags &= ~2u;
}Referenced by:
MmStoreProbeAndLockPages
SmKmUnlockMdl