HalpDmaFlushBuffer
VOID __stdcall HalpDmaFlushBuffer(
_DOUBLE ChildAdapter,
_MDL *Mdl,
VOID *CurrentVa,
UINT64 WriteToDevice,
INT64 DeferFlushing,
INT64 a6){
__int64 v6;
unsigned __int8 CurrentIrql;
void *MappedSystemVa;
unsigned __int64 v11;
unsigned __int8 v12;
_MDL *v13;
UINT64 BugCheckOnFailure;
UINT64 Priority;
v6 = (unsigned int)WriteToDevice;
CurrentIrql = KeGetCurrentIrql();
if( (Mdl->MdlFlags & 5) != 0 )
{
MappedSystemVa = Mdl->MappedSystemVa;
}
else
{
LODWORD(Priority) = 1073741856;
LODWORD(BugCheckOnFailure) = 0;
MappedSystemVa = MmMapLockedPagesSpecifyCache(Mdl, 0, MmCached, 0i64, BugCheckOnFailure, Priority);
}
v11 = ((unsigned __int64)((unsigned __int16)CurrentVa & 0xFFF) + v6 + 4095) >> 12;
if( MappedSystemVa && (unsigned int)v11 <= 0x200 )
{
v12 = CurrentIrql;
if( CurrentIrql < 2u )
{
v12 = KeGetCurrentIrql();
__writecr8(2ui64);
}
v13 = (_MDL *)*((_QWORD *)qword_140C53C60 + KeGetPcr()->Prcb.Number);
v13->Next = 0i64;
v13->MdlFlags = 0;
v13->Size = 8 * (v11 + 6);
v13->StartVa = (void *)((unsigned __int64)CurrentVa & 0xFFFFFFFFFFFFF000ui64);
v13->ByteOffset = (unsigned __int16)CurrentVa & 0xFFF;
v13->ByteCount = v6;
IoBuildPartialMdl(Mdl, v13, CurrentVa, (unsigned int)v6);
if( !(_BYTE)a6 )
KeFlushIoBuffers(v13, (_BYTE)DeferFlushing == 0, 1u);
if( CurrentIrql < 2u )
__writecr8(v12);
}
else
{
if( CurrentIrql > 2u )
KeBugCheckEx(0xACu, (PVOID)0x1000, (PVOID)0xEF05, 0i64, 0i64);
LOBYTE(Priority) = a6;
LOBYTE(BugCheckOnFailure) = DeferFlushing;
HalpDmaFlushBufferWithEmergencyResources(
ChildAdapter,
Mdl,
CurrentVa,
(unsigned int)v6,
BugCheckOnFailure,
Priority);
}
}Referenced by:
HalBuildScatterGatherListV2
HalMapTransferEx
HalpDmaFlushContiguousTransferV2
HalpDmaFlushContiguousTransferV3
HalpDmaFlushScatterTransferV2
HalpDmaFlushScatterTransferV3
HalpDmaMapContiguousTransferV2
HalpDmaMapContiguousTransferV3
HalpDmaMapScatterTransferV2
HalpDmaMapScatterTransferV3
IoFlushAdapterBuffersV2
IoMapTransferInternal