Функция IoSetCancelRoutine (wdm.h)
Подпрограмма IoSetCancelRoutine настраивает предоставленную драйвером процедуру отмены , которая будет вызываться при отмене определенного IRP.
Синтаксис
PDRIVER_CANCEL IoSetCancelRoutine(
[in] PIRP Irp,
[in] PDRIVER_CANCEL CancelRoutine
);
Параметры
[in] Irp
Указатель на IRP, который помещается в состояние отмены или удаляется из него.
[in] CancelRoutine
Указывает точку входа предоставленной вызывающей процедурой Отмены , которая будет вызвана, если указанная функция IRP отменена или имеет значение NULL , если данный IRP удаляется из состояния отмены. Эта подпрограмма объявляется следующим образом:
VOID
(*PDRIVER_CANCEL)(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
Возвращаемое значение
IoSetCancelRoutine возвращает предыдущее значение Irp-CancelRoutine>. Если ранее не была задана процедура отмены или отмена IRP уже выполняется, IoSetCancelRoutine возвращает значение NULL.
Комментарии
Эта подпрограмма может отключить подпрограмму Отмена , установленную в IRP.
Драйвер должен удерживать блокировку спина системы отмены при вызове этой процедуры, если драйвер использует предоставленную диспетчером ввода-вывода очередь устройств в объекте устройства. Драйвер запускается в IRQL = DISPATCH_LEVEL после вызова IoAcquireCancelSpinLock , пока не отпустит блокировку отмены спина с помощью IoReleaseCancelSpinLock.
Если драйвер управляет собственными очередями IRP, драйвер не должен удерживать блокировку отмены спина при вызове этой процедуры. IoSetCancelRoutine использует встроенную функцию межблокированного обмена, чтобы задать адрес подпрограммы Отмены как атомарную операцию. Сокращение использования блокировки отмены спина может повысить производительность драйвера и общую производительность системы.
Процедуры отмены драйвера вызываются в IRQL = DISPATCH_LEVEL с удержанной блокировкой отмены спина. Подпрограмма отмены должна освободить блокировку отмены спина, прежде чем она вернет управление.
Требования
Требование | Значение |
---|---|
Целевая платформа | Персональный компьютер |
Верхняя часть | wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h) |
Библиотека | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | DISPATCH_LEVEL (см. раздел "Примечания") |
Правила соответствия DDI | IrpCancelField(wdm), StartIoCancel(wdm) |