无忧启动论坛

标题: 在PE中快速的查找安装驱动程序 [打印本页]

作者: sp_star    时间: 2016-9-4 10:22
标题: 在PE中快速的查找安装驱动程序
本帖最后由 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
复制代码

作者: pseudo    时间: 2016-9-4 11:22
本帖最后由 pseudo 于 2016-9-4 11:28 编辑

谢谢分享。         
有没有支持xp/03pe的。                                                                                                                  。
作者: parsons    时间: 2016-9-4 11:35
Thanks
作者: sp_star    时间: 2016-9-4 11:43
pseudo 发表于 2016-9-4 11:22
谢谢分享。         
有没有支持xp/03pe的。                                                          ...

这个工具是用PECMD2012打包的,但是里面有个小工具,为了支持64位,是以win7的方式编译的,不知道是不是能在xp/03下工作。
作者: 红毛樱木    时间: 2016-9-4 11:46
本帖最后由 红毛樱木 于 2016-9-4 11:48 编辑
sp_star 发表于 2016-9-4 11:43
这个工具是用PECMD2012打包的,但是里面有个小工具,为了支持64位,是以win7的方式编译的,不知道是不是 ...


可以用新版PECMD打包下。DEVI命令换成DEVI *devcon,这样安装可能更保险一些。
作者: sp_star    时间: 2016-9-4 11:57
红毛樱木 发表于 2016-9-4 11:46
可以用新版PECMD打包下。DEVI命令换成DEVI *devcon,这样安装可能更保险一些。

直接用了devcon.exe。有空再慢慢更新。
作者: tzxinqing    时间: 2016-9-4 12:12
没看懂怎么用?直接执行就行?
作者: freesoft00    时间: 2016-9-4 15:36
devcon.exe、dpinst.exe、devload.exe等几个程序安装驱动有什么不同?只是命令执行的方式不同,效果都一样是吗?
作者: xzf680    时间: 2016-9-4 16:05
pecmd也能打包,还不知道。学习一下
作者: xzf680    时间: 2016-9-4 16:08
好旬
作者: xzf680    时间: 2016-9-4 16:09
好像我理解错了,是命令打包在PECMD里,驱动还是外置的吧,先了
作者: xzf680    时间: 2016-9-4 16:09
好像我理解错了,是命令打包在PECMD里,驱动还是外置的吧,先了解下
作者: 2012hzy6420    时间: 2016-9-4 16:36
支持了支持楼主
作者: JCDN    时间: 2016-9-4 17:34
PE下的万能驱动工具!S大辛苦了
作者: sp_star    时间: 2016-9-5 11:51
xzf680 发表于 2016-9-4 16:09
好像我理解错了,是命令打包在PECMD里,驱动还是外置的吧,先了解下

对的,驱动要外置的。搜索速度快的话,那么驱动包的规模就可以比较大,这就是这个工具的目的。
作者: sp_star    时间: 2016-9-5 11:52
JCDN 发表于 2016-9-4 17:34
PE下的万能驱动工具!S大辛苦了

不算万能吧.....
作者: belenkwong    时间: 2016-9-5 15:47
前來學習。
作者: wimboot    时间: 2016-9-5 19:00
大师 我想问一下 10PE怎么隐藏资源管理器的搜索框

搜索框.PNG (1.32 KB, 下载次数: 91)

搜索框.PNG

作者: sp_star    时间: 2016-9-5 19:43
wimboot 发表于 2016-9-5 19:00
大师 我想问一下 10PE怎么隐藏资源管理器的搜索框

这个不知道,留着不好吗?
作者: wimboot    时间: 2016-9-5 19:55
sp_star 发表于 2016-9-5 19:43
这个不知道,留着不好吗?

精简版不需要搜索功能 留着碍事影响地址框长度
作者: 红毛樱木    时间: 2016-11-20 21:02
本帖最后由 红毛樱木 于 2016-11-20 21:36 编辑

今天没事研究了一下代码,发现有两个地方不够完美。
只去掉了一种状态的硬件                                   Driver is running
还需要去掉另外一种状态的硬件                         Device is currently stopped


