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

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

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

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

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 7651
活跃值: (523)
能力值: ( 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》
http://advdbg.org/dfstore/img/Understanding%20and%20Using%20Execution%20Context%20in%20Windows%20NT%20Drivers.pdf

很老的文章,但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
游客
登录 | 注册 方可回帖
返回
//