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

[2020.4改好] SOFTWARE 决定兼容性,用批处理复制Dll注册信息,解决程序报错

本帖最后由 2010hook 于 2020-4-8 15:06 编辑

*** 如果用完整版60MB的SOFTWARE可以略过 ***
*** 已经能处理 InProcHandler32、InprocServer32、LocalServer32 ***
*** 已经能完整处理 CLSID、Interface、TypeLib ***

最近找到@wimboot做的Win10 PE(1709),启动很顺滑,菜单很干净,神似原版,是我一直要寻找的外观完成度挺高的作品。
可惜的是,系统可靠性和程序兼容性都有些问题。
另外,@fish2006也做了个10PE(1703),系统稳定,基本没有兼容问题。如果启动不依赖第三方小工具就好了。
对比发现,主要问题在于@wimboot过度精简SOFTWARE,不完整。

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

我写了个批处理,能自动根据已有的文件和SID复制所需要的注册表键值。

先挂载注册表(挂载后暂停,让你处理好再按任意键卸载):
@echo off
pushd "%~d0\PE\test\Windows\System32\config\"
rem pushd "C:\Windows\System32\config"
reg load HKLM\2Def DEFAULT
reg load HKLM\2Soft SOFTWARE
reg load HKLM\2Sys SYSTEM
Pause
:unload
if exist DEFAULT reg unload HKLM\2Def
if exist SOFTWARE reg unload HKLM\2Soft
if exist SYSTEM reg unload HKLM\2Sys

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

然后复制注册表内容,无中间文件落地,项目很多,速度稍慢:
@echo off
SetLocal EnableDelayedExpansion

set "Source1=HKLM\1Soft"
set "CopyTo=HKLM\2Soft"

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

:CLSID
for /f %%i in ('"reg query "!Source1!\Classes\CLSID" /f "32" /k /s 2^>nul"') do (
      set "_InPro=%%i"
      for /f "tokens=2*" %%a in ('"reg query "!_InPro!" /ve 2^>nul"') do (
                call set "_Dlls=%%~b"
                if exist "!_Dlls!" (
                        for /f "delims=\ tokens=5" %%j in ("!_InPro!") do (
                              set "_SIDs=%%j" & echo !_SIDs!>>"%~dp0regkeys.txt"
                            reg copy "!Source1!\Classes\CLSID\!_SIDs!" "!CopyTo!\Classes\CLSID\!_SIDs!" /s /f >nul
                            reg copy "!Source1!\Classes\WOW6432Node\CLSID\!_SIDs!" "!CopyTo!\Classes\WOW6432Node\CLSID\!_SIDs!" /s /f >nul 2>nul
                              )
                )
      )
)

:IntSID
pushd "%~dp0"
for /f %%i in ('"reg query "!Source1!\Classes\Interface" /f "32" /k /s 2^>nul"') do (
      set "_ProSIDs=%%i"
      for /f "tokens=2*" %%a in ('"reg query "!_ProSIDs!" /ve 2^>nul"') do (
                call set "_IntSIDs=%%~b"
                              for /f %%m in (regkeys.txt) do (
                                        set "_SIDs=%%~m"
                                 if /i "!_IntSIDs!" equ "!_SIDs!" (
                              for /f "delims=\ tokens=5" %%l in ("!_ProSIDs!") do (
                                           reg copy "!Source1!\Classes\Interface\!_SIDs!" "!CopyTo!\Classes\Interface\!_SIDs!" /s /f >nul
                                     reg copy "!Source1!\Classes\WOW6432Node\Interface\!_SIDs!" "!CopyTo!\Classes\WOW6432Node\Interface\!_SIDs!" /s /f >nul 2>nul
                                    )
                            )
                )
      )
)
popd

pause & exit

Anson4 发表于 2020-10-6 12:30:42

仔细看了一下,楼主其实没有讲清楚怎么使用。
第一个批处理和第二个批处理没能对应!

最重要的是第二个批处理的使用环境,应该是需要精简SOFTWARE的目标PE!

正确的使用方法应该是这样的:启动到目标PE环境下,挂载完整版的SOFTWARE为1Soft,挂载需要精简补充的SOFTWARE为2Soft,运行第二个批处理即可(此时不需要第一个批处理)。

另外,对于 CLSID 和 InferFace,我个人觉得,应该是要根据文件是存在于SYSTEM32下面还是存在于SysWOW64下面来区分 CLSID、InferFace 和 WOW6432Node\CLSID、WOW6432Node\InferFace。

青青草 发表于 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的注册表是很好的选择。不怕注册表有问题

2010hook 发表于 2018-1-1 22:13:30

本帖最后由 2010hook 于 2018-1-1 22:21 编辑

hsmy 发表于 2018-1-1 18:59
很多DLL已经精简掉了,也就不需要了。精简的注册表更流畅

