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.