HalpDmaFlushBufferWithEmergencyResources
__int64 __fastcall HalpDmaFlushBufferWithEmergencyResources(
__int64 a1,
__int64 a2,
__int64 a3,
unsigned int a4,
char a5,
char a6){
unsigned int v9;
unsigned int v10;
_MDL **v11;
PMDL v12;
MEMORY_CACHING_TYPE v13;
void *v14;
void *v15;
unsigned int v16;
__int64 result;
struct _KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
KeAcquireInStackQueuedSpinLock(&qword_140CF2318, &LockHandle);
v9 = a3 & 0xFFF;
v10 = 4096 - v9;
v11 = (_MDL **)(a2 + 48 + 8i64 * (unsigned int)((unsigned __int64)(a3 - *(_QWORD *)(a2 + 32)) >> 12));
v12 = MemoryDescriptorList;
MemoryDescriptorList->StartVa = (void *)(a3 & 0xFFFFFFFFFFFFF000ui64);
for( v12->ByteOffset = v9; ; v12->ByteOffset = a3 & 0xFFF )
{
v12->ByteCount = v10;
if( !a4 )
break;
v13 = MmNonCached;
v12[1].Next = *v11;
while( 1 )
{
LODWORD(v14) = MmMapLockedPagesWithReservedMapping(MappingAddress, 0x206C6148ui64, v12, v13);
v15 = v14;
if( v14 )
break;
if( ++v13 >= MmMaximumCacheType )
KeBugCheckEx(0xACu, 0x1000ui64, 0xEF01ui64, 0i64, 0i64);
}
v16 = a4;
if( a4 >= 4096 - v9 )
v16 = 4096 - v9;
if( !a6 )
KeFlushIoBuffers(v12, a5 == 0, 1u);
MmUnmapReservedMapping(v15, 0x206C6148u, v12);
a4 -= v16;
a3 += v16;
++v11;
v9 = 0;
v10 = a4;
if( a4 > 0x1000 )
v10 = 4096;
v12->StartVa = (void *)(a3 & 0xFFFFFFFFFFFFF000ui64);
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
result = (unsigned int)KiIrqlFlags;
__writecr8(LockHandle.OldIrql);
return result;
}Referenced by:
HalpDmaFlushBuffer