首页
社区
课程
招聘
[求助]派遣函数运行于哪个进程的问题。
发表于: 2011-7-2 19:31 5287

[求助]派遣函数运行于哪个进程的问题。

2011-7-2 19:31
5287
比如应用层调用WriteFile,相应内核派遣列程是运行在调用它的进程中吗(主要是针对低2g虚拟内存地址访问问题)?

如果是,那为什么还要担心进程切换的问题?
或者说是异步调用,系统只负责将i/o请求下发,切换进程操作仍然继续。然后再驱动上传结果时,系统将结果送给调用的应用程序?

[培训]传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 7651
活跃值: (518)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
上层的驱动派遣函数是运行在发起调用的进程中的(ntfs/fastfat什么的),直到某一层驱动将Irp挂入处理队列之后才会转移到其它进程(经常是Idle进程),而当该Irp完成后返回时还是在发起调用的进程,以WriteFile为例,进入内核后如下(为方便说明下面的调用栈实际进行了调整,但主要流程不变):
1: kd> kvn
 # ChildEBP RetAddr  Args to Child              
00 f8a47ff0 8080a3d9 82bc6d98 82901d78 82901f10 atapi!IdePortDispatch (FPO: [2,2,0])
01 f8a48000 f8615fdd 8278c000 827a7240 82901f10 nt!IopfCallDriver+0x31 (FPO: [0,0,0])
02 f8a48014 f8615cdc 82901f10 82bbbb70 827a731c CLASSPNP!SubmitTransferPacket+0x82 (FPO: [1,0,4])
03 f8a48044 f8615dcd 00004000 00004000 827a7240 CLASSPNP!ServiceTransferRequest+0xe4 (FPO: [2,6,4])
04 f8a48068 8080a3d9 82bbbab8 00000000 82bcba38 CLASSPNP!ClassReadWrite+0xff (FPO: [2,2,4])
05 f8a48078 f887d921 82bbb870 827a7340 f8a480d8 nt!IopfCallDriver+0x31 (FPO: [0,0,0])
06 f8a48088 8080a3d9 82bbd808 827a7240 827a7340 PartMgr!PmReadWrite+0x95 (FPO: [2,1,4])
0a f8a480bc f854d1c6 827a7380 82b747b0 827a7240 nt!IopfCallDriver+0x31 (FPO: [0,0,0])
0b f8a480d8 8080a3d9 82bbb7b8 827a7240 827a73a4 ftdisk!FtDiskReadWrite+0x194 (FPO: [Non-Fpo])
0c f8a480e8 f8625aa7 827a720c 82bc3100 82bcb4d8 nt!IopfCallDriver+0x31 (FPO: [0,0,0])
0d f8a480fc 8080a3d9 82bbe0d8 827a7240 827a7240 VolSnap!VolSnapWrite+0xbb (FPO: [2,0,0])
0e f8a4810c f808a1c3 f8a48504 827a7240 f8a482fc nt!IopfCallDriver+0x31 (FPO: [0,0,0])
0f f8a4811c f8089d26 f8a48504 82bbe020 00ee3000 Ntfs!NtfsSingleAsync+0x6d (FPO: [7,0,0])
10 f8a482fc f808afbc f8a48504 827a7240 82bc24e0 Ntfs!NtfsNonCachedIo+0x2f8 (FPO: [Non-Fpo])
11 f8a484f4 f808ac18 f8a48504 827a7240 0110070a Ntfs!NtfsCommonWrite+0x1821 (FPO: [Non-Fpo])
01 f8a60b20 8080a3d9 82bc3020 82750968 80a2a410 Ntfs!NtfsFsdWrite+0xf3 (FPO: [Non-Fpo])
02 f8a60b30 8089987c 82750ad4 00000000 82750968 nt!IopfCallDriver+0x31 (FPO: [0,0,0])
03 f8a60b44 808a8b39 82bc3020 82750968 82b77b68 nt!IopSynchronousServiceTail+0x70 (FPO: [7,0,4])
04 f8a60be8 8080699f 80000080 8000049c 00000000 nt!NtWriteFile+0x5d7 (FPO: [Non-Fpo])
05 f8a60be8 8080d7fb 80000080 8000049c 00000000 nt!KiFastCallEntry+0xfc (FPO: [0,0] TrapFrame @ f8a60c14)


从WriteFile到atapi!IdePortDispatch都是运行在发起者的进程中,再往后就是把该请求作为一个Packet挂入队列,那时候就不在发起者进程了。。。
你说的异步调用的过程大致是对的,当Io管理器最终完成Irp时,会返回到发起调用的那个进程中去~
2011-7-2 20:55
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
没写过驱动,只是有点印象。

DriverEntry()位于SYSTEM上下文;未队列的Dispatch等位于调用者线程上下文;DPC For ISR、Timer DPC等位于任意线程上下文。

可以参考 :《Understanding and Using Execution Context in Windows NT Drivers》
713K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3q4V1N6X3c8T1k6#2)9J5k6h3!0J5k6#2)9J5c8X3c8X3M7%4c8G2M7X3g2Q4x3V1k6A6L8h3N6Q4x3V1k6g2L8X3c8W2M7Y4y4@1j5h3&6V1K9h3&6Y4i4K6t1#2x3U0m8S2L8X3c8Q4x3U0f1J5x3q4g2K6K9h3&6Y4i4K6t1#2x3U0m8q4P5r3g2U0N6i4c8A6L8$3&6Q4x3U0f1J5x3p5y4G2L8Y4c8W2P5s2c8Q4x3U0f1J5x3r3W2F1i4K6t1#2x3U0m8i4K9h3&6V1L8%4N6K6i4K6t1#2x3U0m8z5g2q4)9J5y4e0t1H3c8s2u0A6N6X3g2J5M7#2)9J5k6i4m8V1k6R3`.`.

很老的文章,但NT的架构还是一样。可见MS的设计并不象大多数人说的一无是处。
2011-7-2 22:10
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
4
哪里有苦难,哪里就会出现教主
2011-7-2 22:41
0
雪    币: 9
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
好的,我去看看
2011-7-3 10:15
0
游客
登录 | 注册 方可回帖
返回