ChangeServiceConfig2中的Windows崩溃

时间:2016-11-23 12:17:45

标签: windows service named-pipes

我遇到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[]的长度。

  

堆栈转储:

     

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中至少有一个错误;至少它在参数验证中失败了。

1 个答案:

答案 0 :(得分:2)

SERVICE_TRIGGER对象是正确的,但ChangeServiceConfig2想要SERVICE_TRIGGER_INFO。简单的解决方案:使用st

包裹SERVICE_TRIGGER_INFO sti{ 1, &st, NULL };