HalpDmaFlushBuffer
void __fastcall HalpDmaFlushBuffer(__int64 a1, __int64 a2, __int64 a3, unsigned int a4, char a5, char a6){
__int64 v6;
unsigned __int8 CurrentIrql;
PVOID v10;
unsigned __int64 v11;
unsigned __int8 v12;
_MDL *v13;
v6 = a4;
CurrentIrql = KeGetCurrentIrql();
if( (*(_BYTE *)(a2 + 10) & 5) != 0 )
v10 = *(PVOID *)(a2 + 24);
else
v10 = MmMapLockedPagesSpecifyCache((PMDL)a2, 0, MmCached, 0i64, 0, 0x40000020u);
v11 = ((unsigned __int64)(a3 & 0xFFF) + v6 + 4095) >> 12;
if( v10 && (unsigned int)v11 <= 0x200 )
{
v12 = CurrentIrql;
if( CurrentIrql < 2u )
{
v12 = KeGetCurrentIrql();
__writecr8(2ui64);
}
v13 = *(_MDL **)(qword_140C53C60 + 8i64 * *((unsigned int *)KeGetPcr() + 105));
v13->Next = 0i64;
v13->MdlFlags = 0;
v13->Size = 8 * (v11 + 6);
v13->StartVa = (void *)(a3 & 0xFFFFFFFFFFFFF000ui64);
v13->ByteOffset = a3 & 0xFFF;
v13->ByteCount = v6;
IoBuildPartialMdl((_MDL *)a2, v13, (PVOID)a3, (unsigned int)v6);
if( !a6 )
KeFlushIoBuffers(v13, a5 == 0, 1u);
if( CurrentIrql < 2u )
__writecr8(v12);
}
else
{
if( CurrentIrql > 2u )
KeBugCheckEx(0xACu, 0x1000ui64, 0xEF05ui64, 0i64, 0i64);
HalpDmaFlushBufferWithEmergencyResources(a1, a2, a3, v6, a5, a6);
}
}Referenced by:
HalBuildScatterGatherListV2
HalMapTransferEx
HalpDmaFlushContiguousTransferV2
HalpDmaFlushContiguousTransferV3
HalpDmaFlushScatterTransferV2
HalpDmaFlushScatterTransferV3
HalpDmaMapContiguousTransferV2
HalpDmaMapContiguousTransferV3
HalpDmaMapScatterTransferV2
HalpDmaMapScatterTransferV3
IoFlushAdapterBuffersV2
IoMapTransferInternal