日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DDK样例toaster分析(1)

發布時間:2023/12/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DDK样例toaster分析(1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? msddk樣例中toaster是一個比較完整和值得學習的pnp驅動,包括了一個完整的設備棧(含總線驅動/功能驅動,以及設備棧中各層過濾驅動)和驅動安裝程序(含驅動安裝包/類安裝程序/協安裝程序)。本篇記錄在xp下調試busenum驅動入口(關于環境的搭建網上一搜一大把,這里就省了,當然也可以參考這篇:win7 x64部署和串口調試虛擬驅動toaster)。

? ? 通過添加硬件的方式安裝busenum.sys后,會依次進入busenum.c!DriverEntry和pnp.c!Bus_AddDevice。AddDevice是本篇的重點,因此進入DriverEntry后在這個函數上下一個斷點:

kd> lmvm busenum //查看驅動和調試符號加載是否正確 start end module name b20e9000 b20f2b80 busenum (private pdb symbols) d:\winddk\7600.16385.1\src\general\toaster\wdm\bus\objchk_wxp_x86\i386\BusEnum.pdbLoaded symbol image file: busenum.sys kd> !itoldyouso busenum busenum.sysTimestamp: 57639546SizeOfImage: 9B80pdb: d:\winddk\7600.16385.1\src\general\toaster\wdm\bus\objchk_wxp_x86\i386\BusEnum.pdbpdb sig: A0EB3691-6995-416E-9BF4-C25A160C9318age: 1 Loaded pdb is d:\winddk\7600.16385.1\src\general\toaster\wdm\bus\objchk_wxp_x86\i386\BusEnum.pdb BusEnum.pdbpdb sig: A0EB3691-6995-416E-9BF4-C25A160C9318age: 1MATCH: BusEnum.pdb and busenum.sys確定sys文件加載正確后,查找函數并下斷點,然后繼續運行:
kd> x busenum!Bus_AddDevice b20eca60 busenum!Bus_AddDevice (struct _DRIVER_OBJECT *, struct _DEVICE_OBJECT *) kd> bp busenum!Bus_AddDevice kd> bl1 e b20eca60 0001 (0001) busenum!Bus_AddDevice當windbg進入Bus_AddDevice遇到斷點時,函數有兩個參數:PDRIVER_OBJECT DriverObject和PDEVICE_OBJECT PhysicalDeviceObject。DriverObject很好理解,就是busenum.sys,有windbg為證:

kd> dd DriverObject l1 f8ae99e8 8227a3b8kd> !drvobj 8227a3b8 Driver object (8227a3b8) is for:\Driver\busenum
PhysicalDeviceObject是什么 呢?如果是pnp設備驅動,那很簡單,這就是底層總線驅動對應的設備。但busenum本身是總線驅動,誰提供底層設備?答案是pnp管理器

kd> dd PhysicalDeviceObject l1 f8ae99ec 81f41030 kd> !devobj 81f41030 ---> 這個設備是pnp創建的設備 Device object (81f41030) is for:00000082 \Driver\PnpManager DriverObject 823eb2b0 ---> windbg指出,創建設備對象的驅動對象kd> !drvobj 823eb2b0 Driver object (823eb2b0) is for:\Driver\PnpManager --->驅動對象 Driver Extension List: (id , addr) 該驅動對象的設備對象 Device Object list: 81f41030 823e73d0 823e7610 823e7850原來,pnp管理器為了維護一顆設備樹,在加載總線驅動前會為總線設備創建一個pnpmanage設備對象,作為設備棧的棧底對象,讓總線設備attach上去。在busenum.sys代碼中也有這種設備棧的上下體現:

NTSTATUS Bus_AddDevice(__in PDRIVER_OBJECT DriverObject,__in PDEVICE_OBJECT PhysicalDeviceObject) {status = IoCreateDevice (DriverObject,...,&deviceObject);deviceData->UnderlyingPDO = PhysicalDeviceObject;deviceData->NextLowerDriver = IoAttachDeviceToDeviceStack (deviceObject,PhysicalDeviceObject); }
首先代碼創建busenum.sys的設備對象,然后attach到pnpmanager設備對象上。難怪toaster的幫助文檔中注釋這個對象為Fdo,而把Bus_AddDevice的第二個參數認為是Pdo。

來看下創建設備后設備棧情況:

kd> !drvobj 8227a3b8 Driver object (8227a3b8) is for:\Driver\busenum Driver Extension List: (id , addr) ;相比剛進入DriverEntry時,現在busenum驅動對象下已經有一個設備對象了,這個就是調用IoCreateDevice時創建的 Device Object list: 81f2a930 kd> dd deviceObject l1 f8ae99dc 81f2a930 ;設備對象的地址 kd> !devobj 81f2a930 ;驗證一下設備對象的屬主 Device object (81f2a930) is for:\Driver\busenum DriverObject 8227a3b8 Current Irp 00000000 RefCount 0 Type 0000002a Flags 00000088 DevExt 81f2a9e8 DevObjExt 81f2aa90 ExtensionFlags (0000000000) Device queue is not busy. kd> !devstack 81f2a930 ;81f2a930就是前面IoCreateDevice創建的設備對象!DevObj ? !DrvObj ? ? ? ? ? ?!DevExt ? ObjectName> 81f2a930 ?\Driver\busenum ? ?81f2a9e8 ?81f41030 ?\Driver\PnpManager 00000000 ?00000082!DevNode 81f2a008 :DeviceInst is "ROOT\UNKNOWN\0000" ;設備實例ServiceName is "busenum" ;設備對應的服務名
至此busenum的設備棧已經成形了,可以創建Fdo了。

在結束本文前,還有一些瑣碎的東西需要記錄。就是busenum.inf中DDinstall section

? ? 安裝busenum驅動后,打開設備管理器,在system devices下可以看到設備對象。



如圖所示,設備出現在system devices下,設備實例是ROOT\Unknow\0000。問題來了,為什么會這樣?

首先,設備管理器是以類設備為視圖,不同的設備類歸入不同的類下(物以類聚)。因此出現在system devices下一定是刻意設定,那么這由誰來設定?當然是inf文件了,在version節中指定:下面的內容摘自bus.inf

[Version] Signature="$WINDOWS NT$" Class=System ;指明busenum屬于system類 ClassGuid={4D36E97D-E325-11CE-BFC1-08002BE10318} ;類的guid Provider=%MSFT% DriverVer=09/21/2006,6.0.5736.1 CatalogFile=toaster.cat其次,硬件ID,由inf文件DDinstall節指定,msdn文檔上一般將DDinstall節認為是從Manufacturer開始:

[Manufacturer] %StdMfg%=Standard[Standard] ; These are the toaster bus pnp ids%ToasterBus.DeviceDesc%=ToasterBus_Device, root\busenum ;root\busenum指定了設備的HardwareID有了這兩項,在結合驅動在注冊表下的路徑可以找到相應的信息:

先確定設備的總線關系,inf文件中已經指出了busenum屬于root總線,它在注冊表中的路徑為:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root

設備實例ROOT\Unknow\0000表明,busenum在root總線的Unknow\0000下,在這個項中可以找到驅動的service和class信息:



1)通過ROOT\Unknow\0000索引驅動的service為busenum

