无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 22797|回复: 75

在PE中快速的查找安装驱动程序

    [复制链接]
发表于 2016-9-4 10:22:01 | 显示全部楼层 |阅读模式
本帖最后由 sp_star 于 2016-9-4 22:32 编辑

驱动包和工具 链接: http://pan.baidu.com/s/1qXLtZtU 密码: rd3f   (驱动包很旧了,只是作为一个例子)
AUTODRV_X86.EXE是32位的程序,AUTODRV_X64.EXE是64位程序,二者功能是一样的。这个工具的目的就是尽可能快速的在驱动包里找到需要的驱动,并能够静默的安装。

如何使用
X86的驱动放置在NT6x86目录下,X64的驱动放置在NT6x64目录下,以管理员权限运行AUTODRV_X86.EXE或AUTODRV_X64.EXE,就可以自动安装匹配上的驱动。在PE里,由PECMD来调用可能更常见。

测量安装驱动所花费的时间,以及HWID的列表:
  1. DATE &t_start uptime
  2. EXEC* &inst_hwid=Z:\WIN8PE\Drivers\AUTODRV_X86.EXE
  3. DATE &t_end uptime
  4. CALC &n_second=(%t_end%-%t_start%)/1000#2
  5. MESS %inst_hwid%\n\n用时%n_second%秒
复制代码


仅安装显卡驱动:
  1. AUTODRV_X86.EXE *CC_0300
复制代码


驱动包的索引
为了快速查找驱动程序,每个驱动包(7Z格式)都有一个同名的索引TXT文件,记录了驱动包支持的Hardware ID。索引只在TXT文件里进行,让速度尽可能的快。
TXT文件格式,每行对应一个HWID,以逗号(英文字符)分隔四项。
第一项是HWID,可以从inf文件中的到支持的HWID列表。
第二项是驱动的描叙,主要是为了增加可读性,可以随便写。
第三项是inf文件名,一个驱动包可能包含多个inf文件,如果在驱动包中有路径,这里也应该加上路径。
第四项是"日期+空格+v+版本号",日期和版本号都可从inf文件获取。会自动匹配版本号最大的驱动。
***从inf文件中拷贝这些信息,用excel处理,可以容易的得到索引文件***
  1. PCI\VEN_8086&DEV_2A42,Intel(R) HD Graphics (Microsoft Corporation - WDDM 1.1),igdlh11.inf,03/24/2012 v8.15.10.2702
  2. PCI\VEN_8086&DEV_2A43,Intel(R) HD Graphics (Microsoft Corporation - WDDM 1.1),igdlh11.inf,03/24/2012 v8.15.10.2702
  3. PCI\VEN_8086&DEV_2E02,Intel(R) HD Graphics (Microsoft Corporation - WDDM 1.1),igdlh11.inf,03/24/2012 v8.15.10.2702
  4. PCI\VEN_8086&DEV_2E03,Intel(R) HD Graphics (Microsoft Corporation - WDDM 1.1),igdlh11.inf,03/24/2012 v8.15.10.2702
  5. .
  6. .
复制代码


工具是用PECMD2012打包的,导入资源如下,想修改的可以自己看看。
  1. -addoverwrite wcs\AUTODRV.WCS,SCRIPT,101,2052
  2. -addoverwrite wcs\x86\fdrv.cab,EXEDATA,100,2052
  3. -addoverwrite wcs\x86\A7Z.CAB,EXEDATA,101,2052
  4. -addoverwrite wcs\x86\devcon.cab,EXEDATA,102,2052
复制代码

评分

参与人数 7无忧币 +31 收起 理由
2012_12_21 + 5 链接挂了...
hehui + 1 很给力!
zmac2007 + 5
belenkwong + 5 赞一个!
tzxinqing + 5 支持大神,然而没有驱动包啊
freesoft00 + 5
xyzxp + 5 很给力!

查看全部评分

 楼主| 发表于 2016-9-4 11:43:16 | 显示全部楼层
pseudo 发表于 2016-9-4 11:22
谢谢分享。         
有没有支持xp/03pe的。                                                          ...

这个工具是用PECMD2012打包的,但是里面有个小工具,为了支持64位,是以win7的方式编译的,不知道是不是能在xp/03下工作。
回复

使用道具 举报

 楼主| 发表于 2016-9-4 11:57:45 | 显示全部楼层
红毛樱木 发表于 2016-9-4 11:46
可以用新版PECMD打包下。DEVI命令换成DEVI *devcon,这样安装可能更保险一些。

直接用了devcon.exe。有空再慢慢更新。
回复

使用道具 举报

 楼主| 发表于 2016-9-5 11:51:54 | 显示全部楼层
xzf680 发表于 2016-9-4 16:09
好像我理解错了,是命令打包在PECMD里,驱动还是外置的吧,先了解下

