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