HalpDmaSyncMapBuffersWithEmergencyResources
VOID __stdcall HalpDmaSyncMapBuffersWithEmergencyResources(
_ADAPTER_OBJECT *ChildAdapter,
_MDL *Mdl,
VOID *CurrentVa,
_KLOCK_QUEUE_HANDLE *TranslationBase,
UINT8 CacheSyncOnly,
UINT8 DeferFlushing){
_KLOCK_QUEUE_HANDLE *Lock;
_MDL *v9;
_MDL *v10;
unsigned int v11;
unsigned int v12;
unsigned __int64 v13;
_MDL **v14;
VOID *v15;
UINT64 v16;
char v17;
_MEMORY_CACHING_TYPE v18;
VOID *v19;
size_t v20;
int v21;
int v22;
__int16 v23;
unsigned __int64 v24;
unsigned __int64 v25;
int v26;
_MDL **v27;
_KLOCK_QUEUE_HANDLE LockHandle;
NTSTATUS AdapterCacheAlignment;
char *v31;
_KLOCK_QUEUE_HANDLE *v32;
char v33;
char v34;
v32 = TranslationBase;
v31 = (char *)CurrentVa;
Lock = TranslationBase;
memset(&LockHandle, 0, sizeof(LockHandle));
AdapterCacheAlignment = HalpDmaGetAdapterCacheAlignment(ChildAdapter);
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&qword_140CF2318, &LockHandle);
v9 = (_MDL *)::Mdl;
v10 = (_MDL *)MemoryDescriptorList;
v11 = (unsigned __int16)CurrentVa & 0xFFF;
v12 = CacheSyncOnly;
v13 = ((unsigned __int64)CurrentVa - (unsigned __int64)Mdl->StartVa) >> 12;
*(_DWORD *)(::Mdl + 44) = v11;
v9->ByteCount = 4096 - v11;
v9->StartVa = (void *)((unsigned __int64)CurrentVa & 0xFFFFFFFFFFFFF000ui64);
v10->StartVa = (void *)((unsigned __int64)CurrentVa & 0xFFFFFFFFFFFFF000ui64);
v14 = &Mdl[1].Next + (unsigned int)v13;
v10->ByteOffset = v11;
for( v10->ByteCount = 4096 - v11; ; v10->ByteCount = v22 )
{
v27 = v14;
if( !v12 )
break;
if( ((unsigned __int64)Lock[2].LockQueue.Next & 0xFFFFFFFFFFFFF000ui64) != 0 )
{
v16 = v11 + ((unsigned __int64)Lock[2].LockQueue.Next & 0xFFFFFFFFFFFFF000ui64);
v17 = 0;
}
else
{
v15 = qword_140C53C50;
v10[1].Next = (_MDL *)((unsigned __int64)Lock->LockQueue.Next >> 12);
v16 = (UINT64)MmMapLockedPagesWithReservedMapping(v15, 0x206C6148ui64, v10, MmCached);
if( !v16 )
KeBugCheckEx(0xACu, (PVOID)0x1000, (PVOID)0xEF00, 0i64, 0i64);
v14 = v27;
v17 = 1;
}
v18 = MmNonCached;
v9[1].Next = *v14;
while( 1 )
{
v19 = MmMapLockedPagesWithReservedMapping(MappingAddress, 0x206C6148ui64, v9, v18);
if( v19 )
break;
if( ++v18 >= MmMaximumCacheType )
KeBugCheckEx(0xACu, (PVOID)0x1000, (PVOID)0xEF01, 0i64, 0i64);
}
v20 = v12;
if( v12 >= 4096 - v11 )
v20 = 4096 - v11;
v11 = 0;
if( DeferFlushing )
{
if( !v33 )
((void(__fastcall *)(UINT64, VOID *, _QWORD))HalpMoveMemory)(v16, v19, v20);
}
else
{
if( !ChildAdapter->CacheCoherent )
{
v21 = ~(AdapterCacheAlignment - 1);
v10->ByteOffset = v21 & v16 & 0xFFF;
v10->StartVa = (void *)((v16 - ((unsigned int)v16 - (v21 & (unsigned int)v16))) & 0xFFFFFFFFFFFFF000ui64);
v10->ByteCount = v21 & (v20 + AdapterCacheAlignment + v16 - (v21 & v16) - 1);
if( !v34 )
KeFlushIoBuffers(v10, 1u, 1u);
}
if( !v33 )
memmove(v19, (const VOID *)v16, v20);
}
MmUnmapReservedMapping((UINT64)v19, 0x206C6148ui64, (INT64)v9);
if( v17 )
MmUnmapReservedMapping(v16, 0x206C6148ui64, (INT64)v10);
v12 -= v20;
v22 = v12;
v14 = v27 + 1;
v23 = v20 + (_WORD)v31;
Lock = (_KLOCK_QUEUE_HANDLE *)v32->LockQueue.Lock;
v24 = (unsigned __int64)&v31[v20];
v32 = Lock;
if( v12 > 0x1000 )
v22 = 4096;
v31 += v20;
v25 = v24 & 0xFFFFFFFFFFFFF000ui64;
v9->ByteCount = v22;
v9->StartVa = (void *)v25;
v26 = v23 & 0xFFF;
v9->ByteOffset = v26;
v10->StartVa = (void *)v25;
v10->ByteOffset = v26;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
}Referenced by:
HalpDmaSyncMapBuffers