HalpDmaSyncMapBuffersWithEmergencyResources
__int64 __fastcall HalpDmaSyncMapBuffersWithEmergencyResources(
__int64 a1,
__int64 a2,
__int64 a3,
_QWORD *a4,
unsigned int a5,
char a6,
char a7,
char a8){
_QWORD *v8;
PMDL v11;
PMDL v12;
unsigned int v13;
unsigned __int64 v15;
_MDL **v16;
PVOID v17;
UINT8 *v18;
UINT8 *v19;
char v20;
MEMORY_CACHING_TYPE v21;
UINT8 *v22;
UINT8 *v23;
unsigned int v24;
int v25;
unsigned int v26;
__int16 v27;
__int64 v28;
unsigned __int64 v29;
int v30;
__int64 result;
_MDL **v32;
struct _KLOCK_QUEUE_HANDLE LockHandle;
int AdapterCacheAlignment;
__int64 v36;
_QWORD *v37;
v37 = a4;
v36 = a3;
v8 = a4;
memset(&LockHandle, 0, sizeof(LockHandle));
AdapterCacheAlignment = HalpDmaGetAdapterCacheAlignment(a1);
KeAcquireInStackQueuedSpinLock(&qword_140CF2318, &LockHandle);
v11 = MemoryDescriptorList;
v12 = Mdl;
v13 = a3 & 0xFFF;
v15 = (unsigned __int64)(a3 - *(_QWORD *)(a2 + 32)) >> 12;
MemoryDescriptorList->ByteOffset = v13;
v11->ByteCount = 4096 - v13;
v11->StartVa = (void *)(a3 & 0xFFFFFFFFFFFFF000ui64);
v12->StartVa = (void *)(a3 & 0xFFFFFFFFFFFFF000ui64);
v16 = (_MDL **)(a2 + 8 * ((unsigned int)v15 + 6i64));
v12->ByteOffset = v13;
for( v12->ByteCount = 4096 - v13; ; v12->ByteCount = v26 )
{
v32 = v16;
if( !a5 )
break;
if( (v8[6] & 0xFFFFFFFFFFFFF000ui64) != 0 )
{
v19 = (UINT8 *)(v13 + (v8[6] & 0xFFFFFFFFFFFFF000ui64));
v20 = 0;
}
else
{
v17 = qword_140C53C50;
v12[1].Next = (_MDL *)(*v8 >> 12);
LODWORD(v18) = MmMapLockedPagesWithReservedMapping(v17, 0x206C6148ui64, v12, MmCached);
v19 = v18;
if( !v18 )
KeBugCheckEx(0xACu, 0x1000ui64, 0xEF00ui64, 0i64, 0i64);
v16 = v32;
v20 = 1;
}
v21 = MmNonCached;
v11[1].Next = *v16;
while( 1 )
{
LODWORD(v22) = MmMapLockedPagesWithReservedMapping(MappingAddress, 0x206C6148ui64, v11, v21);
v23 = v22;
if( v22 )
break;
if( ++v21 >= MmMaximumCacheType )
KeBugCheckEx(0xACu, 0x1000ui64, 0xEF01ui64, 0i64, 0i64);
}
v24 = a5;
if( a5 >= 4096 - v13 )
v24 = 4096 - v13;
v13 = 0;
if( a6 )
{
if( !a7 )
((void(__fastcall *)(UINT8 *, UINT8 *, _QWORD))HalpMoveMemory)(v19, v22, v24);
}
else
{
if( !*(_BYTE *)(a1 + 437) )
{
v25 = ~(AdapterCacheAlignment - 1);
v12->ByteOffset = v25 & (unsigned int)v19 & 0xFFF;
v12->StartVa = (void *)((unsigned __int64)&v19[-((unsigned int)v19 - (v25 & (unsigned int)v19))] & 0xFFFFFFFFFFFFF000ui64);
v12->ByteCount = v25 & (v24 + AdapterCacheAlignment + (_DWORD)v19 - (v25 & (unsigned int)v19) - 1);
if( !a8 )
KeFlushIoBuffers(v12, 1u, 1u);
}
if( !a7 )
memmove(v23, v19, v24);
}
MmUnmapReservedMapping(v23, 0x206C6148u, v11);
if( v20 )
MmUnmapReservedMapping(v19, 0x206C6148u, v12);
a5 -= v24;
v26 = a5;
v16 = v32 + 1;
v27 = v24 + v36;
v8 = (_QWORD *)v37[1];
v28 = v24 + v36;
v37 = v8;
if( a5 > 0x1000 )
v26 = 4096;
v36 += v24;
v29 = v28 & 0xFFFFFFFFFFFFF000ui64;
v11->ByteCount = v26;
v11->StartVa = (void *)v29;
v30 = v27 & 0xFFF;
v11->ByteOffset = v30;
v12->StartVa = (void *)v29;
v12->ByteOffset = v30;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
result = (unsigned int)KiIrqlFlags;
__writecr8(LockHandle.OldIrql);
return result;
}Referenced by:
HalpDmaSyncMapBuffers