📄 usbstor21.txt
字号:
98的USB 通用驱动程序终结篇
前一段时间我发布了USB 通用驱动程序第二版,它是一个
从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 之后的结果
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -