Ошибка синего экрана: 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); 
}
Другие вопросы по тегам