aboutsummaryrefslogtreecommitdiff
path: root/src/burn/engine/elevation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/burn/engine/elevation.cpp')
-rw-r--r--src/burn/engine/elevation.cpp42
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*******************************************************************/
109static HRESULT LaunchElevatedProcess(
110 __in BURN_ENGINE_STATE* pEngineState,
111 __in_opt HWND hwndParent
112 );
103static DWORD WINAPI ElevatedChildCacheThreadProc( 113static 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
1384static 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
1407LExit:
1408 ReleaseHandle(hProcess);
1409 ReleaseStr(sczParameters);
1410
1411 return hr;
1412}
1413
1374static DWORD WINAPI ElevatedChildCacheThreadProc( 1414static DWORD WINAPI ElevatedChildCacheThreadProc(
1375 __in LPVOID lpThreadParameter 1415 __in LPVOID lpThreadParameter
1376 ) 1416 )