функция обратного вызова DMA_COMPLETION_ROUTINE (wdm.h)
Подпрограмма обратного вызова DmaCompletionRoutine уведомляет драйвер, который ранее запрашивал передачу DMA системы, что эта передача завершена.
Синтаксис
DMA_COMPLETION_ROUTINE DmaCompletionRoutine;
void DmaCompletionRoutine(
[in] PDMA_ADAPTER DmaAdapter,
[in] PDEVICE_OBJECT DeviceObject,
[in] PVOID CompletionContext,
[in] DMA_COMPLETION_STATUS Status
)
{...}
Параметры
[in] DmaAdapter
Указатель на структуру DMA_ADAPTER. Эта структура — это объект адаптера, представляющий канал DMA системы драйвера.
[in] DeviceObject
Указатель на структуру DEVICE_OBJECT. Эта структура представляет собой объект физического устройства (PDO), представляющий целевое устройство для запрошенной операции DMA.
[in] CompletionContext
Указатель на определяемый драйвером контекст для подпрограммы DmaCompletionRoutine . Этот контекст представляет собой значение параметра CompletionContext, которое драйвер ранее передал вызов MapTransferEx, инициирующий передачу DMA системы.
[in] Status
Состояние завершения передачи DMA. Этот параметр представляет собой значение перечисления DMA_COMPLETION_STATUS, указывающее, успешно ли выполнена передача DMA.
Возвращаемое значение
Никакой
Замечания
В качестве параметра драйвер может реализовать подпрограмму DmaCompletionRoutine. Когда драйвер запрашивает передачу DMA системы, драйвер может предоставить указатель на эту подпрограмму с запросом. После завершения передачи DMA программа DmaCompletionRoutine автоматически вызывается для уведомления драйвера.
Подпрограмма драйвера DmaCompletionRoutine вызывается только в том случае, если передача DMA, запрошенная драйвером, использует системный контроллер DMA, который может создать прерывание после завершения передачи DMA. Драйвер, использующий устройство DMA шины или использующий системный контроллер DMA, который не создает прерывания, должен использовать другие средства для определения завершения передачи DMA. Например, этот драйвер может использовать прерывание таймера для периодического опроса состояния передачи DMA.
Драйвер может предоставить указатель на подпрограмму DmaCompletionRoutine как необязательный параметр для подпрограммы MapTransferEx.
Примеры
Чтобы определить подпрограмму обратного вызова DmaCompletionRoutine DmaCompletionRoutine, необходимо сначала указать объявление функции, определяющее тип определяемой процедуры обратного вызова. Windows предоставляет набор типов функций обратного вызова для драйверов. Объявление функции с помощью типов функций обратного вызова помогает анализ кода для драйверов, статический проверяющий драйвер (SDV) и другие средства проверки подлинности, и это требование для написания драйверов для операционной системы Windows.
Например, чтобы определить подпрограмму обратного вызова DmaCompletionRoutine, которая называется MyDmaCompletionRoutine
, используйте тип DMA_COMPLETION_ROUTINE, как показано в этом примере кода:
DMA_COMPLETION_ROUTINE MyDmaCompletionRoutine;
Затем реализуйте подпрограмму обратного вызова следующим образом:
_Use_decl_annotations_
VOID
MyDmaCompletionRoutine(
PDMA_ADAPTER DmaAdapter,
PDEVICE_OBJECT DeviceObject,
PVOID CompletionContext,
DMA_COMPLETION_STATUS Status
)
{
// Function body
}
Тип функции DMA_COMPLETION_ROUTINE определен в файле заголовка Wdm.h. Чтобы более точно определить ошибки при запуске средств анализа кода, обязательно добавьте в определение функции _Use_decl_annotations_
заметку. Заметка _Use_decl_annotations_
гарантирует, что используются заметки, применяемые к типу функции DMA_COMPLETION_ROUTINE в файле заголовка. Дополнительные сведения о требованиях к объявлениям функций см. в объявлении функций с помощью типов ролей функций для драйверов WDM. Дополнительные сведения о _Use_decl_annotations_ см. в поведению функции.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Доступно начиная с Windows 8. |
целевая платформа | Настольный |
заголовка | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Вызывается в DISPATCH_LEVEL. |