怎么查看缺少哪些文件?这里要用到一个小工具depends,用depends打开前面提到的Vid服务的vid.sys文件,如图。
这是打开正常系统的vid.sys驱动文件,显示相关的文件列表如下:\System32\NTOSKRNL.EXE\System32\BOOTVID.DLL\System32\CI.DLL\System32\HAL.DLL\System32\KDCOM.DLL\System32\PSHED.DLL\System32\drivers\CNG.SYS\System32\drivers\KSECDD.SYS\System32\drivers\MSRPC.SYS\System32\drivers\WDFLDR.SYS\System32\drivers\WINHVR.SYS\System32\zh-cn\PSHED.DLL.mui
最后的一个\System32\zh-cn\PSHED.DLL.mui文件是\System32\PSHED.DLL的mui文件。对比文件列表,不同的PE可能缺少的文件不同,缺少的文件自行复制到对应的目录。打包WIM测试,还是驱动异常。与Vid.sysy驱动文件有关的文件是补齐了,驱动异常说明还缺少其他的文件甚至服务。最省事的做法,将正常系统中与这个驱动类似的文件vm*.dll,vm*.sys都复制过去(包括对应的mui文件),将CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}文件夹中带HyperV,VM的文件也一起复制。打包WIM测试,结果让人失望,还是异常。怎么办?文件应该不缺,要缺的只有服务了。注册表虽然没有过度精简过,但是指不定有些服务在注册表里被精简了。打开注册表HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services,与正常系统对比,重点关注VM开头的服务,将vmbus服务,VMBusHID服务,vmgid服务都添加上。别忘了这些服务对应的驱动或文件也要添加。如vmbus服务要注入wvmbus.inf_amd64_a192dbf28b4634a7驱动,vmgid服务要注入wvmgid.inf_amd64_3a0240393de08f95驱动,VMBusHID服务要复制VMBusHID.sys文件。最简单最省事的办法,说起来还是不少,操作时还不能粗心大意,不要忘了mui文件,不要复制错文件夹等等。再打包测试,打开设备管理器,有个小惊喜,驱动正常了!就为了去掉这个设备驱动的黄色小感叹号,来来回回折腾。总算是成功了。办法老土,我实在没有精准定位缺失哪些文件,注册表设置甚至服务的能力,只能采取大而化之的办法。如果要精简到极致,这个土办法不适合。要么能精确找到缺少的文件,注册表,要么一个一个文件添加测试,总能成功的。列举的文件,注册表,服务仅限于此PE,即使相同的版本,不同的PE可能也会不同。只是给出驱动集成的思路和一般做法供参考,在PE中没有测试虚拟机,如果虚拟机不能运行,那还要补充其他文件和服务。