• 自动安装驱动程序


    原文地址:自动安装驱动程序作者:waterpure
    关于驱动程序安装,只要你细心看了ddk,就应该知道怎样做
    对于即插即用简单地说要对付2种情况
    1。在你的设备未安装前,安装驱动程序这叫预先安装。
    最简单的方法就是使用SetupCopyOEMInf函数。

    具体做法是:
    将SetupCopyOEMInf封装在一个动态库里。
    用installshield将所有文件copy到一个临时目录。
    调用动态库使用SetupCopyOEMInf函数copy临时目录下的inf文件(路径)。
    installshield让计算机重启。

    插上设备,自动识别。

    其实在注册表里添加东西不必大费周张,很简单,installshield就支持对注册表的任意修改。不必用什么函数,即改即用,方便。

    还要分:
    1。先插入硬件再放入安装盘,这时安装程序要能auto run 且能自动更新驱动
    2。先放入安装盘安装再插入硬件。这时好像是用SetupCopyOEMInf。

     

    SetupCopyOEMInf 可以在Win98下面使用。

    1)将inf文件和sys等文件拷贝到相应目录下面。
    然后执行 SetupCopyOEMInf()。这时候,这个函数就会将你的inf文件生成一个pnf文件。
    Windows即插即用管理器首先找到pnf文件。
    另外,在inf文件中最好不要有copyfile的字段。否则会出现对话框。,
    还有,在inf中不使用绝对路径。这样,windows寻找文件的时候,就会在自己的目录下面找了。

    我要做一个驱动自动安装的安装程序,要在XP下安装驱动。
    我这里共两个文件,一个.inf,一个.sys。
    参考了论坛里几位前辈的贴子,谈论的方法都是在InstallShield里,
    在某处(比如OnFirstUIAfter函数)加上如下代码:
    //==============================================
    //...
    string szProgram;
    string szCmdLine;
    //...
    szProgram = "rundll32.exe";
    szCmdLine = "setupapi.dll,InstallHinfSection 你要执行的section名 132" + "你的.inf文件所在全路径名";
    LaunchAppAndWait(szProgram, szCmdLine, WAIT);
    //==============================================
    其实InstallShield内部的实现是调用Windows API函数orShellExecuteEx(orShellExecute),
    于是我就自己写了个程序来实现如上代码效果,以下是我在MFC里写的代码:
    //==============================================
    ::ShellExecute(NULL, "open", "rundll32.exe",
              "setupapi.dll, InstallHinfSection PwSwpDrv.Dev 132     c:driverpwswpdrv.inf",
               "c:driver", SW_SHOWNORMAL);
    //==============================================
    我的两个文件.inf和.sys放在C盘的自己建的driver目录下。
    程序执行的结果是:
    1.因为指定了SW_SHOWNORMAL,所以出现了一个将.sys文件拷到c:windowssystem32driver目录下的一个对话框。
    2.也是最关键的:我在c:windowsinf目录下发现我的.inf文件已成功地转化为oem13.inf(我机器里是oem13,这个数字是不一定的,视机器而定);在c:windowssystem32driver目录下也发现我的.inf文件,名字没变。
    按理说出现了刚才的第2点,安装已经成功,为什么我的驱动还无法正常工作?设备管理器里我的设备还是有个感叹号,而且点查看驱动详细信息时,出现该设备没有安装驱动。
    请问大家各路高手,到底该如何实现驱动的自动安装?谢谢!!!
     
    inf文件放在windows的inf目录下
    sys文件放在system32的drivers目录下
    现在我手上有的资料可以使我有两种安装方式,一个是通过InstallShield在安装过程中通过脚本来调用Devcon来实现安装;还有一个是通过在脚本中调用rundll32来实现安装。
    顺遍提一下,关于INF文件安装需要调用的函数说明,具体说明请参看Microsoft的MSDN
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/setupapi/setup/installing_from_an_inf_file.asp
    编写INF文件时,参看DDK中"Installation Requirements for Network Protocols"。
    如果安装失败,请检查%systemroot%setupapi.log文件。
    假设用NCPA安装INF文件时碰到如下错误信息:
    > Error E000020B in UpdateDriverForPlugAndPlayDevices: ERROR_NO_SUCH_DEVINST
    > #E154 类别安装程式失败。 错误 0xe0000208: 操作无法在尚未注册的设备信息元素上运行。
    请立即用chkinf.bat(DDK自带工具)检查一下INF文件,此时可能有低级错误
     
    主要是用DDK驱动安装函数根据*.inf文件来安装驱动:
    在win2000及win2000以上系统:
    a.没插上设备,安装驱动:
    1.用SetupCopyOEMInf()函数将驱动的安装文件(*.inf)拷贝到inf目录中,并自动生成了oem*.inf预安装文件
    2.用msdn中的SetupInstallFilesFromInfSection()函数根据*.inf文件中的安装段,将相应的驱动文件拷贝到系统中.
    3.插上设备,系统会弹出"发现新新的硬件向导",只要点击下一步直至完成即可完成设备的驱动安装.
    b.插上设备,安装驱动:
    1.从*.inf文件中
       ...
       [Manufacturer]
        %WinChipHead% = WinChipHead
       [WinChipHead]
        %CH375.DeviceDesc% = CH375.Install, USBVID_4348&PID_5537
        %CH375HM.DeviceDesc% = CH375.Install, USBVID_4348&PID_55E0
        ...
       获取hardwareid号USBVID_4348&PID_5537,USBVID_4348&PID_55E0;
      2. 用UpdateDriverForPlugAndPlayDevices()自动安装新驱动!
    在98,me系统下:只要将inf文件拷贝到inf目录下,用SetupInstallFilesFromInfSection函数将驱动文件拷贝到相应的目录下,更新驱动程序信息,插上设备,系统就会自动安装驱动.(有个更新驱动信息的办法,将inf目录下的drvidx.bin删掉,插上新设备,系统会自动更新驱动信息).
    大体上就是这样!
  • 相关阅读:
    Homebrew-macOS缺失的软件包管理器(简称brew)
    小程序setData工作原理理解图
    JS字符串转base64格式
    小小时钟带给我大大的思考-制作个时钟插件
    关键字屏蔽-正则
    图片(imageView)
    状态开关(ToggleButton)
    横向开关(switch)
    单选按钮(RadioButton)
    多选按钮(CheckBox)
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/4156650.html
Copyright © 2020-2023  润新知