另外status获取的是“硬件 Id”,我测试了下,有的时候需要用"兼容 Id"来搞定。这个ID转换有点烦人,status不可以直接输出兼容的。



——————————————————————————————————————————————————
把长ID转换为短ID,上面应该可以实现。
比如把这个ID
PCI\VEN_10EC&DEV_8168&SUBSYS_86771043&REV_15
转换成
PCI\VEN_10EC&DEV_8168



_________________________________________________________________________________
但是内置的fdrv.exe貌似不能这样匹配起来。
作者: sp_star    时间: 2016-11-20 22:34
红毛樱木 发表于 2016-11-20 21:02
今天没事研究了一下代码,发现有两个地方不够完美。
只去掉了一种状态的硬件                             ...


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

时间太长了,不知记错了没....,fdrv.exe匹配逻辑是这样的:
如果输入的HWID长,驱动文件中的HWID短,但前面部分完全相等,就算匹配上了。
如果输入的HWID短,驱动文件中的HWID长,就认为没有匹配。
作者: 红毛樱木    时间: 2016-11-20 23:54
sp_star 发表于 2016-11-20 22:34
Device is currently stopped是没考虑,当时好像也没看到这个状态。
"兼容 Id"这个不知怎么得到。不过 ...

兼容id我这个网卡驱动就需要这个装。
fdrv.exe有源码改下匹配机制吗?
作者: sp_star    时间: 2016-11-21 08:46
红毛樱木 发表于 2016-11-20 23:54
兼容id我这个网卡驱动就需要这个装。
fdrv.exe有源码改下匹配机制吗?

要是得到了兼容id,再用它搜索一遍应该就可以了吧?
源码: fdrv.7z (3.27 KB, 下载次数: 37)
作者: 2011npwjm    时间: 2016-11-21 08:49
谢谢楼主的分享
作者: 红毛樱木    时间: 2016-11-21 12:05
sp_star 发表于 2016-11-21 08:46
要是得到了兼容id,再用它搜索一遍应该就可以了吧?
源码:

应该用我上面说的换成短id让fdrv去搜索比较准。

pecmd也是匹配短id的,然后让系统自己去判断inf是否合适。
作者: sp_star    时间: 2016-11-21 12:51
红毛樱木 发表于 2016-11-21 12:05
应该用我上面说的换成短id让fdrv去搜索比较准。

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

inf里列出了它支持的HWID,如果一个HWID比较长,说明对支持的硬件做了更多的限制。所以我认为不应该匹配短的ID,那可能是错误的匹配。
所有的匹配都是在TXT里进行的,里面的ID也可以自己编辑,只是可能容易出错。
作者: 红毛樱木    时间: 2016-11-21 13:03
本帖最后由 红毛樱木 于 2016-11-21 13:08 编辑
sp_star 发表于 2016-11-21 12:51
inf里列出了它支持的HWID,如果一个HWID比较长,说明对支持的硬件做了更多的限制。所以我认为不应该匹配 ...


如果用完整的ID匹配,不知道具体用哪个ID合适,或者先后顺序怎么排。
一般的驱动安装工具都是匹配短ID,然后用devcon.exe来安装的,应该比较成熟的套路了。
作者: sp_star    时间: 2016-11-21 14:19
红毛樱木 发表于 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 14:31
sp_star 发表于 2016-11-21 14:19
完整的HWID不是devcon从硬件中读取的吗?可能之前没描叙清楚。

devcon读取的HWID和TXT文件(inf)中的HW ...

你开始说的我明白意思。
现实使用中,可能需要使用两次匹配或者更多。

读取的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
==> 匹配失败
-----------------------------------------------------------------------------------------------------



还有另外一种情况,用devcon读取的ID信息如下:
硬件Id:PCI\VEN_10EC&DEV_8168&SUBSYS_86771043&REV_15
兼容Id:PCI\VEN_10EC&DEV_8168&REV_15
而TXT文件中ID:PCI\VEN_10EC&DEV_8168&REV_15
这时候只能用兼容ID来搞定了。
当然这只是一种情况,可能还有别的情况,只能遇到一种排除一种了。
作者: sp_star    时间: 2016-11-21 15:16
本帖最后由 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);

