HalpFreeDmaChannels
NTSTATUS __fastcall HalpFreeDmaChannels(__int64 a1){
__int64 v1;
__int64 v2;
unsigned __int8 CurrentIrql;
UINT64 *v4;
_QWORD *v5;
_QWORD *v6;
__int64 v7;
struct _DMA_ADAPTER *v8;
NTSTATUS result;
v1 = *(_QWORD *)(a1 + 360);
v2 = *(_QWORD *)(v1 + 56) + 160i64 * *(unsigned int *)(a1 + 372);
*(_DWORD *)(a1 + 384) = 0;
CurrentIrql = KeGetCurrentIrql();
__writecr8(*(unsigned __int8 *)(v1 + 176));
v4 = (UINT64 *)(v1 + 168);
KxAcquireSpinLock(v4);
v5 = (_QWORD *)(v2 + 144);
v6 = *(_QWORD **)(v2 + 144);
if( v6 == (_QWORD *)(v2 + 144) )
{
*(_WORD *)(v2 + 5) = 0;
*(_QWORD *)(v2 + 24) = 0i64;
KxReleaseSpinLock(v4);
result = CurrentIrql;
__writecr8(CurrentIrql);
}
else
{
v7 = *v6;
if( (_QWORD *)v6[1] != v5 || *(_QWORD **)(v7 + 8) != v6 )
__fastfail(3u);
*v5 = v7;
v8 = (struct _DMA_ADAPTER *)(v6 - 25);
*(_QWORD *)(v7 + 8) = v5;
++*((_DWORD *)v6 + 104);
*((_DWORD *)v6 + 46) = 1;
*(_QWORD *)(v2 + 24) = v6 - 25;
KxReleaseSpinLock(v4);
__writecr8(CurrentIrql);
return HalpAllocateDmaResources(v8);
}
return result;
}Referenced by:
IoFreeAdapterChannelV3Internal