IoFreeAdapterChannelV3

VOID __stdcall IoFreeAdapterChannelV3(PDMA_ADAPTER DmaAdapter){
  unsigned __int8 CurrentIrql; 
  INT64 *NextWcb; 
  char v4; 
  int v5; 
  char DmaResourcesInternal; 

  CurrentIrql = KeGetCurrentIrql();
  if( CurrentIrql == 2 && *(_DWORD *)&DmaAdapter[32].Version )
  {
    if( LOBYTE(DmaAdapter[13].DmaOperations) )
      ExQueueWorkItem((PWORK_QUEUE_ITEM)&DmaAdapter[29].DmaOperations, CriticalWorkQueue);
  }
  else
  {
    IoFreeAdapterChannelV3Internal((INT64)DmaAdapter);
    do
    {
      NextWcb = HalpDmaGetNextWcb((INT64)DmaAdapter);
      if( !NextWcb )
        break;
      DmaAdapter[21].DmaOperations = (_DMA_OPERATIONS *)NextWcb;
      v4 = 0;
      *(_DWORD *)&DmaAdapter[15].Version = *((_DWORD *)NextWcb + 10);
      v5 = *((_DWORD *)NextWcb + 4);
      LODWORD(DmaAdapter[38].DmaOperations) = 0;
      HIDWORD(DmaAdapter[23].DmaOperations) = v5;
      if( CurrentIrql < 2u )
      {
        CurrentIrql = KeGetCurrentIrql();
        __writecr8(2ui64);
        v4 = 1;
      }
      DmaResourcesInternal = HalpAllocateDmaResourcesInternal(DmaAdapter);
      if( v4 )
        __writecr8(CurrentIrql);
    }
    while( DmaResourcesInternal );
  }
}

Referenced by:

IoFreeAdapterChannel
IoFreeAdapterChannelV3Passive