liuzhaoyzz 发表于 2021-3-25 22:53:09

请问下有没有命令行程序可以实现安装过时驱动这个功能?

本帖最后由 liuzhaoyzz 于 2021-3-25 22:54 编辑


请问下有没有命令行程序可以实现安装过时驱动这个功能?
比如说我想安装svbus驱动,怎么用pecmd/dpinst/drvload/devcon/PnPUtil实现?
试了下没有成功。
@echo off
rem PECMDx64_cli DEVI *self *sub *nocheck *rverify *sys *ret $$.\SVBus-朱玛\svbus.inf
rem PECMDx64_cli DEVI $$.\SVBus-朱玛\svbus.inf
PECMDx64_cli DEVI .\SVBus-朱玛\svbus.inf
pause

      


邪恶海盗 发表于 2021-3-25 22:59:07

太高级,看不懂...

zds1210 发表于 2021-3-25 23:00:51

新版pecdm,请直接找M大问下,可以比较靠谱。

dos时代菜鸟 发表于 2021-3-26 06:14:38

dism 导入

liuzhaoyzz 发表于 2021-3-26 06:58:54

zds1210 发表于 2021-3-25 23:00
新版pecdm,请直接找M大问下,可以比较靠谱。

我尝试的就是m大的新版pecmd,试了下没有成功。

liuzhaoyzz 发表于 2021-3-26 07:14:42

dos时代菜鸟 发表于 2021-3-26 06:14
dism 导入

我晚点试试看,谢谢提醒。

dos时代菜鸟 发表于 2021-3-26 10:25:43

本帖最后由 dos时代菜鸟 于 2021-3-26 10:29 编辑

liuzhaoyzz 发表于 2021-3-26 07:14
我晚点试试看,谢谢提醒。
dism 不支持 online方式安装 添加驱动。需要离线。

pe下用drvload 是可以的,但是 drvload 不只一个文件,还需要配套的 dll ,到底都有哪些 dll 就不清楚了。

liuzhaoyzz 发表于 2021-3-26 10:51:38

dos时代菜鸟 发表于 2021-3-26 10:25
dism 不支持 online方式安装 添加驱动。需要离线。

pe下用drvload 是可以的,但是 drvload 不只一个 ...

我想在线安装,看来dism不能满足我的需求。

感觉drvload不如dpinst可靠。

dos时代菜鸟 发表于 2021-3-26 18:04:02

本帖最后由 dos时代菜鸟 于 2021-3-26 20:34 编辑

pnputil 试试




这个是从你那里弄到的 注册表文件,先运行这个,
再 安装 inf 就可以安装上。

liuzhaoyzz 发表于 2021-3-27 08:07:03

dos时代菜鸟 发表于 2021-3-26 18:04
pnputil 试试




@echo off
reg import EVRootCA.reg
pnputil /add-driver svbus.inf
pause

我试了下,不行。
操作成功完成。
Microsoft PnP 工具

正在添加驱动程序包:svbus.inf
已成功添加驱动程序程序包。
发布名称:         oem14.inf

驱动程序包总数:1
已添加驱动程序包数:1
请按任意键继续. . .

显示添加驱动程序成功,但实际上并没有成功。设备管理器里面没有svbus驱动。

dos时代菜鸟 发表于 2021-3-27 08:12:45

liuzhaoyzz 发表于 2021-3-27 08:07
@echo off
reg import EVRootCA.reg
pnputil /add-driver svbus.inf


可能需要重启,或者,已经挂载了虚拟盘

liuzhaoyzz 发表于 2021-3-27 08:22:23

dos时代菜鸟 发表于 2021-3-27 08:12
可能需要重启,或者,已经挂载了虚拟盘

svbus直接从设备管理器里面添加过时驱动,不需要重启就可以啊。

dos时代菜鸟 发表于 2021-3-27 10:05:54

本帖最后由 dos时代菜鸟 于 2021-3-27 10:10 编辑

liuzhaoyzz 发表于 2021-3-27 08:22
svbus直接从设备管理器里面添加过时驱动,不需要重启就可以啊。
也可以尝试下,用PNPUTIL /DRVLOAD 啥的再次通过已经添加成 OEM. inf 的驱动文件来安装下。或许能行。
你看下注册表指定位置是否有驱动对应的service,如果没有,那就要重启才会出来,或许用DEVCON 的RESCAN能行。

