首页
社区
课程
招聘
[旧帖] [求助]驱动程序完成挂起的IRP蓝屏问题 0.00雪花
发表于: 2012-1-12 08:15 1734

[旧帖] [求助]驱动程序完成挂起的IRP蓝屏问题 0.00雪花

2012-1-12 08:15
1734
我要在应用层开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虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 53
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
以下的dump信息是错误3时捕捉的错误信息。同错误一时,原因应该是一致的,只不过调用例程的场景不一致。

READ_ADDRESS:  98192bc0

CURRENT_IRQL:  2

FAULTING_IP:
nt!MmUnlockPages+12b
80507c39 8b4710          mov     eax,dword ptr [edi+10h]

DEFAULT_BUCKET_ID:  DRIVER_FAULT

BUGCHECK_STR:  0xA

PROCESS_NAME:  USR_TESTR3.exe

TRAP_FRAME:  f7746b38 -- (.trap 0xfffffffff7746b38)
ErrCode = 00000000
eax=00000002 ebx=8170e01c ecx=81712d00 edx=00000004 esi=8170e01c edi=98192bb0
eip=80507c39 esp=f7746bac ebp=f7746bd0 iopl=0         nv up ei ng nz na po nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00010282
nt!MmUnlockPages+0x12b:
80507c39 8b4710          mov     eax,dword ptr [edi+10h] ds:0023:98192bc0=????????
Resetting default scope

LAST_CONTROL_TRANSFER:  from 804f8b9d to 80528bdc

STACK_TEXT:  
f77466ec 804f8b9d 00000003 f7746a48 00000000 nt!RtlpBreakWithStatusInstruction
f7746738 804f978a 00000003 98192bc0 80507c39 nt!KiBugCheckDebugBreak+0x19
f7746b18 80541683 0000000a 98192bc0 00000002 nt!KeBugCheck2+0x574
f7746b18 80507c39 0000000a 98192bc0 00000002 nt!KiTrap0E+0x233
f7746bd0 804f17e4 8170e000 8131a9d0 812f4e70 nt!MmUnlockPages+0x12b
f7746bf8 f96808d7 814a5ca0 f7746c20 804f15e3 nt!IopfCompleteRequest+0x1e8
f7746c04 804f15e3 814a5be8 812f4e70 812f4e80 Test!IrpCancelRoutine+0x37 [f:\WDM\Test\readwrite.cpp @ 617]
f7746c20 8056b8fd 812f4e70 8133f638 8131a7c0 nt!IoCancelIrp+0x6f
f7746c48 805c96f8 8131a7c0 8131a7c0 8131aa08 nt!IoCancelThreadIo+0x33
f7746d08 805c9b54 00000001 8131a7c0 00000000 nt!PspExitThread+0x42a
f7746d28 805c9d2f 8131a7c0 00000001 f7746d64 nt!PspTerminateThreadByPointer+0x52
f7746d54 8053e638 00000000 00000001 0012fed0 nt!NtTerminateProcess+0x105
f7746d54 7c92e514 00000000 00000001 0012fed0 nt!KiFastCallEntry+0xf8
0012fdd0 7c92de7a 7c81cace ffffffff 00000001 ntdll!KiFastSystemCallRet
0012fdd4 7c81cace ffffffff 00000001 00c43168 ntdll!NtTerminateProcess+0xc
0012fed0 7c81cb26 00000001 77e8f3b0 ffffffff kernel32!_ExitProcess+0x62
0012fee4 00455d19 00000001 00455f1f 00000001 kernel32!ExitProcess+0x14
WARNING: Stack unwind information not available. Following frames may be wrong.
0012ff24 00455f44 00000001 00000000 00000000 USR_TESTR3+0x55d19
0012ffc0 7c817077 00390038 00370035 7ffd5000 USR_TESTR3+0x55f44
0012fff0 00000000 0045116f 00000000 78746341 kernel32!BaseProcessStart+0x23

STACK_COMMAND:  kb

FOLLOWUP_IP:
test!IrpCancelRoutine+37 [f:\WDM\Test\readwrite.cpp @ 617]
f96808d7 8be5            mov     esp,ebp

FAULTING_SOURCE_CODE:  
   613:         if( Irp == pdx->pBufIrp)
   614:         {
   615:                 pdx->pBufIrp = NULL;
   616:         }
   617:
   618:         Irp->IoStatus.Status      = STATUS_CANCELLED;
   619:         Irp->IoStatus.Information = 0;
>  620:         IoCompleteRequest(Irp,IO_NO_INCREMENT);
   621:
   622:         return;

SYMBOL_STACK_INDEX:  6

SYMBOL_NAME:  Test!IrpCancelRoutine+37

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: Test

IMAGE_NAME:  Test.sys

DEBUG_FLR_IMAGE_TIMESTAMP:  4f0d65b2

FAILURE_BUCKET_ID:  0xA_Test!IrpCancelRoutine+37

BUCKET_ID:  0xA_Test!IrpCancelRoutine+37
2012-1-12 08:56
0
雪    币: 53
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
问题解决啦。 上边写出的代码木有问题。 有问题的是IRP->MDLAddress被我MmProbeAndLockPages 锁定(其实已经被锁定), 然后再次其他时间调用了MmUnlockPages(pdx->pBufIrp->MdlAddress); 把IRP->MDLADDRESS给置换成分页的内存啦。
2012-1-12 13:12
0
雪    币: 12
活跃值: (767)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
能自己搞定BSOD的都是好孩子
2012-1-12 13:22
0
游客
登录 | 注册 方可回帖
返回
//