首页
社区
课程
招聘
[求助]派遣函数调用是否在发起者线程中执行?
发表于: 2008-12-30 21:20 6468

[求助]派遣函数调用是否在发起者线程中执行?

2008-12-30 21:20
6468
想请教一个问题,看到这样一段描述。
系统服务函数NtReadFile创建IRP_MJ_WRITE类型的IRP,然后它将这个IRP发送到某个驱动程序的派遣函数中。NtReadFile然后去等待一个事件,这时当前线程进入“睡眠”状态,也可以说当前线程被阻塞住或者线程处于“Pending”状态。

这里说当线程进入睡眠状态,那么线程就可能发生了切换吧,那其派遣函数又在哪个线程环境中执行的?似乎根据不同的IRP类型其派遣函数被调用的方式都不同? 求教下!

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

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
Irp发送下去之后Dispatch(派遣函数)一定是在当前线程中执行的,但是驱动有权由于各种原因选择不立即执行所请求的操作,而是将所请求的操作通过各种方式(比如将所有的操作连成一个链表然后在某个特定的由驱动创建的线程)在其他线程的上下文中完成,而发送IRP的线程则会一直被阻塞直到驱动调用Io(f)CompleteRequest唤醒发送IRP的线程。
2009-1-1 09:04
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
麻烦炉子大牛移架一下这里~ :)
http://www.debugman.com/read.php?tid=2599
2009-1-1 17:07
0
雪    币: 217
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
“Irp发送下去之后Dispatch”只有顶层的驱动可以保证这点,如果你是low level的驱动,比如ndis层的,那一般都不在原线程上下文。
2009-1-1 20:48
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
to:heretic

这跟IRP是否同步处理有关吗?
2009-1-1 21:20
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
heretic说的对,通常而言,更下层的驱动的dispatch是由上层的驱动在一个特定workthread(一个由上层驱动创建的SystemThread)中调用的,这样可以保证Dispatch立即返回,否则难以实现异步IO。
2009-1-2 11:25
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
可俺这个问题是个 同步IRP的问题汗~~
2009-1-2 14:57
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
异步IO的话调用了Dispatch之后不会WaitForSingleObject,同步IO在调用了Dispatch如果Dispatch返回STATUS_PENDING的话会WaitForSingleObject(kernel中)
2009-1-2 15:32
0
雪    币: 214
活跃值: (24)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
派遣函数调用是否在发起者线程中执行?
========================
非常肯定,是的。
2009-1-2 15:43
0
游客
登录 | 注册 方可回帖
返回
//