作者: 红毛樱木    时间: 2016-11-21 15:35
sp_star 发表于 2016-11-21 15:16
改这个函数就行了

好的,谢谢。不会,我找同事看看。
作者: 红毛樱木    时间: 2016-11-21 22:51
sp_star 发表于 2016-11-21 15:16
改这个函数就行了


又研究了一番,发现有的设备需要用devcon获取的硬件ID中的第二行去匹配,所以这个匹配逻辑还得改。。。如果用短ID匹配,安装显卡和网卡驱动是没有问题的。声卡驱动可能就要另外的单独做短ID来匹配了,可能需要3段的短ID。

过段时间再研究吧。。。要和同事一起做驱动包,预预热哈哈
作者: sp_star    时间: 2016-11-21 23:01
红毛樱木 发表于 2016-11-21 22:51
又研究了一番,发现有的设备需要用devcon获取的硬件ID中的第二行去匹配,所以这个匹配逻辑还得改。。。 ...

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

声卡有什么特殊的吗?
作者: 红毛樱木    时间: 2016-11-21 23:30
本帖最后由 红毛樱木 于 2016-11-21 23:53 编辑
sp_star 发表于 2016-11-21 23:01
发现有的设备需要用devcon获取的硬件ID中的第二行去匹配
==>什么设备啊?贴上来看看?




我这片声卡就需要用第二行的ID来匹配了(应该还有更多的情况,只是没有发现)

HDAUDIO\FUNC_01&VEN_10EC&DEV_0887&SUBSYS_104386C7

下面的是INF文件
oem19.7z (28 KB, 下载次数: 2)


声卡如果按照&分段的话,可能需要三段才能匹配厂家的真实ID
作者: sp_star    时间: 2016-11-22 10:41
红毛樱木 发表于 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不知道是不是必须的。


作者: 红毛樱木    时间: 2016-11-22 15:21
sp_star 发表于 2016-11-22 10:41
devcon读取HWID是HDAUDIO\FUNC_01&VEN_10EC&DEV_0887&SUBSYS_104386C7&REV.....
inf中的HWID是HDAUDIO\F ...

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

多匹配几次应该也没问题,就算匹配错误,安装驱动时也会检查。
搜索次数多,就会慢一些。
作者: 红毛樱木    时间: 2016-11-22 17:27
sp_star 发表于 2016-11-22 17:20
多匹配几次应该也没问题,就算匹配错误,安装驱动时也会检查。
搜索次数多,就会慢一些。

恩确实是的,只是这样用PECMD弄出来的代码,可能效率就低很多了。
作者: sp_star    时间: 2016-11-22 17:52
红毛樱木 发表于 2016-11-22 17:27
恩确实是的,只是这样用PECMD弄出来的代码,可能效率就低很多了。

