IoMapTransferInternal
_LARGE_INTEGER __stdcall IoMapTransferInternal(
_ADAPTER_OBJECT *ChildAdapter,
_MDL *Mdl,
VOID *MapRegisterBase,
VOID *CurrentVa,
UINT8 DeferFlushing,
UINT64 WriteToDevice,
UINT8 a7){
unsigned int v10;
__int64 *v11;
unsigned int v12;
__int64 v13;
UINT64 v14;
_LARGE_INTEGER v15;
VOID *v17;
VOID *v18;
_ADAPTER_OBJECT *v19;
INT64 v20;
INT64 a6;
UINT8 v22;
if( MapRegisterBase )
{
LOBYTE(a6) = WriteToDevice;
if( HalpDmaGetAdapterVersion(ChildAdapter) == 2 )
return HalpMapTransferV2(v19, Mdl, v17, v18, DeferFlushing, a6, v22);
else
return HalpMapTransferV3(v19, Mdl, v17, v18, DeferFlushing, a6, a7);
}
else
{
v10 = 4096 - ((unsigned __int16)CurrentVa & 0xFFF);
v11 = (__int64 *)(&Mdl[1].Next + (((unsigned __int64)CurrentVa - (unsigned __int64)Mdl->StartVa) >> 12));
v12 = *(_DWORD *)DeferFlushing;
v13 = *v11;
v14 = *(unsigned int *)DeferFlushing;
v15.QuadPart = ((unsigned __int16)CurrentVa & 0xFFF) + (*v11 << 12);
if( v10 < *(_DWORD *)DeferFlushing )
{
do
{
if( v13 + 1 != *++v11 )
break;
v13 ^= *v11;
if( (v13 & 0xFFFFFFFFFFF00000ui64) != 0 )
break;
v10 += 4096;
v13 = *v11;
}
while( v10 < v12 );
if( v10 < v12 )
{
*(_DWORD *)DeferFlushing = v10;
v14 = v10;
}
}
if( !ChildAdapter->CacheCoherent )
{
LOBYTE(a6) = a7;
LOBYTE(v20) = WriteToDevice;
HalpDmaFlushBuffer(v13, Mdl, CurrentVa, v14, v20, a6);
}
return v15;
}
}Referenced by:
HalMapTransferEx
IoMapTransfer