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.