CrystalDiskMark 和 XYplorer 估计都无法运行;
RegSnap 新建快照时会报错 {:1_186:}

hsmy 发表于 2018-1-2 15:05:41

本帖最后由 hsmy 于 2018-1-2 15:07 编辑

2010hook 发表于 2018-1-1 22:13
CrystalDiskMark 和 XYplorer 估计都无法运行;
RegSnap 新建快照时会报错

精简的注册表,很多软件还是可以运行的,我测试了一下CrystalDiskMark,没有问题

RegSnap我的PE里有,测试新建快照也没问题
如果某些软件打不开,再考虑添加文件和可能的注册表

chef0824 发表于 2018-1-2 17:47:35

        赞一个!

2011wanglei5207 发表于 2018-8-27 10:47:34

@2010hook老师,真心没看懂您这个批处理怎么使用的,第一段批处理挂载之后按继续就卸载了如何复制第二段注册表文件呢?还望详细讲解一下,不胜感激!另外简单修改了一下wimboot大佬的16299 PE,其它一切正常,目前只发现Dism++的空间回收功能无法使用,点击就闪退,按您的推论可能也出在Software上,如果可以麻烦您给看看是缺少文件还是缺少键值,谢谢!
PE文件:https://pan.baidu.com/s/1k5IcB17p-Fil8NPNhy9PiA

2010hook 发表于 2018-8-29 19:04:23

2011wanglei5207 发表于 2018-8-27 10:47
@2010hook老师,真心没看懂您这个批处理怎么使用的,第一段批处理挂载之后按继续就卸载了如何复制第二段注 ...

挂载之后,不要马上按继续!进行复制,该做的做完后,才能卸载注册表。
我对比过兼容性好的PE,发现文件和键值都缺。

2011wanglei5207 发表于 2018-8-30 10:35:49

2010hook 发表于 2018-8-29 19:04
挂载之后,不要马上按继续!进行复制,该做的做完后,才能卸载注册表。
我对比过兼容性好的PE,发现文件 ...

不知道是不是我操作的问题,进行复制的时候没有看到任何文件信息,而且新生成的Software在哪个路径呢?好像没有任何改变一样!我对比了一下文件,针对Dism++的文件都是全的,而且运行也正常,唯一不正常的就是Dism++的空间回收功能无法使用,用的是wimboot的16299网络版,如果可以,劳烦您给看看或者能否提供一份在原基础上修改好的Software呢?感谢!

2010hook 发表于 2018-8-31 01:51:15

2011wanglei5207 发表于 2018-8-30 10:35
不知道是不是我操作的问题,进行复制的时候没有看到任何文件信息,而且新生成的Software在哪个路径呢?好 ...

这个复制注册表动作,完全没有文件生成的,是直接在注册表键值之间复制!
他的Software缺陷不少,对Dism++我也不能排查出问题所在。

黑中见白 发表于 2018-8-31 02:32:22

Dism++
\Windows\Fonts\arial.ttf
\Windows\Fonts\msyh.ttc
\Windows\Fonts\StaticCache.dat
\Windows\Globalization\Sorting\SortDefault.nls
\Windows\System32\advapi32.dll
\Windows\System32\apphelp.dll
\Windows\System32\bcrypt.dll
\Windows\System32\bcryptprimitives.dll
\Windows\System32\cfgmgr32.dll
\Windows\System32\clbcatq.dll
\Windows\System32\combase.dll
\Windows\System32\CoreMessaging.dll
\Windows\System32\CoreUIComponents.dll
\Windows\System32\crypt32.dll
\Windows\System32\cryptbase.dll
\Windows\System32\cryptsp.dll
\Windows\System32\C_1252.NLS
\Windows\System32\C_950.NLS
\Windows\System32\dnsapi.dll
\Windows\System32\dwmapi.dll
\Windows\System32\ExplorerFrame.dll
\Windows\System32\FWPUCLNT.DLL
\Windows\System32\gdi32.dll
\Windows\System32\gdi32full.dll
\Windows\System32\iertutil.dll
\Windows\System32\imm32.dll
\Windows\System32\IPHLPAPI.DLL
\Windows\System32\kernel.appcore.dll
\Windows\System32\kernel32.dll
\Windows\System32\KernelBase.dll
\Windows\System32\locale.nls
\Windows\System32\msasn1.dll
\Windows\System32\msctf.dll
\Windows\System32\msimg32.dll
\Windows\System32\msvcp_win.dll
\Windows\System32\msvcrt.dll
\Windows\System32\mswsock.dll
\Windows\System32\nsi.dll
\Windows\System32\ntdll.dll
\Windows\System32\ntmarta.dll
\Windows\System32\ole32.dll
\Windows\System32\oleacc.dll
\Windows\System32\oleaccrc.dll
\Windows\System32\oleaut32.dll
\Windows\System32\OnDemandConnRouteHelper.dll
\Windows\System32\powrprof.dll
\Windows\System32\profapi.dll
\Windows\System32\psapi.dll
\Windows\System32\rasadhlp.dll
\Windows\System32\rpcrt4.dll
\Windows\System32\rsaenh.dll
\Windows\System32\sechost.dll
\Windows\System32\SHCore.dll
\Windows\System32\shell32.dll
\Windows\System32\shlwapi.dll
\Windows\System32\SogouPY.ime
\Windows\System32\SogouTSF.ime
\Windows\System32\sspicli.dll
\Windows\System32\TextInputFramework.dll
\Windows\System32\ucrtbase.dll
\Windows\System32\urlmon.dll
\Windows\System32\user32.dll
\Windows\System32\uxtheme.dll
\Windows\System32\version.dll
\Windows\System32\wimgapi.dll
\Windows\System32\win32u.dll
\Windows\System32\windows.storage.dll
\Windows\System32\winhttp.dll
\Windows\System32\wininet.dll
\Windows\System32\winnsi.dll
\Windows\System32\WinTypes.dll
\Windows\System32\ws2_32.dll

