hhh333 发表于 2016-11-2 18:15:18

关于DEVI\DPINST及inf2cat和驱动数字签名的进一步探讨

本帖最后由 hhh333 于 2016-11-10 18:05 编辑

缘起:
   用DEVI $XXX.CAB来安装驱动有一个最大的缺点就是CAB较大时解压需要较多的时间,感觉起来安装驱动就比较慢。后看ljycslg网友发布的win10采用了7z压缩形式,解压后用DPINST来安装,7z压缩的效率比CAB要高20%的样子,35M的CAB包如果用7z大概28M,如果更大节约的空间就更大,DPINST安装效率也很高,似乎是一种更好的方式,但无论CAB还是7z解压都另外需要时间和空间,实际效率是不高的。因此,红毛等提出一个设想用WIM映像的方式来存放驱动,我认为是可取的,于是进行测试,现碰到一些问题
1、驱动文件打包为WIM文件,挂载后用DEVI来安装
在pecmd有关devi的说明中有:DEVI *subD:\ABC,Net                     //D:\ABC下寻找并安装网络驱动。
因此可以用这个,后测试这个用法是无效的。于是利用forx循环来查找inf,再用DEVI XX.inf的形式来安装,但每运行一次DEVI就要对硬件进行一次列表,效率也不高,如果inf排列靠后就更慢!似乎不大可取。
2、驱动文件打包为WIM文件,挂载后用DPINST来安装
这个应该是较好的方案,不用解压直接挂载,节约了解压的时间和空间,同时DPINST为MS开发的驱动包安装工具,算法上应该是有保证的。从ljycslg网友的作品中将dpinst.exe和dpinst.xml提取出来,在win10中使用效果非常不错安装驱动很快,但放win7/8/8.1中又不行,不知何故?

测试了一下,红毛发布的64位显卡驱动,CAB-129M,打包成7z(正常压缩模式)112M,做成WIM为175M,原文件503M,因此性能上WIM应为最优,挂载几乎不要时间,真正安装的文件较少,从原盘和从挂载盘中读取文件的差异可以忽略不计。现在问题的关键要么解决DPINST的通用性问题,要么解决DEVI *sub的问题,各位有好的建议吗?
查看MS有关DPINST的说明似乎对系统没什么要求。

解决:
1、签名的破解:经过反复测试,之所以出现这个现象主要是由驱动数字签名校验引起,最彻底的解决办法是破解其签名校验,感谢yamingw 大侠提供了全套的破解文件:
2、签名的制作:
  ①安装WDK工具以获取inf2cat;
  ②找到安装位置并把PATH环境变量设定到这个位置如:D:\Program Files\Windows Kits\10\bin\x86;
  ③为inf文件制作签名CAT文件:先看一下inf文件中段有不有CatalogFile = xxxx.cat项目,没有的就加上。如从系统中提取的驱动athw8.inf中可以加上CatalogFile = athw8.cat,这样就指明了cat文件的名称,再运行Inf2Cat /driver:athw8.inf_x86_b4cfe0b424372367 /os:Server2008_x86,7_x86,8_x86,6_3_x86,这样就制作了适合Server2008、Win7/8/8.1的32数字签名,将上述OS后的x86改成x64就可制作64位的签名。其中athw8.inf_x86_b4cfe0b424372367 是驱动存放的目录名。如果批量制作,也可做成批处理文件如sn.cmd:
set s=%1
For /F %%I In ('dir /ad /b /s') DO Inf2Cat /driver:%%I /os:Server2008_%s%,7_%s%,8_%s%,6_3_%s%

将所有驱动放到一个目录下,再将这个批处理也放到这个目录下,运行sn x86或sn x64就可以了一下子将所有的cat制作好;
3、进一步测试:
win8以后系统无论是32位还是64位,驱动必须有CAT文件,无论drvinst是否破解,没有cat就直接退出了,如果cat签名不对破解过的或者挂起的看一下安装的log会出现:
!!!sig:                     Driver package INF file hash is not present in catalog file. Filename = netnvm64.inf, Error = 0xE000024B
!!!sig:                     Driver package appears to be tampered, but error is ignored in WinPE.
用以上inf2cat制作cat后,以上提示似乎可以不出现,说明这个cat是有效的。

