无忧启动论坛

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

原创:如何在PE中启用 Themes

[复制链接]
跳转到指定楼层
1#
发表于 2009-3-17 18:01:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如何在WinPE中启用XP的主题一直是个难题,网上搜一搜,没有答案。XPE Plugin的作者Sherpya做了不少工作,但最后也说:Until themes are not working these files are only wasting space。没办法,自己努力吧。
        有很多兄弟们都想要一个现成的,不过我更喜欢授人以渔,因为有好多人制作出来的PE比我的好多了,有哪位兄弟先做出来,让我也下载一个。
        先说原理,如果你看不懂,那就和我一块等着下载别人的。
        Winlogon启动后先初始化一些全局变量,检测HKEY_LOCAL_MACHINE\SYSTEM\Setup下的SystemSetupInProgress是否为零,如果是正常启动,如果为一,则在启动系统服务SamSs时告诉它不要管SAM数据库,启动一些必要的服务后,比如Services,lsass,然后就启动HKEY_LOCAL_MACHINE\SYSTEM\Setup下由CMDline指定的程序,等待程序结束,重启或者关机。如果SystemSetupInProgress == 1,则初始化系统服务后调用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是否为零,如果为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.dllC:\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
文件夹下的
comctl32.dll
还有一些Windows文件夹System32下的文件,自己研究吧。(用Depends工具找一找文件的依赖关系)
        2.修改文件。(均已SP3的文件为例)使用UltraEdit打开文件,Winlogon.exe 查找AF46FFFF85C07512,将最后的12改为27,查找
56E8151D000056  FF7614E8FC,修改为56E8151D000056  E8BC91FFFF(看清了,只修改最后五位);打开SXS.Dll查找530079007300740065006d005300650074007500700049006e00500072006f00670072006500可以看到S.e.t.u.p.I.n.p.r.o.g.r.e.s.s的字样,把最后的s改成t,即73改成74。
修改PE的注册表,在SYSTEM\Setup下比照着SystemSetupInProgress新建一个REG_DWORD值SystemSetupInProgrest,设为0。为什么这样,请参照http://bbs.wuyou.net/forum.php?mod=viewthread&tid=125169&highlight=
特别注意要修改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路径指向你自己的图片。

http://www.namipan.com/d/themes.im_/103380cd7b73bbc6036b87fb41b21fab0d5dab8c01cffb03

[ 本帖最后由 yamingw 于 2009-7-20 18:51 编辑 ]

minlogon.rar

13.02 KB, 下载次数: 653, 下载积分: 无忧币 -2

2#
发表于 2009-3-17 18:12:26 | 只看该作者
大沙发!真正的高手是让我们永远都无法想象他到底有多高!
回复

使用道具 举报

3#
发表于 2009-3-17 18:23:37 | 只看该作者
先尝试下再来报告结果,不过LZ确实是技术派的,太厉害了。
对于SP2的PE需要的文件能否列个表?
回复

使用道具 举报

4#
发表于 2009-3-17 18:27:36 | 只看该作者
测试改在明天进行,不确定如果比如是现在论坛里的PE,启动的时候都把WINLOGON干掉了,还能显示主题吗?
回复

使用道具 举报

5#
发表于 2009-3-17 18:59:02 | 只看该作者
高手啊,谁先做出来个绝对是个创举啊。。。用WB的日子过去啦
O(∩_∩)O哈哈~
回复

使用道具 举报

6#
发表于 2009-3-17 21:34:30 | 只看该作者
WINSXS文件夹变成14M,代价是不是太大了点?
回复

使用道具 举报

7#
 楼主| 发表于 2009-3-17 22:39:06 | 只看该作者

回复 #6 yidawpf 的帖子

有一些是我测试NETfx程序和其它东西用的,可以删除的,比如VC的运行库。system32下的还有很多文件可以精简,比如那些c_xx.nls,msxml3~4等文件,我原先以为是由于系统不能解析ManifestXML格式的文件造成的。还有一些文件可以外置,我是为了方便放在系统目录下的。
回复

使用道具 举报

8#
发表于 2009-3-17 22:51:28 | 只看该作者
标记下,有时间再研究
回复

使用道具 举报

