本帖最后由 liangyi 于 2023-11-14 10:30 编辑
我把上面那个关于 SystemSetupInProgress 键值的文章扒过来了,万一哪天有人用到呢———————————————————————————————————————————————————
PE下使用桌面主题的技巧
在正常windows下更换主题相信大家也会了,但在PE下使用桌面主题大家应该就没见过吧。
先看看原理:Winlogon启动后先初始化一些全局变量,检测 HKEY_LOCAL_MACHINE\SYSTEM\Setup 下的 SystemSetupInProgress 是否为零,如果是 0,就正常启动;如果是 1,则在启动系统服务 SamSs 时告诉它不要管 SAM 数据库,启动一些必要的服务后,比如 Services,lsass,然后就启动HKEY_LOCAL_MACHINE\SYSTEM\Setup 下由 CMDline 指定的程序,等待程序结束,重启或者关机。当 SystemSetupInProgress = 0,则初始化系统服务后调用 MSgina.dll 登录XP。MSgina.dll 在初始化时调用 SHsvcs.dll 产生一个 ThemesStartEvent 系统级事件,代码如下:
- #define ThemeWatchForStart_Ordinal 1
- #define ThemeWaitForServiceReady_Ordinal 2
- typedef DWORD (_stdcall *PFN_ThemeWaitForServiceReady)(DWORD dwTimeout);
- typedef BOOL (_stdcall *PFN_ThemeWatchForStart)(void);
-
- HMODULE hShsvcs = LoadLibrary(_T("shsvcs.dll"));
- if( hShsvcs != NULL )
- {
- PFN_ThemeWaitForServiceReady pfThemeWait
- = (PFN_ThemeWaitForServiceReady)GetProcAddress( hShsvcs, (LPCSTR)ThemeWaitForServiceReady_Ordinal);
-
- PFN_ThemeWatchForStart pfThemeWatch
- = (PFN_ThemeWatchForStart)GetProcAddress( hShsvcs,(LPCSTR)ThemeWatchForStart_Ordinal);
-
- if( pfThemeWait != NULL && pfThemeWatch != NULL )
- {
- pfThemeWait(1000);
- pfThemeWatch();
- }
- CloseHandle(hShsvcs);
- }
复制代码 那位同学说了:“把 SystemSetupInProgress 直接改成 0 不就得了!”
Lsass告诉你:“此路不通!重启吧你”
我告诉你:“我们可以改一改 Winlogon,让它先启动 Msgina 或是直接调用 Shsvcs 就行了。”
ThemesStartEvent 事件是出来了,怎么?还不行!
那是因为还有个家伙在捣乱: SXS.dll。他会在系统要求它调用指定 dll 时用 FusionpAreWeInOSSetupMode 函数判断 SystemSetupInProgress 是否为 0,如果为 1,它就会告诉系统:“我那个什么......先歇会儿再说。”
然而系统要实现 Themes,恰恰需要它去找到合适的 ComCtl32.dll。
你可以修改它,但是合适的 dll 在哪里?
这种概念是从微软的 .NET FrameWork 的 GAC 引入的。每当应用程序要求合适的 dll 时,系统会调用 SXS.dll 在 %SystemRoot%\WinSxS 文件夹中寻找,当有多个相同文件时,它就查看 C:\Windows\WinSxS\Manifests ,以 C:\Windows\WinSxS\Policies 中的规则来调用相应的文件。
———————————————————————————————————————————————————
动手了:
1、启用 Themes 需要以下文件:
- 修改版的 Winlogon 调用 Msgina.dll 或直接修改 MinLogon(XPE Feathure Pack 2007 中有此文件),
- Winlogon, Msgina.dll, Shsvcs.dll, Activeds.dll, uxtheme.dll, themeui.dll, sxs.dll
复制代码 C:\Windows\WinSxS\Manifests 文件夹中的(对应SP3)
- x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83.cat
- x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83.Manifest
复制代码 C:\Windows\WinSxS\Policies\x86_policy.6.0.Microsoft.Windows.Common-Controls_6595b64144ccf1df_x-ww_5ddad775 文件夹下的
- 6.0.2600.5512.cat
- 6.0.2600.5512.Policy
复制代码 C:\Windows\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83 文件夹下的
还有一些 Windows 文件夹 System32 下的文件,自己研究吧。(用Depends工具找一找文件的依赖关系)
2、修改文件。(均以SP3的文件为例) 1. 使用 UltraEdit 打开文件 Winlogon.exe, 查找 AF46FFFF85C07512,将最后的 12 改为 27,查找 56E8151D000056 FF7614E8FC,修改为 56E8151D000056 E8BC91FFFF(看清了,只修改最后五位); 2. 打开 SXS.dll 查找十六进制数值 530079007300740065006d005300650074007500700049006e00500072006f00670072006500 可以看到 SystemSetupInProgress 的字样,把最后的 s 改成 t,即 73 改成 74。
3. 修改 PE 的注册表,在 SYSTEM\Setup 下比照着 SystemSetupInProgress,新建一个 REG_DWORD 值并命名为 SystemSetupInProgrest,设为0。特别注意要修改 services.exe 中的 SystemSetupInProgress 为 SystemSetupInProgrest。
同时测试了基于 bartpe 的 xpe 硬盘版,因为 xpe 使用自己的 pegina.dll 重新进入 sas 序列,所以无法启用主题。
———————————————————————————————————————————————————
上传一个修改过的 Minlogon,切记修改注册表。对了,最重要的是别忘了加上你自己的主题文件,它们一般在 Windows\Resources 文件夹下。传了一个压缩的,是用我心如水的PE做的(hhh333的也不错,不过他的是SP2的,测试不方便),我重新上传一个精简过文件的IS_文件,可直接替换我心如水里面的 winpe.is_
1、修改的注册表,添加了一些键值,比如对 DX8 游戏的支持;
2、修改为支持双核,理论上能在 P4 以上单核上启动;
3、自动检测硬件,安装驱动。(必须有相应的 INF 和驱动文件)
今天上传了一个自己用的 img 格式的内核,根据站长的研究使主题自动开启。其中添加了 VC2005 的运行库,内置 NV 显示驱动,配合外置的 DX9可以玩现在的新游戏了。
有一个小问题,墙纸不能自动加载是因为 Windows 只认 bmp 格式的图片,jpg 格式的要转换成 bmp。把你需要的墙纸转换成 bmp,然后再修改HKEY_CURRENT_USER\Control Panel\Desktop 下的 WallPaper 路径指向你自己的图片。
|