IoFlushAdapterBuffersV3
NTSTATUS __stdcall IoFlushAdapterBuffersV3(
_ADAPTER_OBJECT *ChildAdapter,
_MDL *Mdl,
VOID *MapRegisterBase,
VOID *CurrentVa,
UINT64 Length,
INT64 WriteToDevice){
bool v10;
_DMA_OPERATIONS *v11;
NTSTATUS result;
UINT64 v13;
INT64 v14;
INT64 DeferFlushing;
if( (_DWORD)Length )
{
if( ChildAdapter->TranslationType == ExtTranslationTypeTranslate )
{
v10 = *((_BYTE *)MapRegisterBase + 64) == 0;
v11 = (_DMA_OPERATIONS *)*((_QWORD *)MapRegisterBase + 3);
*((_QWORD *)MapRegisterBase + 5) = v11;
if( v10 )
{
result = HalpDmaFreeLa(&ChildAdapter->AdapterObject.DmaHeader, v11);
*((_QWORD *)MapRegisterBase + 4) = 0i64;
}
}
if( !ChildAdapter->MasterDevice )
HalpDmaControllerFlushChannel(ChildAdapter->DmaController, ChildAdapter->ChannelNumber);
if( ChildAdapter->NeedsMapRegisters )
{
if( MapRegisterBase )
*((_QWORD *)MapRegisterBase + 7) = MapRegisterBase;
LOBYTE(DeferFlushing) = 0;
LOBYTE(v14) = WriteToDevice;
LODWORD(v13) = Length;
if( ChildAdapter->ScatterGather )
HalpDmaFlushScatterTransferV3(
ChildAdapter,
Mdl,
(_HALP_DMA_TRANSLATION_ENTRY *)MapRegisterBase,
CurrentVa,
v13,
v14,
DeferFlushing,
0i64);
else
HalpDmaFlushContiguousTransferV3(
ChildAdapter,
Mdl,
(_HALP_DMA_TRANSLATION_ENTRY *)MapRegisterBase,
CurrentVa,
v13,
v14,
DeferFlushing,
0i64);
}
}
LOBYTE(result) = 1;
return result;
}Referenced by:
IoFlushAdapterBuffers