首页 > 课堂 > 电脑知识 > 正文

PE下桌面主题使用技巧解读

2024-05-08 13:55:41
字体:
来源:转载
供稿:网友
在正常windows下更换主题相信大家也会了,但在PE下使用桌面主题大家应该就没见过吧。下面一起来操作一下吧。

  先看看原理:Winlogon启动后先初始化一些全局变量,检测HKEY_LOCAL_MACHINESYSTEMSetup下的SystemSetupInProgress是否为零,如果是正常启动,如果为1,则在启动系统服务SamSs时告诉它不要管SAM数据库,启动一些必要的服务后,比如Services,lsass,然后就启动HKEY_LOCAL_MACHINESYSTEMSetup下由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:WindowsWinSxSManifests以C:WindowsWinSxSPolicies中的规则来调用相应的文件。

  ———————————————————————————————————————————————————
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表