2011wanglei5207 发表于 2018-8-31 10:56:23

2010hook 发表于 2018-8-31 01:51
这个复制注册表动作,完全没有文件生成的,是直接在注册表键值之间复制!
他的Software缺陷不少,对Dism ...

还是不太明白,您说是在注册表键值之间复制,理论上Software会新增键值才对,但是我比较了原始software和复制注册表文件之后的Software,两个注册表没有任何变化啊?

2011wanglei5207 发表于 2018-8-31 11:05:11

2010hook 发表于 2018-8-31 01:51
这个复制注册表动作,完全没有文件生成的,是直接在注册表键值之间复制!
他的Software缺陷不少,对Dism ...

我明白了,复制注册表文件之后挂载的soft2导出reg就可以对比新增的键值,感谢!

2011wanglei5207 发表于 2018-8-31 11:46:07

黑中见白 发表于 2018-8-31 02:32
Dism++
\Windows\Fonts\arial.ttf
\Windows\Fonts\msyh.ttc


不是缺失文件的问题,您列出的文件都补齐了也一样,空间回收功能不可用!还行感谢!

2010hook 发表于 2018-8-31 17:48:21

2011wanglei5207 发表于 2018-8-31 11:05
我明白了,复制注册表文件之后挂载的soft2导出reg就可以对比新增的键值,感谢!

也可以插入命令,一边复制一边导出键值:
echo "!Source1!\Classes\CLSID\%%l">>"%~dp0keys.txt"

我1楼的批处理,只复制CLSID的内容,不完整,应该还要其它相关的键值才行,比如Interface和TypeLib等。

2011wanglei5207 发表于 2018-8-31 17:54:51

2010hook 发表于 2018-8-31 17:48
也可以插入命令,一边复制一边导出键值:
echo "!Source1!\Classes\CLSID\%%l">>"%~dp0keys.txt"



有空完善一下批处理吧,应该可以帮到很多人,当然Dism++的空间回收功能还不能确定是注册表引起的,其它功能都正常只有垃圾清理功能无法使用,闪退!我再找找原因!

Windows_Air 发表于 2018-9-2 00:37:41

用c整了个,没想到楼主已经搞出来了- -

Windows_Air 发表于 2018-9-2 11:16:19

似乎这样生成出来的注册表还有不少冗余项目

2010hook 发表于 2018-9-2 17:49:19

Windows_Air 发表于 2018-9-2 11:16
似乎这样生成出来的注册表还有不少冗余项目

不会啊,有对应dll的键才复制。

Windows_Air 发表于 2018-9-3 11:38:11

2010hook 发表于 2018-9-2 17:49
不会啊,有对应dll的键才复制。

您这样整出来的wow64node导出成配置单元有多大?

2010hook 发表于 2018-9-3 19:15:20

Windows_Air 发表于 2018-9-3 11:38
您这样整出来的wow64node导出成配置单元有多大?

不知道哦,我还没试过导出来,而且这批处理也只复制了CLSID,其它的2/3内容暂不处理。
抽空会完善一下这批处理吧。

Windows_Air 发表于 2018-9-3 22:28:56

2010hook 发表于 2018-9-3 19:15
不知道哦,我还没试过导出来,而且这批处理也只复制了CLSID,其它的2/3内容暂不处理。
抽空会完善一下这 ...

您试试吧,俺这里可以压一半的体积。。。。还有Microsoft\Windows\CurrentVersion\SideBySide\Winners这里也是重灾区,您有什么好的精简方法吗?

hsmy 发表于 2018-9-10 10:39:53

压榨SOFTWARE最后一点体积
最新19H1PE 18234.100注册表体积

页: [1] 2
查看完整版本: [2020.4改好] SOFTWARE 决定兼容性,用批处理复制Dll注册信息,解决程序报错