比如之前要搜索10个ID,现在要搜索50个,搜索的时间就长了5倍,这和PECMD没关系。
驱动种类很多,要找一个覆盖所有情况的比较难,我觉得大多数OK就行了,要尽量快。
作者: daier    时间: 2016-11-24 08:39
谢谢分享!
作者: 红毛樱木    时间: 2017-1-3 21:20
本帖最后由 红毛樱木 于 2017-1-3 21:22 编辑
  1. LOGS * %Curdir%\DRV.LOG
  2. TEAM ENVI^ ENVIMODE=1| ENVI^ FORCELOCAL=1

  3. SET$ NL=0d 0a
  4. SET$ NL1=0a
  5. SET$ SP=0d 0a 20 20 20 20
  6. SET& TAB=09
  7. ENVI &INST_HWIDs=

  8. //如果是EXE文件,使用内置工具
  9. TEAM ENVI run_fdrv=|ENVI run_7z=|ENVI run_devcon=
  10. FEXT ext=%~0
  11. ENVI parm=%~1
  12. FIND $%ext%=EXE,
  13. {
  14.     ENVI run_fdrv=-exe:*cab:#100:fdrv.exe
  15.     ENVI run_7z=-exe:*cab:#101:7z.exe
  16.     ENVI run_devcon=-exe:*cab:#102:devcon.exe
  17. }

  18. FIND |%&bX64%=0,ENVI ARCH=X86!ENVI ARCH=X64
  19. FIND $%ARCH%=X64, ENVI DRV_DIR=%CurDir%\NT6x64! ENVI DRV_DIR=%CurDir%\NT6x86

  20. GetNotDrivedHWID &DEVICE_LIST %parm%
  21. //TEAM MESS %&DEVICE_LIST% | EXIT
  22. InstallDevicesDriver

  23. EXIT

  24. //参数%~1=返回的HWID列表   %~2=前缀,可选
  25. _SUB GetNotDrivedHWID
  26.     ENVI &&find_str=%~2
  27.     FIND $%&find_str%=,ENVI &&find_str=*
  28.     EXEC* %run_devcon% &&VV=!devcon.exe status %&find_str%
  29.     SED &&VV=0:0,%SP%,%TAB%%TAB%,%&VV%   //将部分换行符替换为TAB
  30.     ENVI &&dev_running=[^%NL1%]*Driver is running[^%NL1%]*%NL%
  31.     SED &&VV=0:0,%dev_running%,,%&VV%     //删除running的HWID
  32.     ENVI &&dev_stopped=[^%NL1%]*Device is currently stopped[^%NL1%]*%NL%
  33.     SED &&VV=0:0,%dev_stopped%,,%&VV%     //删除currently stopped的HWID
  34.     ENVI &&del_str=%TAB%%TAB%[^%NL1%]*%NL%
  35.     SED &&VV=0:0,%del_str%,%NL%,%&VV%  //删除不需要的信息
  36.     ENVI &&del_str=[^%NL1%]*matching device[^%NL1%]*%NL%   
  37.     SED &&VV=0:0,%del_str%,,%&VV%   //删除最后一行信息
  38.     ENVI-ret %~1=%&VV%
  39. _END

  40. _SUB InstallDevicesDriver
  41.     READ -,-1,&DevNum,%DEVICE_LIST%
  42.     ENVI &LineNum=1
  43.     LOOP #%&LineNum%<=%&DevNum%,
  44.     {
  45.          READ -, %&LineNum%,DevHWID,%DEVICE_LIST%   //读取一个设备ID
  46.          CALL InstallDriverForHWID %DevHWID%
  47.          CALC &LineNum=%&LineNum%+1 //处理下一行
  48.     }
  49. _END

  50. _SUB InstallDriverForHWID
  51.         ENVI &&hwid=%~1
  52.         FIND $%&hwid%=,EXIT

  53.         //查找DevHWID对应的驱动文件
  54.         EXEC* %run_fdrv% &Drv_Info=!fdrv.exe "%DRV_DIR%" "%&hwid%" 1
  55.     READ -,1,&&Drv_File,%&Drv_Info%
  56.     READ -,4,&&Drv_Inf,%&Drv_Info%
  57.     //没有找到,退出
  58.     FIND $%&Drv_File%=NOT_FOUND, TEAM WRIT -,$+0,%&hwid%: not found | EXIT

  59.     //找到了,继续安装
  60.     ENVI &INST_HWIDs=%INST_HWIDs%%&hwid%%NL%
  61.     WRIT -,$+0,%&hwid%: installed
  62.         TEAM MESS "%&Drv_File%" "%&Drv_Inf%"| EXIT
  63.         CALL Install_Driver_7Z "%&Drv_File%" "%&Drv_Inf%"
  64. _END



  65. _SUB Install_Driver_7Z
  66.     ENVI &Drv_File=%~1
  67.     ENVI &Drv_Inf=%~2
  68.     //得到驱动程序包的名称
  69.     FDIR fPath=%Drv_File%
  70.     FNAM fName=%Drv_File%
  71.     ENVI DrvFile_7z=%fPath%\%fName%.7z
  72.     //解压缩到%temp%\%fName%目录下,安装,并删除
  73.     MDIR %temp%\%fName%
  74.     EXEC* %run_7z% &result=!7z.exe x "%DrvFile_7z%" -y -o"%temp%\%fName%"
  75.     //拷贝*.cat文件到catroot,安装程序可能不会自动完成
  76.     FDIR fPath=%temp%\%fName%\%Drv_Inf%
  77.     FILE %fPath%\*.cat=>%windir%\System32\catroot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}
  78.     //安装驱动
  79.     DEVI %temp%\%fName%\%Drv_Inf%
  80.     //删除临时文件
  81.     FILE %temp%\%fName%
  82. _END
