HalpDmaControllerCancelTransfer
VOID __stdcall HalpDmaControllerCancelTransfer(
_HALP_DMA_CONTROLLER *DmaController,
_DMA_TRANSFER_CONTEXT *TransferContext,
_DMA_TRANSFER_CONTEXT *a3){
unsigned int v3;
_HALP_DMA_CHANNEL *v6;
unsigned __int8 CurrentIrql;
char v8;
unsigned __int64 *p_Lock;
bool v10;
v3 = (unsigned int)TransferContext;
v6 = &DmaController->Channels[(unsigned int)TransferContext];
CurrentIrql = KeGetCurrentIrql();
v8 = 0;
if( CurrentIrql == 15 )
{
p_Lock = &DmaController->Lock;
}
else
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(DmaController->Irql);
p_Lock = &DmaController->Lock;
KxAcquireSpinLock(&DmaController->Lock);
v8 = 1;
}
a3->V1.TransferState |= 1u;
if( DmaController->Operations.CancelTransfer(DmaController->ExtensionData, v3) )
{
v10 = v6->CurrentCompletionRoutine == 0i64;
v6->Complete = 1;
v6->CurrentInterruptType = InterruptTypeCancelled;
if( !v10 )
KiInsertQueueDpc(&v6->Dpc, 0i64, 0i64, 0i64, 0);
}
if( v8 )
{
KxReleaseSpinLock(p_Lock);
__writecr8(CurrentIrql);
}
}Referenced by:
HalCancelMappedTransfer