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

Отмена IRP и очереди, управляемые драйвером



Отмена IRP и очереди, управляемые драйвером



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

PIRP irpToCancel;

PDEVICE_EXT devExt;

KIRQL oldlrql;

// обнулить указатель на функцию отмены loSetCancelRoutine(Irp, NULL); // Освободить системную спин-блокировку // как можно быстрее

loReleaseCancelSpinLock(Irp->CancelIrql); devExt = DeviceObject->DeviceExtension; . // Захватить спин-блокировку доступа к очереди, // удалить IRP и освободить // спин-блокировку KeAcquireSpinLock(&devExt->QueueLock, soldlrql);

RemoveEntryList(&Irp->Tail.Overlay.ListEntry); KeReleaseSpinLock(&devExt->QueueLock, oldlrql) ;

// Отменить IRP

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

 



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