找回密码
 加入
搜索
查看: 2341|回复: 32

[AU3基础] [已解决]PrimoCache4.3安装过程RUN运行程序出错?

[复制链接]
发表于 2023-9-2 16:37:35 | 显示全部楼层 |阅读模式
本帖最后由 msold5 于 2023-9-10 10:16 编辑

看到一个好软件PrimoCache:http://bbs.wuyou.net/forum.php?mod=viewthread&tid=432774 .这个程序使用内存来动态智能缓存程序,
我用过较长时间老版本,使用起来硬盘速度提升蛮不错的,其软件下载链接:https://www.lanzoub.com/b0btzvdej  码:ttjc
以前的静默安装参数失效,只能先手动安装EXE后再用贴子里的批处理处理,想写一个AU3程序来实现无人参与的安装工作,其中遇到一个问题:在安装中批处理有一部分如下:
"C:\Program Files\PrimoCache\fcsetup.exe" -i "C:\Program Files\PrimoCache\drv\rxfcv.inf" 257
这段作用是安装新驱动,最明显的是安装后会把rxfcv.sys复制到C:\windows\system32\drivers\下,用批处理就完全正确,而改到AU3中就无法正常运行,实现不了效果,在C:\windows\system32\drivers找不到文件
$i=RunWait('"C:\Program Files\PrimoCache\fcsetup.exe" -i "C:\Program Files\PrimoCache\drv\rxfcv.inf" 257')
if $i<>0 then
        MsgBox(0,$sTitle,"fcsetup.exe安装rxfcv.inf出错,可能是权限或被安全原因," & @CRLF & ",可能是权限原因或被安全软件阻止,请关闭安全软件后重新运行.")
        Exit
EndIf
程序返回值也是0,但根本没有成功运行程序,不知道是错在哪里?使用run、RunWait、_RunDos运行都这样。
已经是管理员权限了,怎么会这样呢? 把AU3生成EXE后使用管理员权限仍然是这样,百思不得其姐,同样的指令,用批处理运行好好的,改成AU3就不行。
我的系统是管理员登陆,关闭了系统自带DF,退出所有安全软件也还是这样。

我有三个猜测:
1、RUN的环境和批处理环境不同,fcsetup.exe检测到情况特殊于是退出了
2、AU3被禁止调用别的程序安装INF文件
3、AU3不被允许存取C:\windows\system32\drivers 文件夹
到底是什么原因,怎么解决或者我该从什么思路去摸索呢?



对回复先赞为敬


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2023-9-10 01:39:56 | 显示全部楼层
这软件可以脱离原版自己安装的。
#AutoIt3Wrapper_UseX64=y
#NoTrayIcon
#include <File.au3>
#include <WinAPIError.au3>
Global $Log = @ScriptDir & "\日志.log"
Global $path = @ProgramFilesDir & "\PrimoCache"
If @OSBuild < 6001 Then Exit MsgBox(0, "错误", "不支持的操作系统.")
_install($path)
_TestCertificate($path & "\TestCertificate.cer")
_drivers($path)
_RegCache($path)
_FileWriteLog($Log, "安装完毕")



Func _install($Dir)
        If Not FileExists($Dir) Then DirCreate($Dir)
        If Not FileExists($Dir & "\drv") Then DirCreate($Dir & "\drv")
        If Not FileExists($Dir & "\lang") Then DirCreate($Dir & "\lang")
        FileInstall(".\Resources\FancyCcV.exe", $Dir & "\FancyCcV.exe", 1)
        FileInstall(".\Resources\fcsetup.exe", $Dir & "\fcsetup.exe", 1)
        FileInstall(".\Resources\rxpcc.exe", $Dir & "\rxpcc.exe", 1)
        FileInstall(".\Resources\TestCertificate.cer", $Dir & "\TestCertificate.cer", 1)
        FileInstall(".\Resources\unins000.exe", $Dir & "\unins000.exe", 1)
        FileInstall(".\Resources\unins000.dat", $Dir & "\unins000.dat", 1)
        FileInstall(".\Resources\pcc_chs.dll", $Dir & "\lang\pcc_chs.dll", 1)
        Select
                Case @OSBuild >= 6001 And @OSBuild < 10240
                        FileInstall(".\Resources\rxfcv,7.cat", $Dir & "\drv\rxfcv.cat", 1)
                        FileInstall(".\Resources\rxfcv,7.inf", $Dir & "\drv\rxfcv.inf", 1)
                        FileInstall(".\Resources\rxfcv,7.sys", $Dir & "\drv\rxfcv.sys", 1)
                        FileInstall(".\Resources\rxbsknl,7.sys", @SystemDir & "\drivers\rxbsknl.sys", 1)
                Case @OSBuild >= 10240
                        FileInstall(".\Resources\rxfcv,10.cat", $Dir & "\drv\rxfcv.cat", 1)
                        FileInstall(".\Resources\rxfcv,10.inf", $Dir & "\drv\rxfcv.inf", 1)
                        FileInstall(".\Resources\rxfcv,10.sys", $Dir & "\drv\rxfcv.sys", 1)
                        FileInstall(".\Resources\rxbsknl,10.sys", @SystemDir & "\drivers\rxbsknl.sys", 1)
                Case Else
        EndSelect
        If Not FileExists(@StartMenuCommonDir & "\PrimoCache") Then DirCreate(@StartMenuCommonDir & "\PrimoCache")
        FileCreateShortcut($Dir & "\FancyCcV.exe", @StartMenuCommonDir & "\PrimoCache\PrimoCache.lnk", $Dir)
        FileCreateShortcut($Dir & "\unins000.exe", @StartMenuCommonDir & "\PrimoCache\卸载PrimoCache.lnk", $Dir)

