无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 13465|回复: 43
打印 上一主题 下一主题

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

    [复制链接]
跳转到指定楼层
1#
发表于 2018-1-1 13:54:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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复制所需要的注册表键值。

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

  12. del /f /q /a:h *.*
复制代码

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

  3. set "Source1=HKLM\1Soft"
  4. set "CopyTo=HKLM\2Soft"

  5. :TypeLib
  6. for /f %%i in ('"reg query "!Source1!\Classes\TypeLib" /f "win" /k /s 2^>nul"') do (
  7.         set "_winfiles=%%i"
  8.         for /f "tokens=2*" %%a in ('"reg query "!_winfiles!" /ve 2^>nul"') do (
  9.                 call set "_Dlls=%%~b"
  10.                 if exist "!_Dlls!" (
  11.                         for /f "delims=\ tokens=5" %%j in ("!_winfiles!") do (
  12.                             reg copy "!Source1!\Classes\TypeLib\%%j" "!CopyTo!\Classes\TypeLib\%%j" /s /f >nul
  13.                             )
  14.                 )
  15.         )
  16. )

  17. :CLSID
  18. for /f %%i in ('"reg query "!Source1!\Classes\CLSID" /f "32" /k /s 2^>nul"') do (
  19.         set "_InPro=%%i"
  20.         for /f "tokens=2*" %%a in ('"reg query "!_InPro!" /ve 2^>nul"') do (
  21.                 call set "_Dlls=%%~b"
  22.                 if exist "!_Dlls!" (
  23.                         for /f "delims=\ tokens=5" %%j in ("!_InPro!") do (
  24.                                 set "_SIDs=%%j" & echo !_SIDs!>>"%~dp0regkeys.txt"
  25.                             reg copy "!Source1!\Classes\CLSID\!_SIDs!" "!CopyTo!\Classes\CLSID\!_SIDs!" /s /f >nul
  26.                             reg copy "!Source1!\Classes\WOW6432Node\CLSID\!_SIDs!" "!CopyTo!\Classes\WOW6432Node\CLSID\!_SIDs!" /s /f >nul 2>nul
  27.                                 )
  28.                 )
  29.         )
  30. )

  31. :IntSID
  32. pushd "%~dp0"
  33. for /f %%i in ('"reg query "!Source1!\Classes\Interface" /f "32" /k /s 2^>nul"') do (
  34.         set "_ProSIDs=%%i"
  35.         for /f "tokens=2*" %%a in ('"reg query "!_ProSIDs!" /ve 2^>nul"') do (
  36.                 call set "_IntSIDs=%%~b"
  37.                                 for /f %%m in (regkeys.txt) do (
  38.                                         set "_SIDs=%%~m"
  39.                                  if /i "!_IntSIDs!" equ "!_SIDs!" (
  40.                                 for /f "delims=\ tokens=5" %%l in ("!_ProSIDs!") do (
  41.                                            reg copy "!Source1!\Classes\Interface\!_SIDs!" "!CopyTo!\Classes\Interface\!_SIDs!" /s /f >nul
  42.                                      reg copy "!Source1!\Classes\WOW6432Node\Interface\!_SIDs!" "!CopyTo!\Classes\WOW6432Node\Interface\!_SIDs!" /s /f >nul 2>nul
  43.                                     )
  44.                             )
  45.                 )
  46.         )
  47. )
  48. popd

  49. pause & exit

复制代码

评分

参与人数 4无忧币 +16 收起 理由
qingyi78 + 1 赞一个!
JinPei + 5 很给力!
freesoft00 + 5
立帮电子 + 5 赞一个!

查看全部评分

来自 39#
发表于 2020-10-6 12:30:42 | 只看该作者
仔细看了一下,楼主其实没有讲清楚怎么使用。
第一个批处理和第二个批处理没能对应!

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

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

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

评分

参与人数 1无忧币 +5 收起 理由
2010hook + 5 感谢指正!

查看全部评分

回复

