Прочитать на английском

Поделиться через


Функция IoSetCancelRoutine (wdm.h)

Подпрограмма IoSetCancelRoutine настраивает подпрограмму отмены отмены драйвера, которая будет вызвана, если данный IRP отменен.

Синтаксис

C++
PDRIVER_CANCEL IoSetCancelRoutine(
  [in] PIRP           Irp,
  [in] PDRIVER_CANCEL CancelRoutine
);

Параметры

[in] Irp

Указатель на то, что IRP помещается в или удаляется из отменяемого состояния.

[in] CancelRoutine

Указывает точку входа вызываемой процедуры отмены отмены, которую необходимо вызвать, если указанная функция IRP отменена или null, если заданный IRP удаляется из состояния отмены. Эта подпрограмма объявлена следующим образом:

C++
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)

См. также

IoAcquireCancelSpinLock

IoReleaseCancelSpinLock