aboutsummaryrefslogtreecommitdiff
path: root/src/burn/engine/core.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/burn/engine/core.cpp')
-rw-r--r--src/burn/engine/core.cpp231
1 files changed, 141 insertions, 90 deletions
diff --git a/src/burn/engine/core.cpp b/src/burn/engine/core.cpp
index 478aa692..dc976eb4 100644
--- a/src/burn/engine/core.cpp
+++ b/src/burn/engine/core.cpp
@@ -14,26 +14,14 @@ struct BURN_CACHE_THREAD_CONTEXT
14 14
15// internal function declarations 15// internal function declarations
16 16
17static HRESULT ParseCommandLine( 17static HRESULT GetSanitizedCommandLine(
18 __in int argc, 18 __in int argc,
19 __in LPWSTR* argv, 19 __in LPWSTR* argv,
20 __in BOOTSTRAPPER_COMMAND* pCommand, 20 __in BOOTSTRAPPER_COMMAND* pCommand,
21 __in BURN_PIPE_CONNECTION* pCompanionConnection,
22 __in BURN_PIPE_CONNECTION* pEmbeddedConnection,
23 __in BURN_VARIABLES* pVariables, 21 __in BURN_VARIABLES* pVariables,
24 __out BURN_MODE* pMode, 22 __in DWORD cUnknownArgs,
25 __out BURN_AU_PAUSE_ACTION* pAutomaticUpdates, 23 __in int* rgUnknownArgs,
26 __out BOOL* pfDisableSystemRestore, 24 __inout_z LPWSTR* psczSanitizedCommandLine
27 __out_z LPWSTR* psczSourceProcessPath,
28 __out_z LPWSTR* psczOriginalSource,
29 __out BOOL* pfDisableUnelevate,
30 __out DWORD *pdwLoggingAttributes,
31 __out_z LPWSTR* psczLogFile,
32 __out_z LPWSTR* psczActiveParent,
33 __out_z LPWSTR* psczIgnoreDependencies,
34 __out_z LPWSTR* psczAncestors,
35 __out_z LPWSTR* psczSanitizedCommandLine,
36 __inout BOOL* pfInvalidCommandLine
37 ); 25 );
38static HRESULT ParsePipeConnection( 26static HRESULT ParsePipeConnection(
39 __in_ecount(3) LPWSTR* rgArgs, 27 __in_ecount(3) LPWSTR* rgArgs,
@@ -78,9 +66,7 @@ extern "C" HRESULT CoreInitialize(
78 SIZE_T cbBuffer = 0; 66 SIZE_T cbBuffer = 0;
79 BURN_CONTAINER_CONTEXT containerContext = { }; 67 BURN_CONTAINER_CONTEXT containerContext = { };
80 BOOL fElevated = FALSE; 68 BOOL fElevated = FALSE;
81 LPWSTR sczSourceProcessPath = NULL;
82 LPWSTR sczSourceProcessFolder = NULL; 69 LPWSTR sczSourceProcessFolder = NULL;
83 LPWSTR sczOriginalSource = NULL;
84 70
85 // Initialize variables. 71 // Initialize variables.
86 hr = VariableInitialize(&pEngineState->variables); 72 hr = VariableInitialize(&pEngineState->variables);
@@ -103,9 +89,8 @@ extern "C" HRESULT CoreInitialize(
103 hr = ContainersInitialize(&pEngineState->containers, &pEngineState->section); 89 hr = ContainersInitialize(&pEngineState->containers, &pEngineState->section);
104 ExitOnFailure(hr, "Failed to initialize containers."); 90 ExitOnFailure(hr, "Failed to initialize containers.");
105 91
106 // Parse command line. 92 hr = GetSanitizedCommandLine(pEngineState->argc, pEngineState->argv, &pEngineState->command, &pEngineState->variables, pEngineState->cUnknownArgs, pEngineState->rgUnknownArgs, &sczSanitizedCommandLine);
107 hr = ParseCommandLine(pEngineState->argc, pEngineState->argv, &pEngineState->command, &pEngineState->companionConnection, &pEngineState->embeddedConnection, &pEngineState->variables, &pEngineState->mode, &pEngineState->automaticUpdates, &pEngineState->fDisableSystemRestore, &sczSourceProcessPath, &sczOriginalSource, &pEngineState->fDisableUnelevate, &pEngineState->log.dwAttributes, &pEngineState->log.sczPath, &pEngineState->registration.sczActiveParent, &pEngineState->sczIgnoreDependencies, &pEngineState->registration.sczAncestors, &sczSanitizedCommandLine, &pEngineState->fInvalidCommandLine); 93 ExitOnFailure(hr, "Fatal error while sanitizing command line.");
108 ExitOnFailure(hr, "Fatal error while parsing command line.");
109 94
110 LogId(REPORT_STANDARD, MSG_BURN_COMMAND_LINE, sczSanitizedCommandLine ? sczSanitizedCommandLine : L""); 95 LogId(REPORT_STANDARD, MSG_BURN_COMMAND_LINE, sczSanitizedCommandLine ? sczSanitizedCommandLine : L"");
111 96
@@ -129,12 +114,12 @@ extern "C" HRESULT CoreInitialize(
129 hr = VariableSetNumeric(&pEngineState->variables, BURN_BUNDLE_UILEVEL, pEngineState->command.display, TRUE); 114 hr = VariableSetNumeric(&pEngineState->variables, BURN_BUNDLE_UILEVEL, pEngineState->command.display, TRUE);
130 ExitOnFailure(hr, "Failed to overwrite the %ls built-in variable.", BURN_BUNDLE_UILEVEL); 115 ExitOnFailure(hr, "Failed to overwrite the %ls built-in variable.", BURN_BUNDLE_UILEVEL);
131 116
132 if (sczSourceProcessPath) 117 if (pEngineState->internalCommand.sczSourceProcessPath)
133 { 118 {
134 hr = VariableSetString(&pEngineState->variables, BURN_BUNDLE_SOURCE_PROCESS_PATH, sczSourceProcessPath, TRUE, FALSE); 119 hr = VariableSetString(&pEngineState->variables, BURN_BUNDLE_SOURCE_PROCESS_PATH, pEngineState->internalCommand.sczSourceProcessPath, TRUE, FALSE);
135 ExitOnFailure(hr, "Failed to set source process path variable."); 120 ExitOnFailure(hr, "Failed to set source process path variable.");
136 121
137 hr = PathGetDirectory(sczSourceProcessPath, &sczSourceProcessFolder); 122 hr = PathGetDirectory(pEngineState->internalCommand.sczSourceProcessPath, &sczSourceProcessFolder);
138 ExitOnFailure(hr, "Failed to get source process folder from path."); 123 ExitOnFailure(hr, "Failed to get source process folder from path.");
139 124
140 hr = VariableSetString(&pEngineState->variables, BURN_BUNDLE_SOURCE_PROCESS_FOLDER, sczSourceProcessFolder, TRUE, FALSE); 125 hr = VariableSetString(&pEngineState->variables, BURN_BUNDLE_SOURCE_PROCESS_FOLDER, sczSourceProcessFolder, TRUE, FALSE);
@@ -143,15 +128,15 @@ extern "C" HRESULT CoreInitialize(
143 128
144 // Set BURN_BUNDLE_ORIGINAL_SOURCE, if it was passed in on the command line. 129 // Set BURN_BUNDLE_ORIGINAL_SOURCE, if it was passed in on the command line.
145 // Needs to be done after ManifestLoadXmlFromBuffer. 130 // Needs to be done after ManifestLoadXmlFromBuffer.
146 if (sczOriginalSource) 131 if (pEngineState->internalCommand.sczOriginalSource)
147 { 132 {
148 hr = VariableSetString(&pEngineState->variables, BURN_BUNDLE_ORIGINAL_SOURCE, sczOriginalSource, FALSE, FALSE); 133 hr = VariableSetString(&pEngineState->variables, BURN_BUNDLE_ORIGINAL_SOURCE, pEngineState->internalCommand.sczOriginalSource, FALSE, FALSE);
149 ExitOnFailure(hr, "Failed to set original source variable."); 134 ExitOnFailure(hr, "Failed to set original source variable.");
150 } 135 }
151 136
152 if (BURN_MODE_UNTRUSTED == pEngineState->mode || BURN_MODE_NORMAL == pEngineState->mode || BURN_MODE_EMBEDDED == pEngineState->mode) 137 if (BURN_MODE_UNTRUSTED == pEngineState->mode || BURN_MODE_NORMAL == pEngineState->mode || BURN_MODE_EMBEDDED == pEngineState->mode)
153 { 138 {
154 hr = CacheInitialize(&pEngineState->registration, &pEngineState->variables, sczSourceProcessPath); 139 hr = CacheInitialize(&pEngineState->registration, &pEngineState->variables, pEngineState->internalCommand.sczSourceProcessPath);
155 ExitOnFailure(hr, "Failed to initialize internal cache functionality."); 140 ExitOnFailure(hr, "Failed to initialize internal cache functionality.");
156 } 141 }
157 142
@@ -174,9 +159,7 @@ extern "C" HRESULT CoreInitialize(
174 } 159 }
175 160
176LExit: 161LExit:
177 ReleaseStr(sczOriginalSource);
178 ReleaseStr(sczSourceProcessFolder); 162 ReleaseStr(sczSourceProcessFolder);
179 ReleaseStr(sczSourceProcessPath);
180 ContainerClose(&containerContext); 163 ContainerClose(&containerContext);
181 ReleaseStr(sczStreamName); 164 ReleaseStr(sczStreamName);
182 ReleaseStr(sczSanitizedCommandLine); 165 ReleaseStr(sczSanitizedCommandLine);
@@ -1177,43 +1160,38 @@ LExit:
1177 LogId(REPORT_STANDARD, MSG_CLEANUP_COMPLETE, hr); 1160 LogId(REPORT_STANDARD, MSG_CLEANUP_COMPLETE, hr);
1178} 1161}
1179 1162
1180// internal helper functions 1163extern "C" HRESULT CoreParseCommandLine(
1181
1182static HRESULT ParseCommandLine(
1183 __in int argc, 1164 __in int argc,
1184 __in LPWSTR* argv, 1165 __in LPWSTR* argv,
1185 __in BOOTSTRAPPER_COMMAND* pCommand, 1166 __in BOOTSTRAPPER_COMMAND* pCommand,
1186 __in BURN_PIPE_CONNECTION* pCompanionConnection, 1167 __in BURN_PIPE_CONNECTION* pCompanionConnection,
1187 __in BURN_PIPE_CONNECTION* pEmbeddedConnection, 1168 __in BURN_PIPE_CONNECTION* pEmbeddedConnection,
1188 __in BURN_VARIABLES* pVariables, 1169 __inout BURN_MODE* pMode,
1189 __out BURN_MODE* pMode, 1170 __inout BURN_AU_PAUSE_ACTION* pAutomaticUpdates,
1190 __out BURN_AU_PAUSE_ACTION* pAutomaticUpdates, 1171 __inout BOOL* pfDisableSystemRestore,
1191 __out BOOL* pfDisableSystemRestore, 1172 __inout_z LPWSTR* psczSourceProcessPath,
1192 __out_z LPWSTR* psczSourceProcessPath, 1173 __inout_z LPWSTR* psczOriginalSource,
1193 __out_z LPWSTR* psczOriginalSource, 1174 __inout HANDLE* phSectionFile,
1194 __out BOOL* pfDisableUnelevate, 1175 __inout HANDLE* phSourceEngineFile,
1195 __out DWORD *pdwLoggingAttributes, 1176 __inout BOOL* pfDisableUnelevate,
1196 __out_z LPWSTR* psczLogFile, 1177 __inout DWORD* pdwLoggingAttributes,
1197 __out_z LPWSTR* psczActiveParent, 1178 __inout_z LPWSTR* psczLogFile,
1198 __out_z LPWSTR* psczIgnoreDependencies, 1179 __inout_z LPWSTR* psczActiveParent,
1199 __out_z LPWSTR* psczAncestors, 1180 __inout_z LPWSTR* psczIgnoreDependencies,
1200 __out_z LPWSTR* psczSanitizedCommandLine, 1181 __inout_z LPWSTR* psczAncestors,
1201 __inout BOOL* pfInvalidCommandLine 1182 __inout BOOL* pfInvalidCommandLine,
1183 __inout DWORD* pcUnknownArgs,
1184 __inout int** prgUnknownArgs
1202 ) 1185 )
1203{ 1186{
1204 HRESULT hr = S_OK; 1187 HRESULT hr = S_OK;
1205 BOOL fUnknownArg = FALSE; 1188 BOOL fUnknownArg = FALSE;
1206 BOOL fHidden = FALSE;
1207 LPWSTR sczCommandLine = NULL;
1208 LPWSTR sczSanitizedArgument = NULL;
1209 LPWSTR sczVariableName = NULL;
1210 BOOL fInvalidCommandLine = FALSE; 1189 BOOL fInvalidCommandLine = FALSE;
1190 DWORD64 qw = 0;
1211 1191
1212 for (int i = 0; i < argc; ++i) 1192 for (int i = 0; i < argc; ++i)
1213 { 1193 {
1214 fUnknownArg = FALSE; 1194 fUnknownArg = FALSE;
1215 int originalIndex = i;
1216 ReleaseNullStr(sczSanitizedArgument);
1217 1195
1218 if (argv[i][0] == L'-' || argv[i][0] == L'/') 1196 if (argv[i][0] == L'-' || argv[i][0] == L'/')
1219 { 1197 {
@@ -1414,6 +1392,12 @@ static HRESULT ParseCommandLine(
1414 } 1392 }
1415 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], lstrlenW(BURN_COMMANDLINE_SWITCH_CLEAN_ROOM), BURN_COMMANDLINE_SWITCH_CLEAN_ROOM, lstrlenW(BURN_COMMANDLINE_SWITCH_CLEAN_ROOM))) 1393 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], lstrlenW(BURN_COMMANDLINE_SWITCH_CLEAN_ROOM), BURN_COMMANDLINE_SWITCH_CLEAN_ROOM, lstrlenW(BURN_COMMANDLINE_SWITCH_CLEAN_ROOM)))
1416 { 1394 {
1395 if (BURN_MODE_UNTRUSTED != *pMode)
1396 {
1397 fInvalidCommandLine = TRUE;
1398 TraceLog(E_INVALIDARG, "Multiple mode command-line switches were provided.");
1399 }
1400
1417 // Get a pointer to the next character after the switch. 1401 // Get a pointer to the next character after the switch.
1418 LPCWSTR wzParam = &argv[i][1 + lstrlenW(BURN_COMMANDLINE_SWITCH_CLEAN_ROOM)]; 1402 LPCWSTR wzParam = &argv[i][1 + lstrlenW(BURN_COMMANDLINE_SWITCH_CLEAN_ROOM)];
1419 if (L'=' != wzParam[0] || L'\0' == wzParam[1]) 1403 if (L'=' != wzParam[0] || L'\0' == wzParam[1])
@@ -1428,12 +1412,6 @@ static HRESULT ParseCommandLine(
1428 hr = StrAllocString(psczSourceProcessPath, wzParam + 1, 0); 1412 hr = StrAllocString(psczSourceProcessPath, wzParam + 1, 0);
1429 ExitOnFailure(hr, "Failed to copy source process path."); 1413 ExitOnFailure(hr, "Failed to copy source process path.");
1430 } 1414 }
1431
1432 if (BURN_MODE_UNTRUSTED != *pMode)
1433 {
1434 fInvalidCommandLine = TRUE;
1435 TraceLog(E_INVALIDARG, "Multiple mode command-line switches were provided.");
1436 }
1437 } 1415 }
1438 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], -1, BURN_COMMANDLINE_SWITCH_EMBEDDED, -1)) 1416 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], -1, BURN_COMMANDLINE_SWITCH_EMBEDDED, -1))
1439 { 1417 {
@@ -1551,11 +1529,47 @@ static HRESULT ParseCommandLine(
1551 } 1529 }
1552 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], lstrlenW(BURN_COMMANDLINE_SWITCH_FILEHANDLE_ATTACHED), BURN_COMMANDLINE_SWITCH_FILEHANDLE_ATTACHED, lstrlenW(BURN_COMMANDLINE_SWITCH_FILEHANDLE_ATTACHED))) 1530 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], lstrlenW(BURN_COMMANDLINE_SWITCH_FILEHANDLE_ATTACHED), BURN_COMMANDLINE_SWITCH_FILEHANDLE_ATTACHED, lstrlenW(BURN_COMMANDLINE_SWITCH_FILEHANDLE_ATTACHED)))
1553 { 1531 {
1554 // Already processed in InitializeEngineState. 1532 LPCWSTR wzParam = &argv[i][2 + lstrlenW(BURN_COMMANDLINE_SWITCH_FILEHANDLE_ATTACHED)];
1533 if (L'=' != wzParam[-1] || L'\0' == wzParam[0])
1534 {
1535 fInvalidCommandLine = TRUE;
1536 TraceLog(E_INVALIDARG, "Missing required parameter for switch: %ls", BURN_COMMANDLINE_SWITCH_FILEHANDLE_ATTACHED);
1537 }
1538 else
1539 {
1540 hr = StrStringToUInt64(wzParam, 0, &qw);
1541 if (FAILED(hr))
1542 {
1543 TraceLog(hr, "Failed to parse file handle: '%ls'", wzParam);
1544 hr = S_OK;
1545 }
1546 else
1547 {
1548 *phSourceEngineFile = (HANDLE)qw;
1549 }
1550 }
1555 } 1551 }
1556 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], lstrlenW(BURN_COMMANDLINE_SWITCH_FILEHANDLE_SELF), BURN_COMMANDLINE_SWITCH_FILEHANDLE_SELF, lstrlenW(BURN_COMMANDLINE_SWITCH_FILEHANDLE_SELF))) 1552 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], lstrlenW(BURN_COMMANDLINE_SWITCH_FILEHANDLE_SELF), BURN_COMMANDLINE_SWITCH_FILEHANDLE_SELF, lstrlenW(BURN_COMMANDLINE_SWITCH_FILEHANDLE_SELF)))
1557 { 1553 {
1558 // Already processed in InitializeEngineState. 1554 LPCWSTR wzParam = &argv[i][2 + lstrlenW(BURN_COMMANDLINE_SWITCH_FILEHANDLE_SELF)];
1555 if (L'=' != wzParam[-1] || L'\0' == wzParam[0])
1556 {
1557 fInvalidCommandLine = TRUE;
1558 TraceLog(E_INVALIDARG, "Missing required parameter for switch: %ls", BURN_COMMANDLINE_SWITCH_FILEHANDLE_SELF);
1559 }
1560 else
1561 {
1562 hr = StrStringToUInt64(wzParam, 0, &qw);
1563 if (FAILED(hr))
1564 {
1565 TraceLog(hr, "Failed to parse file handle: '%ls'", wzParam);
1566 hr = S_OK;
1567 }
1568 else
1569 {
1570 *phSectionFile = (HANDLE)qw;
1571 }
1572 }
1559 } 1573 }
1560 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], lstrlenW(BURN_COMMANDLINE_SWITCH_PREFIX), BURN_COMMANDLINE_SWITCH_PREFIX, lstrlenW(BURN_COMMANDLINE_SWITCH_PREFIX))) 1574 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, &argv[i][1], lstrlenW(BURN_COMMANDLINE_SWITCH_PREFIX), BURN_COMMANDLINE_SWITCH_PREFIX, lstrlenW(BURN_COMMANDLINE_SWITCH_PREFIX)))
1561 { 1575 {
@@ -1571,40 +1585,15 @@ static HRESULT ParseCommandLine(
1571 else 1585 else
1572 { 1586 {
1573 fUnknownArg = TRUE; 1587 fUnknownArg = TRUE;
1574
1575 const wchar_t* pwc = wcschr(argv[i], L'=');
1576 if (pwc)
1577 {
1578 hr = StrAllocString(&sczVariableName, argv[i], pwc - argv[i]);
1579 ExitOnFailure(hr, "Failed to copy variable name.");
1580
1581 hr = VariableIsHidden(pVariables, sczVariableName, &fHidden);
1582 ExitOnFailure(hr, "Failed to determine whether variable is hidden.");
1583
1584 if (fHidden)
1585 {
1586 hr = StrAllocFormatted(&sczSanitizedArgument, L"%ls=*****", sczVariableName);
1587 ExitOnFailure(hr, "Failed to copy sanitized argument.");
1588 }
1589 }
1590 } 1588 }
1591 1589
1592 // Remember command-line switch to pass off to UX.
1593 if (fUnknownArg) 1590 if (fUnknownArg)
1594 { 1591 {
1595 PathCommandLineAppend(&pCommand->wzCommandLine, argv[i]); 1592 hr = MemEnsureArraySizeForNewItems(reinterpret_cast<LPVOID*>(prgUnknownArgs), *pcUnknownArgs, 1, sizeof(int), 5);
1596 } 1593 ExitOnFailure(hr, "Failed to ensure size for unknown args.");
1597 1594
1598 if (sczSanitizedArgument) 1595 (*prgUnknownArgs)[*pcUnknownArgs] = i;
1599 { 1596 *pcUnknownArgs += 1;
1600 PathCommandLineAppend(psczSanitizedCommandLine, sczSanitizedArgument);
1601 }
1602 else
1603 {
1604 for (; originalIndex <= i; ++originalIndex)
1605 {
1606 PathCommandLineAppend(psczSanitizedCommandLine, argv[originalIndex]);
1607 }
1608 } 1597 }
1609 } 1598 }
1610 1599
@@ -1637,9 +1626,71 @@ LExit:
1637 *pfInvalidCommandLine = TRUE; 1626 *pfInvalidCommandLine = TRUE;
1638 } 1627 }
1639 1628
1629 return hr;
1630}
1631
1632// internal helper functions
1633
1634static HRESULT GetSanitizedCommandLine(
1635 __in int argc,
1636 __in LPWSTR* argv,
1637 __in BOOTSTRAPPER_COMMAND* pCommand,
1638 __in BURN_VARIABLES* pVariables,
1639 __in DWORD cUnknownArgs,
1640 __in int* rgUnknownArgs,
1641 __inout_z LPWSTR* psczSanitizedCommandLine
1642 )
1643{
1644 HRESULT hr = S_OK;
1645 DWORD dwUnknownArgIndex = 0;
1646 BOOL fHidden = FALSE;
1647 LPWSTR sczSanitizedArgument = NULL;
1648 LPWSTR sczVariableName = NULL;
1649
1650 for (int i = 0; i < argc; ++i)
1651 {
1652 fHidden = FALSE;
1653
1654 if (dwUnknownArgIndex < cUnknownArgs && rgUnknownArgs[dwUnknownArgIndex] == i)
1655 {
1656 ++dwUnknownArgIndex;
1657
1658 if (argv[i][0] != L'-' && argv[i][0] != L'/')
1659 {
1660 const wchar_t* pwc = wcschr(argv[i], L'=');
1661 if (pwc)
1662 {
1663 hr = StrAllocString(&sczVariableName, argv[i], pwc - argv[i]);
1664 ExitOnFailure(hr, "Failed to copy variable name.");
1665
1666 hr = VariableIsHidden(pVariables, sczVariableName, &fHidden);
1667 ExitOnFailure(hr, "Failed to determine whether variable is hidden.");
1668
1669 if (fHidden)
1670 {
1671 hr = StrAllocFormatted(&sczSanitizedArgument, L"%ls=*****", sczVariableName);
1672 ExitOnFailure(hr, "Failed to copy sanitized argument.");
1673 }
1674 }
1675 }
1676
1677 // Remember command-line switch to pass off to BA.
1678 PathCommandLineAppend(&pCommand->wzCommandLine, argv[i]);
1679 }
1680
1681 if (fHidden)
1682 {
1683 PathCommandLineAppend(psczSanitizedCommandLine, sczSanitizedArgument);
1684 }
1685 else
1686 {
1687 PathCommandLineAppend(psczSanitizedCommandLine, argv[i]);
1688 }
1689 }
1690
1691LExit:
1640 ReleaseStr(sczVariableName); 1692 ReleaseStr(sczVariableName);
1641 ReleaseStr(sczSanitizedArgument); 1693 ReleaseStr(sczSanitizedArgument);
1642 ReleaseStr(sczCommandLine);
1643 1694
1644 return hr; 1695 return hr;
1645} 1696}