能力值:
( 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时,会返回到发起调用的那个进程中去~
能力值:
( 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的设计并不象大多数人说的一无是处。
能力值:
( LV11,RANK:190 )
4 楼
哪里有苦难,哪里就会出现教主
能力值:
( LV2,RANK:10 )
5 楼
好的,我去看看