2016-11-23 111 views
0

我在与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访问冲突,所以显然是未经检查的空指针。并且它不是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()012 ! sechost.dll ChangeServiceConfig2W()

Service成员是没有问题的,或ChangeServiceConfig2本身:我可以通过ChangeServiceConfig2(Service, SERVICE_CONFIG_DESCRIPTION, &desc);设置服务描述。该问题似乎在解析SERVICE_TRIGGER。命名管道服务触发器显然适用于远程注册表服务,因此它并没有从根本上打破。

问:我的SERVICE_TRIGGER哪部分是错的?

显然Windows中至少有一个bug;至少它在参数验证中失败了。

+0

https://blogs.msdn.microsoft.com/oldnewthing/20091210-00/?p=15713 –

回答

2

SERVICE_TRIGGER对象是正确的,但ChangeServiceConfig2想要SERVICE_TRIGGER_INFO。简单的解决方案:包装st使用SERVICE_TRIGGER_INFO sti{ 1, &st, NULL };