☆ 編寫hello.inf文件
; ------------------------------------------------------------------------
;
; Copyright to satisfy the CHKINF utility
;
[Version]
Signature = "$Windows NT$"
Class = %ClassName%
;
; For a new device setup class, the INF must specify a newly generated
; ClassGuid value
;
; 用\WINDDK\2600.1106\tools\other\i386\guidgen.exe生成
;
ClassGuid = {EABDB9DF-F09D-44ba-81E5-551C2ABC1FA9}
Provider = %INFCreator%
DriverVer = 06/10/2003,1.00.1993.9
; ------------------------------------------------------------------------
[ClassInstall32.ntx86]
AddReg = ClassInstall32Reg
[ClassInstall32Reg]
HKR,,,,%ClassName%
; ------------------------------------------------------------------------
[Manufacturer]
%INFCreator% = HelloWorldSection
; ------------------------------------------------------------------------
[HelloWorldSection]
%DESCRIPTION% = DDInstall,*HWD1993
; ------------------------------------------------------------------------
[SourceDisksNames.x86]
1 = %DiskDescription%,,,
[SourceDisksFiles.x86]
hello.sys = 1
[DestinationDirs]
DefaultDestDir = 10,system32\drivers
FileList = 10,system32\drivers
; ------------------------------------------------------------------------
[DDInstall.ntx86]
Copyfiles = FileList
[FileList]
hello.sys,,,0x00000002
; ------------------------------------------------------------------------
[DDInstall.ntx86.Services]
AddService = HelloWorld,0x00000002,ServiceInstall
[ServiceInstall]
DisplayName = %FriendlyName% ; friendly name
ServiceType = 0x00000001 ; SERVICE_KERNEL_DRIVER
StartType = 0x3 ; SERVICE_DEMAND_START
ErrorControl = 0x1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %10%\system32\drivers\hello.sys
; ------------------------------------------------------------------------
[DDInstall.ntx86.HW]
AddReg = DDInstallRegHW
[DDInstallRegHW]
HKR,,HelloWorldInfo,,%DESCRIPTION%
; ------------------------------------------------------------------------
[Strings]
ClassName = "HelloWorldClass"
INFCreator = "The Hello World Software"
DESCRIPTION = "The Hello World Driver"
DiskDescription = "The Hello World Software Disk"
FriendlyName = "Hello World"
; ------------------------------------------------------------------------
DDK文檔詳細解釋了如何編寫INF文件。不過個人覺得DDK文檔適合在閱讀一份現(xiàn)成的
INF文件時當作手冊查看。如果妄圖在沒有樣板INF文件的情況下通過查看DDK文檔來
從頭寫一份新INF文件,至少初學者不要有這樣的念頭。為了寫這么點破爛,我費勁
壞了。
用\WINDDK\2600.1106\tools\other\i386\guidgen.exe生成ClassGuid。
執(zhí)行如下命令對hello.inf文件提前進行一些檢查:
\WINDDK\2600.1106\tools\chkinf> chkinf.bat hello.inf
在\WINDDK\2600.1106\tools\chkinf\htm\目錄里生成分析報告:
--------------------------------------------------------------------------
Line 7: (E22.1.1081) Directive: CatalogFile required (and must not be blank) in section [Version] for WHQL digital signature.
Line 9: (E22.1.1310) Class HelloWorldClass (ClassGUID {EABDB9DF-F09D-44ba-81E5-551C2ABC1FA9}) is unrecognized.
--------------------------------------------------------------------------
第一個錯誤因為我沒有指定"CatalogFile.ntx86 = ...",目前階段也沒法指定。第
二個錯誤因為ClassGuid是新創(chuàng)建的。
剛開始寫hello.inf文件時,分析報告里還有不少錯誤、警告信息。應該在某注釋行
中包含"Copyright"單詞,否則分析報告里有"No Copyright information found."警
告信息。
知道為什么要安裝ActivePerl 5.6.1么,chkinf.bat需要Perl解釋器的支持!
Walter Oney的光盤([1])需要安裝,他的安裝過程會在這里增加相關內(nèi)容:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class
不清楚他這么做的好處何在,說實話,挺煩這手的。不喜歡安裝這些人提供的隨書光
盤,它們使我喪失了深入了解問題本質(zhì)的機會,這也是我沒有安裝DriverStudio中其
它開發(fā)工具的原因。由于源代碼已經(jīng)在那里,我沒有執(zhí)行setup.exe,只是直接編譯
并試圖安裝其中的某些例子程序:
> fastinst.exe xxx.inf
結(jié)果得到一個對話框式的錯誤提示,ERROR_SECTION_NOTFOUND。setupapi.log中看到:
--------------------------------------------------------------------------
找不到 [ClassInstall32] 段。
--------------------------------------------------------------------------
chkinf.bat xxx.inf的分析報告里有相應警告信息:
--------------------------------------------------------------------------
Custom defined Classes should have a [ClassInstall32] section.
--------------------------------------------------------------------------
最初的hello.inf沒有下面這部分內(nèi)容,自然會遇上同樣的問題:
--------------------------------------------------------------------------
[ClassInstall32.ntx86]
AddReg = ClassInstall32Reg
[ClassInstall32Reg]
HKR,,,,%ClassName%
--------------------------------------------------------------------------
此外,注意這一節(jié):
--------------------------------------------------------------------------
[DDInstall.ntx86]
Copyfiles = FileList
--------------------------------------------------------------------------
剛開始多根據(jù)DDK文檔寫成"CopyFiles = ...",結(jié)果在\windows\setupapi.log中看
到:
--------------------------------------------------------------------------
在 "hello.inf" 的 [FileList] 段分析 "Copyfiles" 失敗。 錯誤 0xe0000102: 在 INF 中找不到所需的行。
--------------------------------------------------------------------------
這個錯誤導致hello.sys未被復制到\windows\system32\drivers\目錄下。按大小寫
敏感方式修改成現(xiàn)在使用的樣子就解決了。如果用"fastinst.exe hello.inf"進行安
裝,不會遇到該問題,我懷疑這是MS的一個小BUG。
經(jīng)驗就是,安裝過程出了問題先看setupapi.log文件。
順便提一下,DDK提供了GenInf工具,這是一個垃圾工具,即使對初學者也如此。測
試使用了一次,強烈建議大家當它不存在。Art Baker委婉地表述了類似觀點([3])。
☆ 安裝hello.inf文件
Walter Oney的fastinst.exe果然便捷,不過個人建議在試圖了解更多細節(jié)的時候還
是少依賴它為妙。
控制面板->添加硬件->是,硬件已聯(lián)接好->添加新的硬件設備->
安裝我手動從列表選擇的硬件(高級)->顯示所有設備->從磁盤安裝->完成
由于hello.c最后故意失敗返回,安裝雖然完成,但加載驅(qū)動必然失敗。在設備管理
器中可以看到黃色驚嘆號,表示無法成功加載驅(qū)動程序。
這次安裝過程導致如下一些動作:
1)
--------------------------------------------------------------------------
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{EABDB9DF-F09D-44BA-81E5-551C2ABC1FA9}]
"Class"="HelloWorldClass"
@="HelloWorldClass"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{EABDB9DF-F09D-44BA-81E5-551C2ABC1FA9}\0000]
"InfPath"="oem5.inf"
"InfSection"="DDInstall"
"InfSectionExt"=".NTx86"
"ProviderName"="The Hello World Software"
"DriverDateData"=hex:00,40,43,3c,e3,2e,c3,01
"DriverDate"="6-10-2003"
"DriverVersion"="1.0.1993.9"
"MatchingDeviceId"="*hwd1993"
"DriverDesc"="The Hello World Driver"
--------------------------------------------------------------------------
2)
--------------------------------------------------------------------------
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\UNKNOWN]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\UNKNOWN\0000]
"ClassGUID"="{EABDB9DF-F09D-44BA-81E5-551C2ABC1FA9}"
"ConfigFlags"=dword:00000004
"Driver"="{EABDB9DF-F09D-44BA-81E5-551C2ABC1FA9}\\0000"
"Class"="HelloWorldClass"
"Mfg"="The Hello World Software"
"HardwareID"=hex(7):2a,00,68,00,77,00,64,00,31,00,39,00,39,00,33,00,00,00,00,\
00
"Service"="HelloWorld"
"DeviceDesc"="The Hello World Driver"
"Capabilities"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\UNKNOWN\0000\Device Parameters]
"HelloWorldInfo"="The Hello World Driver"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\UNKNOWN\0000\LogConf]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\UNKNOWN\0000\Control]
--------------------------------------------------------------------------
3)
--------------------------------------------------------------------------
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HelloWorld]
"Type"=dword:00000001
"Start"=dword:00000003
"ErrorControl"=dword:00000001
"ImagePath"=hex(2):73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,64,00,\
72,00,69,00,76,00,65,00,72,00,73,00,5c,00,68,00,65,00,6c,00,6c,00,6f,00,2e,\
00,73,00,79,00,73,00,00,00
"DisplayName"="Hello World"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HelloWorld\Security]
"Security"=hex:01,00,14,80,90,00,00,00,9c,00,00,00,14,00,00,00,30,00,00,00,02,\
00,1c,00,01,00,00,00,02,80,14,00,ff,01,0f,00,01,01,00,00,00,00,00,01,00,00,\
00,00,02,00,60,00,04,00,00,00,00,00,14,00,fd,01,02,00,01,01,00,00,00,00,00,\
05,12,00,00,00,00,00,18,00,ff,01,0f,00,01,02,00,00,00,00,00,05,20,00,00,00,\
20,02,00,00,00,00,14,00,8d,01,02,00,01,01,00,00,00,00,00,05,0b,00,00,00,00,\
00,18,00,fd,01,02,00,01,02,00,00,00,00,00,05,20,00,00,00,23,02,00,00,01,01,\
00,00,00,00,00,05,12,00,00,00,01,01,00,00,00,00,00,05,12,00,00,00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HelloWorld\Enum]
"0"="ROOT\\UNKNOWN\\0000"
"Count"=dword:00000001
"NextInstance"=dword:00000001
"INITSTARTFAILED"=dword:00000001
--------------------------------------------------------------------------
4) 復制hello.sys到\windows\system32\drivers\目錄下。
在setupapi.log中可以看到如下內(nèi)容:
--------------------------------------------------------------------------
[2003/06/11 14:06:31 1780.404]
#-198 處理的命令行: "\system32\rundll32.exe" shell32.dll,Control_RunDLL "\system32\hdwwiz.cpl",添加硬件
#I140 正在安裝設備類別: "HelloWorldClass" {EABDB9DF-F09D-44ba-81E5-551C2ABC1FA9}。
#I141 類別安裝已結(jié)束,沒有出錯。
[2003/06/11 14:06:32 1780.407 Driver Install]
#-124 正在做“僅復制”安裝 "ROOT\UNKNOWN\0000"。
#-198 處理的命令行: "\system32\rundll32.exe" shell32.dll,Control_RunDLL "\system32\hdwwiz.cpl",添加硬件
#E360 驅(qū)動程序 "The Hello World Driver" 的一個未經(jīng)過簽署或簽署不正確的文件 "hello.inf" 將得到安裝(策略=忽略)。 錯誤 0xe000022f: 第三方 INF 不包含數(shù)字簽名信息。
#-024 正在將文件 "hello.sys" 復制到 "\system32\drivers\hello.sys"。
#E360 驅(qū)動程序 "The Hello World Driver" 的一個未經(jīng)過簽署或簽署不正確的文件 "hello.inf" 將得到安裝(策略=忽略)。 錯誤 0xe000022f: 第三方 INF 不包含數(shù)字簽名信息。
#-166 設備安裝函數(shù): DIF_REGISTER_COINSTALLERS。
#I056 注冊了共同安裝程序。
#-166 設備安裝函數(shù): DIF_INSTALLINTERFACES。
#-011 正在從 "hello.inf" 安裝段 [DDInstall.NTx86.Interfaces]。
#I054 安裝接口。
#-166 設備安裝函數(shù): DIF_INSTALLDEVICE。
#I123 進行 "ROOT\UNKNOWN\0000" 的完整安裝。
#E360 驅(qū)動程序 "The Hello World Driver" 的一個未經(jīng)過簽署或簽署不正確的文件 "hello.inf" 將得到安裝(策略=忽略)。 錯誤 0xe000022f: 第三方 INF 不包含數(shù)字簽名信息。
#I163 設備未開始: 設備有問題: 0x25: CM_PROB_FAILED_DRIVER_ENTRY.
#I121 "ROOT\UNKNOWN\0000" 的設備安裝成功完成。
--------------------------------------------------------------------------
如果在資源管理器中右鍵選中hello.inf,點擊菜單里的"安裝",不知為何,毫無動
靜。注冊表、drivers目錄、setupapi.log均無變化,活見鬼了。目前我還不懂這里
的竅道,以后再來理解。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet只是到ControlSet<nnn>的符號鏈接,
HKEY_LOCAL_MACHINE\SYSTEM\Select用于具體確定是到誰的符號鏈接。啟動時F8菜單
有一個選項對應最近一次成功引導所用設置,就是由LastKnownGood決定的。參看[4]
的5.2.6小節(jié)。
☆ 卸載hello.sys及相關設置
1)
手工卸載很簡單,在注冊表中刪除上述三處內(nèi)容,在drivers目錄中刪除hello.sys。
2)
也可以執(zhí)行"sc delete HelloWorld":
> sc delete HelloWorld
[SC] DeleteService SUCCESS
設備管理器中倒是看不到相應顯示了。注冊表中殘留了一點內(nèi)容:
--------------------------------------------------------------------------
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{EABDB9DF-F09D-44BA-81E5-551C2ABC1FA9}]
"Class"="HelloWorldClass"
@="HelloWorldClass"
--------------------------------------------------------------------------
并且drivers\hello.sys也未刪除。
3)
還有一種方式,通過設備管理器卸載,比"sc delete HelloWorld"干得活還要少些,
注冊表中"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HelloWorld"
還在。
個人建議用第二種方式,結(jié)合一些手動操作。
這樣仔細地手工折騰一趟之后,想必對驅(qū)動的安裝/卸載有了初步認識吧。反正我是
感覺學到不少東西。
☆ 察看KdPrint輸出
從Unix轉(zhuǎn)過來的兄弟們不要幻想有uprintf()這樣的內(nèi)核函數(shù)可用。只有類似Linux下
printk()的KdPrint輸出。有很多辦法察看這個輸出,這次我用DebugView([5])。在
Capture菜單里勾中Capture kernel、Pass-Through、Capture Events即可。扔到一
邊別理它。
添加硬件過程最終會嘗試加載hello.sys,DriverEntry()被調(diào)用,在DebugView中可
以看到KdPrint輸出,確認SEH起作用了。
安裝結(jié)束后如想再次進入DriverEntry(),可以執(zhí)行"net start HelloWorld"。
☆ 使用DriverMonitor
Compuware DriverStudio Release 2.7中提供了DriverMonitor。在File菜單里選擇
"Open Driver"打開hello.sys,選擇"Start Driver"調(diào)用DriverEntry(),直接看到
KdPrint輸出信息。如果同時啟動了DebugView,兩邊都可看到,此時可以順帶加強對
Pass-Through設置的理解。
好處在于不必編寫hello.inf就可測試hello.sys。"Open Driver"時會臨時在注冊表
中設置一些內(nèi)容:
--------------------------------------------------------------------------
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Hello]
"Type"=dword:00000001
"Start"=dword:00000003
"ErrorControl"=dword:00000001
"ImagePath"=hex(2):5c,00,3f,00,3f,00,5c,00,63,00,3a,00,5c,00,6f,00,6e,00,6c,00,\
79,00,74,00,65,00,6d,00,70,00,5c,00,68,00,65,00,6c,00,6c,00,6f,00,5c,00,68,\
00,65,00,6c,00,6c,00,6f,00,2e,00,73,00,79,00,73,00,00,00
"DisplayName"="Hello"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Hello\Security]
"Security"=hex:01,00,14,80,90,00,00,00,9c,00,00,00,14,00,00,00,30,00,00,00,02,\
00,1c,00,01,00,00,00,02,80,14,00,ff,01,0f,00,01,01,00,00,00,00,00,01,00,00,\
00,00,02,00,60,00,04,00,00,00,00,00,14,00,fd,01,02,00,01,01,00,00,00,00,00,\
05,12,00,00,00,00,00,18,00,ff,01,0f,00,01,02,00,00,00,00,00,05,20,00,00,00,\
20,02,00,00,00,00,14,00,8d,01,02,00,01,01,00,00,00,00,00,05,0b,00,00,00,00,\
00,18,00,fd,01,02,00,01,02,00,00,00,00,00,05,20,00,00,00,23,02,00,00,01,01,\
00,00,00,00,00,05,12,00,00,00,01,01,00,00,00,00,00,05,12,00,00,00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Hello\Enum]
"Count"=dword:00000000
"NextInstance"=dword:00000000
"INITSTARTFAILED"=dword:00000001
--------------------------------------------------------------------------
因此可以"net start Hello"激發(fā)KdPrint輸出。在File菜單里選擇"Remove Service
Entry"將刪除上述內(nèi)容,退出DriverMonitor前應該執(zhí)行該操作。
DriverMonitor不會做其它操作,比如不會復制hello.sys到drivers目錄下,也不影
響設備管理器。
好,我這次目的達到了,現(xiàn)在對編譯、安裝、卸載Windows驅(qū)動有了感性認識,順帶
學習了一些工具的使用,希望對你也有所幫助。下次就不知道什么時候開始第三次學
習了,正經(jīng)工作是編寫掃描器插件以及Unix漏洞跟蹤分析,想學點Windows不容易,
還好不是太苦悶。
☆ 參考資源
[ 1] <<Programming the Microsoft Windows Driver Model>> - Walter Oney
[ 2] <<Windows NT Device Driver Development>> - P. Viscarola, W. Mason
[ 3] <<The Windows 2000 Device Driver Book, Second Edition>> - Art Baker, Jerry Lozano
[ 4] <<Inside Microsoft Windows 2000 Third Edition>> - David A. Solomon, Mark E. Russinovich
[ 5] DebugView
http://www.sysinternals.com
cygwin (夢醒⊙崇尚暴力) 于 (Wed Jun 11 17:01:07 2003) 提到:
【 在 soycola (醬油可樂) 的大作中提到: 】
: 標 題: Re: 學習寫一個Hello World驅(qū)動
: 發(fā)信站: BBS 水木清華站 (Wed Jun 11 16:15:09 2003), 轉(zhuǎn)信
:
: 這個是wdm版的hello world,這個過程掩蓋了很多實質(zhì)問題。
:
: 我的理解wdm為了支持設備的即插即用引入了復雜的驅(qū)動安裝
: 過程,即必須編寫inf文件并使用新設備向?qū)?,反觀nt驅(qū)動,
: 只要調(diào)用幾個service control manager的api就可以完成安裝,
: 究其本質(zhì)原因,應當是nt4的driver-centered的驅(qū)動模型和
: win 2000的device centered驅(qū)動模型之間的區(qū)別。nt4的驅(qū)動
: 模型說白了就是linux采用的模型,nt4的net start就是linux的
: 的insmod,nt4的net stop就是linux的rmmod。當然nt4在執(zhí)行
: net start之前必須執(zhí)行一個輕量級的安裝工作(主要是createservice
: ),而這個createservice的過程在linux下面只是將驅(qū)動的.o
: 文件拷貝到相關路徑中即可(我自己的理解,請小四兄指正)。
: 當然nt4的這個‘服務式’驅(qū)動模型和linux的驅(qū)動模型也有區(qū)別,
: nt4中的服務可以是用戶態(tài)的,換句話說,nt4的服務約等于
: linux的核心模塊+linux的daemon程序,而wdm驅(qū)動則約等于
: nt4核心態(tài)驅(qū)動+pnp支持+電源管理支持。
你所說的nt4方案也可以2k下用啊
只要打開service manager
加入服務,啟動服務
就搞定了
:
: 所以,如果說nt4的驅(qū)動模式更接近于linux,則那些ms fans不妨可以
: 認為windows的wdm比linux先進。
:
: btw,對于小四兄的應用,我想大部分情況下應該只是一個nt4核心
: 態(tài)驅(qū)動就夠了,不需要wdm支持。對這種程序,寫一個hello
: world其實更簡單。我一會兒轉(zhuǎn)一個過來大家審查一下。
: 【 在 hellguard (小四★北渡北漢江⊙) 的大作中提到: 】
: : 學習筆記,沒有技術含量,高手勿Ctrl-F了
: : 日期: 2003-06-10 21:50
: : 更新:
: : --------------------------------------------------------------------------
: : 目錄:
: : ☆ 概述
: : ☆ 編寫hello.c文件
: : ☆ 編寫dirs文件
: : ☆ 編寫sources文件
: : ☆ 編寫makefile文件
: : ☆ 編譯產(chǎn)生hello.sys文件
: : ...................
:
: --
:
: ※ 來源:·BBS 水木清華站 smth.org·[FROM: 61.51.240.205]
cygwin (夢醒⊙崇尚暴力) 于 (Wed Jun 11 17:12:01 2003) 提到:
這我就不懂了
filemon的那個驅(qū)動不是wdm的?
【 在 soycola (醬油可樂) 的大作中提到: 】
: wdm驅(qū)動這樣做是不行的,嘿嘿,wdm驅(qū)動都是按需加載的,有設備才
: 加載(所以才能實現(xiàn)pnp),所以它那個StartupType統(tǒng)統(tǒng)是3:demand_start
: ,除了一些啟動時需要加載的驅(qū)動以外。2k為了兼容nt,wdm驅(qū)動仍然
: 保留了服務這個概念,但是由于我在上面說的原因,我們應當認識到
: 服務這個driver center的東西本質(zhì)上和wdm這種device centered的架構(gòu)
: 是不甚融洽的。
cygwin (夢醒⊙崇尚暴力) 于 (Wed Jun 11 17:21:35 2003) 提到:
我只寫過一回驅(qū)動
所以對這些了解不多
剛才在driverdev找kmd,
發(fā)現(xiàn)只有一篇文章,還是提問的
驅(qū)動除了vxd(win9x),wdm,kmd還有沒有其它類型?
而wdm與kmd又有何居別?
【 在 soycola (醬油可樂) 的大作中提到: 】
: 小四所說‘想說hello不容易’是因為kmd的驅(qū)動編譯環(huán)境實在
: 復雜,相信每個寫過驅(qū)動的人都有體會,至于安裝復雜還在其次。
: 我回的帖子主要是兩個意思,1是可以用那個極簡單的makefile解決
: 編譯復雜的問題(ddk的那個build程序是微軟自己用來編譯win2k
: 的,所以考慮了很多細節(jié),至于我們用它則屬于牛刀宰雞),2是
: 可以回避復雜的安裝,直接用nt4的那個方案,因為小四用的程序
: 估計只是一個KMD。
反正我知道它的這個程序肯定可以用nt4的那種方式加載。
hellguard (小四★北渡北漢江⊙) 于 (Wed Jun 11 17:46:17 2003) 提到:
【 在 soycola (醬油可樂) 的大作中提到: 】
> 我想大部分情況下應該只是一個nt4核心
> 態(tài)驅(qū)動就夠了,不需要wdm支持。對這種程序,寫一個hello
> world其實更簡單。我一會兒轉(zhuǎn)一個過來大家審查一下。
這個我明白,的確是不需要WDM,不過是順手逮著學學。那我就等著學
你那個例子啦。主要是市面上的書直奔硬件而去,我想找個Hello World
而不得,只好自己瞎折騰一回,見笑見笑。
Linux的驅(qū)動模型我并不熟悉更多,只是從前寫過LLKM而已。我所
接觸的FKLD、SLKM都是偽設備驅(qū)動,真要討論涉及物理的驅(qū)動,我
一點經(jīng)驗都沒有的。
hellguard (小四★北渡北漢江⊙) 于 (Wed Jun 11 17:47:57 2003) 提到:
好,多謝,我回頭學學
【 在 soycola (醬油可樂) 的大作中提到: 】
: 諾,就是這個,很久以前在driverdev貼的,自己挺臭美的所以就轉(zhuǎn)過來了呵呵。
: /*++
: hello.c
: --*/
: #define _X86_
: #include <ddk/ntddk.h>
: #pragma comment(linker, "/entry:DriverEntry /subsystem:native /base:0x10000 /driver")
: #pragma comment(lib, "wdm.lib")
: VOID _stdcall Unload(IN PDRIVER_OBJECT DriverObject)
: {
: DbgPrint("Bye bye!\n");
: ...................
hellguard (小四★北渡北漢江⊙) 于 (Wed Jun 11 17:56:00 2003) 提到:
發(fā)現(xiàn)聽你講這些挺省事的啊,雖然不搞這些東西,聽你講講
也有收獲,
上次你們提到
A New Interface for Driver Writing -- The Windows Driver Framework
在OSR主站上有這篇,
http://www.osronline.com/article.cfm?id=212
我轉(zhuǎn)在Driver版了,已經(jīng)換行處理過
【 在 soycola (醬油可樂) 的大作中提到: 】
: 98就不說了。只說wdm和kmd,我能想到的最精確的描述就是:
: KMD(kernel mode driver)是‘驅(qū)動程序為中心’驅(qū)動架構(gòu)
: 下的產(chǎn)物WDM驅(qū)動是設備中心的驅(qū)動架構(gòu)下的產(chǎn)物。不過這么
: 說可能過于概括。在KMD時代,驅(qū)動程序處于主導地位,發(fā)現(xiàn)
: 并枚舉總線和設備、找到或分配設備的資源占用情況、創(chuàng)建
: 設備對象并提供環(huán)境子系統(tǒng)可以訪問的符號鏈接等,都是驅(qū)動
: 程序的工作。驅(qū)動告訴os說這里有個設備,驅(qū)動告訴os說這個
: 設備的io、mem、dma、irq,驅(qū)動創(chuàng)建一個設備對象然后扔給os說
: 給你個設備,然后os才知道有個設備;
: 而在WDM時代就不一樣了,設備翻身做了主人,在總線驅(qū)動和控
: 制器驅(qū)動(注1)的幫助下,os自己就知道當前計算機上鏈接有哪些設
: ...................
netfun (netfun) 于 (Tue Jun 17 15:41:30 2003) 提到:
WDM是Microsoft為了統(tǒng)一9x系列與NT系列而引入的驅(qū)動模型,實際上pnp與power只是
她的兩個需求而已,這可以從Windows Driver Model的命名可以看到。
在NT系列中WDM構(gòu)建于NT Legacy KMD(Kernel Mode Driver NT4)的基礎上,并不是不
甚融洽的。而正是由于PNP與Power的引入才使Driver的安裝發(fā)生了根本的變革,使其復雜
的多,但是pnp driver的安裝仍是基于最基本的services的概念,正是由于安裝的復雜,
microsoft引入了setupapi.dll用于這部分任務,而setupapi.dll則是對services的封
裝,當然實際上整個過程是非常復雜的,從內(nèi)核態(tài)引入root bus(\driver\pnpmanager
這是一個ntoskrnl.exe buildin driver)到device node等等。這一切的基礎都是KMD。
Microsoft并沒有鄙棄KMD,WDM是KMD發(fā)展而來的。
【 在 soycola (醬油可樂) 的大作中提到: 】
: wdm驅(qū)動這樣做是不行的,嘿嘿,wdm驅(qū)動都是按需加載的,有設備才
: 加載(所以才能實現(xiàn)pnp),所以它那個StartupType統(tǒng)統(tǒng)是3:demand_start
: ,除了一些啟動時需要加載的驅(qū)動以外。2k為了兼容nt,wdm驅(qū)動仍然
: 保留了服務這個概念,但是由于我在上面說的原因,我們應當認識到
: 服務這個driver center的東西本質(zhì)上和wdm這種device centered的架構(gòu)
: 是不甚融洽的。