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 ではエラーではありません