HOWTO: 解决 Windows 10 Hyper-V Host Compute 启动故障 0x80070005
今天微软为 Windows 10 v1709 发布了新的累计更新 KB4093105(16299.402),解决了不少的问题,于是 gOxiA 一早更新了这个补丁,但在更新完毕重启后发现 Hyper-V 无法使用,但在已知问题列表中未查询到有价值的信息。
打开服务管理器(Services.msc)检查 Hyper-V 相关服务,发现 Hyper-V Host Compute Service 服务无法正常启动,提示 0x80070005 访问拒绝。而在事件查看器中也找到了这个事件的记录。
抓包大概看了一下,在栈中比较可疑的是“mmunsecurevirtualmemory”,貌似因为传递了未加密的虚拟内存数据,难不成因为什么安全规则导致的?!但貌似这函数与Hyper-V也没有直接的关系,Bing 了一下也没什么参考资料,也许这个思路就是错误的!!!
之后也想过用 WinDbg 附加到该服务上看看具体过程,但使用 gflags 附加 vmcompute.exe 未能成功启动 WinDbg,也没再深入研究为什么!!迷茫中,想起来同系统版本的其他机器也打了补丁,倒是没有发生这个故障,比较了两个系统设置,唯独是正常运行Hyper-V的机器禁用了 Defender,之后做了对比和测试找到了影响 Hyper-V 服务启动的根因——Control Flow Guard(CFG),Exploit protection 的一个子功能。有关 CFG 的介绍可以参考官方文档:“Control Flow Guard”。
结论,当 CFG 为关闭状态时就会导致 Hyper-V Compute Service服务启动失败,所以必须将其设置为“On by default”。其中的“奥妙”也许只能期待以后微软方面能给出详细的说明!