MiCreateMdl

_MDL *__stdcall MiCreateMdl(UINT64 NumberOfBytes){
  unsigned int v1; 
  UINT64 v2; 
  int v3; 
  unsigned int v4; 
  UINT64 v5; 
  unsigned int v6; 
  _MDL *Mdl; 
  _MDL *v9; 
  UINT64 v10; 
  _MDL *v11; 
  _MDL *v12; 
  VOID *MappedSystemVa; 
  VOID *Pool; 
  void *v16; 
  _MDL *v17; 
  UINT64 v18; 
  UINT64 Priority; 

  v4 = v2;
  v5 = v2 >> 12;
  v6 = v1;
  if( v3 )
  {
    Mdl = IoAllocateMdl(0i64, (unsigned int)v2, 0, 0, 0i64);
    v9 = Mdl;
    if( Mdl )
    {
      v10 = 0i64;
      v11 = Mdl + 1;
      if( v5 )
      {
        while( 1 )
        {
          MiGetPageForHeader((_MI_PARTITION *)NumberOfBytes, v6);
          if( v12 == (_MDL *)-1i64 )
            break;
          if( !v10 )
            v9->MdlFlags |= 0x4002u;
          v11->Next = v12;
          ++v10;
          v11 = (_MDL *)((char *)v11 + 8);
          if( v10 >= v5 )
            goto LABEL_8;
        }
        v9->ByteCount = (_DWORD)v10 << 12;
        goto LABEL_16;
      }
LABEL_8:
      if( (v9->MdlFlags & 5) != 0 )
      {
        MappedSystemVa = v9->MappedSystemVa;
      }
      else
      {
        LODWORD(Priority) = 1073741856;
        LODWORD(v18) = 0;
        MappedSystemVa = MmMapLockedPagesSpecifyCache(v9, 0, MmCached, 0i64, v18, Priority);
      }
      if( !MappedSystemVa )
      {
LABEL_16:
        MiDeleteImageCreationMdls(v9);
        return 0i64;
      }
      return v9;
    }
  }
  else
  {
    Pool = MiAllocatePool(64i64, v2, 0x78786D4Dui64);
    v16 = Pool;
    if( Pool )
    {
      v17 = IoAllocateMdl(Pool, v4, 0, 0, 0i64);
      v9 = v17;
      if( !v17 )
      {
        ExFreePoolWithTag(v16, 0);
        return 0i64;
      }
      MmBuildMdlForNonPagedPool(v17);
      v9->MdlFlags |= 0x4000u;
      return v9;
    }
  }
  return 0i64;
}

Referenced by:

MiCreateImageFileMap