9#
发表于 2009-3-18 09:04:03 | 只看该作者
原帖由 yamingw 于 2009-3-17 22:39 发表
有一些是我测试NETfx程序和其它东西用的,可以删除的,比如VC的运行库。system32下的还有很多文件可以精简,比如那些c_xx.nls,msxml3~4等文件,我原先以为是由于系统不能解析ManifestXML格式的文件造成的。还有 ...

那些是必须的?你说明下。
回复

使用道具 举报

10#
发表于 2009-3-21 21:07:52 | 只看该作者
这个用到66369的pe确实可行,我想一般的pe都可以了。
但是我的pe还是不行。
研究了几个小时,winlogon我是启动cmd的。如果调用Msgina.Dll就无法加载二级内核了。
有时间再研究。
回复

使用道具 举报

11#
发表于 2009-3-21 21:12:53 | 只看该作者
如何在调用cmd后再调用Msgina.Dll。楼主能否给个思路?
回复

使用道具 举报

12#
发表于 2009-3-21 22:59:32 | 只看该作者
这个怎么玩法,发图来看看
回复

使用道具 举报

13#
 楼主| 发表于 2009-3-21 23:27:15 | 只看该作者

回复 #12 yidawpf 的帖子

CMD调用Msgina.dll这个有点难度。因为这不是msgina的问题,而是一个概念性的问题,winlogon会创建三个桌面,我们平时使用的都是一个外壳,比如CMD,PECMD,explorer。启动CMD之前winlogon已经锁住另外两个,用户只能见到应用层,而主题服务是在服务层建立一个全局服务。所以要在CMD中启用主题服务不大可能,我原来试过,用编程的方法,先提升自身权限,再通过SetThreadDesktop切换桌面,在服务层初始化主题服务,再回来。但这样有个问题,就是主题服务只运行几秒钟的时间就没了,不知道是什么原因。
回复

使用道具 举报

14#
 楼主| 发表于 2009-3-21 23:46:01 | 只看该作者

回复 #11 yidawpf 的帖子

我修改的Winlogon是先调用Msgina再启动CMD或Explorer等外壳,Shsvcs.Dll必须内置,这样winlogon启动时才能启动主题。未修改版的是不会调用Msgina也不会启动主题的。如果你不想要msgina也可以用我修改的Minlogon代替,附件中的已改名为winlogon。
回复

使用道具 举报

15#
发表于 2009-3-22 08:58:39 | 只看该作者
原帖由 yamingw 于 2009-3-21 23:46 发表
我修改的Winlogon是先调用Msgina再启动CMD或Explorer等外壳,Shsvcs.Dll必须内置,这样winlogon启动时才能启动主题。未修改版的是不会调用Msgina也不会启动主题的。如果你不想要msgina也可以用我修改的Minlogon ...

你那个minlogon怎么用?我不太懂。
替换原版的winlogon?
回复

使用道具 举报

16#
发表于 2009-3-22 08:59:07 | 只看该作者
原帖由 xiaolongkun0 于 2009-3-21 22:59 发表
这个怎么玩法,发图来看看

抽空截个效果图你看看。
回复

使用道具 举报

17#
发表于 2009-3-22 09:45:33 | 只看该作者
还有楼主这个主题的开启到底还需要其他什么文件不?
我是用你提供的内核测试的。确实可以启动。
但是你的内核太大了,需要200多M才能启动。
而你在主贴说明的文件还不算太大。到底还要不要其他文件的支持?
如果需要是那些?
。。。。如果自己找那是一个大工程。楼主还是说明下吧。
回复

使用道具 举报

18#
 楼主| 发表于 2009-3-22 10:12:38 | 只看该作者
启用Themes需要以下文件:修改版的Winlogon调用Msgina.Dll或直接修改MinLogon(XPE Feathure Pack 2007 中有此文件),Shsvcs.dll,Activeds.dll,icaapi.dll,mstlsapi.dll,ntlsapi.dll,termsrv.dll,uxtheme.dll,themeui.dll,sxs.dll
WinSxS文件夹下其实只需要
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
文件夹下的
comctl32.dll
GDIplus我的是5581,你可根据你机器上的提取相应Manifest和Dll文件
x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.2600.5581_x-ww_dfbc4fc4
——————————————————————————————————————————————————————
这样吧,我重新上传一个精简的IS_文件,你再看一看。
1,修改的注册表,添加了一些键值,比如对DX8游戏的支持;
2,修改为支持双核,理论上能在P4以上单核上启动;
3,自动检测硬件,安装驱动。(必须有相应的INF和驱动文件)

