设备栈中各个设备加载顺序

    如题,这是前几天某同事问我的问题。他假设设备栈中有Pdo,Fdo,以及附属于Fdo的设备上下过滤驱动以及类上下过滤驱动,在这种情况下,OS会以怎样的顺序加载这些设备?

    我第一反应是当然先加载Fdo,然后再加载过滤驱动。不过,出于谨慎,我决定还是先调试一下,然后再找资料核对一下。至于调试的对象,肯定还是万能的toast了~先准备好驱动文件夹,看名字就知道里面包含了类上下过滤驱动,设备上下过滤驱动以及功能驱动:


    之后为这些驱动的加载下延迟断点:

kd> bu devlower!DriverEntry
kd> bu devupper!DriverEntry
kd> bu toaster!DriverEntry
kd> .sympath+ C:\Users\Eugene\Desktop\studio\to
Symbol search path is: srv*;C:\Users\Eugene\Desktop\studio\to
Symbol search path is: SRV*D:\symbols\win10Rs2x86*http://msdl.microsoft.com/download/symbols;c:\users\eugene\desktop\studio\to

    现在可以用toaster中enum.exe枚举设备了,期间windbg会中断几次,只要根据遇到断点时给出的模块的名字以及断点触发的先后就可以知道驱动的加载顺序:

kd> g
Breakpoint 3 hit
devlower!DriverEntry:
abcb5010 8bff            mov     edi,edi
kd> ?? DriverObject
struct _DRIVER_OBJECT * 0xbf52c030
kd> g
Breakpoint 5 hit
toaster!DriverEntry:
abccb010 8bff            mov     edi,edi
kd> ?? DriverObject
struct _DRIVER_OBJECT * 0xb9682cd8
kd> g
Breakpoint 4 hit
devupper!DriverEntry:
abcd7010 8bff            mov     edi,edi
kd> g

最后看看这些模块在设备栈中的位置:

kd> !drvobj 0xb9682cd8 ;0xb9682cd8是前面加载toast时,显示的DriverObject的地址
Driver object (b9682cd8) is for:
 \Driver\toaster
Driver Extension List: (id , addr)

Device Object list:
d346f550  
kd> !devstack d346f550
  !DevObj   !DrvObj            !DevExt   ObjectName
  bf5efea0  \Driver\devupper   bf5eff58  
> d346f550  \Driver\toaster    d346f608  
  c1685a68  \Driver\devlower   c1685b20  
  b53681a0  \Driver\dynambus   b53df1a0  00000092
!DevNode b53df258 :
  DeviceInst is "{B85B7C50-6A01-11d2-B841-00C04FAD5171}\MsToaster\1&79f5d87&0&02"
  ServiceName is "toaster"
相信看了上面结果大家都知道设备加载的顺序了吧?os先加载设备栈底部的驱动,由下而上完成所有驱动的加载。

猜你喜欢

转载自blog.csdn.net/lixiangminghate/article/details/80739026