EndFunc   ;==>_install

Func _drivers($Dir)
        $Pid = Run('"' & $Dir & "\fcsetup.exe" & '"' & ' -i ' & '"' & $Dir & "\drv\rxfcv.inf" & '"' & ' 257', $Dir, @SW_HIDE)
        ProcessWaitClose($Pid)
        $Handle = _ProcessExitCode($Pid)
        $ExitCode = _ProcessExitCode($Pid, $Handle)
        If $ExitCode <> 0 Then
                _FileWriteLog($Log, "驱动安装完成。 退出代码:" & $ExitCode & ":" & _WinAPI_GetErrorMessage($ExitCode))
        Else
                _FileWriteLog($Log, "驱动安装完成")
        EndIf
EndFunc   ;==>_drivers

Func _TestCertificate($File)
        If Not FileExists($File) Then Return False
        RegRead("HKLM64\SOFTWARE\Microsoft\SystemCertificates\ROOT\Certificates\D39680ED59502209941759C74229F7E2FAC72749", "Blob")
        If @error Then
                If FileExists(@SystemDir & "\certutil.exe") and FileExists($File) Then
                        RunWait(@SystemDir & "\certutil.exe" & " -f -addstore Root " & '"' & $File & '"', @ScriptDir, @SW_HIDE)
                        RunWait(@SystemDir & "\certutil.exe" & " -f -addstore TrustedPublisher " & '"' & $File & '"', @ScriptDir, @SW_HIDE)
                        _FileWriteLog($Log, "添加驱动证书")
                        FileDelete($File)
                Else
                        FileDelete($File)
                        Return False
                EndIf
        Else
                _FileWriteLog($Log, "驱动证书已存在")
                FileDelete($File)
        EndIf
        Return True
EndFunc   ;==>_TestCertificate

Func _RegCache($Dir)
        Local $iRegWrite, $Data, $Uninstall
        $Uninstall = "HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{7A37EA43-BF6F-4DB7-83DB-97AA19BF9408}_is1"
        RegWrite("HKLM64\SOFTWARE\Romex Software\FancyCcV", "Version", "REG_DWORD", 67305472)
        RegWrite("HKLM64\SOFTWARE\Romex Software\FancyCcV", "Multilingual", "REG_SZ", "mui")
        RegWrite("HKLM64\SOFTWARE\Romex Software\FancyCcV", "PrefetchPath", "REG_SZ", "\DosDevices" & $Dir & "\prefetch")
        RegWrite("HKCU64\SOFTWARE\Romex Software\PrimoCache", "LanguageId", "REG_DWORD", 2052)

        RegWrite($Uninstall, "DisplayName", "REG_SZ", "PrimoCache 4.3.0")
        RegWrite($Uninstall, "DisplayVersion", "REG_SZ", "4.3.0")
        RegWrite($Uninstall, "UninstallString", "REG_SZ", $Dir & "\unins000.exe")
        RegWrite($Uninstall, "DisplayIcon", "REG_SZ", $Dir & "\FancyCcV.exe")
        RegWrite($Uninstall, "InstallLocation", "REG_SZ", $Dir & "")
        RegWrite($Uninstall, "Publisher", "REG_SZ", "Romex Software")
        RegWrite($Uninstall, "URLInfoAbout", "REG_SZ", "http://www.romexsoftware.com/")
        RegWrite($Uninstall, "NoModify", "REG_DWORD", 1)
        RegWrite($Uninstall, "NoRepair", "REG_DWORD", 1)
        RegWrite($Uninstall, "InstallDate", "REG_SZ", @YEAR & @MON & @MDAY)
        RegWrite($Uninstall, "EstimatedSize", "REG_DWORD", DirGetSize($Dir) / 1000)

        RegWrite("HKLM64\SYSTEM\CurrentControlSet\Services\FancyCcV\Parameters", "Scode", "REG_BINARY", Binary("0x5461dce9066ead46b4fb4d1b2cc61c6f"))
        $Data = "0xB800000055EAC6F98FECF94466FF7C07" & _
                        "07075BB7A8F7700FE09E0AA48C81C369" & _
                        "580C83A26E217A8EF08E1A94BCB1F399" & _
                        "281C73B25E114A7E2B7B28616E23E0B0" & _
                        "C231D0F8D16FD3C6B8DDEC122FF6057D" & _
                        "9E95E754A3F8CA261AEC6E7841899990" & _
                        "D1BEA09F2CB41E72672C98FD5690E585" & _
                        "2619AECBF177C5C88A2B8CAECA3EE093" & _
                        "2F1DAEC82B3ADF1E7EDF43AFBF9C7090" & _
                        "0A2D5B9CA45B172E0FF6F77AAA1B704C" & _
                        "D0C48096B7E8674F9BE9416EAEB7547B" & _
                        "1B417F848265302A"
        $iRegWrite = RegWrite("HKLM64\SYSTEM\CurrentControlSet\Services\FancyCcV\Parameters", "Data3", "REG_BINARY", Binary($Data))
        If $iRegWrite = False Then
                _FileWriteLog($Log, "添加激活信息失败")
                Return False
        Else
                _FileWriteLog($Log, "添加激活信息成功")
                Return True
        EndIf
