-
-
[旧帖]
[求助]驱动程序完成挂起的IRP蓝屏问题
0.00雪花
-
发表于:
2012-1-12 08:15
1734
-
[旧帖] [求助]驱动程序完成挂起的IRP蓝屏问题
0.00雪花
我要在应用层开buffer供内核使用。当采集数据时,应用层开辟足够的空间,然后传递给内核,驱动程序挂起该IRP。
当停止采集时,内核关闭挂起IRP(开始采集时的IRP)时,程序崩溃。
错误的原因是 IRQL LESS THAN OR EQUAL
给我的感觉是 挂起的IRP在分页内存中,我也粗略的检查了引入的buffer在崩溃1处,没有消除。
(如代码所示,经过各种测试,有3种情况会发生上述错误。)
NTSTATUS
SfDeviceIoControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;
switch( ioControlCode)
{
//...该IRP仅仅传递来了一个BUFFER,供内核输出。
case IOCTL_DRIVER_REF_BUFFER:
Irp->IoStatus.Status = STATUS_PENDING;
Irp->IoStatus.Information = 0;
IoMarkIrpPending(Irp);
IoSetCancelRoutine(Irp, OnCancelIrp);
deviceExtension->rbBufferIrp = Irp;
return STATUS_PENDING;
...
//buffer使用完成后,完成挂起的rbBufferIrp,其他问题不会处理rbBufferIrp
//应用程序也不会主动cancelIO
case IOCTL_DRIVER_DEREF_BUFFER:
Irp->IoStatus.Status = STATUS_CANCELLED;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp,IO_NO_INCREMENT); // 1: 蓝屏,IRQL NOT LESS THAN OR EQUAL
break;
default:
//.....
break
}
//......
IoCompleteRequest(Irp,IO_NO_INCREMENT);
}
OnCancelIrp(PDEVICE_OBJECT DeviceObject, PIRP pirp)
{
PDEVICE_EXTENSION deviceExtension = ;
deviceExtension = (PDEVICE_EXTENSION)
DeviceObject->DeviceExtension;
IoReleaseCancelSpinLock(Irp->CancelIrql); //2: 强制结束任务进程,系统执行此例程,该位置也崩溃,原因同1
if( Irp==deviceExtension->UserMessageIrp)
{
deviceExtension->UserMessageIrp = NULL;
}
Irp->IoStatus.Status = STATUS_CANCELLED;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp,IO_NO_INCREMENT); //3: 注视错误2,系统执行此例程,该位置也崩溃,原因同1
}
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法