Windows ChangeServiceConfig2 崩溃

Windows crash in ChangeServiceConfig2

我在使用 ChangeServiceConfig2(...SERVICE_CONFIG_TRIGGER_INFO...)

时遇到问题

相关代码:

    WCHAR test[] = L"TEST12";
    SERVICE_TRIGGER_SPECIFIC_DATA_ITEM stdata {
        SERVICE_TRIGGER_DATA_TYPE_STRING,
        wcslen(test)*sizeof(WCHAR),
        reinterpret_cast<BYTE*>(test)
    };
    SERVICE_TRIGGER st {
        SERVICE_TRIGGER_TYPE_NETWORK_ENDPOINT,
        SERVICE_TRIGGER_ACTION_SERVICE_START,
        const_cast<GUID*>(&NAMED_PIPE_EVENT_GUID),
        1, &stdata
    };
    ChangeServiceConfig2(Service, SERVICE_CONFIG_TRIGGER_INFO, &st);

这会导致地址 00000009 发生访问冲突,很明显这是一个未经检查的空指针。而且它不是 ststdata 中的空指针。地址 00000009 不依赖于 test[].

的长度

Stack dump:

rpcrt4.dll!NdrpEmbeddedRepeatPointerBufferSize()
rpcrt4.dll!NdrConformantArrayBufferSize()
rpcrt4.dll!NdrSimpleStructBufferSize()
rpcrt4.dll!NdrpUnionBufferSize()
rpcrt4.dll!_NdrNonEncapsulatedUnionBufferSize@12()
rpcrt4.dll!NdrComplexStructBufferSize()
rpcrt4.dll!NdrClientCall2() rpcrt4.dll!_NdrClientCall4()
sechost.dll!ChangeServiceConfig2W()

Service 成员不是问题,或者 ChangeServiceConfig2 本身:我可以通过 ChangeServiceConfig2(Service, SERVICE_CONFIG_DESCRIPTION, &desc); 设置服务描述。问题似乎出在 SERVICE_TRIGGER 的解析中。命名管道服务触发器显然适用于远程注册表服务,因此它并没有从根本上被破坏。

问:我的SERVICE_TRIGGER哪一部分是错的?

显然 Windows 中至少有一个错误;至少它在参数验证中失败了。

SERVICE_TRIGGER 对象是正确的,但是 ChangeServiceConfig2 想要一个 SERVICE_TRIGGER_INFO。简单的解决方案:使用 SERVICE_TRIGGER_INFO sti{ 1, &st, NULL };

包装 st