有部分刚开始接触美化的朋友不理解为什么必须使用StyleXP或Uxtheme-MultiPatcher才能使用第三方的msstyles文件,现在在这里给大家做个解释:
在WinXP中,系统界面的外观绘制工作由位于System32目录下的Uxtheme.dll中的API来完成。.msstyles文件是微软定义的一套界面元素集合文件,用StyleBuilder打开可以看到里面有很多位图,很显然,Uxtheme的工作就是把这些位图根据msstyles文件里定义的配置"贴"到系统界面的相应元素上,因此有人把这套绘制机制称为"引擎"。
然而,微软的这个引擎并不为没有经过微软数字签名的msstyles文件工作。Uxtheme的工作机制大概是这样:
1.打开msstyles文件,调用Advapi32.dll中的CryptVerifySignatureW()检查数字签名,若返回FALSE,则不进行后续操作。
2.分析msstyles文件,为窗口过程的相关绘制函数(如OnNcPaint等)注册钩子回调,因此每个窗口应用程序创建时都会由注册的一系列回调函数完成窗口的绘制。
3.完成绘制后的更新通知。通常窗口都会收到WM_THEMECHANGED消息。
要想让引擎为第三方的msstyles文件工作,必须想办法绕过数字签名的验证。绕过的方法有很多,但目的都一样,就是使上面提到的CryptVerifySignatureW()始终返回TRUE即可。
下面再分别说下StyleXP和Uxtheme-MultiPatcher:
StyleXP在安装后会启动一个StyleXPService的系统服务,这个服务的作用之一就是使Uxtheme.dll在调用CryptVerifySignatureW()验证msstyles文件时返回TRUE,而其他程序做其他验证则返回正常调用时原本的返回值。这个服务会驻留内存运行,因此会占少量的系统资源。
MulitPatcher则是直接修改Uxtheme.dll文件中验证msstyles文件的部分,经过修改的Uxtheme.dll相当于不对msstyles文件进行验证。有部分网友反映使用MulitPatcher后造成系统不稳定或者异常,因为不同版本的Uxtheme.dll中关于验证的偏移位置不同,所以可以去下载对应版本的修改后的文件,但注意由于文件保护机制的存在,需要使用专门的替换工具或在DOS进行。 |