窄口牛 发表于 2021-3-27 10:54:17

微软搞了wtg,也想像Linux那样富驱动,所以现在系统体积最大的累赘就是驱动,不信你看看刚装完和打了驱动以后的体积比较一下。

dos时代菜鸟 发表于 2021-3-27 12:00:23

527104427 发表于 2021-3-27 10:51
楼主的意思是添加一个不存在的设备。
而你说的这些都是给已存在的设备添加驱动。
不是一个意思。

哦,那,看来又要通过 api 了

liuzhaoyzz 发表于 2021-3-27 12:08:00

本帖最后由 liuzhaoyzz 于 2021-3-29 07:45 编辑

527104427 发表于 2021-3-27 10:05
可以去请教m大,为增强pecmd出一份力
有没有可能pecmd已经有解决办法了,只是因为参数太多,我不会用?

我尝试用devcon,可以成功。
@echo off
setlocal EnableDelayedExpansion
if /i %PROCESSOR_IDENTIFIER:~0,3%==x86 (
set "devcon=devcon.exe"
set "svbus=svbusx86"
set "PECMD=PECMDx86_cli.exe"
) else (
set "devcon=devcon64.exe"
set "svbus=svbusx64"
set "PECMD=PECMDx64_cli.exe"
)
reg import EVRootCA.reg
%devcon% status "root\%svbus%"|find /i "No matching devices found" 1>nul 2>nul && (
echo Install svbus driver...
%devcon% install svbus.inf "root\%svbus%"
echo Svbus driver has been installed.
)
%devcon% status "root\%svbus%"|find /i "The device has the following problem" 1>nul 2>nul && (
set /p confirm=警告:你的电脑需要重启下以确保svbus驱动生效!现在重启?(Y=是,回车或者N=不是):
if not defined confirm set confirm=N
if /i "!confirm!"=="Y" shutdown.exe /r /f /t 5 /c "重启电脑,以确保svbus驱动生效..."
)
pause

但是再次用devcon可能会导致一些问题,第二次用的话可能需要先删除驱动,但是删除驱动之后再次安装就会导致:
由于 Windows 无法加载这个设备所需的驱动程序,导致这个设备工作异常。 (代码 31)
对象名已存在。





这个“对象名已存在”,不知道指的是什么?我尝试sc delete "svbusx64"服务也没用。sc delete "svbusx64"会删除下面的svbus注册表服务:Windows Registry Editor Version 5.00


"Type"=dword:00000001
"Start"=dword:00000000
"ErrorControl"=dword:00000001
"Tag"=dword:00000022
"ImagePath"=hex(2):53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,64,00,\
72,00,69,00,76,00,65,00,72,00,73,00,5c,00,73,00,76,00,62,00,75,00,73,00,78,\
00,36,00,34,00,2e,00,73,00,79,00,73,00,00,00
"Group"="SCSI Miniport"
"Owners"=hex(7):6f,00,65,00,6d,00,31,00,34,00,2e,00,69,00,6e,00,66,00,00,00,00,\
00


"0"="ROOT\\SCSIADAPTER\\0000"
"Count"=dword:00000001
"NextInstance"=dword:00000001


%devcon% remove root\%svbus%执行之后,已经删除了注册表的这个主键,这是svbus驱动安装时创建的主键,怎么还会提示这个“对象名已存在”?搞不懂。

Windows Registry Editor Version 5.00


"DriverDesc"="SVBus Virtual SCSI Host Adapter"
"ProviderName"="Kai Schtrom"
"DriverDateData"=hex:00,80,c3,f5,ef,1c,d6,01
"DriverDate"="4-28-2020"
"DriverVersion"="1.2.0.0"
"InfPath"="oem14.inf"
"InfSection"="svbusx64"
"MatchingDeviceId"="root\\svbusx64"

windows事件查看器错误日志:设备 ROOT\SCSIADAPTER\0000 在启动时出现问题。