复制代码



加入一个"Device is currently stopped"状态的排除
另外FIND $%ARCH%=X64, ENVI DRV_DIR=%CurDir%\NT6x64! ENVI DRV_DIR=%CurDir%\NT6x86
这一段原版中多一个空格,造成DRV_DIR变量在64位系统下会多出一个空格
上面改了这两个。
作者: sp_star    时间: 2017-1-3 21:28
红毛樱木 发表于 2017-1-3 21:20
加入一个"Device is currently stopped"状态的排除
另外FIND $%ARCH%=X64, ENVI DRV_DIR=%CurDir%\N ...


不过我在PE里试过, ACPI开头的都没安装驱动。还是关键字过滤靠谱一点。
或者加参数:
*CC_0300: 显卡
*CC_02*: 网卡
这样也能避免很多不需要的HWID,少搜索几次。
作者: 红毛樱木    时间: 2017-1-3 21:32
本帖最后由 红毛樱木 于 2017-1-3 21:43 编辑
sp_star 发表于 2017-1-3 21:28
不过我在PE里试过, ACPI开头的都没安装驱动。还是关键字过滤靠谱一点。
或者加参数:
*CC_0 ...

网卡用那个通用ID不是很准,反正尽量全,ID匹配规范,估计还得一个ID的所有行都得一行一行的匹配。。。
fdrv.exe源码不会改。。。不会C
元旦正好没事,用你这个fdrv.exe弄个了usb3.0/3.1的安装工具,这驱动安装奇葩,难搞。
作者: sp_star    时间: 2017-1-3 22:03
红毛樱木 发表于 2017-1-3 21:32
网卡用那个通用ID不是很准,反正尽量全,ID匹配规范,估计还得一个ID的所有行都得一行一行的匹配。。。
...

我已经不折腾了。。。
CC_02应该是准的,网卡的类型就是02
作者: 红毛樱木    时间: 2017-1-3 22:16
sp_star 发表于 2017-1-3 22:03
我已经不折腾了。。。
CC_02应该是准的,网卡的类型就是02

也有可能USB网卡。。。
作者: sp_star    时间: 2017-1-3 22:35
红毛樱木 发表于 2017-1-3 22:16
也有可能USB网卡。。。

是的,只适用于PCI设备,USB不适用。但USB设备可以用USB*来过滤啊。
你看pecmd脚本就知道,这个参数直接传给devcon.exe status,所以,可以使用你想要的关键字。
作者: 红毛樱木    时间: 2017-1-7 14:33
本帖最后由 红毛樱木 于 2017-1-7 14:52 编辑
sp_star 发表于 2017-1-3 22:35
是的,只适用于PCI设备,USB不适用。但USB设备可以用USB*来过滤啊。
你看pecmd脚本就知道,这个参数直接 ...

今天又研究了一下,发现用status命令读取的设备ID都是唯一ID,这个唯一ID用devcon的hwids命令和find命令都读不到。。。好头疼

-------------------------------------------------------------
研究出来了,做个标记
比如唯一ID是
HDAUDIO\FUNC_01&VEN_8086&DEV_2809&SUBSYS_80860101&REV_1000\4&18DB7577&0&0201

前面加个@符号就可以标记了

作者: 红毛樱木    时间: 2017-1-7 19:10
本帖最后由 红毛樱木 于 2017-1-7 19:14 编辑

