DMA 트랜잭션 취소

[KMDF에만 적용]

드라이버가 1.11 이상 버전의 KMDF로 빌드되었으며 DMA(직접 메모리 액세스) 버전 3을 사용하여 Windows 8 이상에서 실행되는 경우 드라이버는 WdfDmaTransactionCancel 메서드를 호출하여 보류 중인 DMA 트랜잭션을 취소하려고 시도할 수 있습니다.

WdfDmaTransactionCancel을 호출할 때 드라이버는 호출 중에 지정된 DMA 트랜잭션이 완료되지 않았는지 확인해야 합니다. 드라이버는 다음 기술을 사용하여 DMA 채널 할당 전 또는 일부 전송 작업이 이미 완료된 후 트랜잭션을 안전하게 취소할 수 있습니다.

  1. 드라이버의 요청 처리기 중 하나에서 드라이버는 WdfRequestMarkCancelableEx 를 호출하고 I/O 요청에 대한 EvtRequestCancel 콜백 함수를 제공합니다. 그런 다음 요청 처리기는 WdfDmaTransactionExecute를 호출합니다.

  2. 드라이버의 EvtRequestCancel 콜백 함수( WdfRequestMarkCancelableEx 호출 직후 별도의 스레드에서 실행되기 시작할 수 있음)는 WdfDmaTransactionCancel을 호출합니다.

  3. WdfDmaTransactionExecute 호출 후 WdfDmaTransactionCancel에 대한 호출이 발생하지만 WdfDmaTransactionExecute 메서드가 DMA 할당을 시작하기 전에 트랜잭션 취소가 성공하고 WdfDmaTransactionCancel이 TRUE를 반환합니다. 이 경우 드라이버의 EvtRequestCancel 콜백 함수 가 DMA 트랜잭션을 완료해야 합니다. WdfDmaTransactionExecute 는 오류 값을 반환합니다.

  4. WdfDmaTransactionExecute 메서드가 DMA 할당을 시작한 후 드라이버가 WdfDmaTransactionCancel을 호출하면 트랜잭션 취소 시도가 실패하고 WdfDmaTransactionCancel이 FALSE를 반환합니다. 이 경우 WdfDmaTransactionExecute 는 STATUS_SUCCESS 반환하고 드라이버의 요청 처리기는 DMA 트랜잭션을 완료해야 합니다.

    이 시점에서 드라이버가 시스템 모드 DMA를 사용하는 경우 EvtRequestCancel 콜백 함수는 WdfDmaTransactionStopSystemTransfer 를 호출하여 진행 중인 시스템 모드 DMA 전송을 중지하려고 시도할 수 있습니다. 이 작업을 수행하는 방법을 보여 주는 코드 예제는 WdfDmaTransactionStopSystemTransfer를 참조하세요.

  5. WdfDmaTransactionExecute 메서드가 DMA 할당을 완료한 후 프레임워크는 드라이버의 EvtProgramDma 콜백 함수를 호출합니다(WdfDmaTransactionExecute 호출 직후 별도의 스레드에서 실행되기 시작할 수 있음). 이 시점에서 WdfDmaTransactionCancel 메서드를 호출하면 FALSE가 반환됩니다.

    EvtProgramDma에서 드라이버는 WdfRequestUnmarkCancelable을 호출하여 요청 취소 가능성을 종료할 수 있습니다. WdfRequestUnmarkCancelable이 STATUS_SUCCESS 반환하는 경우 콜백 함수는 하드웨어를 프로그래밍하여 전송을 시작해야 합니다. WdfRequestUnmarkCancelable이 STATUS_CANCELLED 반환하면 요청이 취소됩니다. 이 경우 EvtProgramDmaWdfDmaTransactionDmaCompletedFinal 을 호출하여 DMA 트랜잭션을 완료해야 합니다.

    드라이버는 일부 전송 작업이 이미 완료된 후 동일한 기술을 사용하여 DMA 트랜잭션을 취소할 수 있습니다. 이 경우 드라이버는 WdfDmaTransactionDmaCompleted를 호출한 후, 프레임워크가 EvtProgramDma를 호출하여 다음 전송 작업을 프로그래밍하기 전에 WdfDmaTransactionCancel을 호출합니다. 드라이버가 WdfDmaTransactionDmaCompleted 를 호출하기 전에 WdfDmaTransactionCancel을 호출하는 경우 WdfDmaTransactionDmaCompletedDMA 트랜잭션이 완료되었음을 나타내는 TRUE를 반환합니다.