0

Windows 7でドライバーを作成します。そして、pedding 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トレースを使用し、トレースは「PtDriverCancelIRP」関数で発生します。

このエラーに関連するロックを適用しますか? どうしてか分かりません?どうすれば修正できますか?

PS このドライバは Windows XP ではエラーではありません

4

1 に答える 1