MiAllocatePagesForMdl

_MDL *__stdcall MiAllocatePagesForMdl(
        _MI_PARTITION *Partition,
        _LARGE_INTEGER LowAddress,
        _LARGE_INTEGER HighAddress,
        _LARGE_INTEGER SkipBytes,
        UINT64 TotalBytes,
        _MI_PFN_CACHE_ATTRIBUTE CacheAttribute,
        UINT16 IdealNode,
        UINT64 Flags){
  LARGE_INTEGER PerformanceCounter; 
  EVENT_DESCRIPTOR *v13; 
  unsigned __int64 v14; 
  _MI_PFN_CACHE_ATTRIBUTE v15; 
  _DWORD *v16; 
  unsigned int v17; 
  MDL *v18; 
  _MI_PFN_CACHE_ATTRIBUTE v19; 
  UINT64 v20; 
  int v21; 
  PVOID v22; 
  int v24; 
  LPCGUID ActivityId; 
  LPCGUID RelatedActivityId; 
  INT64 UserDataCount; 
  UINT64 UserDataCounta; 
  PEVENT_DATA_DESCRIPTOR UserData; 
  PEVENT_DATA_DESCRIPTOR UserDataa; 
  INT64 v31; 
  UINT16 v32; 
  int v33; 
  INT64 result; 
  UINT64 Flagsa; 
  unsigned __int64 v36; 
  PVOID P; 
  __int64 v38[6]; 
  int v39; 
  int v40; 
  EVENT_DATA_DESCRIPTOR v41; 
  memset((INT64)&result, 0i64);
  PerformanceCounter = KeQueryPerformanceCounter(0i64);
  LODWORD(v31) = Flags;
  LODWORD(UserData) = IdealNode;
  LODWORD(UserDataCount) = CacheAttribute;
  if( (int)MiValidateMdlAllocationRequest(
              (INT64)&result,
              (INT64)Partition,
              LowAddress.QuadPart,
              HighAddress.QuadPart,
              SkipBytes.QuadPart,
              TotalBytes,
              UserDataCount,
              (INT64)UserData,
              v31) >= 0
    && (int)MiObtainMdlCharges((INT64)&result) >= 0 )
  {
    v16 = P;
    v41.Ptr = v36;
    *((_DWORD *)P + 10) = 0;
    v17 = 0;
    while( 1 )
    {
      v33 = v16[10];
      MiFindPagesForMdl(
        (_MI_PARTITION *)&result,
        (_MDL *)v14,
        (UINT64)v13,
        v15,
        (UINT64)ActivityId,
        (UINT64)RelatedActivityId,
        UserDataCounta,
        (UINT64)UserDataa,
        v32);
      v14 = (unsigned int)v16[10];
      if( v14 >> 12 == v41.Ptr )
        break;
      v24 = Flagsa;
      if( (Flagsa & 0x80u) == 0i64 )
        goto LABEL_21;
      if( v33 == (_DWORD)v14 )
      {
        if( v17 > 3 || KeGetCurrentIrql() >= 2u || (Flagsa & 8) != 0 )
        {
LABEL_21:
          MiReturnMdlExcess((INT64)&result);
          break;
        }
        KeDelayExecutionThread(0, 0, (PLARGE_INTEGER)&Mi10Milliseconds);
        v24 = Flagsa;
        ++v17;
      }
      else
      {
        v17 = 0;
      }
      LODWORD(Flagsa) = v24 & 0xFFFEFFFF;
    }
    v18 = (MDL *)P;
    if( P )
    {
      if( (Flags & 0x40) == 0 )
      {
        MiInitializeMdlBatchPages((INT64)&result);
        MiInitializeMdlPages(v18, (unsigned int)Flagsa, v19, v20, (UINT64)ActivityId);
      }
      if( (Flagsa & 0x100) != 0 )
        P = MiRemoveMdlPages(v18, (unsigned int)Flagsa);
    }
  }
  v21 = Flagsa;
  v22 = P;
  if( EtwEventEnabled(EtwpMemoryProvRegHandle, (EVENT_DESCRIPTOR *)&KERNEL_MEM_EVENT_MDL_ALLOCATION, v13) )
  {
    v38[0] = EtwpGetDurationSince(PerformanceCounter.QuadPart);
    v38[1] = TotalBytes;
    v38[5] = (__int64)v22;
    v41.Ptr = (unsigned __int64)v38;
    LODWORD(UserDataCounta) = 1;
    v38[2] = LowAddress.QuadPart;
    v38[3] = HighAddress.QuadPart;
    v38[4] = SkipBytes.QuadPart;
    v39 = IdealNode;
    v40 = v21;
    *(_QWORD *)&v41.Size = 56i64;
    EtwWriteEx(
      EtwpMemoryProvRegHandle,
      (EVENT_DESCRIPTOR *)&KERNEL_MEM_EVENT_MDL_ALLOCATION,
      0i64,
      1ui64,
      0i64,
      0i64,
      UserDataCounta,
      &v41);
  }
  return(_MDL *)P;
}

Referenced by:

MiAllocatePartitionPhysicalPages
MiAllocateUserPhysicalPages
MiPopulateCombineMdls
MmAllocateNonCachedMemory
MmAllocatePagesForMdl
MmAllocatePartitionNodePagesForMdlEx