对的,驱动要外置的。搜索速度快的话,那么驱动包的规模就可以比较大,这就是这个工具的目的。
回复

使用道具 举报

 楼主| 发表于 2016-9-5 11:52:21 | 显示全部楼层
JCDN 发表于 2016-9-4 17:34
PE下的万能驱动工具!S大辛苦了

不算万能吧.....
回复

使用道具 举报

 楼主| 发表于 2016-9-5 19:43:23 | 显示全部楼层
wimboot 发表于 2016-9-5 19:00
大师 我想问一下 10PE怎么隐藏资源管理器的搜索框

这个不知道,留着不好吗?
回复

使用道具 举报

 楼主| 发表于 2016-11-20 22:34:24 | 显示全部楼层
红毛樱木 发表于 2016-11-20 21:02
今天没事研究了一下代码,发现有两个地方不够完美。
只去掉了一种状态的硬件                             ...


Device is currently stopped是没考虑,当时好像也没看到这个状态。
"兼容 Id"这个不知怎么得到。不过这种情况比较少吧?我用着一直挺好啊。

时间太长了,不知记错了没....,fdrv.exe匹配逻辑是这样的:
如果输入的HWID长,驱动文件中的HWID短,但前面部分完全相等,就算匹配上了。
如果输入的HWID短,驱动文件中的HWID长,就认为没有匹配。
回复

使用道具 举报

 楼主| 发表于 2016-11-21 08:46:23 | 显示全部楼层
红毛樱木 发表于 2016-11-20 23:54
兼容id我这个网卡驱动就需要这个装。
fdrv.exe有源码改下匹配机制吗?

要是得到了兼容id,再用它搜索一遍应该就可以了吧?
源码: fdrv.7z (3.27 KB, 下载次数: 37)
回复

使用道具 举报

 楼主| 发表于 2016-11-21 12:51:33 | 显示全部楼层
红毛樱木 发表于 2016-11-21 12:05
应该用我上面说的换成短id让fdrv去搜索比较准。

pecmd也是匹配短id的,然后让系统自己去判断inf是否合 ...

inf里列出了它支持的HWID,如果一个HWID比较长,说明对支持的硬件做了更多的限制。所以我认为不应该匹配短的ID,那可能是错误的匹配。
所有的匹配都是在TXT里进行的,里面的ID也可以自己编辑,只是可能容易出错。
回复

使用道具 举报

 楼主| 发表于 2016-11-21 14:19:57 | 显示全部楼层
红毛樱木 发表于 2016-11-21 13:03
如果用完整的ID匹配,不知道具体用哪个ID合适,或者先后顺序怎么排。
一般的驱动安装工具都是匹配短ID ...

完整的HWID不是devcon从硬件中读取的吗?可能之前没描叙清楚。

devcon读取的HWID和TXT文件(inf)中的HWID比较。

读取的HWID:  PCI\VEN_10EC&DEV_8168&SUBSYS_86771043&REV_15
TXT文件中ID: PCI\VEN_10EC&DEV_8168
==> 匹配成功

读取的HWID:  PCI\VEN_10EC&DEV_8168
TXT文件中ID: PCI\VEN_10EC&DEV_8168&SUBSYS_86771043&REV_15
==> 匹配失败
这个逻辑不合理吗?
回复

使用道具 举报

 楼主| 发表于 2016-11-21 15:16:42 | 显示全部楼层
本帖最后由 sp_star 于 2016-11-21 15:20 编辑
红毛樱木 发表于 2016-11-21 14:31
你开始说的我明白意思。
现实使用中,可能需要使用两次匹配或者更多。


改这个函数就行了
  1. int CompareHwId(char *short_id, char *long_id)
  2. {
  3.         int i=0;
  4.         char *p=short_id;
  5.         if( *p==' ' ) p++; //跳过前面的空格

  6.         while( p[i]!=0)
  7.         {
  8.                 if( p[i]!=long_id[i] )
  9.                 {
  10.                         return 0;
  11.                 }
  12.                 i++;
  13.         }
  14.         return 1;
  15. }
复制代码


只有一个地方使用,info->hwid是从TXT文件读取出的ID, hwid是实际的硬件ID.
match = CompareHwId(info->hwid, hwid);

点评

又研究了一番,发现有的设备需要用devcon获取的硬件ID中的第二行去匹配,所以这个匹配逻辑还得改。。。如果用短ID匹配,安装显卡和网卡驱动是没有问题的。声卡驱动可能就要另外的单独做短ID来匹配了,可能需要3段的  详情 回复 发表于 2016-11-21 22:51
好的,谢谢。不会,我找同事看看。  详情 回复 发表于 2016-11-21 15:35
回复

使用道具 举报

 楼主| 发表于 2016-11-21 23:01:10 | 显示全部楼层
