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