Функция 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.
Если драйвер управляет собственными очередями IRPs, драйвер не должен удерживать блокировку отмены при вызове этой процедуры. IoSetCancelRoutine использует внутреннее взаимодействие обмена, чтобы задать адрес подпрограммы отмены как атомарную операцию. Снижение использования блокировки спина отмены может повысить производительность драйвера и общую производительность системы.
Драйвер подпрограммы отмены вызываются в IRQL = DISPATCH_LEVEL с удерживаемой блокировкой отмены спина. Подпрограмма отмены отмены должна освободить блокировку спина отмены, прежде чем она возвращает элемент управления.
Требование | Ценность |
---|---|
целевая платформа | Настольный |
заголовка | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
библиотеки | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | DISPATCH_LEVEL (см. раздел "Примечания") |
правил соответствия DDI | IrpCancelField(wdm), StartIoCancel(wdm) |