Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
[Применимо только к KMDF]
Если драйвер создан с версией 1.11 или более поздней версией KMDF и работает в Windows 8 или более поздней с помощью прямого доступа к памяти (DMA) версии 3, драйвер может попытаться отменить ожидающую транзакцию DMA, вызвав метод WdfDmaTransactionCancel .
При вызове WdfDmaTransactionCancel драйвер должен убедиться, что указанная транзакция DMA не завершена во время вызова. Драйвер может использовать следующий метод для безопасного отмены транзакции либо до выделения канала DMA, либо после завершения некоторых операций передачи:
В одном из обработчиков запросов драйвера драйвер вызывает WdfRequestMarkCancelableEx и предоставляет функцию обратного вызова EvtRequestCancel для запроса ввода-вывода. Затем обработчик запросов вызывает WdfDmaTransactionExecute.
Функция обратного вызова EvtRequestCancel драйвера (которая может начать выполняться в отдельном потоке сразу после вызова WdfRequestMarkCancelableEx) вызывает WdfDmaTransactionCancel.
Если вызов WdfDmaTransactionCancel происходит после вызова WdfDmaTransactionExecute, но до начала выделения DMA метод WdfDmaTransactionExecute , отмена транзакций завершается успешно, а WdfDmaTransactionCancel возвращает TRUE. В этом случае функция обратного вызова EvtRequestCancel драйвера должна завершить транзакцию DMA. WdfDmaTransactionExecute возвращает значение ошибки.
Если драйвер вызывает WdfDmaTransactionCancel после того, как метод WdfDmaTransactionExecute запустил выделение DMA, попытка отменить транзакцию завершается ошибкой, и WdfDmaTransactionCancel возвращает FALSE. В этом случае WdfDmaTransactionExecute возвращает STATUS_SUCCESS, а обработчик запросов драйвера должен завершить транзакцию DMA.
На этом этапе, если драйвер использует DMA в системном режиме, функция обратного вызова EvtRequestCancel может вызвать WdfDmaTransactionStopSystemTransfer , чтобы попытаться остановить передачу DMA в режиме выполнения. Пример кода, показывающий, как это сделать, см. в разделе WdfDmaTransactionStopSystemTransfer.
После того как метод WdfDmaTransactionExecute завершает выделение DMA, фреймворк вызывает функцию обратного вызова драйвера EvtProgramDma (которая может выполняться в отдельном потоке сразу после вызова WdfDmaTransactionExecute). На этом этапе вызов метода WdfDmaTransactionCancel вернет FALSE.
В EvtProgramDma драйвер может вызвать WdfRequestUnmarkCancelable , чтобы завершить возможность отмены запроса. Если WdfRequestUnmarkCancelable возвращает STATUS_SUCCESS, функция обратного вызова должна программировать оборудование для запуска передачи. Если WdfRequestUnmarkCancelable возвращает STATUS_CANCELLED, запрос был отменен. В этом случае EvtProgramDma должен вызвать WdfDmaTransactionDmaCompletedFinal , чтобы завершить транзакцию DMA.
Драйвер может использовать тот же метод для отмены транзакции DMA после завершения некоторых операций передачи. В этом случае драйвер вызывает WdfDmaTransactionCancel после вызова WdfDmaTransactionDmaCompleted, но прежде чем платформа вызывает EvtProgramDma , чтобы запрограммировать следующую операцию передачи. Если драйвер вызывает WdfDmaTransactionCancel перед вызовом WdfDmaTransactionDmaCompleted, WdfDmaTransactionDmaCompleted возвращает TRUE, указывая, что транзакция DMA завершена.