如何代码安装驱动?

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

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

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

你可能感兴趣的:(c,windows,Microsoft,application,Class,DDK)