2016-11-23 33 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 };