红毛樱木 发表于 2016-11-21 22:51
又研究了一番,发现有的设备需要用devcon获取的硬件ID中的第二行去匹配,所以这个匹配逻辑还得改。。。 ...

发现有的设备需要用devcon获取的硬件ID中的第二行去匹配
==>什么设备啊?贴上来看看?

声卡有什么特殊的吗?
回复

使用道具 举报

 楼主| 发表于 2016-11-22 10:41:19 | 显示全部楼层
红毛樱木 发表于 2016-11-21 23:30
我这片声卡就需要用第二行的ID来匹配了(应该还有更多的情况,只是没有发现)

HDAUDIO\FUNC_01&VE ...

devcon读取HWID是HDAUDIO\FUNC_01&VEN_10EC&DEV_0887&SUBSYS_104386C7&REV.....
inf中的HWID是HDAUDIO\FUNC_01&VEN_10EC&DEV_0887&SUBSYS_104386C7
按之前的逻辑,是可以匹配上的。

我用devcon读取的,字符串更长。
HDAUDIO\FUNC_01&VEN_10EC&DEV_0887&SUBSYS_1458A002&REV_1003\4&1F81EEAB&0&0201
    Name: Realtek High Definition Audio
    Driver is running.

如果你要分段的话,最重要的是VEN_10EC&DEV_0887,不管几段,一定要包括的。后面的SUBSYS不知道是不是必须的。

点评

恩,ven..den...这段是关键。 另外一个方法,不知道妥不妥当。 从硬件ID第一行开始匹配,匹配不到的就跳到第二行匹配,直到匹配为止,如果还没有就跳到兼容ID匹配,以此类推。 不知道这种逻辑是不是稳妥些  详情 回复 发表于 2016-11-22 15:21
回复

使用道具 举报

 楼主| 发表于 2016-11-22 17:20:34 | 显示全部楼层
红毛樱木 发表于 2016-11-22 15:21
恩,ven..den...这段是关键。
另外一个方法,不知道妥不妥当。
从硬件ID第一行开始匹配,匹配不到的就 ...

多匹配几次应该也没问题,就算匹配错误,安装驱动时也会检查。
搜索次数多,就会慢一些。

点评

恩确实是的,只是这样用PECMD弄出来的代码,可能效率就低很多了。  详情 回复 发表于 2016-11-22 17:27
回复

使用道具 举报

 楼主| 发表于 2016-11-22 17:52:56 | 显示全部楼层
红毛樱木 发表于 2016-11-22 17:27
恩确实是的,只是这样用PECMD弄出来的代码,可能效率就低很多了。

比如之前要搜索10个ID,现在要搜索50个,搜索的时间就长了5倍,这和PECMD没关系。
驱动种类很多,要找一个覆盖所有情况的比较难,我觉得大多数OK就行了,要尽量快。
回复

使用道具 举报

 楼主| 发表于 2017-1-3 21:28:40 | 显示全部楼层
红毛樱木 发表于 2017-1-3 21:20
加入一个"Device is currently stopped"状态的排除
另外FIND $%ARCH%=X64, ENVI DRV_DIR=%CurDir%\N ...


不过我在PE里试过, ACPI开头的都没安装驱动。还是关键字过滤靠谱一点。
或者加参数:
*CC_0300: 显卡
*CC_02*: 网卡
这样也能避免很多不需要的HWID,少搜索几次。

点评

网卡用那个通用ID不是很准,反正尽量全,ID匹配规范,还是上次说的那样,估计一个ID的所有行都得一行一行的匹配。。。  详情 回复 发表于 2017-1-3 21:32
回复

使用道具 举报

 楼主| 发表于 2017-1-3 22:03:38 | 显示全部楼层
红毛樱木 发表于 2017-1-3 21:32
网卡用那个通用ID不是很准,反正尽量全,ID匹配规范,估计还得一个ID的所有行都得一行一行的匹配。。。
...

我已经不折腾了。。。
CC_02应该是准的,网卡的类型就是02

点评

也有可能USB网卡。。。  详情 回复 发表于 2017-1-3 22:16

评分

参与人数 1无忧币 +5 收起 理由
freesoft00 + 5

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2017-1-3 22:35:02 | 显示全部楼层
红毛樱木 发表于 2017-1-3 22:16
也有可能USB网卡。。。

是的,只适用于PCI设备,USB不适用。但USB设备可以用USB*来过滤啊。
你看pecmd脚本就知道,这个参数直接传给devcon.exe status,所以,可以使用你想要的关键字。

点评

今天又研究了一下,发现用status命令读取的设备ID都是唯一ID,这个唯一ID用devcon的hwids命令和find命令都读不到。。。好头疼  详情 回复 发表于 2017-1-7 14:33
回复

