HalpDmaCheckMdlAccessibility
CHAR *__stdcall HalpDmaCheckMdlAccessibility(INT64 a1, INT64 *a2, UINT64 a3, UINT64 a4, CHAR *a5, _MDL **a6){
unsigned int v7;
unsigned int v8;
INT64 *v9;
CHAR v11;
CHAR *result;
__int64 v13;
unsigned int v14;
unsigned int v15;
int v16;
_MDL *Mdl;
_MDL *v18;
VOID *v19;
unsigned int v20;
INT64 *v21;
unsigned int v22;
_MDL *Next;
UINT64 v24;
UINT64 Priority;
VOID *VirtualAddress;
_MDL **p_Next;
v7 = a4;
v8 = a3;
v9 = a2;
*a6 = 0i64;
p_Next = 0i64;
if( KeGetCurrentIrql() > 2u || *(_BYTE *)(a1 + 437) )
{
LABEL_3:
if( *a6 )
{
do
{
Next = (*a6)->Next;
IoFreeMdl(*a6);
*a6 = Next;
}
while( Next );
}
v11 = 0;
}
else
{
v11 = 1;
if( a2 )
{
while( v7 )
{
v13 = *((unsigned int *)v9 + 11);
v14 = *((_DWORD *)v9 + 10) - v8;
if( v14 >= v7 )
v14 = v7;
v15 = v13 + v8;
if( !*(_BYTE *)(a1 + 437) )
{
v16 = HalpDmaGetAdapterCacheAlignment((_ADAPTER_OBJECT *)a1) - 1;
if( (v16 & v15) != 0 || (v14 & v16) != 0 )
goto LABEL_3;
}
VirtualAddress = (VOID *)(v8 + v13 + v9[4]);
Mdl = IoAllocateMdl(VirtualAddress, v14, 0, 0, 0i64);
v18 = Mdl;
if( !Mdl )
goto LABEL_3;
if( *a6 )
*p_Next = Mdl;
else
*a6 = Mdl;
p_Next = &Mdl->Next;
if( (*((_BYTE *)v9 + 10) & 5) != 0 )
{
v19 = (VOID *)v9[3];
}
else
{
LODWORD(Priority) = 1073741856;
LODWORD(v24) = 0;
v19 = MmMapLockedPagesSpecifyCache((_MDL *)v9, 0, MmCached, 0i64, v24, Priority);
}
if( !v19 )
goto LABEL_3;
IoBuildPartialMdl((_MDL *)v9, v18, VirtualAddress, v14);
v20 = 4096 - (v15 & 0xFFF);
v21 = &v9[((unsigned __int64)v15 >> 12) + 6];
if( v14 )
{
while( *(_QWORD *)(a1 + 136) >= (unsigned __int64)(*v21 << 12) || *(_DWORD *)(a1 + 512) == 2 )
{
++v21;
v22 = v14;
if( v14 >= v20 )
v22 = v20;
v20 = 4096;
v7 -= v22;
v14 -= v22;
if( !v14 )
goto LABEL_27;
}
goto LABEL_3;
}
LABEL_27:
v9 = (INT64 *)*v9;
v8 = 0;
if( !v9 )
break;
}
}
}
result = a5;
*a5 = v11;
return result;
}Referenced by:
HalFlushAdapterBuffersEx
HalMapTransferEx