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