使用道具 举报

 楼主| 发表于 2017-1-9 19:30:37 | 显示全部楼层
本帖最后由 sp_star 于 2017-1-10 10:43 编辑
红毛樱木 发表于 2017-1-7 19:10
更新了一下程序,按照“硬件 Id”和“兼容 Id”的列表,逐行匹配,更精准。做了一些特殊处理。另外驱动 ...

更新的fdrv.exe,可以输出多个匹配的结果。匹配规则还和以前一样。
无标题.jpg
下载:   new_fdrv.7z (5.97 KB, 下载次数: 26)

点评

能编译一个支持nt5.x运行的exe吗?03PE下有这个需求。  详情 回复 发表于 2017-1-15 16:40
附件里的fdrv在win7 x64下没反应。。。  详情 回复 发表于 2017-1-9 20:23
之前是直接读取输出的行就可以了,现在用",",不会处理了。。。  详情 回复 发表于 2017-1-9 20:16
哦,这样的话用PECMD分析fdrv.exe输出的结果也要改了  详情 回复 发表于 2017-1-9 20:11
回复

使用道具 举报

 楼主| 发表于 2017-1-9 20:35:44 | 显示全部楼层
红毛樱木 发表于 2017-1-9 20:23
附件里的fdrv在win7 x64下没反应。。。

命令行里不会显示输出,要pecmd来读取.

点评

哦哦 运来如此。折腾下  详情 回复 发表于 2017-1-9 20:42
回复

使用道具 举报

 楼主| 发表于 2017-1-9 20:37:57 | 显示全部楼层
红毛樱木 发表于 2017-1-9 20:16
之前是直接读取输出的行就可以了,现在用",",不会处理了。。。

如果按照之前的方式,分行输出,第 ...

这样方便,因为后面的内容程序不处理了, 可以用PECMD来处理,这样后面的字段可以自己定义, 自己处理。

点评

这样好像还有个问题,如果驱动所在的目录路径中有","的话,就复杂了。  详情 回复 发表于 2017-1-9 21:36
回复

使用道具 举报

 楼主| 发表于 2017-1-9 22:04:06 | 显示全部楼层
红毛樱木 发表于 2017-1-9 21:36
这样好像还有个问题,如果驱动所在的目录路径中有","的话,就复杂了。

会有这么变态的目录吗?用","分隔个,主要是和后面字段保持一致,这样PECMD一行就能全部分离出来。
这个分隔符改改也容易,改成什么好呢?

点评

排除特殊情况啊 这也是一种。其他的分隔符,好像目录也可以设置的 不太好。  详情 回复 发表于 2017-1-9 22:45
回复

使用道具 举报

 楼主| 发表于 2017-1-10 10:44:50 | 显示全部楼层
红毛樱木 发表于 2017-1-9 22:47
之前那个分行,看上去比较靠谱一些。

在一行输出,方便FORX和MSTR处理。
回复

使用道具 举报

 楼主| 发表于 2017-1-10 10:45:43 | 显示全部楼层
红毛樱木 发表于 2017-1-10 01:35
我想了一下,应该可以先读取程序所在路劲,然后排查逗号,这样就可以了。

又更新了,现在同一文件的多个相同ID也可以处理了。
回复

使用道具 举报

 楼主| 发表于 2017-1-15 21:27:09 | 显示全部楼层
红毛樱木 发表于 2017-1-15 16:40
能编译一个支持nt5.x运行的exe吗?03PE下有这个需求。
输出结果方便按版本高低顺序排列吗?

试试这个: fdrv_xp.7z (4.66 KB, 下载次数: 14)
回复

使用道具 举报

 楼主| 发表于 2017-1-15 21:45:32 | 显示全部楼层
红毛樱木 发表于 2017-1-15 21:31
好的,谢谢。
驱动弄成wim挂载,再多线程安装,速度可以飞起了。

飞不起来吧。搜索,解压再快,安装驱动本身也要一些时间,这个省不了啊。
回复

使用道具 举报

 楼主| 发表于 2017-1-15 22:54:48 | 显示全部楼层
红毛樱木 发表于 2017-1-15 22:24
能处理大部分INF,一些特殊的处理不了的列表出来。
生成索引方法,在程序当前目录和子目录(相对目录不用 ...

厉害! 果然是方便!
unicode就算了,一个是不会处理,一个是不想拖慢处理速度。
回复

使用道具 举报

 楼主| 发表于 2017-1-16 16:38:53 | 显示全部楼层
红毛樱木 发表于 2017-1-16 15:09
fdrv的结果方便按匹配ID结果的长短排序一次吗?长结果在前面,短结果在后面,这样应该更符合实际。
或者 ...

现在是匹配就直接输出了,没有存下来。所以不好对最后结果进行处理。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-10-18 19:10

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表