又:如果与显卡同时并发安装,会出现红色提示框,看log文件记录如下:
   sig:                        Catalog= X:\windows\System32\DriverStore\Temp\{4ead746c-c950-0c4d-b166-182c607ffb46}\netnvm64.cat
!    sig:                        Verifying file against specific Authenticode(tm) catalog failed! (0x800b0100)
   sig:                     {_VERIFY_FILE_SIGNATURE exit(0x800b0100)} 17:58:02.040
!    sig:                     Driver package does not contain a signature, but user wants to install anyway.


注:WDK工具我可以到https://developer.microsoft.com/zh-cn/windows/hardware/windows-driver-kit下载安装。

hhh333 发表于 2016-11-2 18:28:08

本帖最后由 hhh333 于 2016-11-2 18:31 编辑

公布一段代码:

_SUB DCAB
IFEX %1,
{
        `REGI HKLM\SYSTEM\Setup\SystemSetupInProgress=#1
        DEVI $%1,,%Temp%
        WAIT 300
        TEMP @Delete
        `REGI HKLM\SYSTEM\Setup\SystemSetupInProgress=#0
}
_END

_SUB DpInsInf
EXEC =!dpinst.exe /S /LM /SA /SH /Path %1
WAIT 100
_END

_SUB DpIns7Z
`FORX %1\*.7Z,fzip,1,
ENVI fzip=%1
IFEX %fzip%,
{
        NAME &&fname=%fzip%
        EXEC =!7z.exe x %fzip% -o%temp%\%&fname%
        CALL DpInsInf %temp%\%&fname%
        FILE -q %temp%\%&fname%
}
_END

_SUB DpInsWim        `挂WIM文件安装驱动(注意引入了一个外部参数MountDrv)
`FORX %1\*.WIM,fzip,1,
ENVI fzip=%1
IFEX %fzip%,
{
        NAME &&fname=%fzip%
        MOUN%fzip%,%MountDrv%\%&fname%
        CALL DpInsInf %MountDrv%\%&fname%
        MOUN ,%MountDrv%\%&fname%,0
}
_END
DEVI MountDrv=Y:
DEVI ADD_DRV=XXXX
ENVI FCAB=DRIVERS_VGA.CAB
ENVI FWIM=DRIVERS_VGA.WIM
ENVI F7Z=DRIVERS_VGA.7Z
ENVI OUTCAB=%ADD_DRV%\%FCAB%

CALL DpInsInf %ADD_DRV%
CALL DpInsWim %ADD_DRV%\%FWIM%
CALL DpIns7z %ADD_DRV%\%F7Z%
DCAB %OUTCAB%

这个可以支持原文件、WIM、7z和CAB四种存放方式的搜索驱动并安装,系统目录中有DPINST,Win10中运行无误,其他系统无反应。

h2bx86 发表于 2016-11-2 20:04:31

是不是dpinst版本的问题?

h2bx86 发表于 2016-11-2 20:12:24

可以这样测试
把7z的某一可用驱动移动为wim文件,如当前机的网卡,按你说的使用7z来加载没有网卡的驱动包,手动加载wim,再手动使用dpinst,就可以看问题出在哪儿了

hhh333 发表于 2016-11-2 20:47:52

经跟踪,并不是dpinst没有工作,各系统中均有工作,但只是安装不成功而已

slore 发表于 2016-11-2 21:20:18

cab或者的7z的内容,事前对inf进行索引,得到id和驱动的压缩包目录关系,进系统根据系统设备信息,解压特定的驱动文件,或者直接处理或者遍历相关inf应该是可以提高加载速度的。

yamingw 发表于 2016-11-2 21:30:24

比较一下各系统的drvinst.exe与原版是否一样,win10的有可能是经过修改的

红毛樱木 发表于 2016-11-2 21:36:14

还是等M出来解决DEVI的一些问题才行。

hhh333 发表于 2016-11-2 22:15:35

这是dpinst的log文件:

sp_star 发表于 2016-11-2 22:17:45

CAB文件体积大些,但是解压比7z压缩包要快。
页: [1] 2 3 4 5 6 7
查看完整版本: 关于DEVI\DPINST及inf2cat和驱动数字签名的进一步探讨