diff options
Diffstat (limited to 'src/burn/engine/elevation.cpp')
| -rw-r--r-- | src/burn/engine/elevation.cpp | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/src/burn/engine/elevation.cpp b/src/burn/engine/elevation.cpp index 03674f0b..c229fa58 100644 --- a/src/burn/engine/elevation.cpp +++ b/src/burn/engine/elevation.cpp | |||
| @@ -100,6 +100,16 @@ typedef struct _BURN_ELEVATION_CHILD_MESSAGE_CONTEXT | |||
| 100 | 100 | ||
| 101 | // internal function declarations | 101 | // internal function declarations |
| 102 | 102 | ||
| 103 | /******************************************************************* | ||
| 104 | LaunchElevatedProcess - Called from the per-user process to create | ||
| 105 | the per-machine process and set up the | ||
| 106 | communication pipe. | ||
| 107 | |||
| 108 | *******************************************************************/ | ||
| 109 | static HRESULT LaunchElevatedProcess( | ||
| 110 | __in BURN_ENGINE_STATE* pEngineState, | ||
| 111 | __in_opt HWND hwndParent | ||
| 112 | ); | ||
| 103 | static DWORD WINAPI ElevatedChildCacheThreadProc( | 113 | static DWORD WINAPI ElevatedChildCacheThreadProc( |
| 104 | __in LPVOID lpThreadParameter | 114 | __in LPVOID lpThreadParameter |
| 105 | ); | 115 | ); |
| @@ -367,7 +377,7 @@ extern "C" HRESULT ElevationElevate( | |||
| 367 | nResult = IDOK; | 377 | nResult = IDOK; |
| 368 | 378 | ||
| 369 | // Create the elevated process and if successful, wait for it to connect. | 379 | // Create the elevated process and if successful, wait for it to connect. |
| 370 | hr = PipeLaunchChildProcess(pEngineState->sczBundleEngineWorkingPath, &pEngineState->companionConnection, TRUE, hwndParent); | 380 | hr = LaunchElevatedProcess(pEngineState, hwndParent); |
| 371 | if (SUCCEEDED(hr)) | 381 | if (SUCCEEDED(hr)) |
| 372 | { | 382 | { |
| 373 | LogId(REPORT_STANDARD, MSG_LAUNCH_ELEVATED_ENGINE_SUCCESS); | 383 | LogId(REPORT_STANDARD, MSG_LAUNCH_ELEVATED_ENGINE_SUCCESS); |
| @@ -1371,6 +1381,36 @@ LExit: | |||
| 1371 | 1381 | ||
| 1372 | // internal function definitions | 1382 | // internal function definitions |
| 1373 | 1383 | ||
| 1384 | static HRESULT LaunchElevatedProcess( | ||
| 1385 | __in BURN_ENGINE_STATE* pEngineState, | ||
| 1386 | __in_opt HWND hwndParent | ||
| 1387 | ) | ||
| 1388 | { | ||
| 1389 | HRESULT hr = S_OK; | ||
| 1390 | DWORD dwCurrentProcessId = ::GetCurrentProcessId(); | ||
| 1391 | LPWSTR sczParameters = NULL; | ||
| 1392 | HANDLE hProcess = NULL; | ||
| 1393 | BURN_PIPE_CONNECTION* pConnection = &pEngineState->companionConnection; | ||
| 1394 | |||
| 1395 | hr = StrAllocFormatted(&sczParameters, L"-q -%ls %ls %ls %u", BURN_COMMANDLINE_SWITCH_ELEVATED, pConnection->sczName, pConnection->sczSecret, dwCurrentProcessId); | ||
| 1396 | ExitOnFailure(hr, "Failed to allocate parameters for elevated process."); | ||
| 1397 | |||
| 1398 | // Since ShellExecuteEx doesn't support passing inherited handles, don't bother with CoreAppendFileHandleSelfToCommandLine. | ||
| 1399 | // We could fallback to using ::DuplicateHandle to inject the file handle later if necessary. | ||
| 1400 | hr = ShelExec(pEngineState->sczBundleEngineWorkingPath, sczParameters, L"runas", NULL, SW_SHOWNA, hwndParent, &hProcess); | ||
| 1401 | ExitOnFailure(hr, "Failed to launch elevated child process: %ls", pEngineState->sczBundleEngineWorkingPath); | ||
| 1402 | |||
| 1403 | pConnection->dwProcessId = ::GetProcessId(hProcess); | ||
| 1404 | pConnection->hProcess = hProcess; | ||
| 1405 | hProcess = NULL; | ||
| 1406 | |||
| 1407 | LExit: | ||
| 1408 | ReleaseHandle(hProcess); | ||
| 1409 | ReleaseStr(sczParameters); | ||
| 1410 | |||
| 1411 | return hr; | ||
| 1412 | } | ||
| 1413 | |||
| 1374 | static DWORD WINAPI ElevatedChildCacheThreadProc( | 1414 | static DWORD WINAPI ElevatedChildCacheThreadProc( |
| 1375 | __in LPVOID lpThreadParameter | 1415 | __in LPVOID lpThreadParameter |
| 1376 | ) | 1416 | ) |
