Win7pe内部原理初探
首先说一下我对win7的第一印象.首先就是大,大的让人不敢安装,后来找了一个简化版试用一下,给人印象最深的就是win7自带的搜索功能,文件名还没输完,文件就已经找到了!正是因为搜索功能,才想做一个"简化版的win7",win7pe. 搜索功能是早就实现了,但随着探索的深入,发现与原先的想象大不一样.就现阶段win7pe与xp/2k3pe相差太远了!首先还是体积,要添加一个功能,可能需要增加一个xp/2k3pe的体积.这一点在速度较慢的存储设备,比如u盘上反映最明显,启动速度过慢.原先网上传说的什么win7微内核24mb,估计是启动到smss,同样条件xp只需6mb.
1,搜索功能.Explorer启动时会装载srchadmin.dll在内存中建立索引,响应组策略.当ExplorerFrame一接收到搜索键盘输入,首先查询用户接口语言PreferUILanguge(zh-CN),根据相应的键值在HEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ContentIndex中查找分词器(chsbrkr.dll,NOISE.CHS),由SearchFolder.dll负责定义范围,最后调用StructureQuery.dll进行结构化查询.当然这中间少不了一大堆的CLSID和相应的文件,比如Query.dll,tquery.dll等.这个搜索功能的子集并不需要正常win7中那么多的Windows Search 组件,甚至不需要Software\Microsoft\Windows Search这个键值,缺点是不能在开始菜单中查找.
2,Windows服务.为了方便管理,Windows 把服务分成很多组,每一组由一个Svchost.exe管理.Svchost启动时读取注册表HKEY_LOCAL_MACHINE\SoftWare\Microsoft\Windows\CurrentVersion\Svchost中的服务配置,此后启动服务时直接从内存中取得配置参数.所以要想启用所有服务就得先手动把相应服务的配置导入注册表.Windows 缺省情况下给服务的权限只有三种,WinpeShl 通过 LsaAddRights( ) 给服务更多的权限,要不然很多服务启动不了.服务除了自身的权限,还可以从Users"继承"过来权限,比如增加工作集.AudioSrv 比较特殊,正常系统System登陆模式是可以启动的,但在win7pe中即使赋予了权限,却仍然报错权限不够.暂时还不知道原因.
3,程序中的附件.可别小看这些小程序,它们从一个侧面代表了Win7pe的复杂性,要想在win7pe中使用它们,你会发现并不容易,已经不是拷贝两三个文件所能解决的.比如图片查看器不但需要Windows图像组件的4个文件photometadatahandler.dll,windowscodecs.dll,windowscodecsext.dll,wmphoto.dll;而且还需要windows颜色组件mscms.dll,icm32.dll,以及spool文件夹下的配色文件。这是为了和打印出的图像一致,所见即所得嘛。再说画图,UIRibbon.dll,UIRibbonRes.dll是界面需要必不可少,而如果注册表中有静止图像服务,你就得有wiaservc.dll文件。windows中等待服务的时间可是两分钟啊。所以说,要想要功能,加文件增体积,没错!另外,截图工具和邮件程序更是不像话。截图工具在正常系统的System模式下也不能启动,已经不是文件和注册表的问题了。邮件程序在正常系统中也扭扭捏捏不肯出来,更别提在pe中了。
4,用户个性化.win7各版本使用相同的文件,用户激活哪个授权就是那个版本,这就是微软的软件限制策略。不但是更换墙纸功能,win7的很多特性都需要验证版本属性。先看themecpl.dll中的一段程序:
//被CThemeCplCore::InitializePage(CThemeCplPage *)和CColorCplPage::LayoutInitialized(void)调用
BOOL IsPersonalizationFeatureAvailable()
{
BOOL retV = FALSE;
DWORD dwEnable,dwData;
if ( S_OK == SLGetWindowsInformationDWORD(L"Personalization-Enabled", &dwEnable) )
{
if ( dwEnable )
{
if ( !IsOS(OS_ANYSERVER) || SHRegGetBOOLW(HKEY_LOCAL_MACHINE, L"Software\Microsoft\Windows\CurrentVersion\Personalization", L"AllowPersonalization", &dwData) >= 0 && dwData )
retV = TRUE;
}
}
return retV;
}
而SLGetWindowsInformationXX()系列API访问的都是这个键值HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ProductOptions
所以嘛,应该怎么办大家已经知道了。
要在win7pe中启用主题相对xppe来说已经纯粹是体力活了。补齐文件,补齐注册表,补齐各种服务,最后别忘了把你的DEFAULT拷到Users\Default下改名NTUSER.DAT,然后切换用户到Administrator。
不是我不想说详细点,而是东西多,忙过了还让人觉得得不偿失。
5,驱动安装.先说如何提取自己的驱动。当自动安装成功驱动后,系统会在System32\DriverStore\FileRepositorycatroot生成备份,比如NV的显卡名字会是nv_disp.inf加一串数字GUID。把此文件夹和System32\DriverStore下的几个文件拷到pe中相应的地方,因为infstrng.dat等文件记录了驱动的信息,安装时是以此为依据来找文件夹的。驱动安装时需要验证数字签名,System32\catroot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}下也得有相应的cat文件。nt5.cat记录的是windows本身的文件,pe中的文件记录不全。若要安装显卡驱动,DX的文件必不可少,缺省情况下窗口管理器也需要DX10.1的文件。当然像dispci.dll,montr_ci.dll这类设备类别安装器,System32\Drivers下相应的DX文件也必不可少。注册表中HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses和HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\class以及HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services中关于DX的项最好也补全。系统即插即用组件可千万不要少啊。声卡驱动还需要Windows Media Foundition 等组件,不过装上了也没声音,现阶段恐怕是不好办。
预留,后面补充。 感谢楼主分享,我想知道怎样使WIN8PE的查看方式默认为详细信息方式,恳请指点! 学习了 谢谢分享
谢谢分享。。。。。。。。。。
页:
1
[2]