驱动程序名称: oem14.inf
类 GUID: {4d36e97b-e325-11ce-bfc1-08002be10318}
服务: svbusx64
低层筛选程序:
高层筛选程序:
问题: 0x1F









dos时代菜鸟 发表于 2021-3-27 12:27:05

liuzhaoyzz 发表于 2021-3-27 12:08
有没有可能pecmd已经有解决办法了,只是因为参数太多,我不会用?

我尝试用devcon,可以成功。


设备管理器器 选择显示隐藏设备。看看

liuzhaoyzz 发表于 2021-3-27 13:03:33

本帖最后由 liuzhaoyzz 于 2021-3-27 13:07 编辑

dos时代菜鸟 发表于 2021-3-27 12:27
设备管理器器 选择显示隐藏设备。看看
勾上显示隐藏设备也是一样的。应该是pecmd安装驱动没有成功。

我看了下pecmd的DEVI命令帮助:
    │命令│'DEVI'                                                                                    ┃
┃    ├──┼──────────────────────────────────────────────┨
┃    │格式│DEVI [*rescan] [*norescan] [*devclass:DevClass] [$]<CAB路径>[,匹配级别[,解压目录]]          ┃
┃    │    │DEVI [*rescan] [*norescan] [*nocheck]   <INF路径>[,DevClass]                              ┃
┃    │    │DEVI [*rescan] [*norescan] <含有INF子目录的目录>[,DevClass]                                 ┃
┃    │    │DEVI [*rescan] [*norescan] <*sub|*self> <含有INF文件的目录>[,DevClass]                      ┃
┃    │    │DEVI $[$]<INF路径>,[安装节],[操作码]            <===◆标准安装模式, 默认DefaultInstall,132┃
┃    │    │DEVI [*rescan] [*norescan] *extract <CAB路径>,[匹配级别],解压目录             <===纯解压    ┃
┃    │    │DEVI [*rescan] [*norescan] *nocheck <CAB路径>,[匹配级别],解压目录,INF相对路径 <直接安包内INF┃
┃    │    │DEVI *rescan[:Fun]                                                   <===重新扫描硬件改动 ┃
┃    │    │DEVI listdev:变量名[*devclass:DevClass] [*ALL] [*listdev=i|c|+] [*devid:ID]   ┃
┃    │    │          [*comp[+]] [*hwid] [*inst] [*many] [*rescan] //查询 可'preID1''preID2'...         ┃
┃    │    │DEVI *disverify<===关闭驱动校验 **为强制         DEVI *autodisverify <==驱动判断模式   ┃
┃    │    │DEVI <*enable|*disable|*remove|*restart>:设备实例路径/(hc)ID<===启用/禁用/删..设备┃
┃    │    │DEVI *update:硬件ID:INF   <===更新设备   可'硬件ID1:INF1''硬件ID2:INF2'... 上同             ┃
┃    │    │DEVI *status:返回名:设备实例路径/(hc)ID [*nl]   <===查询   可'ID1''ID2'...          ┃
┃    │    │ status:0x400=有问题 0x8000=权限 0x8=运行      PROBLEM:0x16=禁止                            ┃
┃    │    │DEVI buildcache: 驱动目录//生成目录的加速缓冲                                             ┃
┃    ├──┼──────────────────────────────────────────────┨
┃    │功能│从 CAB 文件或INF文件或指定的文件夹中查找(并安装)驱动程序。                                  ┃
┃    ├──┼──────────────────────────────────────────────┨
┃    │    │※*dummy 则不实际安装。用于调试,如查看 DevClass。*devid:设备ID 则安装指定设备驱动。      ┃
┃    │    │*nnverify 则不禁止驱动签名校验;*rverify之后恢复禁止驱动签名校验设置。 *7pe[-]则强制使用┃
┃    │    │Drvload。*inner则强制不使用Drvload。*drvload/*devcon优先用drvload(默认)/devcon。          ┃
┃    │    │*retid:变量名 返回本次安装驱动的设备的ID。*auto自动转换是否“处理INF”(CAB默认。注意会改写┃
┃    │    │INF) *sys:拷贝到系统目录 *cab强制为CAB文件*comp+:也匹配兼容ID   *ret:返回名:返回报告┃
┃    │    │*IdCah:PeVar:可续用ID缓冲*infcache:加速缓冲文件                                        ┃
┃    │参数│■指定CAB文件路径。CAB前导"$"表示解压缩驱动文件后安装驱动,否则不安装驱动;可内置         ┃
┃    │    │■INF前导"$"表示执行拷贝的标准模式;否则只加载设备驱动(可能因找不到设备而不加载);      ┃
┃    │    │■*nocheck:不检查硬件ID强制安装;*norescan:禁止重新扫描硬件改动。                         ┃
┃    │    │■*rescan[:Fun]:重新扫描硬件改动(NT6非强制安装时默认),可单用;Fun:0~7。*rescan:3或2       ┃
┃    │    │■匹配级别:设备ID的以&分隔的节数,默认2。                                                ┃
┃    │    │■查询:默认为设备ID,*listdev=c则为兼容ID,*listdev=i则为唯一ID。*ALL则包含不存在设备      ┃
┃    ├──┼──────────────────────────────────────────────┨
┃    │示例│DEVI *retid:&&IDS $%SystemRoot%\DRV.CAB或 DEVI MyInf*.INF 或 DEVI %SystemRoot%\Inf\*.INF┃
┃    │    │DEVI %SystemRoot%                                                                           ┃
┃    │    │DEVI *extract myCab.CAB,,D:\ABC                                                             ┃
┃    │    │DEVI *dummy *subD:\ABC                  //打印D:\ABC下所有INF的DevClass到LOGS。         ┃
┃    │    │DEVI *subD:\ABC,Net                     //D:\ABC下寻找并安装网络驱动。                  ┃
┃    │    │DEVI *devclass:Net$D:\DRV.CAB,,%TEMP%   //D:\DRV.CAB中寻找并安装网络驱动。                ┃
┃    │    │DEVI *devid:PCI\VEN_8086&DEV_1229 $D:\DRV.CAB,,%TEMP%                      //网卡Intel8255x ┃
┃    │    │DEVI *disable:PCI\VEN_14E4&DEV_16B5&SUBSYS_05001025&REV_10\4&14C08592&0&00E3//禁用网卡BCM ┃
┃    │    │DEVI $$D:\MyDrvs\Drv1.inf               //◆标准安装模式, 默认DefaultInstall,132          ┃
┃    ├──┼──────────────────────────────────────────────┨
┃DEVI│备注│※此命令使用自定的(而非系统的)驱动搜索算法,可快速解压缩可能用到的驱动程序,因此,一个设备可┃
┃    │    │能搜索到多个驱动程序。                                                                  ┃
┃    │    │※在CAB中,把每个驱动单独放在一个目录中,并保证CAB中INF文件总是在当前目录的最前面,且CAB中的┃
┃    │    │INF文件必须经过处理。建议使用配套程序XCAB来制作。                                       ┃
┃    │    │※驱动文件是CAB时,NT5.x系统中,前导'$'和[释放目录]不能同时设置(除非按NT6模式或*sys),但可同┃
┃    │    │时省略。省略前导'$'时只解压文件;省略[释放目录]时,将进行驱动匹配解压,INF文件            ┃
┃    │    │被解压到 "%WinDir%\INF" 目录,SYS文件解压到 "%WinDir%\SYSTEM32\DRIVERS" 目录,其它文件解压┃
┃    │    │到" %WinDir%\SYSTEM32" 目录。                                                             ┃
┃    │    │※驱动文件是CAB时,NT6.x系统中,(*sys同此)有前导'$',[释放目录]为空或*,则为%TEMP%下的一个临┃
┃    │    │时目录,安装后自动删除。有释放目录'$'可省。将CAB压缩文件按目录结构解压到指定目录中,当有前┃
┃    │    │导'$'时表示解压后安装目标目录的驱动文件。如果不安装,需要指定*extract。                   ┃
┃    │    │※如果其它文件需要解压缩到特定目录中,可以在文件名中使用"#"代替目录分隔符,如文件         ┃
┃    │    │"SYSTEM32#WBEM#MOF#XXX.MOF"将会被解压缩到"%SystemRoot%\SYSTEM32\WBEM\MOF\XXX.MOF"。       ┃
┃    │    │※NT6.x系列WinPE中,用DEVI命令安装"%WinDir%\INF"的INF文件将不进行硬件ID匹配检查(直接安装)。 ┃
┃    │    │※此命令还有一个功能:从本地磁盘中搜索驱动,如"DEVI \Windows,Display"。但此命令未完善,会提 ┃
┃    │    │示驱动文件对话框。因此,本功能暂不提供技术支持。                                          ┃
┃    │    │*self表示搜索其下*.inf;*sub还要搜索子目录;*self*sub都没则搜索其下INF\*.inf            ┃
┃    │    │※DevClass: Battery CDROM Computer DiskDrive Display FloppyDisk HIDClass Image Infrared   ┃
┃    │    │Keyboard MEDIA Media Monitor Mouse Net PCMCIA Ports Processor SCSIAdapter System USB      ┃
┃    │    │Volume fdc hdc                                                                            ┃
┃    │    │※%&__DEVI.REBOOT%: 是否需要重启   ID中*字符用^*(或*)替代                                 ┃

@echo off
if /i %PROCESSOR_IDENTIFIER:~0,3%==x86 (
set "devcon=devcon.exe"
set "svbus=svbusx86"
set "PECMD=PECMDx86_cli.exe"
) else (
set "devcon=devcon64.exe"
set "svbus=svbusx64"
set "PECMD=PECMDx64_cli.exe"
)
reg import EVRootCA.reg
rem sc delete "%svbus%"
rem PECMDx64_cli DEVI *self *sub *nocheck *rverify *sys *ret $$.\SVBus-朱玛\svbus.inf
rem PECMDx64_cli DEVI $$.\SVBus-朱玛\svbus.inf
rem PECMDx64_cli DEVI .\svbus.inf
PECMDx64_cli DEVI *remove *devcon *devid:root\%svbus%
PECMDx64_cli DEVI *nocheck **disverify *sys *ret *inner *devcon *devid:root\%svbus% svbus.inf
pause

尝试了很多个参数都不行,不会用。我都不会用pecmd,也没法跟mdyblog大神反馈。。。

红毛樱木 发表于 2021-3-27 14:06:15

liuzhaoyzz 发表于 2021-3-27 13:03
勾上显示隐藏设备也是一样的。应该是pecmd安装驱动没有成功。

我看了下pecmd的DEVI命令帮助:


搭好环境,加我QQ   252184824
远程看下

liuzhaoyzz 发表于 2021-3-27 14:59:02

红毛樱木 发表于 2021-3-27 14:06
搭好环境,加我QQ   252184824
远程看下

已添加。

liuzhaoyzz 发表于 2021-3-28 08:26:15

本帖最后由 liuzhaoyzz 于 2021-3-28 09:13 编辑

红毛写了个pecmd脚本:test.wcs
ENVI &NeedInstall=No
IFEX #%&bx64%=0,
{*
    ENVI &devconexe=%&CurDir%\devcon.exe
    ENVI &svbusid="ROOT\svbusx86"
}!
{*
    ENVI &devconexe=%&CurDir%\devcon64.exe
    ENVI &svbusid="ROOT\svbusx64"
}
DEVI *status:&Status:+:%&svbusid%
FIND $%&Status%=,
{*
    ENVI &NeedInstall=Yes
}
FIND $%&NeedInstall%=Yes,
{*
    EXEC -wait -hide "%&devconexe%" install "%&Curdir%\svbus.inf" %&svbusid%
}


用最新版pecmd搭配devcon也可以安装svbus,pecmd load test.wcs。


存在的问题一样,svbus驱动安装好之后,不能卸载,卸载之后就不能安装了。删除驱动之后再次安装就会导致前面18楼的帖子一样的结果(有截图):
由于 Windows 无法加载这个设备所需的驱动程序,导致这个设备工作异常。 (代码 31)
对象名已存在。
static/image/hrline/1.gif

哦,重启了下电脑,好像就好了!驱动正常了。





dos时代菜鸟 发表于 2021-3-28 09:33:06

liuzhaoyzz 发表于 2021-3-28 08:26
红毛写了个pecmd脚本:test.wcs
ENVI &NeedInstall=No
IFEX #%&bx64%=0,


看来还是要重新启动。

如果是 win7 下 情况可能更复杂。

liuzhaoyzz 发表于 2021-3-28 10:03:06

本帖最后由 liuzhaoyzz 于 2021-3-28 10:56 编辑

dos时代菜鸟 发表于 2021-3-28 09:33
看来还是要重新启动。

如果是 win7 下 情况可能更复杂。
第一次安装,驱动是直接生效的,不需要重启。
我说的需要重启的情况,指的是,卸载已经安装好的svbus驱动之后,再次安装,svbus驱动无法正常生效,必须重启。

另外想问下各位大神,pecmd能否实现简单的模拟按键,比如第一次安装svbus驱动的时候,windows会弹出对话框,“你想安装这个设备软件吗?”,这个对话框能否用pecmd调用windowsapi的postmessage或者KeyboardEvent之类的搞定?需要先找到这个窗口的句柄,然后setforground,然后勾选复选框,alt+I搞定。

实现应该可以实现,但是好像没有太大的用处。。。因为批处理安装过程中弹出的对话框,pecmd需要提前作为守护进程监视对话框。

freesoft00 发表于 2021-3-28 11:14:07

liuzhaoyzz 发表于 2021-3-28 10:03
第一次安装,驱动是直接生效的,不需要重启。
我说的需要重启的情况,指的是,卸载已经安装好的svbus驱 ...

既然这样,那不如直接用ahk从写 红毛的脚本,反正都是调用devcon安装,ahk还可以模拟点击

liuzhaoyzz 发表于 2021-3-28 11:17:24

freesoft00 发表于 2021-3-28 11:14
既然这样,那不如直接用ahk从写 红毛的脚本,反正都是调用devcon安装,ahk还可以模拟点击

au3/ahk都可以实现模拟按键。批处理其他的一些功能需要调用pecmd,5大已经写好的有现成的,所以想直接用pecmd来搞定。

dos时代菜鸟 发表于 2021-3-28 15:21:29

如果先判断下系统是否已经装有这个驱动,如果有,就不再安装了, 就不会有需要重启的情况了,

dos时代菜鸟 发表于 2021-3-28 15:22:56

本帖最后由 dos时代菜鸟 于 2021-3-28 15:24 编辑

liuzhaoyzz 发表于 2021-3-28 11:17
au3/ahk都可以实现模拟按键。批处理其他的一些功能需要调用pecmd,5大已经写好的有现成的,所以想直接用p ...
PECMD是可以,找出那个窗口,发送个按键,是可以做到的。再有就是能否关闭相关安全服务,来避免窗口弹出,因为可能安全服务级别不同,窗口内容不一样。

liuzhaoyzz 发表于 2021-3-28 18:14:22

dos时代菜鸟 发表于 2021-3-28 15:21
如果先判断下系统是否已经装有这个驱动,如果有,就不再安装了, 就不会有需要重启的情况了,

现在就是判断系统里面是否已经安装了svbus驱动,在再做相应处理。
红毛的pecmd和我写的批处理脚本都是这样做的。

liuzhaoyzz 发表于 2021-3-28 18:18:27

dos时代菜鸟 发表于 2021-3-28 15:22
PECMD是可以,找出那个窗口,发送个按键,是可以做到的。再有就是能否关闭相关安全服务,来避免窗口弹出 ...

有点小问题,批处理是流程化执行的,pecmd必须作为一个守护进程提前打开,然后批处理调用devcon64执行安装程序,安装过程中才会弹出对话框,如果pecmd放在后面,可能执行不了,因为不确认的话,批处理流程走不下去,进行不到下一个语句。
我也曾经想过有没有注册表或者组策略可以用命令行避免这个对话框,但我不知道在哪里。

dos时代菜鸟 发表于 2021-3-28 19:50:09

liuzhaoyzz 发表于 2021-3-28 18:18
有点小问题,批处理是流程化执行的,pecmd必须作为一个守护进程提前打开,然后批处理调用devcon64执行安 ...

pecmd 可以用多线程监视 ,查看窗口出现了,再传递按键。
页: [1] 2
查看完整版本: 请问下有没有命令行程序可以实现安装过时驱动这个功能?