首页
社区
课程
招聘
[求助]请教大牛们个IRP的问题
发表于: 2013-1-16 01:11 8478

[求助]请教大牛们个IRP的问题

2013-1-16 01:11
8478
我在驱动中处理IRP_MJ_DIRECTORY_CONTORL,设置了一个完成例程,但是什么都没有做。
NTSTATUS DirectoryControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
  if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) 
  {
    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0;
    IoCompleteRequest( Irp, IO_NO_INCREMENT );
    return STATUS_SUCCESS;
  }

  IoCopyCurrentIrpStackLocationToNext( Irp );

  IoSetCompletionRoutine(Irp, DirectoryControlCompletion, NULL, TRUE, TRUE, TRUE);

  return IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp );
}


NTSTATUS DirectoryControlCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
{
  if (Irp->PendingReturned)
  {
    IoMarkIrpPending(Irp);
  }

  return Irp->IoStatus.Status;
}


如果是系统启动后驱动程序第一次加载,这时运行都没有问题,加载卸载都不会有问题。
问题出现在当第一次加载后,我打开资源管理器,但是卸载的时候我没有关掉资源管理器。
这时如果第二次加载驱动也不会有问题,但是点开资源管理器里任何一个文件夹都会BSOD。
如果我第一次卸载前把资源管理器关掉,那么第二次驱动加载运行就是正常的。

BSOD信息是 DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_PPERATIONS

错误信息如下:

*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS (ce)
A driver unloaded without cancelling timers, DPCs, worker threads, etc.
The broken driver's name is displayed on the screen.
Arguments:
Arg1: b209c760, memory referenced
Arg2: 00000008, value 0 = read operation, 1 = write operation
Arg3: b209c760, If non-zero, the instruction address which referenced the bad memory
  address.
Arg4: 00000000, Mm internal code.

Debugging Details:
------------------

WRITE_ADDRESS:  b209c760 

FAULTING_IP: 
MyDriver+4760
b209c760 ??              ???

DEFAULT_BUCKET_ID:  DRIVER_FAULT

BUGCHECK_STR:  0xCE

PROCESS_NAME:  explorer.exe

TRAP_FRAME:  b2acd01c -- (.trap 0xffffffffb2acd01c)
ErrCode = 00000010
eax=825f3588 ebx=00000000 ecx=827f0e09 edx=000000e1 esi=827f0e48 edi=827f0fb7
eip=b209c760 esp=b2acd090 ebp=b2acd0bc iopl=0         nv up ei ng nz ac pe cy
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00010297
<Unloaded_MyDriver.sys>+0x4760:
b209c760 ??              ???
Resetting default scope

IP_MODULE_UNLOADED: 
MyDriver+4760
b209c760 ??              ???

LAST_CONTROL_TRANSFER:  from 804f9df9 to 8052c5dc

