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