幽灵/崩溃补丁导致COM方法返回E_ACCESSDENIED

时间:2018-01-12 18:03:32

标签: windows visual-studio visual-c++ com patch

我正在开发一个大量使用COM的项目,新的Spectre / Meltdown补丁毫无疑问地搞乱了程序中的通信。

我怎么知道?我重新映像了一台Windows机器(2017年5月),这个补丁不存在。我安装了我的程序,一切都按预期工作。然后我下载了所有必需的更新。该计划不再有效。然后我只卸载了Meltdown / Spectre补丁(2018-01基于x64的系统的Windows 10版本1507的累积更新(KB4056893)),程序恢复正常行为。

我将调试器连接到我的程序并将其追溯到这部分代码。

INvRtrControl4Itf * poRouterControl = GetNvRtrControl4();
if(poRouterControl)
{
    //the following line of code always returns E_ACCESSDENIED
    HRESULT hr = poRouterControl->GetXPTExtendedInfoForOutputs(lNumPorts, poOutputPorts, poXPTAndLPRInfo, peStatus);
    if(FAILED(hr))
    {
        ConnectToRouterControl();
        poRouterControl->Release();
        return hr;
    }
    poRouterControl->Release();
}

未修补系统上的Windows调试程序:

poRouterControl->GetXPTExtendedInfoForOutputs returns S_OK

已修补系统上的Windows调试程序:

poRouterControl->GetXPTExtendedInfoForOutputs returns E_ACCESSDENIED

我有一台COM服务器A尝试与COM服务器B通信,两者都具有相同的权限(SYSTEM)。在PATCHED系统上,当A从COM接口INvDevControl2Itf调用方法时,服务器B调用该方法而没有错误。当同一服务器A尝试从进程B上的不同接口INvRtrControl4Itf调用方法时,将返回E_ACCESSDENIED,并且我从未遇到过COM接口。在UN-PATCHED系统上,一切都按预期工作。

有没有人在COM和新的Spectre / Meltdown补丁中遇到过这个问题?我将继续寻找原因,但相同的确切代码运行完全没有安装补丁。但是客户最终会想要更新他们的系统,因此我不建议也不要告诉他们永远不要安装补丁。

1 个答案:

答案 0 :(得分:3)

Windows Support Page on the Patch Itself的帮助下,通过更改COM服务的CoInitializeSecurity()方法调用中的一些代码,我能够解决COM服务无法调用方法GetXPTExtendedInfoForOutputs的问题

hRes = CoInitializeSecurity(NULL, -1, NULL, NULL,
        RPC_C_AUTHN_LEVEL_NONE,
        RPC_C_IMP_LEVEL_IMPERSONATE,
        NULL,
        EOAC_NONE,
        NULL);

hRes = CoInitializeSecurity(NULL, -1, NULL, NULL,
        RPC_C_AUTHN_LEVEL_CALL, //<----------- changed
        RPC_C_IMP_LEVEL_IMPERSONATE,
        NULL,
        EOAC_NONE,
        NULL);

虽然它解决了这个问题,但是知道某些接口与原始代码完全正常工作有点麻烦,而其他像INvRtrControl4Itf这样的代码失败了。此外,我不需要在我正在与之通信的其他COM服务中更改CoInitializeSecurity方法初始化,只需更改调用方COM服务。其他COM服务仍然可以使用RPC_C_AUTHN_LEVEL_NONE进行初始化,我的程序可以像以前一样工作。

但是,我确实更改了所有CoInitializeSecurity方法调用以使用RPC_C_AUTHN_LEVEL_CALL,这应该可以减少未来E_ACCESSDENIED hresults的可能性。不幸的是,现在每次调用RPC服务器都需要身份验证,我将假设我的程序性能可能会受到轻微打击。我怀疑它会引起什么关注。

也许这就是为什么有些人在使用Spectre / Meltdown补丁更新他们的系统时会注意到性能损失......只是一个想法。