DontKissBossAss
驱动牛犊
驱动牛犊
  • 注册日期2011-12-06
  • 最后登录2012-12-24
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望21点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2163回复:4

完成挂起的IRP时,蓝屏。 求助。

楼主#
更多 发布于:2012-01-11 23:09
我要在应用层开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); // 蓝屏,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); 

if( Irp==deviceExtension->UserMessageIrp) 
{ 
deviceExtension->UserMessageIrp = NULL; 
} 

Irp->IoStatus.Status = STATUS_CANCELLED; 
Irp->IoStatus.Information = 0; 
IoCompleteRequest(Irp,IO_NO_INCREMENT); 
}

znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
沙发#
发布于:2012-01-13 09:16
这种错误通常是内存错误,比如你多次释放同一同存块,或者访问空指针。可以用!page 看一下这块内存是否存在
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2012-01-15 21:43
25.IoCompleteRequest(Irp,IO_NO_INCREMENT); // 蓝屏,IRQL NOT LESS THAN OR EQUAL

34.IoCompleteRequest(Irp,IO_NO_INCREMENT);
好象执行了2次
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
jzxsasch@126.co
驱动牛犊
驱动牛犊
  • 注册日期2011-07-08
  • 最后登录2012-01-18
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望171点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2012-01-17 23:01
NTSTATUS
SfDeviceIoControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
返回了什么,采用异步方式只能返回STATUS_PENDING,即使你完成了IRP
lzw06061139
驱动牛犊
驱动牛犊
  • 注册日期2011-09-26
  • 最后登录2014-02-19
  • 粉丝0
  • 关注2
  • 积分36分
  • 威望251点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2012-01-20 16:47
有可能是IRQL的问题哦, 看下蓝屏的dump里 CURRENT_IRQL 值为多少,在DISPATCH_LEVEL及以上是不允许使用PagedPool 内存的。
游客

返回顶部