如何代码安装驱动?
2009-05-25 16:04
288 查看
开发驱动、调试驱动是个有技术含量的体力活,但是安装别人开发好的驱动,应该不会太难吧?
那么该如何安装驱动呢?
如果知道了如何安装驱动,那么识别器引擎驱动、虚拟键盘鼠标驱动就都可以搞定了。
呼呼。
以下文章可供参考:
1:
windows驱动入门,DDK中例子的实用方法,驱动的安装,调试,演示。
http://hi.baidu.com/zarelaky/blog/item/852fab3ef7b98cf9838b13e3.html
2:
如何根据驱动程序及其安装文件来访问该设备呢?
http://www.moon-soft.com/doc/13670.htm
3:
一个图文并茂的教程(不知好不好)
http://www.codeproject.com/KB/system/WDM_Driver_development.aspx
4:
Writing a Device Installation Application(这个应该是终极解决方案了)
http://www.osronline.com/DDKx/install/custom-install_7n53.htm
5:高手的讨论
http://www.programfan.com/club/showpost.asp?id=8122
http://www.80diy.com/home/20000612/19/11633.html
UpdateDriverForPlugAndPlayDevices
该函数可以完成两件事
1:安装驱动,只要指定inf文件及设备ID
2:检查指定设备ID的设备是否插入(usbdetect.dll可能就是通过该函数完成的)
参考:
http://www.osronline.com/DDKx/install/di-rtns_01ki.htm
*****************************************************
问:如何和一个硬件设备交互?即如何打开一个设备?
答:通过设备的符号链接打开设备。
设备的符号链接含义:
"//?/hid#vid_093a&pid_2510#6&1da905e4&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
|----1---|-----------2--------------|------------3--------------|-----------------------------4------------------------|
第一部分:何种总线的设备 eg ROOT, //?/hid
第二部分:当前设备硬件的名称 eg zhangfandevice, vid_093a&pid_2510
第三部分:当前设备硬件的第几个设备 eg:6&1da905e4&0&0000,可以同时插上好几个相同的设备硬件,不同的设备的这个域不同
第四部分:当前设备硬件所属的设备接口的GUID
eg:电脑上同时插入两个相同的2代硬件:
分别显示:
"//?/usb#vid_0471&pid_0668#6&2ea1fb62&0&1#{77f49320-16ef-11d2-ad51-006097b514dd}"
"//?/usb#vid_0471&pid_0668#6&3822C75E&0&1#{77f49320-16ef-11d2-ad51-006097b514dd}"
这两个设备的差别就在序号上,这个序号可能是系统随机分配的。
通过任务管理器,可以看到这两个设备的名字一样,都是TOLTech xeyez 2.0
右键查看详细信息-如下:
USB/VID_0471&PID_0668/6&2ea1fb62&0&1
USB/VID_0471&PID_0668/6&3822C75E&0&1
设备接口GUID, 设备ID, 兼容ID等概念:
1:设备接口:即GUID,
1.1)多个设备可以具有相同的GUID。
eg不同的HID鼠标键盘设备具有相同的GUID。
eg不同不同的识别器硬件具有相同的GUID。
1.2)GUID存在于inf文件的前几行。
[Version]
Signature="$CHICAGO$"
Class=USB //用于指示设备装好后出现在设备管理器中的那个分支下
ClassGUID={36FC9E60-C465-11CF-8056-444553540000} // xeyez1代2代3代的GUID,和周立同的一样
Provider=%Provider%
CatalogFile=xeyez.cat
DriverVer=05/15/2009,1.1.0.0
1.3)安装驱动时,这个信息无用。可用于SetupDiXXX函数通过该GUID查找属于该GUID的设备。然后可以通过查找到的信息创建句柄和设备通信。
2:设备ID
2.1)也即硬件id HardwareID eg vidpid
2.2)硬件自身含有自己的vidpid信息。该信息可用于帮组系统定位inf文件,然后根据inf的指示安装驱动
3:兼容ID
3.1)硬件自身含有自己的兼容ID信息,该信息可用于帮组系统定位inf文件,然后根据inf的指示安装驱动
eg hid兼容的usb鼠标就是通过提供兼容id来实现免驱的。
4:驱动程序.sys文件是否和设备接口GUID一一对应?
答:不对应。.sys里面不含有GUID,vidpid,兼容id等任何信息。
5:系统如何为新插入的usb硬件安装驱动?
系统通过usb设备的设备id,和兼容id,然后寻找相匹配的inf文件,然后安装inf文件记载的sys文件。
(至于该sys文件是否真的可用,系统可不管,要不不可用,就会导致蓝屏!)
举例1:从不同的鼠标可以免驱直接使用。是因为这些HID鼠标虽然vidpid不同,系统中也没有对应vidpid的inf文件,但它们具有相同的兼容id,系统中含有该兼容id的inf文件,可以顺利的找到驱动并安装成功。
举例2:不同的识别器硬件pidvid不一样,兼容id也不一样,所以安装失败了。需要对应vidpid的inf才能装上。
我插上了一个usb鼠标,其vidpid为vid_04b3&pid_3107,系统的安装其驱动的流程如下:
下面摘自:c:/windows/setupapi.log 的内容
[2010/01/06 14:26:26 644.3 Driver Install]
#-019 正在查找硬件 ID(s): usb/vid_04b3&pid_3107&rev_0130,usb/vid_04b3&pid_3107
#-018 正在查找兼容 ID(s): usb/class_03&subclass_01&prot_02,usb/class_03&subclass_01,usb/class_03
#-198 处理的命令行: C:/WINDOWS/system32/services.exe
#I022 在 "C:/WINDOWS/Inf/input.inf" 中发现了 "USB/Class_03&SubClass_01";设备: "USB 人体学输入设备";驱动程序: "USB 人体学输入设备";提供程序: "Microsoft";制造商: "(标准系统设备)";段: "HID_Inst"
#I023 实际安装部分: [HID_Inst.NT]。等级: 0x00003101。驱动程序有效日期: 07/01/2001。
#-166 设备安装函数: DIF_SELECTBESTCOMPATDRV。
#I063 从 [HID_Inst] 中的 "c:/windows/inf/input.inf" 选择驱动器安装服务。
#I320 设备的类别 GUID 依旧为: {745A17A0-74D3-11D0-B6FE-00A0C90F57DA}。
#I060 设置所选的驱动器。
#I058 选择最兼容的驱动器。
#-166 设备安装函数: DIF_INSTALLDEVICEFILES。
#I124 正在做“仅复制”安装 "USB/VID_04B3&PID_3107/5&2C1BFE1E&0&1"。
#-166 设备安装函数: DIF_REGISTER_COINSTALLERS。
#I056 注册了共同安装程序。
#-166 设备安装函数: DIF_INSTALLINTERFACES。
#-011 正在从 "c:/windows/inf/input.inf" 安装段 [HID_Inst.NT.Interfaces]。
#I054 安装接口。
#-166 设备安装函数: DIF_INSTALLDEVICE。
#I123 进行 "USB/VID_04B3&PID_3107/5&2C1BFE1E&0&1" 的完整安装。
#I121 "USB/VID_04B3&PID_3107/5&2C1BFE1E&0&1" 的设备安装成功完成。
参见 张帆的 windows驱动开发技术详解 P358
问:如何获取设备的符号链接?(为了调用CreateFile打开设备)
答:通过设备接口(GUID)和设备号决定。 如果系统中安装了同样的设备接口的多个设备,设备号一次递增。eg系统中安装了两个相同驱动的网卡,第一个网卡就是0号网卡,第二个就是1号网卡。
EG:
1:获取设备接口
eg1:HID设备的设备接口 一个系统定义好的GUID,可以通过 HidD_GetHidGuid()系统api知道
eg2:自己定义的设备的设备接口GUID自己应该知道
2:通过SetupDiGetClassDevs(上步得到的GUID)获取该设备接口的类型信息。
3:通过setupDiEnumDeviceInterfaces(上步获取的类型信息, idx)获取该类型设备的第idx个设备。
上面提到了一个设备接口可能对应着多个具体的硬件,只是他们的pidvid不一样
eg1:
识别器硬件1代,2代,2.1代,3代4中不同硬件使用的都是兼容zhou立功的GUID,只是这些硬件的差别存在于pidvid上。
电脑上可以同时插上多个识别器硬件。
eg2:
电脑上可以同时插上多个hid设备,他们具有相同的设备接口GUID。比如同时插上usb鼠标,usb键盘等
那么该如何安装驱动呢?
如果知道了如何安装驱动,那么识别器引擎驱动、虚拟键盘鼠标驱动就都可以搞定了。
呼呼。
以下文章可供参考:
1:
windows驱动入门,DDK中例子的实用方法,驱动的安装,调试,演示。
http://hi.baidu.com/zarelaky/blog/item/852fab3ef7b98cf9838b13e3.html
2:
如何根据驱动程序及其安装文件来访问该设备呢?
http://www.moon-soft.com/doc/13670.htm
3:
一个图文并茂的教程(不知好不好)
http://www.codeproject.com/KB/system/WDM_Driver_development.aspx
4:
Writing a Device Installation Application(这个应该是终极解决方案了)
http://www.osronline.com/DDKx/install/custom-install_7n53.htm
5:高手的讨论
http://www.programfan.com/club/showpost.asp?id=8122
http://www.80diy.com/home/20000612/19/11633.html
UpdateDriverForPlugAndPlayDevices
该函数可以完成两件事
1:安装驱动,只要指定inf文件及设备ID
2:检查指定设备ID的设备是否插入(usbdetect.dll可能就是通过该函数完成的)
参考:
http://www.osronline.com/DDKx/install/di-rtns_01ki.htm
*****************************************************
问:如何和一个硬件设备交互?即如何打开一个设备?
答:通过设备的符号链接打开设备。
设备的符号链接含义:
"//?/hid#vid_093a&pid_2510#6&1da905e4&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
|----1---|-----------2--------------|------------3--------------|-----------------------------4------------------------|
第一部分:何种总线的设备 eg ROOT, //?/hid
第二部分:当前设备硬件的名称 eg zhangfandevice, vid_093a&pid_2510
第三部分:当前设备硬件的第几个设备 eg:6&1da905e4&0&0000,可以同时插上好几个相同的设备硬件,不同的设备的这个域不同
第四部分:当前设备硬件所属的设备接口的GUID
eg:电脑上同时插入两个相同的2代硬件:
分别显示:
"//?/usb#vid_0471&pid_0668#6&2ea1fb62&0&1#{77f49320-16ef-11d2-ad51-006097b514dd}"
"//?/usb#vid_0471&pid_0668#6&3822C75E&0&1#{77f49320-16ef-11d2-ad51-006097b514dd}"
这两个设备的差别就在序号上,这个序号可能是系统随机分配的。
通过任务管理器,可以看到这两个设备的名字一样,都是TOLTech xeyez 2.0
右键查看详细信息-如下:
USB/VID_0471&PID_0668/6&2ea1fb62&0&1
USB/VID_0471&PID_0668/6&3822C75E&0&1
设备接口GUID, 设备ID, 兼容ID等概念:
1:设备接口:即GUID,
1.1)多个设备可以具有相同的GUID。
eg不同的HID鼠标键盘设备具有相同的GUID。
eg不同不同的识别器硬件具有相同的GUID。
1.2)GUID存在于inf文件的前几行。
[Version]
Signature="$CHICAGO$"
Class=USB //用于指示设备装好后出现在设备管理器中的那个分支下
ClassGUID={36FC9E60-C465-11CF-8056-444553540000} // xeyez1代2代3代的GUID,和周立同的一样
Provider=%Provider%
CatalogFile=xeyez.cat
DriverVer=05/15/2009,1.1.0.0
1.3)安装驱动时,这个信息无用。可用于SetupDiXXX函数通过该GUID查找属于该GUID的设备。然后可以通过查找到的信息创建句柄和设备通信。
2:设备ID
2.1)也即硬件id HardwareID eg vidpid
2.2)硬件自身含有自己的vidpid信息。该信息可用于帮组系统定位inf文件,然后根据inf的指示安装驱动
3:兼容ID
3.1)硬件自身含有自己的兼容ID信息,该信息可用于帮组系统定位inf文件,然后根据inf的指示安装驱动
eg hid兼容的usb鼠标就是通过提供兼容id来实现免驱的。
4:驱动程序.sys文件是否和设备接口GUID一一对应?
答:不对应。.sys里面不含有GUID,vidpid,兼容id等任何信息。
5:系统如何为新插入的usb硬件安装驱动?
系统通过usb设备的设备id,和兼容id,然后寻找相匹配的inf文件,然后安装inf文件记载的sys文件。
(至于该sys文件是否真的可用,系统可不管,要不不可用,就会导致蓝屏!)
举例1:从不同的鼠标可以免驱直接使用。是因为这些HID鼠标虽然vidpid不同,系统中也没有对应vidpid的inf文件,但它们具有相同的兼容id,系统中含有该兼容id的inf文件,可以顺利的找到驱动并安装成功。
举例2:不同的识别器硬件pidvid不一样,兼容id也不一样,所以安装失败了。需要对应vidpid的inf才能装上。
我插上了一个usb鼠标,其vidpid为vid_04b3&pid_3107,系统的安装其驱动的流程如下:
下面摘自:c:/windows/setupapi.log 的内容
[2010/01/06 14:26:26 644.3 Driver Install]
#-019 正在查找硬件 ID(s): usb/vid_04b3&pid_3107&rev_0130,usb/vid_04b3&pid_3107
#-018 正在查找兼容 ID(s): usb/class_03&subclass_01&prot_02,usb/class_03&subclass_01,usb/class_03
#-198 处理的命令行: C:/WINDOWS/system32/services.exe
#I022 在 "C:/WINDOWS/Inf/input.inf" 中发现了 "USB/Class_03&SubClass_01";设备: "USB 人体学输入设备";驱动程序: "USB 人体学输入设备";提供程序: "Microsoft";制造商: "(标准系统设备)";段: "HID_Inst"
#I023 实际安装部分: [HID_Inst.NT]。等级: 0x00003101。驱动程序有效日期: 07/01/2001。
#-166 设备安装函数: DIF_SELECTBESTCOMPATDRV。
#I063 从 [HID_Inst] 中的 "c:/windows/inf/input.inf" 选择驱动器安装服务。
#I320 设备的类别 GUID 依旧为: {745A17A0-74D3-11D0-B6FE-00A0C90F57DA}。
#I060 设置所选的驱动器。
#I058 选择最兼容的驱动器。
#-166 设备安装函数: DIF_INSTALLDEVICEFILES。
#I124 正在做“仅复制”安装 "USB/VID_04B3&PID_3107/5&2C1BFE1E&0&1"。
#-166 设备安装函数: DIF_REGISTER_COINSTALLERS。
#I056 注册了共同安装程序。
#-166 设备安装函数: DIF_INSTALLINTERFACES。
#-011 正在从 "c:/windows/inf/input.inf" 安装段 [HID_Inst.NT.Interfaces]。
#I054 安装接口。
#-166 设备安装函数: DIF_INSTALLDEVICE。
#I123 进行 "USB/VID_04B3&PID_3107/5&2C1BFE1E&0&1" 的完整安装。
#I121 "USB/VID_04B3&PID_3107/5&2C1BFE1E&0&1" 的设备安装成功完成。
参见 张帆的 windows驱动开发技术详解 P358
问:如何获取设备的符号链接?(为了调用CreateFile打开设备)
答:通过设备接口(GUID)和设备号决定。 如果系统中安装了同样的设备接口的多个设备,设备号一次递增。eg系统中安装了两个相同驱动的网卡,第一个网卡就是0号网卡,第二个就是1号网卡。
EG:
1:获取设备接口
eg1:HID设备的设备接口 一个系统定义好的GUID,可以通过 HidD_GetHidGuid()系统api知道
eg2:自己定义的设备的设备接口GUID自己应该知道
2:通过SetupDiGetClassDevs(上步得到的GUID)获取该设备接口的类型信息。
3:通过setupDiEnumDeviceInterfaces(上步获取的类型信息, idx)获取该类型设备的第idx个设备。
上面提到了一个设备接口可能对应着多个具体的硬件,只是他们的pidvid不一样
eg1:
识别器硬件1代,2代,2.1代,3代4中不同硬件使用的都是兼容zhou立功的GUID,只是这些硬件的差别存在于pidvid上。
电脑上可以同时插上多个识别器硬件。
eg2:
电脑上可以同时插上多个hid设备,他们具有相同的设备接口GUID。比如同时插上usb鼠标,usb键盘等
相关文章推荐
- 如何代码安装驱动?
- 如何安装不能识别的驱动错误代码为10
- 软件是如何驱动硬件的,代码是怎样对计算机实现控制的?
- V370 Intel WiFi Link 1000 BGN驱动如何正确安装
- linux设备驱动第四篇:从如何定位oops的代码行谈驱动调试方法
- 如何用代码在Delphi 7.0中安装TeeChart 7.0
- datagrip在离线状态如何安装数据驱动mysql-connector-java-5.1.40-bin.jar
- 不依赖于HECI驱动,如何判断客户机是否可能支持Intel AMT的参考代码
- 如何查找、安装设备驱动...
- 如何查看ubuntu下显卡驱动是否已经成功安装
- Linux下如何安装Run文件格式NVIDIA显卡驱动
- 代码实现文件驱动的安装
- 如何为ESXi4&5主机安装驱动
- 如何安装ioncube扩展对PHP代码加密
- 如何制作驱动安装盘?
- 【原创达人】如何手动安装联想电脑管家下载的驱动
- 如何安装的apk不在桌面上显示,并在自己的代码中启动启动
- 使用 JET 在 Eclipse 中创建更多更好的代码,如何掌握专家的最佳实践并提高您的模型驱动开发进度
- 主题:一堂如何提高代码质量的培训课 之 领域驱动设计
- Ubuntu如何安装无线网卡驱动