如何代码安装驱动?

来源:互联网 发布:python lambda 编辑:程序博客网 时间:2024/06/11 19:47

 

开发驱动、调试驱动是个有技术含量的体力活,但是安装别人开发好的驱动,应该不会太难吧?
那么该如何安装驱动呢?

如果知道了如何安装驱动,那么识别器引擎驱动、虚拟键盘鼠标驱动就都可以搞定了。
呼呼。

以下文章可供参考:
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键盘等

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zdl1016/archive/2009/05/25/4214593.aspx

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鱼身上有红斑了怎么办 新买锦鲤不吃食怎么办 鱼身上有红血丝怎么办 大腿内侧有红色条纹怎么办 腿上出现红血丝怎么办 孕妇有脚气,很痒怎么办 孕晚期脚气很痒怎么办 孕期有脚气很痒怎么办 激光后留下色沉怎么办 腋下很黑怎么办怎样才能变白 屁股上长一块癣怎么办 鼻两侧一热发红怎么办 脸上起皮发红痒怎么办 自癜风发红发痒怎么办 脸又干又痒怎么办 脸发红还有点痛怎么办 脸过敏了红痒怎么办 脸两边一片红痒怎么办 婴儿大腿内侧破皮怎么办 宝宝大腿根淹了怎么办 大腿一走路就疼怎么办 下面痒怎么办用什么洗 长藓怎么办用什么药膏 小腿长湿疹很痒怎么办 产后排不出大便怎么办 3岁宝宝大便不通怎么办 腿上干燥像鱼鳞怎么办 一岁脸上长癣怎么办 脖子长了一片癣怎么办 深圳摇到车牌后怎么办 发现车被套牌了怎么办 我车牌被套牌了怎么办 车子被别人套牌怎么办 车被别人套牌了怎么办 被套牌了有违章怎么办 车被套牌了怎么办报警 车牌被别人套了怎么办 被别人套牌了该怎么办 孕妇阴痒还肿了怎么办 怀孕了清洁度4怎么办 皮肤抓破了流水怎么办