如题,这是前几天某同事问我的问题。他假设设备栈中有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先加载设备栈底部的驱动,由下而上完成所有驱动的加载。