• WINPE
  • 为Winpe加载theme的方法

    作者:upzxt 文章来源:u盘装系统 发布时间:2012-08-17 01:07点击:

    为Winpe加载theme的方法

    如何在WinPE系统中启用WinXP的主题一直是个大难题,网上搜一搜,没有找到答案(XPE Plugin的作者Sherpya做了不少工作,但最后也说:Until themes are not working these files are only wasting space)。没办法,自己努力吧!
      有许多兄弟都想要一个现成的,不过更喜欢授人以渔,因为有好多人制作出来的WinPE都很好,有哪位兄弟先做出来,让大家也下载一个。
      先说原理:如果你看不懂,那就和我一块等着下载别人的。
      Winlogon启动后先初始化一些全局变量,检测HKEY_LOCAL_MACHINE\SYSTEM\Setup下的SystemSetupInProgress是否为0,如果是正常启动,如果为1,则在启动系统服务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(

     

    U盘装系统

     

    (责任编辑:www.upzxt.com)