diff options
Diffstat (limited to 'src/burn/engine/core.cpp')
-rw-r--r-- | src/burn/engine/core.cpp | 231 |
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 | ||
17 | static HRESULT ParseCommandLine( | 17 | static 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 | ); |
38 | static HRESULT ParsePipeConnection( | 26 | static 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 | ||
176 | LExit: | 161 | LExit: |
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 | 1163 | extern "C" HRESULT CoreParseCommandLine( |
1181 | |||
1182 | static 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 | |||
1634 | static 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 | |||
1691 | LExit: | ||
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 | } |