HalpDmaCommitScatterMapBuffers
_HALP_DMA_TRANSLATION_ENTRY *__fastcall HalpDmaCommitScatterMapBuffers(
__int64 a1,
__int64 a2,
__int64 a3,
int a4,
_DWORD *a5){
__int64 *v8;
unsigned __int64 v9;
_HALP_DMA_TRANSLATION_ENTRY *result;
__int64 v11;
char v12;
__int64 v13;
__int64 v14;
__int64 v15;
__int64 v16;
__int64 v17;
__int64 v18;
struct _KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
if( a5 )
{
v8 = (__int64 *)(a5 + 12);
v9 = (((a5[8] + a5[11]) & 0xFFF) + (unsigned __int64)(unsigned int)a5[10] + 4095) >> 12;
}
else
{
LODWORD(v9) = a4;
v8 = 0i64;
}
result = HalpDmaGetTranslationEntries((_HALP_DMA_ADAPTER_OBJECT *)a1, HalpDmaNonContiguousMapBuffer, (unsigned int)v9);
v11 = (__int64)result;
if( result )
{
v12 = *(_BYTE *)(a1 + 144);
v13 = (__int64)result;
if( (_DWORD)v9 )
{
v14 = (unsigned int)v9;
do
{
v15 = a3;
if( a5 )
{
v16 = *v8++;
v15 = v16 << 12;
}
else
{
a3 += 4096i64;
}
*(_QWORD *)v13 = v15;
if( a2 )
{
v17 = a2 | *(_DWORD *)(v13 + 48) & 0xFFF;
a2 += 4096i64;
}
else
{
v17 = *(_QWORD *)(v13 + 48);
}
*(_QWORD *)(v13 + 48) = (4i64 * (v12 & 1)) | v17 & 0xFFFFFFFFFFFFFFFAui64 | v12 & 1 | 0xA;
v13 = *(_QWORD *)(v13 + 8);
--v14;
}
while( v14 );
}
KeAcquireInStackQueuedSpinLock((UINT64 *)(a1 + 120), &LockHandle);
v18 = HalpDmaPrependTranslations(v11, v9, *(_QWORD *)(a1 + 24));
*(_DWORD *)(a1 + 32) += v9;
*(_QWORD *)(a1 + 24) = v18;
if( v12 )
*(_DWORD *)(a1 + 208) += v9;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
return(_HALP_DMA_TRANSLATION_ENTRY *)v11;
}
return result;
}Referenced by:
HalpDmaAllocateLocalScatterPool
HalpDmaGrowScatterMapBuffers