Ошибка синего экрана: DRIVER_RETURNED_HOLDING_CANCEL_LOCK
Я пишу драйвер в Windows 7. И я использую IRP для отправки события приложению из драйвера. Код ключа вроде:
PIRP PeddingIRP;
...
VOID PtDriverCancelIRP(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
UNREFERENCED_PARAMETER(DeviceObject);
KdPrint(( "[WENZ] User Message Cancel Irp....\n" ));
if ( Irp == PeddingIRP)
PeddingIRP = NULL;
Irp->IoStatus.Status = STATUS_CANCELLED;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp,IO_NO_INCREMENT);
}
...
NTSTATUS
DeviceControl( PDEVICE_OBJECT DeviceObject, PIRP Irp )
{
...
switch ( irpSp->Parameters.DeviceIoControl.IoControlCode )
{
...
case IOCTL_NOTIFY_STATE:
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = STATUS_PENDING;
IoMarkIrpPending(Irp);
PeddingIRP = Irp;
IoSetCancelRoutine(Irp, PtDriverCancelIRP);
return STATUS_PENDING;
...
}
...
}
Работает, когда какое-то событие уведомляет приложение. Но когда я удаляю драйвер, возникает ошибка синего экрана: драйвер вернулся с вызова отмены, удерживающего глобальную блокировку отмены. Код ошибки id 0x011B. Я использую windbg trace, и трассировка происходит в функции "PtDriverCancelIRP".
Доза блокировки относилась к этой ошибке? Не знаю почему? Как мне это исправить?
PS Этот драйвер не является ошибкой в Windows XP
1 ответ
Решение
Процедура отмены отвечает за разблокировку отмены блокировки. Для этого используйте IoReleaseCancelSpinLock.
VOID PtDriverCancelIRP(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
UNREFERENCED_PARAMETER(DeviceObject);
KdPrint(( "[WENZ] User Message Cancel Irp....\n" ));
if ( Irp == PeddingIRP)
PeddingIRP = NULL;
IoReleaseCancelSpinLock(); // release the cancel spinlock
Irp->IoStatus.Status = STATUS_CANCELLED;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp,IO_NO_INCREMENT);
}