我遇到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上的访问冲突,因此显然是未经检查的空指针。并且它不是st
或stdata
中的空指针。地址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中至少有一个错误;至少它在参数验证中失败了。
答案 0 :(得分:2)
SERVICE_TRIGGER
对象是正确的,但ChangeServiceConfig2
想要SERVICE_TRIGGER_INFO
。简单的解决方案:使用st
SERVICE_TRIGGER_INFO sti{ 1, &st, NULL };