EndFunc   ;==>_RegCache

Func _GetVer()
        Select
                Case @OSBuild >= 6001 And @OSBuild < 10240
                        Return "win7"
                Case @OSBuild >= 10240
                        Return "win10"
                Case Else
                        Return
        EndSelect
EndFunc   ;==>_GetVer

Func _ProcessExitCode($i_Pid, $h_Process = 0)
        Local $v_Placeholder
        If Not IsArray($h_Process) Then
                $h_Process = DllCall('kernel32.dll', 'ptr', 'OpenProcess', 'int', 0x400, 'int', 0, 'int', $i_Pid)
                If Not @error Then Return $h_Process
        Else
                $h_Process = DllCall('kernel32.dll', 'ptr', 'GetExitCodeProcess', 'ptr', $h_Process[0], 'int*', $v_Placeholder)
                If Not @error Then Return $h_Process[2]
        EndIf
        Return 0
EndFunc   ;==>_ProcessExitCode

评分

参与人数 1金钱 +20 收起 理由
msold5 + 20 赞一个!

查看全部评分

发表于 2023-9-3 03:49:37 | 显示全部楼层
cmd.exe不能单独执行,而且只能在C:\Windows\system32\目录,其他目录会异常。

评分

参与人数 1金钱 +20 收起 理由
msold5 + 20 谢谢指点我的调试方法错误

查看全部评分

 楼主| 发表于 2023-9-3 11:14:21 | 显示全部楼层
本帖最后由 msold5 于 2023-9-3 12:25 编辑
白嫖之黑 发表于 2023-9-3 03:49
cmd.exe不能单独执行,而且只能在C:\Windows\system32\目录,其他目录会异常。

居然忽略了你说这个原因.....什么时候开始命令行窗口变成必须在system32下运行了?我的知识太陈旧了,谢谢指点

不过我遇到的问题不是由这个造成的,我得改改内容和标题
发表于 2023-9-3 13:39:36 | 显示全部楼层
如果是64位系统,禁用系统重定向试试

评分

参与人数 1金钱 +20 收起 理由
msold5 + 20 谢谢指点

查看全部评分

 楼主| 发表于 2023-9-3 14:53:41 | 显示全部楼层
zghwelcome 发表于 2023-9-3 13:39
如果是64位系统,禁用系统重定向试试

在本论坛上没搜到,从百度搜了下看起来要编程实现,该怎么禁用呢?
发表于 2023-9-3 15:38:29 | 显示全部楼层
msold5 发表于 2023-9-3 14:53
在本论坛上没搜到,从百度搜了下看起来要编程实现,该怎么禁用呢?

https://autoitx.com/forum.php?mo ... =%D6%D8%B6%A8%CF%F2
发表于 2023-9-4 07:49:08 | 显示全部楼层
本帖最后由 白嫖之黑 于 2023-9-4 07:57 编辑