AUTODRV_X64.7z (1.35 MB, 下载次数: 14)
AUTODRV_X86.7z (1.14 MB, 下载次数: 19)
更新了一下程序,按照“硬件 Id”和“兼容 Id”的列表,逐行匹配,更精准。做了一些特殊处理。另外驱动安装方式换成使用devcon.exe来操作,更合理。(LZ留意下站内消息)
如果有成功匹配,则在“%TEMP%\FIND_HWIDS.TXT”文件做记录,方便查看结果

注意不适合USB3.0/3.1驱动设备类型的安装,这类设备安装方式不同。(有这个需求的请留意此贴http://bbs.wuyou.net/forum.php?mod=viewthread&tid=385386)

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

更新的fdrv.exe,可以输出多个匹配的结果。匹配规则还和以前一样。

下载:   new_fdrv.7z (5.97 KB, 下载次数: 26)

需用PECMD来显示输出结果:
  1. ENVI DRV_DIR=.\Drivers\NT6x86
  2. ENVI DEVHWID=PCI\VEN_8086&DEV_0102
  3. //ENVI DEVHWID=PCI\VEN_8086

  4. EXEC* &rtv=fdrv.exe %DRV_DIR% "%DevHWID%" 1
  5. mess %rtv%
复制代码


作者: 红毛樱木    时间: 2017-1-9 20:11
sp_star 发表于 2017-1-9 19:30
更新的fdrv.exe,可以输出多个匹配的结果。匹配规则还和以前一样。

下载:  

哦,这样的话用PECMD分析fdrv.exe输出的结果也要改了
作者: 红毛樱木    时间: 2017-1-9 20:16
本帖最后由 红毛樱木 于 2017-1-9 20:34 编辑
sp_star 发表于 2017-1-9 19:30
更新的fdrv.exe,可以输出多个匹配的结果。匹配规则还和以前一样。

下载:  
  1.     READ -,1,&Drv_File,%&Drv_Info%
  2.     READ -,4,&Drv_Inf,%&Drv_Info%
复制代码

之前是直接读取输出的行就可以了,现在用",",不会处理了。。。

如果按照之前的方式,分行输出,第二个匹配的在下面接着输入,最后一行加一个匹配个数,这样处理是不是方便些。

作者: 红毛樱木    时间: 2017-1-9 20:23
sp_star 发表于 2017-1-9 19:30
更新的fdrv.exe,可以输出多个匹配的结果。匹配规则还和以前一样。

下载:  

附件里的fdrv在win7 x64下没反应。。。
作者: sp_star    时间: 2017-1-9 20:35
红毛樱木 发表于 2017-1-9 20:23
附件里的fdrv在win7 x64下没反应。。。

命令行里不会显示输出,要pecmd来读取.
作者: sp_star    时间: 2017-1-9 20:37
红毛樱木 发表于 2017-1-9 20:16
之前是直接读取输出的行就可以了,现在用",",不会处理了。。。

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

这样方便,因为后面的内容程序不处理了, 可以用PECMD来处理,这样后面的字段可以自己定义, 自己处理。
作者: 红毛樱木    时间: 2017-1-9 20:42
sp_star 发表于 2017-1-9 20:35
命令行里不会显示输出,要pecmd来读取.

哦哦 运来如此。折腾下
作者: 红毛樱木    时间: 2017-1-9 21:36
sp_star 发表于 2017-1-9 20:37
这样方便,因为后面的内容程序不处理了, 可以用PECMD来处理,这样后面的字段可以自己定义, 自己处理。

这样好像还有个问题,如果驱动所在的目录路径中有","的话,就复杂了。
作者: sp_star    时间: 2017-1-9 22:04
红毛樱木 发表于 2017-1-9 21:36
这样好像还有个问题,如果驱动所在的目录路径中有","的话,就复杂了。

会有这么变态的目录吗?用","分隔个,主要是和后面字段保持一致,这样PECMD一行就能全部分离出来。
这个分隔符改改也容易,改成什么好呢?
作者: 红毛樱木    时间: 2017-1-9 22:45
sp_star 发表于 2017-1-9 22:04
会有这么变态的目录吗?用","分隔个,主要是和后面字段保持一致,这样PECMD一行就能全部分离出来。
这个 ...

排除特殊情况啊 这也是一种。其他的分隔符,好像目录也可以设置的 不太好。

作者: 红毛樱木    时间: 2017-1-9 22:47
之前那个分行,看上去比较靠谱一些。
作者: 红毛樱木    时间: 2017-1-10 01:35
我想了一下,应该可以先读取程序所在路劲,然后排查逗号,这样就可以了。
作者: sp_star    时间: 2017-1-10 10:44
红毛樱木 发表于 2017-1-9 22:47
之前那个分行,看上去比较靠谱一些。

在一行输出,方便FORX和MSTR处理。
作者: sp_star    时间: 2017-1-10 10:45
红毛樱木 发表于 2017-1-10 01:35
我想了一下,应该可以先读取程序所在路劲,然后排查逗号,这样就可以了。

又更新了,现在同一文件的多个相同ID也可以处理了。
作者: 红毛樱木    时间: 2017-1-10 12:09
本帖最后由 红毛樱木 于 2017-1-10 12:13 编辑
sp_star 发表于 2017-1-10 10:45
又更新了,现在同一文件的多个相同ID也可以处理了。


这个看起来有点模糊,能给出一个具体实例说明吗?


假如a.txt
中有如下信息
HDAUDIO\FUNC_01&VEN_8086&DEV_2809&SUBSYS_80860101,IntcDAud.inf,06/19/2009 v6.0.1.6305
HDAUDIO\FUNC_01&VEN_8086&DEV_2809&SUBSYS_80860101,IntcDAud22222222.inf,06/19/2009 v6.0.1.6305
...

是不是这个意思?


---------------------------------------------------
试了一下确实是这样子,赞一个
作者: 红毛樱木    时间: 2017-1-10 22:21
本帖最后由 红毛樱木 于 2017-1-10 22:33 编辑

AUTODRV_X64.7z (1.35 MB, 下载次数: 12)
AUTODRV_X86.7z (1.15 MB, 下载次数: 12)


更新了一下,适配了新的fdrv.exe,
实现下面一些功能:
假设本机未安装驱动的硬件ID为
HDAUDIO\FUNC_01&VEN_8086&DEV_2809&SUBSYS_80860101&REV_1000

在ID库中匹配到三个(或者多个,此处以三个举例)
  1. H:\cccccc\NT6x64\A.7z\IntcDAud.inf
  2. H:\cccccc\NT6x64\HDMI.7z\IntcDAud.inf
  3. H:\cccccc\NT6x64\Z.7z\IntcDAud.inf
复制代码
当第一条安装失败,自动跳转下一个匹配,直到匹配安装返回成功之后终止该硬件ID的驱动安装。然后继续下一个未安装驱动的设备。


程序退出后生成日志文件(%Temp%FIND_HWIDS.TXT\)如下:
  1. 设备ID:HDAUDIO\FUNC_01&VEN_8086&DEV_2809&SUBSYS_80860101&REV_1000    匹配到驱动文件:G:\USM\更新\PECMD.INI\在PE中快速的查找安装驱动程序(sp_star)\20170109\NT6x64\A.7z\IntcDAud.inf    匹配安装成功:No
  2. 设备ID:HDAUDIO\FUNC_01&VEN_8086&DEV_2809&SUBSYS_80860101&REV_1000    匹配到驱动文件:G:\USM\更新\PECMD.INI\在PE中快速的查找安装驱动程序(sp_star)\20170109\NT6x64\HDMI.7z\IntcDAud.inf    匹配安装成功:Yes
复制代码



作者: baosheng00    时间: 2017-1-10 23:52
楼主有没有新的驱动包给我一份!谢谢
作者: 红毛樱木    时间: 2017-1-15 16:40
本帖最后由 红毛樱木 于 2017-1-15 19:33 编辑
sp_star 发表于 2017-1-9 19:30
更新的fdrv.exe,可以输出多个匹配的结果。匹配规则还和以前一样。

下载:  


能编译一个支持nt5.x运行的exe吗?03PE下有这个需求。
输出结果方便按版本高低顺序排列吗?
作者: sp_star    时间: 2017-1-15 21:27
红毛樱木 发表于 2017-1-15 16:40
能编译一个支持nt5.x运行的exe吗?03PE下有这个需求。
输出结果方便按版本高低顺序排列吗?

试试这个: fdrv_xp.7z (4.66 KB, 下载次数: 14)
排序用PECMD实现吧,用程序实现就要解释版本信息,这样就不灵活了。
作者: 红毛樱木    时间: 2017-1-15 21:31
sp_star 发表于 2017-1-15 21:27
试试这个:
排序用PECMD实现吧,用程序实现就要解释版本信息,这样就不灵活了。

好的,谢谢。
驱动弄成wim挂载,再多线程安装,速度可以飞起了。
作者: sp_star    时间: 2017-1-15 21:45
红毛樱木 发表于 2017-1-15 21:31
好的,谢谢。
驱动弄成wim挂载,再多线程安装,速度可以飞起了。

飞不起来吧。搜索,解压再快,安装驱动本身也要一些时间,这个省不了啊。
作者: 红毛樱木    时间: 2017-1-15 22:18
sp_star 发表于 2017-1-15 21:45
飞不起来吧。搜索,解压再快,安装驱动本身也要一些时间,这个省不了啊。

在PE下,相对于之前的CAB方式安装应该快了很多。
作者: 红毛樱木    时间: 2017-1-15 22:24
CreateInfDb2.rar (658.17 KB, 下载次数: 43)
能处理大部分INF,一些特殊的处理不了的列表出来。
生成索引方法,在程序当前目录和子目录(相对目录不用选)搜索INF生成DrvData.db索引文件。Unicode编码的,手动转下ANSI编码就可以用fdrv.exe了。

建议fdrv.exe能支持处理Unicode编码,这样就可以根据它的反馈信息做个窗体出来不至于乱码。
作者: sp_star    时间: 2017-1-15 22:54
红毛樱木 发表于 2017-1-15 22:24
能处理大部分INF,一些特殊的处理不了的列表出来。
生成索引方法,在程序当前目录和子目录(相对目录不用 ...

厉害! 果然是方便!
unicode就算了,一个是不会处理,一个是不想拖慢处理速度。
作者: 红毛樱木    时间: 2017-1-16 15:09
sp_star 发表于 2017-1-15 22:54
厉害! 果然是方便!
unicode就算了,一个是不会处理,一个是不想拖慢处理速度。

fdrv的结果方便按匹配ID结果的长短排序一次吗?长结果在前面,短结果在后面,这样应该更符合实际。
或者这个功能方便加个参数吗?需要的时候用,不需要的时候不用。嘿嘿
作者: sp_star    时间: 2017-1-16 16:38
红毛樱木 发表于 2017-1-16 15:09
fdrv的结果方便按匹配ID结果的长短排序一次吗?长结果在前面,短结果在后面,这样应该更符合实际。
或者 ...

现在是匹配就直接输出了,没有存下来。所以不好对最后结果进行处理。
作者: 红毛樱木    时间: 2017-1-17 18:35
本帖最后由 红毛樱木 于 2017-1-17 18:39 编辑

AUTODRV_X64.zip (1.36 MB, 下载次数: 54)
AUTODRV_X86.zip (1.16 MB, 下载次数: 53)

参数说明(总共三个参数):
第一参数是需要安装的HWID(如果安装所有类型就用*,为空则为*,如果指定某一类型可以用类似"PCI\CC_0300"这样的通用兼容ID,注意若要使用第二个参数则第一个参数不能为空)
第二个参数传递驱动包是否为7z格式(若参数为no7z,则表示驱动包类型不是是7z类型;参数为空或其他字符串则表示是7z类型,注意若要使用第三个参数,则第二个参数不能为空)
第三个参数是指定驱动包所在的路径(如C:\AAA,目录后面不要带\);


改进,代码重写(代码基本都是老五完工的),多线程赛选适配驱动,支持非7z压缩包(参见参数二),可以用于PE内把驱动打包成WIM,然后挂载,再用参数三来匹配搜索安装。















------------------------------
@sp_star 发了站内消息给你




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3