2010hook 发表于 2018-1-1 13:54:45

SOFTWARE 决定兼容性,用批处理自动复制Dll注册信息,解决程序运行出错

本帖最后由 2010hook 于 2019-1-8 23:07 编辑

*** 如果用完整版60MB的SOFTWARE可以略过 ***

最近找到@wimboot做的Win10 PE,启动很顺滑,菜单很干净,神似原版,是我一直要寻找的外观完成度挺高的作品。
可惜的是,系统可靠性和程序兼容性都有些问题。用16299版也是原因之一。
另外,@fish2006也做了个10PE(15063.413),系统稳定,基本没有兼容问题。如果启动不依赖第三方小工具就好了。
对比发现,主要问题在于@wimboot用的SOFTWARE是从boot.wim拿的,不完整。补充提示缺失的dll和注册表键值后解决。

Win10系统主要由SOFTWARE注册定义dll/ocx/exe,如果用的不是install.wim里取的,只复制文件进去是不够的。
注册dll 信息在:
SOFTWARE\Classes\CLSID
SOFTWARE\Classes\Interface
SOFTWARE\Classes\TypeLib
SOFTWARE\Classes\WOW6432Node\CLSID
SOFTWARE\Classes\WOW6432Node\Interface
SOFTWARE\Classes\WOW6432Node\TypeLib

我写了个批处理,能自动根据已存在的文件复制所需要的注册表键值。
目前只复制 CLSID 和 WOW6432Node\CLSID,大家试试够不够。

先挂载注册表:
@echo off
pushd "%~d0\PE\test\Windows\System32\config\"
rem pushd "C:\Windows\System32\config"
reg load HKLM\Def2 DEFAULT
reg load HKLM\Soft2 SOFTWARE
reg load HKLM\Sys2 SYSTEM
Pause
:unload
if exist DEFAULT reg unload HKLM\Def2
if exist SOFTWARE reg unload HKLM\Soft2
if exist SYSTEM reg unload HKLM\Sys2

del /f /q /a:h *.*

然后复制注册表内容,无文件落地,速度还行:
@echo off
SetLocal EnableDelayedExpansion

set "Win2=%~d0\PE\test"
set "Source1=HKLM\Soft1"
set "CopyTo=HKLM\Soft2"

:CLSID
for /f %%i in ('"reg query "!Source1!\Classes\CLSID" /f "InProc" /k /s 2^>nul"') do (
        set "_InProc=%%i"
        for /f "tokens=2*" %%a in ('"reg query "!_InProc!" /ve 2^>nul"') do (
                call set "_Dlls=%%~b"
                if exist "!Win2!!_Dlls:~2!" (
                        for /f "delims=\ tokens=5" %%l in ("!_InProc!") do (
                            reg copy "!Source1!\Classes\CLSID\%%l" "!CopyTo!\Classes\CLSID\%%l" /s /f >nul
                    )
                )
        )
)
pause

:WOW6432Node
for /f %%i in ('"reg query "!Source1!\Classes\WOW6432Node\CLSID" /f "InProc" /k /s 2^>nul"') do (
        set "_InProc=%%i"
        for /f "tokens=2*" %%a in ('"reg query "!_InProc!" /ve 2^>nul"') do (
                call set "_Dlls=%%~b"
                if exist "!Win2!!_Dlls:~2!" (
                        for /f "delims=\ tokens=6" %%l in ("!_InProc!") do (
                            reg copy "!Source1!\Classes\WOW6432Node\CLSID\%%l" "!CopyTo!\Classes\WOW6432Node\CLSID\%%l" /s /f >nul
                    )
                )
        )
)
pause

青青草 发表于 2018-1-1 17:11:31

谢谢分享!

古今一梦 发表于 2018-1-1 18:42:28

支持

hsmy 发表于 2018-1-1 18:59:36

很多DLL已经精简掉了,也就不需要了。精简的注册表更流畅

立帮电子 发表于 2018-1-1 19:00:23

方法不错,但是好像还有点欠缺。
1. Interface 没处理,只是补充CLSID 没有Interface 注册表支持
2. CLSID处理"!_InProc!" 仅处理 InProcHandler32 和 InprocServer32 应该还不够,应该需要补充 LocalServer32
不过你这是补充注册表(有可能行得通),我精简注册表基本上依赖上述信息处理(根据文件处理不需要的就删除)

立帮电子 发表于 2018-1-1 19:20:47

立帮电子 发表于 2018-1-1 19:00
方法不错,但是好像还有点欠缺。
1. Interface 没处理,只是补充CLSID 没有Interface 注册表支持
2. CLSI ...

你这采取精简的注册表根据文件补充相关CLSID,能够采用批处理解决很不错,可能也就解决了问题(主要原来的注册表虽然精简,但是基本的项目都已存在)。如果是完整注册表再根据文件精简就要麻烦些

hsmy 发表于 2018-1-1 19:27:12

需要什么再添加什么,用boot.wim的注册表是正确的

红毛樱木 发表于 2018-1-1 19:29:17

hsmy 发表于 2018-1-1 19:27
需要什么再添加什么,用boot.wim的注册表是正确的

也不一定。
用install中的注册表省事,懒人专用

红毛樱木 发表于 2018-1-1 19:29:41

hsmy 发表于 2018-1-1 19:27
需要什么再添加什么,用boot.wim的注册表是正确的

也不一定。
用install中的注册表省事,懒人专用

hsmy 发表于 2018-1-1 19:36:52

红毛樱木 发表于 2018-1-1 19:29
也不一定。
用install中的注册表省事,懒人专用

对的,对于体积不强迫的来说用INSTALL的注册表是很好的选择。不怕注册表有问题
页: [1] 2 3 4
查看完整版本: SOFTWARE 决定兼容性,用批处理自动复制Dll注册信息,解决程序运行出错