欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

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

程序员文章站 2022-06-02 14:51:43
PE下桌面主题使用技巧解读windows下更换主题相信大家都会,但在PE下使用桌面主题对大家来说,或许就有点难度了,下面为大家介绍个小技巧,大家可以参考下... 14-04-01...
在正常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中的规则来调用相应的文件。

  ———————————————————————————————————————————————————

  动手了:

  1、启用themes需要以下文件:修改版的winlogon调用msgina.dll或直接修改minlogon(xpe feathure pack 2007 中有此文件),winlogon,msgina.dll,shsvcs.dll,activeds.dll,,uxtheme.dll,themeui.dll,sxs.dllc:windowswinsxsmanifests文件夹中的(对应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:windowswinsxspoliciesx86_policy.6.0.microsoft.windows.common-controls_6595b64144ccf1df_x-ww_5ddad775

  文件夹下的

  6.0.2600.5512.cat

  6.0.2600.5512.policy

  c:windowswinsxsx86_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的注册表,在systemsetup下比照着systemsetupinprogress新建一个reg_dword值systemsetupinprogrest,设为0。特别注意要修改services.exe中的systemsetupinprogress为systemsetupinprogrest。

  同时测试了基于bartpe的xpe硬盘版,因为xpe使用自己的pegina.dll重新进入sas序列,所以无法启用主题。

  ———————————————————————————————————————————————————

  上传一个修改过的minlogon,切记修改注册表。对了,最重要的是别忘了加上你自己的主题文件,它们一般在windowsresources文件夹下。传了一个压缩的,是用我心如水的pe做的(hhh333的也不错,不过他的是sp2的,测试不方便),我重新上传一个精简过文件的is_文件,可直接替换我心如水里面的winpe.is_

  1、修改的注册表,添加了一些键值,比如对dx8游戏的支持;

  2、修改为支持双核,理论上能在p4以上单核上启动;

  3、自动检测硬件,安装驱动。(必须有相应的inf和驱动文件)

  今天上传了一个自己用的img格式的内核,根据站长的研究使主题自动开启。其中添加了vc2005的运行库,内置nv显示驱动,配合外置的dx9可以玩现在的新游戏了。

  有一个小问题,墙纸不能自动加载是因为windows只认bmp格式的图片,jpg格式的要转换成bmp。把你需要的墙纸转换成bmp,然后再修改hkey_current_usercontrol paneldesktop下的wallpaper路径指向你自己的图片。
相关标签: PE 桌面主题