HalCancelAdapterChannel

NTSTATUS __stdcall HalCancelAdapterChannel(
        _ADAPTER_OBJECT *ChildAdapter,
        _DEVICE_OBJECT *DeviceObject,
        _DMA_TRANSFER_CONTEXT *TransferContext){
  NTSTATUS result; 
  PVOID *HalWcb; 

  _m_prefetchw(&TransferContext->V1);
  result = _InterlockedOr(&TransferContext->V1.DmaState, 2u);
  if( (result & 1) == 0 && (result & 4) != 0 )
  {
    if( HalpDmaRemoveWcb((INT64)ChildAdapter, (_XSTATE_CONFIGURATION *)&TransferContext->V1.Wcb) )
    {
LABEL_11:
      LOBYTE(result) = 1;
      return result;
    }
    if( HalpDmaRemoveFromEmergencyLogicalAddressQueue(
           (INT64)ChildAdapter,
           (_XSTATE_CONFIGURATION *)&ChildAdapter->LowMemoryLogicalAddressQueueEntry)
      || (result = HalpDmaRemoveAdapterFromMasterQueue(ChildAdapter), (_BYTE)result)
      || !ChildAdapter->MasterDevice && (result = HalpDmaRemoveAdapterFromChannelQueue(ChildAdapter), (_BYTE)result) )
    {
      ChildAdapter->NumberOfMapRegisters = 0;
      IoFreeAdapterChannel(&ChildAdapter->AdapterObject.DmaHeader);
      HalWcb = (PVOID *)TransferContext->V1.HalWcb;
      if( HalWcb )
      {
        if( (*(_DWORD *)HalWcb & 1) == 0 )
        {
          result = (unsigned int)ExFreePoolWithTag(HalWcb[20], 0);
          TransferContext->V1.HalWcb = 0i64;
        }
      }
      goto LABEL_11;
    }
  }
  LOBYTE(result) = 0;
  return result;
}

Referenced by:

No references.