http://www.namipan.com/d/winpe.is_/f87c6f61ddaec31512be88ca4b6c23308e76c8d1a0414c02

[ 本帖最后由 yamingw 于 2009-3-22 11:03 编辑 ]
回复

使用道具 举报

19#
发表于 2009-3-22 10:19:08 | 只看该作者
楼主你上传的minlogon是不是不需要msgina.dll了?
回复

使用道具 举报

20#
 楼主| 发表于 2009-3-22 10:30:40 | 只看该作者
云飞日月
楼主你上传的minlogon是不是不需要msgina.dll了?
————————————————————————
我没有验证,可能在关机时还需要Msgina的一个资源。但启用Themes时不需要。

[ 本帖最后由 yamingw 于 2009-3-22 10:32 编辑 ]
回复

使用道具 举报

21#
发表于 2009-3-22 10:45:31 | 只看该作者
楼主,如果用你上传的minlogon,sxs还用改吗?
回复

使用道具 举报

22#
发表于 2009-3-22 10:47:26 | 只看该作者
还有一个问题,上传的minlogon里面有个注册表,再加上“修改PE的注册表,在SYSTEM\Setup下比照着SystemSetupInProgress新建一个REG_DWORD值SystemSetupInProgrest,设为0”,是不是说,要导入这两个的值?还是说,只要导入systemsetup。。。那个为0的值?
回复

使用道具 举报

23#
发表于 2009-3-22 11:34:43 | 只看该作者
我再提一个问题:
我的pe是分二段加载的。第一段通过修改注册表,利用winlogon启动一级内核的startpe.cmd来加载第二内核。达到启动整个pe的目的。
如果我用你的winlogon加载msgina.dll还能加载cmd吗?如果不能我就无法启动pe了啊!
回复

使用道具 举报

24#
 楼主| 发表于 2009-3-22 11:49:02 | 只看该作者
我修改的winlogon功能没有减少,你可放心使用。
WinPE下winlogon原版流程如下:
1,初始化
2,启动系统服务
3,启动Setup,就是你的CMD或是explorer等。
我修改的winlogon流程如下:
1,初始化
2,启动系统服务
3,加载msgina,启动主题服务
4,启动Setup,就是你的CMD或是explorer等。
回复

使用道具 举报

25#
发表于 2009-3-22 12:38:19 | 只看该作者
原帖由 yamingw 于 2009-3-22 11:49 发表
我修改的winlogon功能没有减少,你可放心使用。
WinPE下winlogon原版流程如下:
1,初始化
2,启动系统服务
3,启动Setup,就是你的CMD或是explorer等。
我修改的winlogon流程如下:
1,初始化
2,启动系 ...

好的,谢谢指导。我的一级内核可能要加不少的文件了。
另外哪个minilogon到底怎么用啊?
回复

使用道具 举报

26#
发表于 2009-3-22 12:39:37 | 只看该作者
另外你的支持双核和dx8的注册表是怎么改的?
回复

使用道具 举报

27#
发表于 2009-3-22 16:52:20 | 只看该作者




发两个开启主题的效果图。以66369的pe为核心的。
回复

使用道具 举报

28#
发表于 2009-3-22 16:54:43 | 只看该作者
楼主,我今天用你的方法试了无数遍。怎么弄都不行啊?
你能不能用我的内核做一个啊?
http://bbs.wuyou.net/forum.php?m ... &extra=page%3D1(我的pe)

另外你新发的内核有问题。测试的时候无法运行!
回复

使用道具 举报

29#
发表于 2009-3-22 18:05:53 | 只看该作者
原帖由 yamingw 于 2009-3-22 11:49 发表
我修改的winlogon功能没有减少,你可放心使用。
WinPE下winlogon原版流程如下:
1,初始化
2,启动系统服务
3,启动Setup,就是你的CMD或是explorer等。
我修改的winlogon流程如下:
1,初始化
2,启动系 ...


楼主有 WinLogon 的源码?或将它逆出来了?
回复

使用道具 举报

30#
 楼主| 发表于 2009-3-22 18:58:12 | 只看该作者

回复 #30 lxl1638 的帖子

有的是网上下载的Win2000的源码,配合着IDA反汇编,发现变化不大,只是增加了一些功能,比如保证自身的数据交换区不能被其他进程访问。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-30 08:16

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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