HalpFreeDmaChannels
VOID __stdcall HalpFreeDmaChannels(_ADAPTER_OBJECT *ChildAdapter){
_HALP_DMA_CONTROLLER *DmaController;
__int64 v2;
unsigned __int8 CurrentIrql;
UINT64 *p_Lock;
_QWORD *v5;
_QWORD *v6;
__int64 v7;
_ADAPTER_OBJECT *v8;
DmaController = ChildAdapter->DmaController;
v2 = (__int64)&DmaController->Channels[ChildAdapter->ChannelNumber];
ChildAdapter->AllocatedChannelCount = 0;
CurrentIrql = KeGetCurrentIrql();
__writecr8(DmaController->Irql);
p_Lock = &DmaController->Lock;
KxAcquireSpinLock(p_Lock);
v5 = (_QWORD *)(v2 + 144);
v6 = *(_QWORD **)(v2 + 144);
if( v6 == (_QWORD *)(v2 + 144) )
{
*(_WORD *)(v2 + 5) = 0;
*(_QWORD *)(v2 + 24) = 0i64;
KxReleaseSpinLock(p_Lock);
__writecr8(CurrentIrql);
}
else
{
v7 = *v6;
if( (_QWORD *)v6[1] != v5 || *(_QWORD **)(v7 + 8) != v6 )
__fastfail(3u);
*v5 = v7;
v8 = (_ADAPTER_OBJECT *)(v6 - 25);
*(_QWORD *)(v7 + 8) = v5;
++*((_DWORD *)v6 + 104);
*((_DWORD *)v6 + 46) = 1;
*(_QWORD *)(v2 + 24) = v6 - 25;
KxReleaseSpinLock(p_Lock);
__writecr8(CurrentIrql);
HalpAllocateDmaResources(v8);
}
}Referenced by:
IoFreeAdapterChannelV3Internal