Windows驱动开发学习记录-IRP取消例程问题

文章讲述了在设置IRP取消例程时,如果没有正确使用IoReleaseCancelSpinLock会导致系统异常,如XP上的假死和Win7x64上的崩溃。正确的做法是在取消例程中包含IoReleaseCancelSpinLock来释放自旋锁,以避免此类问题。
摘要由CSDN通过智能技术生成

一般设置IRP取消例程很简单,大致代码如下

{
    ......
    IoSetCancelRoutine(pIrp, LogIRPCancelRoutine);
	pIrp->IoStatus.Status = STATUS_PENDING;
    return STATUS_PENDING;
    ......
}

先调用 IoSetCancelRoutine设置取消例程为自定义函数。

接着把 IRP状态设置为 STATUS_PENDING, 再返回 STATUS_PENDING。

然后看一个不完善的取消例程:

VOID LogIRPCancelRoutine(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
{
	UNREFERENCED_PARAMETER(pDeviceObject);
	pIrp->IoStatus.Status = STATUS_CANCELLED;
	pIrp->IoStatus.Information = 0;
	IoCompleteRequest(pIrp, IO_NO_INCREMENT);
}

这种取消函数会引起问题,在XP上表现为系统假死,在WIn7 x64上直接崩溃,如图

 原因是取消例程的自旋锁的问题, 代码中要加上

IoReleaseCancelSpinLock(pIrp->CancelIrql); 

完整代码如下:

VOID LogIRPCancelRoutine(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
{
   	UNREFERENCED_PARAMETER(pDeviceObject);
    IoReleaseCancelSpinLock(pIrp->CancelIrql); 
	pIrp->IoStatus.Status = STATUS_CANCELLED;
	pIrp->IoStatus.Information = 0;
	IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值