diff options
Diffstat (limited to 'src/libs/dutil/WixToolset.DUtil/apputil.cpp')
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/apputil.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/libs/dutil/WixToolset.DUtil/apputil.cpp b/src/libs/dutil/WixToolset.DUtil/apputil.cpp index 9e75082a..42f589dc 100644 --- a/src/libs/dutil/WixToolset.DUtil/apputil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/apputil.cpp | |||
@@ -313,6 +313,74 @@ LExit: | |||
313 | return hr; | 313 | return hr; |
314 | } | 314 | } |
315 | 315 | ||
316 | DAPI_(HRESULT) AppWaitForSingleObject( | ||
317 | __in HANDLE hHandle, | ||
318 | __in DWORD dwMilliseconds | ||
319 | ) | ||
320 | { | ||
321 | HRESULT hr = S_OK; | ||
322 | DWORD dwResult = 0; | ||
323 | |||
324 | dwResult = ::WaitForSingleObject(hHandle, dwMilliseconds); | ||
325 | if (WAIT_TIMEOUT == dwResult) | ||
326 | { | ||
327 | ExitFunction1(hr = HRESULT_FROM_WIN32(dwResult)); | ||
328 | } | ||
329 | else if (WAIT_ABANDONED == dwResult) | ||
330 | { | ||
331 | AppExitOnWin32Error(dwResult, hr, "Abandoned wait for single object."); | ||
332 | } | ||
333 | else if (WAIT_OBJECT_0 != dwResult) | ||
334 | { | ||
335 | AssertSz(WAIT_FAILED == dwResult, "Unexpected return code from WaitForSingleObject."); | ||
336 | AppExitWithLastError(hr, "Failed to wait for single object."); | ||
337 | } | ||
338 | |||
339 | LExit: | ||
340 | return hr; | ||
341 | } | ||
342 | |||
343 | DAPI_(HRESULT) AppWaitForMultipleObjects( | ||
344 | __in DWORD dwCount, | ||
345 | __in const HANDLE* rghHandles, | ||
346 | __in BOOL fWaitAll, | ||
347 | __in DWORD dwMilliseconds, | ||
348 | __out_opt DWORD* pdwSignaledIndex | ||
349 | ) | ||
350 | { | ||
351 | HRESULT hr = S_OK; | ||
352 | DWORD dwResult = 0; | ||
353 | DWORD dwSignaledIndex = dwCount; | ||
354 | |||
355 | dwResult = ::WaitForMultipleObjects(dwCount, rghHandles, fWaitAll, dwMilliseconds); | ||
356 | if (WAIT_TIMEOUT == dwResult) | ||
357 | { | ||
358 | ExitFunction1(hr = HRESULT_FROM_WIN32(dwResult)); | ||
359 | } | ||
360 | else if (WAIT_ABANDONED_0 <= dwResult && (WAIT_ABANDONED_0 + dwCount) > dwResult) | ||
361 | { | ||
362 | dwSignaledIndex = dwResult - WAIT_ABANDONED_0; | ||
363 | AppExitOnWin32Error(dwResult, hr, "Abandoned wait for multiple objects, index: %u.", dwSignaledIndex); | ||
364 | } | ||
365 | else if (WAIT_OBJECT_0 <= dwResult && (WAIT_OBJECT_0 + dwCount) > dwResult) | ||
366 | { | ||
367 | dwSignaledIndex = dwResult - WAIT_OBJECT_0; | ||
368 | } | ||
369 | else | ||
370 | { | ||
371 | AssertSz(WAIT_FAILED == dwResult, "Unexpected return code from WaitForMultipleObjects."); | ||
372 | AppExitWithLastError(hr, "Failed to wait for multiple objects."); | ||
373 | } | ||
374 | |||
375 | LExit: | ||
376 | if (pdwSignaledIndex) | ||
377 | { | ||
378 | *pdwSignaledIndex = dwSignaledIndex; | ||
379 | } | ||
380 | |||
381 | return hr; | ||
382 | } | ||
383 | |||
316 | static HRESULT EscapeCommandLineArgument( | 384 | static HRESULT EscapeCommandLineArgument( |
317 | __in_z LPCWSTR wzArgument, | 385 | __in_z LPCWSTR wzArgument, |
318 | __out_z LPWSTR* psczEscaped | 386 | __out_z LPWSTR* psczEscaped |