HalpDmaCommitContiguousMapBuffers
_HALP_DMA_TRANSLATION_ENTRY *__fastcall HalpDmaCommitContiguousMapBuffers(
__int64 a1,
__int64 a2,
unsigned __int64 a3,
unsigned int a4){
__int64 v4;
__int64 v6;
UINT64 v8;
_HALP_DMA_TRANSLATION_ENTRY *result;
_HALP_DMA_TRANSLATION_ENTRY *v10;
__int64 *v11;
_QWORD *v12;
char v13;
INT64 v14;
ULONG v15;
__int64 v16;
__int64 v17;
__int64 v18;
__int64 v19;
bool v20;
__int64 *v21;
char v22;
ULONG StartingIndex;
__int64 *v24;
__int64 v25;
_HALP_DMA_TRANSLATION_ENTRY *v26;
struct _KLOCK_QUEUE_HANDLE LockHandle;
char v28;
v4 = a4;
memset(&LockHandle, 0, sizeof(LockHandle));
v6 = *(_QWORD *)(a1 + 40);
v24 = 0i64;
v8 = a4;
if( v6 && (*(_QWORD *)(a1 + 56) != v6 || *(_DWORD *)(a1 + 64)) )
{
v8 = a4 + 1;
v28 = 1;
}
else
{
v28 = 0;
}
if( !*(_BYTE *)(a1 + 145) )
v8 = (unsigned int)((((unsigned __int64)a4 << 12) + a3 - 1) >> 16) - (unsigned int)(a3 >> 16) + (unsigned int)v8;
result = HalpDmaGetTranslationEntries((_HALP_DMA_ADAPTER_OBJECT *)a1, HalpDmaContiguousMapBuffer, v8);
v26 = result;
v10 = result;
if( result )
{
StartingIndex = HalpDmaTranslationEntryToIndex(a1, (unsigned __int64)result, &v24);
if( (unsigned int)(((__int64)v10 - v24[2]) / 72) )
{
v12 = (_QWORD *)((char *)v10 - 72);
}
else
{
v11 = *(__int64 **)(a1 + 40);
if( v11 == v24 )
{
v12 = 0i64;
}
else
{
if( v11 )
{
do
{
v21 = (__int64 *)*v11;
if( (__int64 *)*v11 == v24 )
break;
v11 = (__int64 *)*v11;
}
while( v21 );
}
v12 = (_QWORD *)(v11[2] + 72i64 * (unsigned int)(*((_DWORD *)v11 + 2) - 1));
}
}
v13 = *(_BYTE *)(a1 + 144);
v14 = (INT64)v10;
v22 = *(_BYTE *)(a1 + 145);
KeAcquireInStackQueuedSpinLock((UINT64 *)(a1 + 120), &LockHandle);
if( (_DWORD)v4 )
{
v15 = StartingIndex;
v16 = v13 & 1;
v25 = v4;
v17 = a2;
v18 = 4 * v16;
do
{
if( v12 )
{
if( *v12 + 4096i64 != a3 || !v22 && ((a3 ^ *v12) & 0xFFFFFFFFFFFF0000ui64) != 0 )
{
v14 = *(_QWORD *)(v14 + 8);
++v15;
}
v18 = 4 * v16;
}
*(_QWORD *)v14 = a3;
if( v17 )
{
v19 = v17 | *(_DWORD *)(v14 + 48) & 0xFFF;
v17 += 4096i64;
}
else
{
v19 = *(_QWORD *)(v14 + 48);
}
*(_QWORD *)(v14 + 48) = v19 & 0xFFFFFFFFFFFFFFF0ui64 | v13 & 1 | v18 & 0xFFFFFFFFFFFFFFF7ui64;
RtlClearBits(*(RTL_BITMAP **)(a1 + 16), v15, 1ui64);
a3 += 4096i64;
v18 = 4 * v16;
++v15;
v12 = (_QWORD *)v14;
v20 = v25-- == 1;
v14 = *(_QWORD *)(v14 + 8);
}
while( !v20 );
LODWORD(v4) = a4;
v10 = v26;
}
if( v28 && v14 )
{
--*(_DWORD *)(a1 + 64);
memset(v14, 0i64);
}
if( v13 )
*(_DWORD *)(a1 + 200) += v4;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
return v10;
}
return result;
}Referenced by:
HalpDmaAllocateLocalContiguousPool
HalpDmaAllocateMapRegisters
HalpDmaGrowContiguousMapBuffers
HalpDmaInitializeMasterAdapter