我对ChangeViceConfig2有问题(... 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! rpcrt4.dll!ndrConformantArrayBuffersize()
rpcrt4.dll!ndrsimplestructBuffersize()
rpcrt4.dll!ndrpunionbuffersize()
rpcrt4.dll! rpcrt4.dll!ndrcomplexstructBuffersize()
rpcrt4.dll!ndrclientCall2()rpcrt4.dll!_ndrclientCall4()
sechost.dll!changeviceconfig2w()
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