HalBuildMdlFromScatterGatherListV2
NTSTATUS __stdcall HalBuildMdlFromScatterGatherListV2(
_ADAPTER_OBJECT *AdapterObject,
_SCATTER_GATHER_LIST *ScatterGather,
_MDL *OriginalMdl,
_MDL **TargetMdl){
unsigned __int64 Reserved;
unsigned int NumberOfElements;
_SCATTER_GATHER_ELEMENT *Elements;
unsigned int v9;
_MDL *v10;
_MDL *v11;
int v12;
unsigned int v13;
UINT64 v14;
char v15;
_SCATTER_GATHER_ELEMENT *v16;
ULONG LowPart;
unsigned int v18;
unsigned int v19;
_MDL *Mdl;
_MDL *v21;
_MDL *Next;
_MDL *v23;
int v24;
_MDL *v25;
char v26;
__int64 v27;
_LARGE_INTEGER Address;
__int64 Length;
_MDL *v30;
unsigned __int64 v31;
__int64 v32;
unsigned int v33;
ULONG v34;
unsigned int v35;
unsigned int v36;
if( !OriginalMdl )
return -1073741811;
if( !AdapterObject->NeedsMapRegisters && AdapterObject->CacheCoherent )
{
*TargetMdl = OriginalMdl;
return 0;
}
Reserved = ScatterGather->Reserved;
if( Reserved && *(_QWORD *)(Reserved + 16) )
return -1073741709;
NumberOfElements = ScatterGather->NumberOfElements;
Elements = ScatterGather->Elements;
v9 = 0;
v33 = NumberOfElements;
v10 = 0i64;
v36 = 0;
v11 = 0i64;
v12 = 0;
v13 = 0;
v14 = 0i64;
v15 = 1;
v16 = ScatterGather->Elements;
if( !NumberOfElements )
{
LABEL_30:
v23 = v10 + 1;
v24 = 0;
v25 = v10;
v26 = 1;
if( ScatterGather->NumberOfElements )
{
v27 = ScatterGather->NumberOfElements;
do
{
Address = Elements->Address;
Length = Elements->Length;
if( !v26 && (v24 || (Address.anonymous_0.LowPart & 0xFFF) != 0) )
{
v25 = v25->Next;
v23 = v25 + 1;
}
v30 = (_MDL *)((unsigned __int64)Address.QuadPart >> 12);
v31 = ((Elements->Address.QuadPart & 0xFFFui64) + Length + 4095) >> 12;
if( (_DWORD)v31 )
{
v32 = (unsigned int)v31;
do
{
v23->Next = v30;
v23 = (_MDL *)((char *)v23 + 8);
v30 = (_MDL *)((char *)v30 + 1);
--v32;
}
while( v32 );
}
v26 = 0;
v24 = (LOWORD(Address.anonymous_0.LowPart) + (_WORD)Length) & 0xFFF;
++Elements;
--v27;
}
while( v27 );
}
*TargetMdl = v10;
if( Reserved )
*(_QWORD *)(Reserved + 16) = v10;
return 0;
}
do
{
LowPart = v16->Address.anonymous_0.LowPart;
v18 = v16->Length;
v19 = v16->Address.anonymous_0.LowPart & 0xFFF;
v35 = v18;
v34 = v16->Address.anonymous_0.LowPart;
if( !v15 && (v12 || v19) )
{
Mdl = IoAllocateMdl((VOID *)v13, v14, 1u, 0, 0i64);
if( !Mdl )
goto LABEL_26;
Mdl->MdlFlags |= 0x2802u;
if( v10 )
v11->Next = Mdl;
else
v10 = Mdl;
NumberOfElements = v33;
v11 = Mdl;
v9 = v36;
LODWORD(v14) = 0;
LOWORD(LowPart) = v34;
v18 = v35;
}
v15 = 0;
if( (_DWORD)v14 )
v19 = v13;
++v9;
v14 = v18 + (unsigned int)v14;
v13 = v19;
v12 = ((_WORD)LowPart + (_WORD)v18) & 0xFFF;
v36 = v9;
++v16;
}
while( v9 < NumberOfElements );
if( !(_DWORD)v14 )
goto LABEL_30;
v21 = IoAllocateMdl((VOID *)v19, v14, 1u, 0, 0i64);
if( v21 )
{
v21->MdlFlags |= 0x2802u;
if( v10 )
v11->Next = v21;
else
v10 = v21;
goto LABEL_30;
}
LABEL_26:
if( v10 )
{
do
{
Next = v10->Next;
IoFreeMdl(v10);
v10 = Next;
}
while( Next );
}
return -1073741670;
}Referenced by:
No references.