STACK_TEXT:  
b2accb50 804f9df9 00000003 b209c760 00000000 nt!RtlpBreakWithStatusInstruction
b2accb9c 804fa9e4 00000003 00000000 c05904e0 nt!KiBugCheckDebugBreak+0x19
b2accf7c 804faf33 00000050 b209c760 00000008 nt!KeBugCheck2+0x574
b2accf9c 8052136a 00000050 b209c760 00000008 nt!KeBugCheckEx+0x1b
b2acd004 80545578 00000008 b209c760 00000000 nt!MmAccessFault+0x9a8
b2acd004 b209c760 00000008 b209c760 00000000 nt!KiTrap0E+0xd0
WARNING: Frame IP not in any known module. Following frames may be wrong.
b2acd08c 804f26b0 825f3588 827f0e48 00000000 <Unloaded_MyDriver.sys>+0x4760
b2acd0bc 8056fdc4 e1efb5b0 e1efb5d0 00000000 nt!IopfCompleteRequest+0xa2
b2acd0ec 8056fe0e 827f0e48 e1efb5b0 00000000 nt!FsRtlNotifyCompleteIrp+0x124
b2acd114 80570715 e1efb5b0 0000010b e100cc58 nt!FsRtlNotifyCompleteIrpList+0x3c
b2acd15c f7847b8a 82496790 8292c400 e100ceb8 nt!FsRtlNotifyCleanup+0x63
b2acd36c f782dd4d b2acd388 827eae20 82901c80 Ntfs!NtfsCommonCleanup+0x92e
b2acd4e4 804f018f 8292c020 827eae20 824d2a80 Ntfs!NtfsFsdCleanup+0xcf
b2acd4f4 f78b0bbf 824ff378 827eae30 b2acd750 nt!IopfCallDriver+0x31
b2acd504 804f018f 82901bc8 827eae20 8279f550 sr!SrCleanup+0xb3
b2acd514 b215de36 00000000 00000020 00010000 nt!IopfCallDriver+0x31
b2acd750 804f018f 8279e7f0 827eae20 827eae20 MyDriver!FSF_Cleanup+0x176 [f:\my c++ pro\2008driver\mydriver\mydriver\mydriver.cpp @ 1426]
b2acd760 80584953 824ff360 000000a8 829e7ad0 nt!IopfCallDriver+0x31
b2acd790 805bda0a 823f8990 8279e7f0 00100001 nt!IopCloseFile+0x26b
b2acd7c4 805bd333 823f8990 00000001 829e7ad0 nt!ObpDecrementHandleCount+0xd8
b2acd7ec 805bd3d1 e1ba7330 824ff378 000006c4 nt!ObpCloseHandleTableEntry+0x14d
b2acd834 805bd509 000006c4 00000001 00000000 nt!ObpCloseHandle+0x87
b2acd848 8054261c 000006c4 00fafbcc 7c92e4f4 nt!NtClose+0x1d
b2acd848 7c92e4f4 000006c4 00fafbcc 7c92e4f4 nt!KiFastCallEntry+0xfc
00fafbbc 7c92cfdc 7c809c1b 000006c4 00fafbdc ntdll!KiFastSystemCallRet
00fafbc0 7c809c1b 000006c4 00fafbdc 7d5fdc13 ntdll!NtClose+0xc
00fafbcc 7d5fdc13 000006c4 0011d9ec 00fafbf4 kernel32!CloseHandle+0x51
00fafbdc 7d5fdbea 00000001 0011d9e8 7d5fdbc5 SHELL32!CInterruptSource::_Reset+0x1b
00fafbe8 7d5fdbc5 000c5964 00fafc14 7d5c5652 SHELL32!CInterruptSource::~CInterruptSource+0xc
00fafbf4 7d5c5652 00000001 00000000 00000000 SHELL32!CLinkedNode<CInterruptSource>::`scalar deleting destructor'+0x10
00fafc14 7d5c55b6 0011d9ec 000c5958 02b33544 SHELL32!CChangeNotify::ReleaseInterruptSource+0x97
00fafc28 7d5c5566 000f6c78 00000001 02b33544 SHELL32!CChangeNotify::RemoveClient+0x2e
00fafc44 7d5c54a9 02b33544 00fafcd8 00000000 SHELL32!CChangeNotify::_DeregisterClient+0x18
00fafc60 7d5c4f26 0000000f 7d5c4e36 00fafc9c SHELL32!CChangeNotify::_DeregisterClientByID+0x55
00fafc70 77d18734 00010078 00000402 0000000f SHELL32!CChangeNotify::WndProc+0x3e
00fafc9c 77d18816 7d5c4e36 00010078 00000402 USER32!InternalCallWinProc+0x28
00fafd04 77d28ea0 0009e520 7d5c4e36 00010078 USER32!UserCallWinProcCheckWow+0x150
00fafd58 77d28eec 005996d8 00000402 0000000f USER32!DispatchClientMessage+0xa3
00fafd80 7c92e453 00fafd90 00000018 005996d8 USER32!__fnDWORD+0x24
00fafd80 805026ec 00fafd90 00000018 005996d8 ntdll!KiUserCallbackDispatcher+0x13
b2acdb14 805a2d39 b2acdbd0 b2acdbd4 b2acdba4 nt!KiCallUserMode+0x4
b2acdb70 bf813d9b 00000002 b2acdbb4 00000018 nt!KeUserModeCallback+0x87
b2acdbf4 bf813f42 bc6396d8 00000402 0000000f win32k!SfnDWORD+0xa8
b2acdc3c bf8419f1 006396d8 00000402 0000000f win32k!xxxSendMessageToClient+0x118
b2acdcac bf801eda e1c9beb0 b2acdd64 00000000 win32k!xxxReceiveMessage+0x2b5
b2acdce8 bf8036ec b2acdd14 000025ff 00000000 win32k!xxxRealInternalGetMessage+0x1d7
b2acdd48 8054261c 00fafe20 00000000 00000000 win32k!NtUserPeekMessage+0x40
b2acdd48 7c92e4f4 00fafe20 00000000 00000000 nt!KiFastCallEntry+0xfc
00fafd80 7c92e453 00fafd90 00000018 005996d8 ntdll!KiFastSystemCallRet
00fafda4 77d193e9 77d193a8 00fafe20 00000000 ntdll!KiUserCallbackDispatcher+0x13
00fafdd0 77d19402 00fafe20 00000000 00000000 USER32!NtUserPeekMessage+0xc
00fafdfc 7d5c4e29 00fafe20 00000000 00000000 USER32!PeekMessageW+0xbc
00fafe3c 7d5c4d3f 00000000 00000000 00000000 SHELL32!CChangeNotify::_HandleMessages+0x43
00faff4c 7d5db53c 77f56f42 00000000 7c8099ea SHELL32!CChangeNotify::_MessagePump+0x52
00faff50 77f56f42 00000000 7c8099ea 00090000 SHELL32!CChangeNotify::ThreadProc+0x1e
00faffb4 7c80b713 00000000 7c8099ea 00090000 SHLWAPI!WrapperThreadProc+0x94
00faffec 00000000 77f56ed3 00e6f4d4 00000000 kernel32!BaseThreadStart+0x37

STACK_COMMAND:  kb

FOLLOWUP_IP: 
MyDriver+4760
b209c760 ??              ???

SYMBOL_STACK_INDEX:  6

SYMBOL_NAME:  MyDriver+4760

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: MyDriver

IMAGE_NAME:  MyDriver.sys

DEBUG_FLR_IMAGE_TIMESTAMP:  0

FAILURE_BUCKET_ID:  0xCE_MyDriver+4760

BUCKET_ID:  0xCE_MyDriver+4760

Followup: MachineOwner
---------

请教各位,到底是怎么回事,我应该怎么做。。。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS  可能完成函数在执行的时候,你强制卸载导致的。用这个IoSetCompletionRoutineEx,可以保证完成函数未完成时不会被卸载
2013-1-16 11:57
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
试了一下还是不行啊。。。
2013-1-17 00:44
0
雪    币: 107
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
return Irp->IoStatus.Status;

完成函数不是这样返回的

http://hi.baidu.com/jonathan2004/item/1290aa6fde7d420ea0cf0f27
这个对IRP的处理总结的很好
楼主可以看看
2013-1-17 12:11
0
雪    币: 224
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我在写tdi过滤驱动的时候跟楼主遇到问题一模一样。关闭iexplorer与否,影响着驱动第二次加载之后系统的稳定性。
按着楼主的做法,也会出现问题,但系统的表现不一样。有的时候会蓝屏,就跟楼主的一样,有的时候却是
kd> r eip
eip=00000000
然后系统就死在那里了。
但我发现在我的调用栈总有一个特点:
f9c4aab0 f130e7f7 00000000 00000008 f9c4ab10 nt!IopfCallDriver+0x31
IoCallDriver的两个参数总是0和8。
我看楼主的调用栈倒不是这个样子的。
有没有大牛提示一下线索。
2013-1-23 11:06
0
雪    币: 224
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不好意思,IopfCallDriver是一个fastcall函数,我没有注意。
2013-1-23 11:46
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
那你的问题解决了么,如果驱动卸载的时候重启一次iexplorer呢?
2013-2-1 18:59
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
8
不会分析dump,就直接搞驱动,凌乱了。
2013-2-1 19:15
0
雪    币: 224
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不好意思,前段时间搞其它的去了,这个问题没有解决。
看到一个帖子,有大牛在这里讨论是否可以卸载的问题。
http://bbs3.driverdevelop.com/simple/?t50206.html
唉,主要是对io系统不太了解,才觉得找不到头绪啊。
2013-2-18 16:16
0
雪    币: 384
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
mark~~~~~~~~~~~~~~~~~~
2013-2-18 16:28
0
游客
登录 | 注册 方可回帖
返回
//