MiInitializeMdlPages

_MDL *__stdcall MiInitializeMdlPages(
        ULONG_PTR MemoryDescriptorList,
        UINT64 Flags,
        _MI_PFN_CACHE_ATTRIBUTE CacheAttribute,
        UINT64 MdlPageSpan,
        UINT64 ZeroingNecessary){
  _QWORD *v5; 
  unsigned __int64 v6; 
  int v7; 
  __int64 v8; 
  __int64 v9; 
  unsigned __int8 CurrentIrql; 
  unsigned __int64 v11; 
  _MDL *result; 
  INT64 v13; 
  __int64 v14; 
  _EPROCESS *Process; 

  v14 = *(_QWORD *)&MemoryDescriptorList;
  v5 = (_QWORD *)(*(_QWORD *)&MemoryDescriptorList + 48i64);
  v6 = (unsigned __int64)*(unsigned int *)(*(_QWORD *)&MemoryDescriptorList + 40i64) >> 12;
  v7 = Flags;
  v8 = *(_QWORD *)&MemoryDescriptorList;
  if( (Flags & 0x80000200) != 0 )
    v9 = 0i64;
  else
    v9 = MiSwizzleInvalidPte(128i64);
  Process = KeGetCurrentThread()->ApcState.Process;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  v11 = 0i64;
  if( v6 )
  {
    do
    {
      LODWORD(v13) = v7;
      MiInitializeMdlLeafPfns((INT64)&MmGetPfnDb()[*v5], 1i64, (UINT64)Process, v9, v13);
      if( CurrentIrql < 2u && (v11 & 0xF) == 0 && (unsigned int)KeShouldYieldProcessor() )
      {
        __writecr8(CurrentIrql);
        CurrentIrql = KeGetCurrentIrql();
        __writecr8(2ui64);
      }
      ++v11;
      ++v5;
    }
    while( v11 < v6 );
    v8 = v14;
  }
  __writecr8(CurrentIrql);
  *(_QWORD *)(v8 + 16) = 0i64;
  result = (_MDL *)2;
  *(_WORD *)(v8 + 10) |= 2u;
  return result;
}

Referenced by:

MiAllocatePagesForMdl
MiReturnMdlExcess