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 发生访问冲突,很明显这是一个未经检查的空指针。而且它不是 st
或 stdata
中的空指针。地址 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
我在使用 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[]
.
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