IoFreeAdapterChannelV2
VOID __fastcall IoFreeAdapterChannelV2(PDMA_ADAPTER DmaAdapter){
char v1;
unsigned __int8 CurrentIrql;
ULONG v4;
PVOID *p_DmaOperations;
_KDEVICE_QUEUE_ENTRY *v6;
_KDEVICE_QUEUE_ENTRY *v7;
UINT64 SortKey;
_HALP_DMA_TRANSLATION_ENTRY *MapRegisters;
PVOID v10;
int v11;
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]);
v7 = v6;
if( !v6 )
break;
DmaAdapter[21].DmaOperations = (_DMA_OPERATIONS *)v6;
*(_DWORD *)&DmaAdapter[15].Version = v6[1].SortKey;
SortKey = v6[1].SortKey;
if( (_DWORD)SortKey && DmaAdapter[9].DmaOperations )
{
MapRegisters = HalpDmaAllocateMapRegisters((_ADAPTER_OBJECT *)DmaAdapter, SortKey);
*p_DmaOperations = MapRegisters;
if( !MapRegisters )
{
HalpDmaQueueAdapter((_ADAPTER_OBJECT *)DmaAdapter);
HalpQueueMapBufferWorker((_ADAPTER_OBJECT *)DmaAdapter, v7[1].SortKey);
break;
}
}
else
{
DmaAdapter[14].DmaOperations = 0i64;
*(_DWORD *)&DmaAdapter[15].Version = 0;
}
v10 = *p_DmaOperations;
DmaAdapter[21].DmaOperations = (_DMA_OPERATIONS *)v7;
v11 = ((__int64(__fastcall *)(_LIST_ENTRY *, _LIST_ENTRY *, PVOID, _LIST_ENTRY *))v7[1].DeviceListEntry.Flink)(
v7[2].DeviceListEntry.Flink,
v7[2].DeviceListEntry.Blink,
v10,
v7[1].DeviceListEntry.Blink);
if( v11 == 1 )
break;
if( v11 == 3 )
*(_DWORD *)&DmaAdapter[15].Version = 0;
}
if( v1 )
__writecr8(CurrentIrql);
}Referenced by:
IoFreeAdapterChannel