在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\{SerivceName}下可以找到各種驅動注冊的服務相關的注冊表值:

對于busenum驅動ServiceName是busenum


ImagePath是驅動程序被安裝的路徑,這些信息在Inf文件中都有對應內容,

[ToasterBus_Device.NT.Services] ;這個節是服務安裝節 AddService = busenum,%SPSVCINST_ASSOCSERVICE%, busenum_Service_Inst? ;AddService對應驅動在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\下創建的服務名 {4D36E97D-E325-11CE-BFC1-08002BE10318} ; -------------- busenum driver install sections [busenum_Service_Inst] DisplayName = %busenum.SVCDESC% ;<span style="font-family: Arial, Helvetica, sans-serif;">busenum.SVCDESC</span><span style="font-family: Arial, Helvetica, sans-serif;">=busenum.SVCDESC = "Toaster Bus Enumerator"對應注冊表項DisplayName和在設備管理器上顯示的名字</span> ServiceType = 1 ; SERVICE_KERNEL_DRIVER StartType = 3 ; SERVICE_DEMAND_START <span style="font-family: Arial, Helvetica, sans-serif;">;對應注冊表的Start</span> ErrorControl = 1 ; SERVICE_ERROR_NORMAL ServiceBinary = %12%\busenum.sys ;對應注冊表中ImagePath LoadOrderGroup = Extended Base
2)通過ROOT\Unknow\0000索引驅動的class信息

在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{ClassGuid}
對于busenum驅動ClassGuid是{4D36E97D-E325-11CE-BFC1-08002BE10318},挨個找過去可以找到busenum注冊表項:


這里InfPath名為oem12.inf,是因為系統把所有inf文件拷到系統路徑后(c:\windows\inf),統一命名為oemxx.inf形式。而InfSection應該對應了設備的DDInstall節,這個節可能是當系統重啟時需要加載設備時到對應的oemxx.inf中尋找DDInstall進行驅動安裝的依據


總結

以上是生活随笔為你收集整理的DDK样例toaster分析(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。