的Windows崩溃ChangeServiceConfig2
我在与ChangeServiceConfig2问题(... ... SERVICE_CONFIG_TRIGGER_INFO)的Windows崩溃ChangeServiceConfig2
相关代码:
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()012 ! sechost.dll ChangeServiceConfig2W()
的Service
成员是没有问题的,或ChangeServiceConfig2
本身:我可以通过ChangeServiceConfig2(Service, SERVICE_CONFIG_DESCRIPTION, &desc);
设置服务描述。该问题似乎在解析SERVICE_TRIGGER
。命名管道服务触发器显然适用于远程注册表服务,因此它并没有从根本上打破。
问:我的SERVICE_TRIGGER
哪部分是错的?
显然Windows中至少有一个bug;至少它在参数验证中失败了。
SERVICE_TRIGGER
对象是正确的,但ChangeServiceConfig2
想要SERVICE_TRIGGER_INFO
。简单的解决方案:包装st
使用SERVICE_TRIGGER_INFO sti{ 1, &st, NULL };
https://blogs.msdn.microsoft.com/oldnewthing/20091210-00/?p=15713 –