查看單個文章
舊 2003-09-20, 01:43 AM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 win 98的USB 通用驅動程式終結篇

98的USB 通用驅動程式終結篇


前一段時間我發佈了USB 通用驅動程式第二版
http://www.slime2.com.tw/forums/show...threadid=68439

,它是一個
從winme抽取出來的WDM版本的USB Mass Storage
驅動程式和我重寫的USBMPHLP.PDR連接埠驅動程式的混合體。

這個終結篇的USB 通用驅動程式完全採用來自winme 的 USB
Mass Storage 驅動程式,僅僅需要修改USBMPHLP.PDR中的兩個字元,
完全不需要重寫USBMPHLP.PDR,因為這個驅動和第二版的功能上
沒有任何區別,僅僅是它和winme 中的驅動程式幾乎完全一樣,
所以我才稱它為終結篇,

方法:
在用一個16進制編輯器(如winhex或者UltraEdit)在USBMPHLP.PDR 文件中
搜尋兩個連續字元0x5a,0x04,把它替換為0x0a,0x04,一共可以
找到兩處,所以共需要修改兩個字元。
其餘的文件和我在USB 通用驅動程式第二版中發佈的沒有區別。

原理:
我一直在考慮為什麼原來WINEME的USBMPHLP.PDR連接埠驅動程式在WIN98
下面不能載入,而我寫的功能完全一樣的程式碼沒有問題,那麼多半是編譯時
的原因。
我把我寫的USBMPHLP.PDR連接埠驅動程式分別在98DDK 和 WIN2kME 的DDK
下編譯,發現產生的程式碼有兩個字元不同(就是0x5a,0x04和0x0a,0x04的不同),
而在WIN2kME 的DDK下編譯的USBMPHLP.PDR連接埠驅動程式也不能在WIN98下載入。
那麼原因是什麼,仔細看了一下WIN2KME DDK的頭文件,發現如下語句
ifndef DDK_VERSION
ifdef WIN31COMPAT
DDK_VERSION EQU 30AH
else
ifdef WIN40COMPAT
DDK_VERSION EQU 400H
else
ifdef WIN41COMPAT
DDK_VERSION EQU 40AH
else
DDK_VERSION EQU 45AH
endif
endif
endif
endif

VxD_Desc_Block STRUC
DDB_Next DD ?
DDB_SDK_Version DW DDK_VERSION
.
.
.
VxD_Desc_Block ENDS

看出來了,0x5a,0x04 就是45AH 而0x0a,0x04就是40AH,
於是我在WIN2KME 的DDK 下編譯時,定義WIN41COMPAT常量,
就可以讓win98載入這個vxd。



最後,我檢查winme 的原來的USBMPHLP.pdr連接埠驅動程式文件,
修改裡面的45aH 為40AH,在WIN98下面測試一切正常。
原來win98 不能載入winme 的USBMPHLP.pdr 是因為版本檢查的原因,
而USBMPHLP.pdr 的功能非常簡單,所以這個版本檢查的限制是沒有
必要的。

ps:
如果修改45AH為400H 是不是就可以在win95C 下載入了呢?
誰有win95C,可以試一下。

其餘內容參見我的主題
"USB 通用驅動程式第二版"。

其中 Usbmphlp.pdr.me 是winme 的 原版的Usbmphlp.pdr
Usbmphlp.pdr 是我直接 修改winme 的Usbmphlp.pdr 之後的結果


附件: USBSTOR21.rar

psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
有 5 位會員向 psac 送花:
aids610718 (2009-10-18),barry (2009-01-20),gamerod100 (2008-12-20),neotek (2008-03-13),souda (2008-04-17)
感謝您發表一篇好文章