HalpDmaFlushBufferWithEmergencyResources
VOID __stdcall HalpDmaFlushBufferWithEmergencyResources(
_DOUBLE ChildAdapter,
_MDL *Mdl,
VOID *CurrentVa,
UINT64 WriteToDevice,
INT64 DeferFlushing,
INT64 a6){
unsigned int v7;
int v9;
int v10;
_MDL **v11;
_MDL *v12;
_MEMORY_CACHING_TYPE v13;
VOID *v14;
unsigned int v15;
_KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
v7 = WriteToDevice;
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&qword_140CF2318, &LockHandle);
v9 = (unsigned __int16)CurrentVa & 0xFFF;
v10 = 4096 - v9;
v11 = &Mdl[1].Next + (unsigned int)(((unsigned __int64)CurrentVa - (unsigned __int64)Mdl->StartVa) >> 12);
v12 = (_MDL *)::Mdl;
*(_QWORD *)(::Mdl + 32) = (unsigned __int64)CurrentVa & 0xFFFFFFFFFFFFF000ui64;
for( v12->ByteOffset = v9; ; v12->ByteOffset = (unsigned __int16)CurrentVa & 0xFFF )
{
v12->ByteCount = v10;
if( !v7 )
break;
v13 = MmNonCached;
v12[1].Next = *v11;
while( 1 )
{
v14 = MmMapLockedPagesWithReservedMapping(MappingAddress, 0x206C6148ui64, v12, v13);
if( v14 )
break;
if( ++v13 >= MmMaximumCacheType )
KeBugCheckEx(0xACu, (PVOID)0x1000, (PVOID)0xEF01, 0i64, 0i64);
}
v15 = v7;
if( v7 >= 4096 - v9 )
v15 = 4096 - v9;
if( !(_BYTE)a6 )
KeFlushIoBuffers(v12, (_BYTE)DeferFlushing == 0, 1u);
MmUnmapReservedMapping((UINT64)v14, 0x206C6148ui64, (INT64)v12);
v7 -= v15;
CurrentVa = (char *)CurrentVa + v15;
++v11;
v9 = 0;
v10 = v7;
if( v7 > 0x1000 )
v10 = 4096;
v12->StartVa = (void *)((unsigned __int64)CurrentVa & 0xFFFFFFFFFFFFF000ui64);
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
}Referenced by:
HalpDmaFlushBuffer