使用道具 举报

2#
发表于 2018-1-1 17:11:31 | 只看该作者
谢谢分享!
回复

使用道具 举报

3#
发表于 2018-1-1 18:42:28 来自手机 | 只看该作者
支持
回复

使用道具 举报

4#
发表于 2018-1-1 18:59:36 | 只看该作者
很多DLL已经精简掉了,也就不需要了。精简的注册表更流畅
回复

使用道具 举报

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

评分

参与人数 1无忧币 +5 收起 理由
2010hook + 5 谢谢宝贵经验,我改进吧

查看全部评分

回复

使用道具 举报

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

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

使用道具 举报

7#
发表于 2018-1-1 19:27:12 | 只看该作者
需要什么再添加什么,用boot.wim的注册表是正确的
回复

使用道具 举报

8#
发表于 2018-1-1 19:29:17 来自手机 | 只看该作者
hsmy 发表于 2018-1-1 19:27
需要什么再添加什么,用boot.wim的注册表是正确的

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

使用道具 举报

9#
发表于 2018-1-1 19:29:41 来自手机 | 只看该作者
hsmy 发表于 2018-1-1 19:27
需要什么再添加什么,用boot.wim的注册表是正确的

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

使用道具 举报

10#
发表于 2018-1-1 19:36:52 | 只看该作者
红毛樱木 发表于 2018-1-1 19:29
也不一定。
用install中的注册表省事,懒人专用

对的,对于体积不强迫的来说用INSTALL的注册表是很好的选择。不怕注册表有问题
回复

使用道具 举报

11#
 楼主| 发表于 2018-1-1 22:13:30 | 只看该作者
本帖最后由 2010hook 于 2018-1-1 22:21 编辑
hsmy 发表于 2018-1-1 18:59
很多DLL已经精简掉了,也就不需要了。精简的注册表更流畅


CrystalDiskMark 和 XYplorer 估计都无法运行;
RegSnap 新建快照时会报错
回复

使用道具 举报

12#
发表于 2018-1-2 15:05:41 | 只看该作者
本帖最后由 hsmy 于 2018-1-2 15:07 编辑
2010hook 发表于 2018-1-1 22:13
CrystalDiskMark 和 XYplorer 估计都无法运行;
RegSnap 新建快照时会报错


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

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

回复

使用道具 举报

13#
发表于 2018-1-2 17:47:35 | 只看该作者
        赞一个!
回复

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

18#
发表于 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
回复

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

21#
发表于 2018-8-31 11:46:07 | 只看该作者
黑中见白 发表于 2018-8-31 02:32
Dism++
\Windows\Fonts\arial.ttf
\Windows\Fonts\msyh.ttc

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

使用道具 举报

22#
 楼主| 发表于 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等。
回复

使用道具 举报

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

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

使用道具 举报

24#
发表于 2018-9-2 00:37:41 | 只看该作者
用c整了个,没想到楼主已经搞出来了- -
回复

使用道具 举报

25#
发表于 2018-9-2 11:16:19 | 只看该作者
似乎这样生成出来的注册表还有不少冗余项目
回复

使用道具 举报

26#
 楼主| 发表于 2018-9-2 17:49:19 | 只看该作者
Windows_Air 发表于 2018-9-2 11:16
似乎这样生成出来的注册表还有不少冗余项目

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

使用道具 举报

27#
发表于 2018-9-3 11:38:11 | 只看该作者
2010hook 发表于 2018-9-2 17:49
不会啊,有对应dll的键才复制。

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

使用道具 举报

28#
 楼主| 发表于 2018-9-3 19:15:20 | 只看该作者
Windows_Air 发表于 2018-9-3 11:38
您这样整出来的wow64node导出成配置单元有多大?

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

使用道具 举报

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

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

使用道具 举报

30#
发表于 2018-9-10 10:39:53 | 只看该作者
压榨SOFTWARE最后一点体积
最新19H1PE 18234.100注册表体积

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-17 06:40

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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