MmAllocateMdlForIoSpace

__int64 __fastcall MmAllocateMdlForIoSpace(_QWORD *a1, unsigned __int64 a2, _MDL **a3){
  unsigned int v4; 
  UINT64 v5; 
  _QWORD *v7; 
  _QWORD *v8; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  _MDL *Mdl; 
  _MDL *v12; 
  __int64 result; 
  unsigned int v14; 
  _MDL *i; 
  unsigned int v16; 
  unsigned __int64 v17; 
  _MDL *v18; 

  v4 = 0;
  v5 = 0i64;
  v7 = a1;
  v8 = a1;
  if( a2 )
  {
    while( (v8[1] & 0xFFF) == 0 )
    {
      if( (*(_DWORD *)v8 & 0xFFF) != 0 )
        break;
      v9 = *v8 >> 12;
      if( v9 <= 0xFFFFFFFFFi64 && (((unsigned __int64)MmGetPfnDb()[v9].u4._bf_0 >> 50) & 1) != 0 )
        break;
      v10 = v5 + v8[1];
      if( v10 < v5 )
        break;
      v5 += v8[1];
      if( v10 > 0xFFFFFFFF )
        break;
      ++v4;
      v8 += 2;
      if( v4 >= a2 )
        goto LABEL_9;
    }
    return 3221225711i64;
  }
  else
  {
LABEL_9:
    Mdl = IoAllocateMdl(0i64, v5, 0, 0, 0i64);
    v12 = Mdl;
    if( Mdl )
    {
      v14 = 0;
      for( i = Mdl + 1; v14 < a2; v7 += 2 )
      {
        v16 = 0;
        v17 = v7[1] >> 12;
        v18 = (_MDL *)(*v7 >> 12);
        if( v17 )
        {
          do
          {
            ++v16;
            i->Next = v18;
            i = (_MDL *)((char *)i + 8);
            v18 = (_MDL *)((char *)v18 + 1);
          }
          while( v16 < v17 );
        }
        ++v14;
      }
      Mdl->Process = 0i64;
      Mdl->MdlFlags |= 0x802u;
      result = 0i64;
      *a3 = v12;
    }
    else
    {
      return 3221225626i64;
    }
  }
  return result;
}

Referenced by:

No references.