HalpDmaSyncMapBuffers
VOID __stdcall HalpDmaSyncMapBuffers(
_ADAPTER_OBJECT *ChildAdapter,
_MDL *Mdl,
VOID *CurrentVa,
_HALP_DMA_TRANSLATION_ENTRY *TranslationBase,
UINT64 Length,
INT64 CopyDown,
UINT8 CacheSyncOnly,
UINT8 DeferFlushing){
unsigned __int8 CurrentIrql;
char *MappedSystemVa;
__int64 v14;
unsigned __int64 v15;
unsigned int v16;
_HALP_DMA_TRANSLATION_ENTRY *i;
char *v18;
INT64 v19;
char *v20;
unsigned int v21;
_HALP_DMA_TRANSLATION_ENTRY *v22;
size_t v23;
const VOID *v24;
UINT64 v25;
UINT64 Priority;
int v27;
char *v28;
INT64 v29[2];
__int128 v30;
__int128 v31;
__int64 v32;
char v33;
*(_OWORD *)v29 = 0i64;
v30 = 0i64;
v31 = 0i64;
v32 = 0i64;
CurrentIrql = KeGetCurrentIrql();
if( (Mdl->MdlFlags & 5) != 0 )
{
MappedSystemVa = (char *)Mdl->MappedSystemVa;
}
else
{
LODWORD(Priority) = 1073741856;
LODWORD(v25) = 0;
MappedSystemVa = (char *)MmMapLockedPagesSpecifyCache(Mdl, 0, MmCached, 0i64, v25, Priority);
}
if( MappedSystemVa )
{
v33 = 0;
v14 = (unsigned __int16)CurrentVa & 0xFFF;
v15 = (v14 + (unsigned __int64)(unsigned int)Length + 4095) >> 12;
v27 = v15;
if( CurrentIrql <= 2u )
{
if( CurrentIrql < 2u )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v33 = 1;
}
HalpDmaAcquireBufferMappings(v14, TranslationBase, v15, (__int64)v29);
}
else
{
v16 = 0;
for( i = TranslationBase; v16 < (unsigned int)v15; ++v16 )
{
if( ((unsigned __int64)i->u.VirtualAddress & 0xFFFFFFFFFFFFF000ui64) == 0 )
KeBugCheckEx(0xACu, (PVOID)0x1000, (PVOID)0xEF03, 0i64, 0i64);
i = i->Next;
}
}
v18 = &MappedSystemVa[(char *)CurrentVa - Mdl->ByteOffset - (char *)Mdl->StartVa];
v28 = v18;
v19 = (unsigned __int16)v18 & 0xFFF;
v20 = v18;
if( !ChildAdapter->CacheCoherent && !(_BYTE)CopyDown )
{
LOBYTE(Priority) = DeferFlushing;
LOBYTE(v25) = 0;
HalpFlushMapBuffers(ChildAdapter, v18, TranslationBase, (unsigned int)Length, v25, Priority);
v19 = (unsigned __int16)v18 & 0xFFF;
}
if( (_DWORD)Length )
{
v21 = Length;
v22 = TranslationBase;
do
{
v23 = v21;
if( v21 >= 4096 - (int)v19 )
v23 = 4096 - v19;
v24 = (const VOID *)(((unsigned __int64)v22->u.VirtualAddress & 0xFFFFFFFFFFFFF000ui64) + (unsigned int)v19);
if( !CacheSyncOnly )
{
if( (_BYTE)CopyDown )
((void(__fastcall *)(const VOID *, char *, _QWORD))HalpMoveMemory)(v24, v18, v23);
else
memmove(v18, v24, v23);
}
v22 = v22->Next;
v19 = 0i64;
v18 += v23;
v21 -= v23;
}
while( v21 );
LODWORD(v15) = v27;
v20 = v28;
}
if( !ChildAdapter->CacheCoherent && (_BYTE)CopyDown )
{
LOBYTE(Priority) = DeferFlushing;
LOBYTE(v25) = CopyDown;
HalpFlushMapBuffers(ChildAdapter, v20, TranslationBase, (unsigned int)Length, v25, Priority);
}
if( CurrentIrql <= 2u )
HalpDmaReleaseBufferMappings(v19, (INT64)TranslationBase, (unsigned int)v15, (INT64)v29);
if( v33 )
__writecr8(CurrentIrql);
}
else
{
if( CurrentIrql > 2u )
KeBugCheckEx(0xACu, (PVOID)0x1000, (PVOID)0xEF05, 0i64, 0i64);
HalpDmaSyncMapBuffersWithEmergencyResources(
ChildAdapter,
Mdl,
CurrentVa,
(_KLOCK_QUEUE_HANDLE *)TranslationBase,
Length,
CopyDown);
}
}Referenced by:
HalpDmaFlushContiguousTransferV2
HalpDmaFlushContiguousTransferV3
HalpDmaFlushScatterTransferV2
HalpDmaFlushScatterTransferV3
HalpDmaMapContiguousTransferV2
HalpDmaMapContiguousTransferV3
HalpDmaMapScatterTransferV2
HalpDmaMapScatterTransferV3