HalpDmaFlushScatterTransferV2
VOID __stdcall HalpDmaFlushScatterTransferV2(
_ADAPTER_OBJECT *ChildAdapter,
_MDL *Mdl,
_HALP_DMA_TRANSLATION_ENTRY *TranslationBase,
VOID *CurrentVa,
UINT64 Length,
INT64 WriteToDevice){
int v10;
__int64 ContiguousPiece;
__int64 v12;
__int64 v13;
char v14;
__int64 v15;
__int64 v16;
_HALP_DMA_TRANSLATION_ENTRY *NextMapping;
unsigned __int64 v18;
__int64 v19;
INT64 WriteToDevicea;
UINT64 Lengtha;
if( TranslationBase )
{
TranslationBase->NextMapping = TranslationBase;
if( !(_BYTE)WriteToDevice )
{
v10 = Length;
if( (_DWORD)Length )
{
while( 1 )
{
LODWORD(Lengtha) = v10;
LOBYTE(WriteToDevicea) = 0;
ContiguousPiece = (unsigned int)HalpDmaNextContiguousPiece(
ChildAdapter,
Mdl,
TranslationBase,
CurrentVa,
WriteToDevicea,
Lengtha);
v12 = (unsigned __int16)CurrentVa & 0xFFF;
if( ChildAdapter->AdapterObject.MaximumPhysicalAddress.QuadPart < (unsigned __int64)(v12
+ (*((_QWORD *)&Mdl[1].Next
+ (unsigned int)(((unsigned __int64)CurrentVa - (unsigned __int64)Mdl->StartVa) >> 12)) << 12)
+ ContiguousPiece
- 1) )
break;
if( !ChildAdapter->CacheCoherent )
{
v13 = (unsigned int)(HalpDmaGetAdapterCacheAlignment(ChildAdapter) - 1);
if( (v13 & v16) != 0 || (v15 & v13) != 0 )
break;
if( !v14 )
{
LOBYTE(Lengtha) = 0;
LOBYTE(WriteToDevicea) = 0;
HalpDmaFlushBuffer(v13, Mdl, CurrentVa, (unsigned int)ContiguousPiece, WriteToDevicea, Lengtha);
}
}
LABEL_14:
CurrentVa = (char *)CurrentVa + ContiguousPiece;
v10 -= ContiguousPiece;
if( !v10 )
goto LABEL_15;
}
LOBYTE(Lengtha) = 0;
LODWORD(WriteToDevicea) = ContiguousPiece;
HalpDmaSyncMapBuffers(ChildAdapter, Mdl, CurrentVa, TranslationBase->NextMapping, WriteToDevicea, Lengtha, 0, 0);
NextMapping = TranslationBase->NextMapping;
v18 = (unsigned __int64)(v12 + ContiguousPiece + 4095) >> 12;
if( (_DWORD)v18 )
{
v19 = (unsigned int)v18;
do
{
NextMapping = NextMapping->Next;
--v19;
}
while( v19 );
}
TranslationBase->NextMapping = NextMapping;
goto LABEL_14;
}
LABEL_15:
TranslationBase->NextMapping = TranslationBase;
}
}
}Referenced by:
IoFlushAdapterBuffersV2