Самоучитель по программированию систем защиты

       

Отмена IRP и Системная Очередь



Отмена IRP и Системная Очередь



Пример функции отмены IRP драйвера, использующего системную очередь, показан в следующем листинге. Необходимо отметить, что для удаления IRP из системной очереди используется функция KeRemoveEntryDeviceQueue() так, как это показано в листинге.

VOID Cancel(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) {

// Обрабатывается ли отменяемый запрос в данный момент?

if (Irp == DeviceOb]ect->Current!rp)

{

// Да. Освободить системную спин-блокировку и указать

// диспетчеру ввода/вывода начать обработку следующего

// пакета. Отмена IRP - в конце функции

loReleaseCancelSpinLock(Irp->CancelIrql);

loStartNextPacket(DeviceOb]ect, TRUE); }

else {

// Нет. Отменяемый IRP находится в очереди. // Удалить его из очереди

KeRemoveEntryDeviceQueue(SDeviceOb]ect->DeviceQueue, &Irp->Tail.Overlay.DeviceQueueEntry);

loReleaseCancelSpinLock(Irp->CancelIrql); }

// Отменить IRP

Irp->IoStatus.Status = STATUS_CANCELLED; Irp->IoStatus.Information = 0; loCompleteRequest(Irp, IO_NO_INCREMENT); return; }



Содержание раздела