HalFlushAdapterBuffersEx
NTSTATUS __stdcall HalFlushAdapterBuffersEx(
_ADAPTER_OBJECT *ChildAdapter,
_MDL *Mdl,
VOID *MapRegisterBase,
UINT64 Offset,
UINT64 Length,
INT64 WriteToDevice){
bool v7;
_HALP_DMA_TRANSLATION_ENTRY *v8;
_MDL *ScatterGatherMdl;
unsigned int v12;
UINT64 ByteCount;
_DMA_OPERATIONS *v15;
_MDL *Next;
unsigned int MappedLength;
unsigned int ByteOffset;
NTSTATUS AdapterCacheAlignment;
__int64 v20;
unsigned __int64 v21;
CHAR v22;
char v23;
_MDL *v24;
_MDL *v25;
unsigned int v26;
unsigned int v27;
char *v28;
UINT64 v29;
INT64 v30;
INT64 DeferFlushing;
PVOID BugCheckParameter4;
CHAR v33;
_HALP_DMA_TRANSLATION_ENTRY *NextMappingOut;
v7 = ChildAdapter->TranslationType == ExtTranslationTypeTranslate;
v8 = (_HALP_DMA_TRANSLATION_ENTRY *)MapRegisterBase;
v33 = 0;
BugCheckParameter4 = 0i64;
NextMappingOut = 0i64;
if( v7 )
{
v15 = (_DMA_OPERATIONS *)*((_QWORD *)MapRegisterBase + 3);
*((_QWORD *)MapRegisterBase + 5) = v15;
HalpDmaFreeLa(&ChildAdapter->AdapterObject.DmaHeader, v15);
}
ScatterGatherMdl = ChildAdapter->ScatterGatherMdl;
if( ScatterGatherMdl )
{
do
{
Next = ScatterGatherMdl->Next;
if( (ScatterGatherMdl->MdlFlags & 1) != 0 )
MmUnmapLockedPages(ScatterGatherMdl->MappedSystemVa, ScatterGatherMdl);
IoFreeMdl(ScatterGatherMdl);
ScatterGatherMdl = Next;
}
while( Next );
}
v12 = Length;
ChildAdapter->ScatterGatherMdl = 0i64;
if( !v12 )
{
if( !ChildAdapter->MasterDevice )
HalpDmaControllerFlushChannel(ChildAdapter->DmaController, ChildAdapter->ChannelNumber);
return 0;
}
if( !Mdl )
return -1073741811;
do
{
ByteCount = Mdl->ByteCount;
if( Offset < ByteCount )
break;
Mdl = Mdl->Next;
Offset -= ByteCount;
}
while( Mdl );
if( !Mdl )
return -1073741811;
if( !ChildAdapter->MasterDevice )
HalpDmaControllerFlushChannel(ChildAdapter->DmaController, ChildAdapter->ChannelNumber);
if( !ChildAdapter->NeedsMapRegisters )
return 0;
if( v8 )
{
MappedLength = v8->MappedLength;
if( Mdl->Next
|| (ByteOffset = Mdl->ByteOffset,
AdapterCacheAlignment = HalpDmaGetAdapterCacheAlignment(ChildAdapter),
((AdapterCacheAlignment - 1) & (unsigned int)v20) != 0)
&& v21 >= (v20 & 0xFFFFFFFFFFFFF000ui64) )
{
v12 = MappedLength;
}
else
{
v12 = (-AdapterCacheAlignment & (v21 + AdapterCacheAlignment - 1)) - ByteOffset - Offset;
if( v12 > MappedLength )
v12 = MappedLength;
}
}
HalpDmaCheckMdlAccessibility(
(INT64)ChildAdapter,
(INT64 *)Mdl,
(unsigned int)Offset,
v12,
&v33,
(_MDL **)&BugCheckParameter4);
v22 = v33;
v23 = WriteToDevice;
if( v33 )
{
v24 = (_MDL *)BugCheckParameter4;
if( !(_BYTE)WriteToDevice )
HalpDmaFlushDriverMdl(BugCheckParameter4);
if( v24 )
{
do
{
v25 = v24->Next;
IoFreeMdl(v24);
v24 = v25;
}
while( v25 );
}
if( !v8 )
return 0;
v22 = v33;
LABEL_35:
v8->NextMapping = v8;
while( v12 )
{
v26 = v12;
if( !Mdl )
break;
v27 = v12;
if( Mdl->ByteCount - (int)Offset <= v12 )
v27 = Mdl->ByteCount - Offset;
v28 = (char *)Mdl->StartVa + Mdl->ByteOffset + Offset;
v12 -= v27;
if( v12 && !Mdl->Next )
{
v27 = v26;
v12 = 0;
}
LOBYTE(DeferFlushing) = v22;
LOBYTE(v30) = v23;
LODWORD(v29) = v27;
if( ChildAdapter->ScatterGather )
HalpDmaFlushScatterTransferV3(ChildAdapter, Mdl, v8, v28, v29, v30, DeferFlushing, &NextMappingOut);
else
HalpDmaFlushContiguousTransferV3(ChildAdapter, Mdl, v8, v28, v29, v30, DeferFlushing, &NextMappingOut);
v8 = NextMappingOut;
Offset = 0i64;
Mdl = Mdl->Next;
v22 = v33;
}
return 0;
}
if( v8 )
goto LABEL_35;
return -1073741823;
}Referenced by:
HalPutScatterGatherListV3