IoFreeAdapterChannelV2
NTSTATUS __stdcall IoFreeAdapterChannelV2(PDMA_ADAPTER DmaAdapter){
char v1;
unsigned __int8 CurrentIrql;
ULONG v4;
PVOID *p_DmaOperations;
_KDEVICE_QUEUE_ENTRY *v6;
__int64 v7;
__int64 v8;
_KDEVICE_QUEUE_ENTRY *v9;
unsigned int SortKey;
__int64 MapRegisters;
PVOID v12;
v1 = 0;
CurrentIrql = 0;
if( KeGetCurrentIrql() < 2u )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v1 = 1;
}
while( 1 )
{
v4 = *(_DWORD *)&DmaAdapter[15].Version;
p_DmaOperations = (PVOID *)&DmaAdapter[14].DmaOperations;
if( v4 )
IoFreeMapRegisters(DmaAdapter, *p_DmaOperations, v4);
v6 = KeRemoveDeviceQueue((_KDEVICE_QUEUE *)&DmaAdapter[11]);
v9 = v6;
if( !v6 )
break;
DmaAdapter[21].DmaOperations = (_DMA_OPERATIONS *)v6;
*(_DWORD *)&DmaAdapter[15].Version = v6[1].SortKey;
SortKey = v6[1].SortKey;
if( SortKey && DmaAdapter[9].DmaOperations )
{
MapRegisters = HalpDmaAllocateMapRegisters((__int64)DmaAdapter, SortKey, v7, v8);
*p_DmaOperations = (PVOID)MapRegisters;
if( !MapRegisters )
{
HalpDmaQueueAdapter((__int64)DmaAdapter);
HalpQueueMapBufferWorker((__int64)DmaAdapter, v9[1].SortKey);
break;
}
}
else
{
DmaAdapter[14].DmaOperations = 0i64;
*(_DWORD *)&DmaAdapter[15].Version = 0;
}
v12 = *p_DmaOperations;
DmaAdapter[21].DmaOperations = (_DMA_OPERATIONS *)v9;
LODWORD(v6) = ((__int64(__fastcall *)(_LIST_ENTRY *, _LIST_ENTRY *, PVOID, _LIST_ENTRY *))v9[1].DeviceListEntry.Flink)(
v9[2].DeviceListEntry.Flink,
v9[2].DeviceListEntry.Blink,
v12,
v9[1].DeviceListEntry.Blink);
if( (_DWORD)v6 == 1 )
break;
if( (_DWORD)v6 == 3 )
*(_DWORD *)&DmaAdapter[15].Version = 0;
}
if( v1 )
{
LODWORD(v6) = CurrentIrql;
__writecr8(CurrentIrql);
}
return(int)v6;
}Referenced by:
IoFreeAdapterChannel