au3的run实际上相当于win菜单的运行,不能把他看成是批处理,需要调用cmd 之后在执行批处理命令。比如"C:\Program Files\PrimoCache\fcsetup.exe" -i "C:\Program Files\PrimoCache\drv\rxfcv.inf" 257 你的代码应该改为 cmd /c "C:\Program Files\PrimoCache\fcsetup.exe" -i "C:\Program Files\PrimoCache\drv\rxfcv.inf" 257 无论是批处理本身还是au3都是依赖于cmd来进行处理批处理的命令。举个例子,run('dir') 和run('cmd /c dir')  前面不会执行,后面会弹出控制台窗口执行dir

评分

参与人数 1金钱 +20 收起 理由
msold5 + 20 谢谢指点

查看全部评分

发表于 2023-9-4 08:05:25 | 显示全部楼层
msold5 发表于 2023-9-3 11:14
居然忽略了你说这个原因.....什么时候开始命令行窗口变成必须在system32下运行了?我的知识太陈旧了,谢 ...

不是命令行窗口需要在system32下,是你调用的cmd.exe本体必须在system32下,因为这是系统级com命令解释器,不在系统目录。系统会怀疑被篡改,命令行窗口在哪里都行,但是名称叫cmd.exe的必须在system32下。
发表于 2023-9-4 09:02:45 | 显示全部楼层
编译成64位试试

评分

参与人数 1金钱 +20 收起 理由
msold5 + 20 谢谢指点

查看全部评分

 楼主| 发表于 2023-9-4 09:07:00 | 显示全部楼层
zghwelcome 发表于 2023-9-3 15:38
https://autoitx.com/forum.php?mod=viewthread&tid=59295&highlight=%D6%D8%B6%A8%CF%F2

试了还是不行,找不到思路
 楼主| 发表于 2023-9-4 09:08:55 | 显示全部楼层
白嫖之黑 发表于 2023-9-4 07:49
au3的run实际上相当于win菜单的运行,不能把他看成是批处理,需要调用cmd 之后在执行批处理命令。比如"C:\P ...

试了还是不行,分别用三个语句:
$i=RunWait(@ComSpec & " /c " & chr(34) & $prog_path & "fcsetup.exe" & chr(34) & " -i " & chr(34) & $prog_path & "drv\rxfcv.inf" & chr(34) & " 257",1)
$i=RunWait(@ComSpec & ' /c "C:\Program Files\PrimoCache\fcsetup.exe" -i "C:\Program Files\PrimoCache\drv\rxfcv.inf" 257',1)
$i=RunWait(@ComSpec & ' /c "C:\Program Files\PrimoCache\test.bat"')
只有最后一个可以,前面两个都不行,最后一个批处理里的句子就一个:
"C:\Program Files\PrimoCache\fcsetup.exe" -i "C:\Program Files\PrimoCache\drv\rxfcv.inf" 257
 楼主| 发表于 2023-9-4 10:09:45 | 显示全部楼层

先前已设为64位,使用32位不知道为什么只能读一部分注册表,但卸载注册表分支无法读取,所以一直没有弄成32位试过,我想办法再试试。
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
发表于 2023-9-4 11:20:07 | 显示全部楼层
msold5 发表于 2023-9-4 09:08
试了还是不行,分别用三个语句:

只有最后一个可以,前面两个都不行,最后一个批处理里的句子就一个: ...

因为我这里只能猜,
$i=RunWait(@ComSpec & ' /c "C:\Program Files\PrimoCache\fcsetup.exe" -i "C:\Program Files\PrimoCache\drv\rxfcv.inf " 257 && pause',1)
  &&pause后au3调用的cmd窗口不会消失,程序运行不正确会有报错信息,麻烦截个图来看看。因为也有可能是编码路径之类的问题。但是没有中文。现在只能想象。还是得看报错才行。
发表于 2023-9-4 11:26:42 | 显示全部楼层
白嫖之黑 发表于 2023-9-4 11:20
因为我这里只能猜,  &&pause后au3调用的cmd窗口不会消失,程序运行不正确会有报错信息,麻烦截个图来看 ...

你的第三条语句可以正常运行,说明au3本身权限是没问题的,只有可能是命令调用出了错,但是命令是传递给cmd的,批处理能运行。au3理论也不会出错。只能看你截图报什么错了,不可能不报错然后也不正常运行的。不过我还是只能猜
 楼主| 发表于 2023-9-4 11:55:30 | 显示全部楼层
白嫖之黑 发表于 2023-9-4 11:26
你的第三条语句可以正常运行,说明au3本身权限是没问题的,只有可能是命令调用出了错,但是命令是传递给c ...

我下午试试
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-2 19:58 , Processed in 0.083796 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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