diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2022-06-24 12:26:27 -0500 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2022-06-27 11:14:21 -0500 |
| commit | 78b5daf01555d86293c1012ed3de704752880a6a (patch) | |
| tree | 45524478c868cf63042a5e2ad78cfcd15aac43d6 /src/libs/dutil/WixToolset.DUtil/apputil.cpp | |
| parent | 4f41db7eaa48b0e061a68fd5fc70ce6d127d9039 (diff) | |
| download | wix-78b5daf01555d86293c1012ed3de704752880a6a.tar.gz wix-78b5daf01555d86293c1012ed3de704752880a6a.tar.bz2 wix-78b5daf01555d86293c1012ed3de704752880a6a.zip | |
Move LoadSystemLibrary and LoadSystemLibraryWithPath into apputil.
Diffstat (limited to '')
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/apputil.cpp | 82 |
1 files changed, 40 insertions, 42 deletions
diff --git a/src/libs/dutil/WixToolset.DUtil/apputil.cpp b/src/libs/dutil/WixToolset.DUtil/apputil.cpp index 7e0bbc7b..147d1d1e 100644 --- a/src/libs/dutil/WixToolset.DUtil/apputil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/apputil.cpp | |||
| @@ -8,6 +8,7 @@ | |||
| 8 | #define AppExitWithLastError(x, s, ...) ExitWithLastErrorSource(DUTIL_SOURCE_APPUTIL, x, s, __VA_ARGS__) | 8 | #define AppExitWithLastError(x, s, ...) ExitWithLastErrorSource(DUTIL_SOURCE_APPUTIL, x, s, __VA_ARGS__) |
| 9 | #define AppExitOnFailure(x, s, ...) ExitOnFailureSource(DUTIL_SOURCE_APPUTIL, x, s, __VA_ARGS__) | 9 | #define AppExitOnFailure(x, s, ...) ExitOnFailureSource(DUTIL_SOURCE_APPUTIL, x, s, __VA_ARGS__) |
| 10 | #define AppExitOnRootFailure(x, s, ...) ExitOnRootFailureSource(DUTIL_SOURCE_APPUTIL, x, s, __VA_ARGS__) | 10 | #define AppExitOnRootFailure(x, s, ...) ExitOnRootFailureSource(DUTIL_SOURCE_APPUTIL, x, s, __VA_ARGS__) |
| 11 | #define AppExitWithRootFailure(x, e, s, ...) ExitWithRootFailureSource(DUTIL_SOURCE_APPUTIL, x, e, s, __VA_ARGS__) | ||
| 11 | #define AppExitOnFailureDebugTrace(x, s, ...) ExitOnFailureDebugTraceSource(DUTIL_SOURCE_APPUTIL, x, s, __VA_ARGS__) | 12 | #define AppExitOnFailureDebugTrace(x, s, ...) ExitOnFailureDebugTraceSource(DUTIL_SOURCE_APPUTIL, x, s, __VA_ARGS__) |
| 12 | #define AppExitOnNull(p, x, e, s, ...) ExitOnNullSource(DUTIL_SOURCE_APPUTIL, p, x, e, s, __VA_ARGS__) | 13 | #define AppExitOnNull(p, x, e, s, ...) ExitOnNullSource(DUTIL_SOURCE_APPUTIL, p, x, e, s, __VA_ARGS__) |
| 13 | #define AppExitOnNullWithLastError(p, x, s, ...) ExitOnNullWithLastErrorSource(DUTIL_SOURCE_APPUTIL, p, x, s, __VA_ARGS__) | 14 | #define AppExitOnNullWithLastError(p, x, s, ...) ExitOnNullWithLastErrorSource(DUTIL_SOURCE_APPUTIL, p, x, s, __VA_ARGS__) |
| @@ -31,20 +32,50 @@ static HRESULT EscapeCommandLineArgument( | |||
| 31 | __out_z LPWSTR* psczEscaped | 32 | __out_z LPWSTR* psczEscaped |
| 32 | ); | 33 | ); |
| 33 | 34 | ||
| 34 | DAPI_(void) AppFreeCommandLineArgs( | 35 | DAPI_(HRESULT) LoadSystemLibrary( |
| 35 | __in LPWSTR* argv | 36 | __in_z LPCWSTR wzModuleName, |
| 37 | __out HMODULE* phModule | ||
| 36 | ) | 38 | ) |
| 37 | { | 39 | { |
| 38 | // The "ignored" hack in AppParseCommandLine requires an adjustment. | 40 | HRESULT hr = LoadSystemLibraryWithPath(wzModuleName, phModule, NULL); |
| 39 | LPWSTR* argvOriginal = argv - 1; | 41 | return hr; |
| 40 | ::LocalFree(argvOriginal); | ||
| 41 | } | 42 | } |
| 42 | 43 | ||
| 43 | /******************************************************************** | 44 | DAPI_(HRESULT) LoadSystemLibraryWithPath( |
| 44 | AppInitialize - initializes the standard safety precautions for an | 45 | __in_z LPCWSTR wzModuleName, |
| 45 | installation application. | 46 | __out HMODULE* phModule, |
| 47 | __deref_out_z_opt LPWSTR* psczPath | ||
| 48 | ) | ||
| 49 | { | ||
| 50 | HRESULT hr = S_OK; | ||
| 51 | DWORD cch = 0; | ||
| 52 | WCHAR wzPath[MAX_PATH] = { }; | ||
| 53 | |||
| 54 | cch = ::GetSystemDirectoryW(wzPath, MAX_PATH); | ||
| 55 | AppExitOnNullWithLastError(cch, hr, "Failed to get the Windows system directory."); | ||
| 56 | |||
| 57 | if (L'\\' != wzPath[cch - 1]) | ||
| 58 | { | ||
| 59 | hr = ::StringCchCatNW(wzPath, MAX_PATH, L"\\", 1); | ||
| 60 | AppExitOnRootFailure(hr, "Failed to terminate the string with a backslash."); | ||
| 61 | } | ||
| 62 | |||
| 63 | hr = ::StringCchCatW(wzPath, MAX_PATH, wzModuleName); | ||
| 64 | AppExitOnRootFailure(hr, "Failed to create the fully-qualified path to %ls.", wzModuleName); | ||
| 65 | |||
| 66 | *phModule = ::LoadLibraryW(wzPath); | ||
| 67 | AppExitOnNullWithLastError(*phModule, hr, "Failed to load the library %ls.", wzModuleName); | ||
| 68 | |||
| 69 | if (psczPath) | ||
| 70 | { | ||
| 71 | hr = StrAllocString(psczPath, wzPath, MAX_PATH); | ||
| 72 | AppExitOnFailure(hr, "Failed to copy the path to library."); | ||
| 73 | } | ||
| 74 | |||
| 75 | LExit: | ||
| 76 | return hr; | ||
| 77 | } | ||
| 46 | 78 | ||
| 47 | ********************************************************************/ | ||
| 48 | DAPI_(void) AppInitialize( | 79 | DAPI_(void) AppInitialize( |
| 49 | __in_ecount(cSafelyLoadSystemDlls) LPCWSTR rgsczSafelyLoadSystemDlls[], | 80 | __in_ecount(cSafelyLoadSystemDlls) LPCWSTR rgsczSafelyLoadSystemDlls[], |
| 50 | __in DWORD cSafelyLoadSystemDlls | 81 | __in DWORD cSafelyLoadSystemDlls |
| @@ -101,39 +132,6 @@ DAPI_(void) AppInitializeUnsafe() | |||
| 101 | ::HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0); | 132 | ::HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0); |
| 102 | } | 133 | } |
| 103 | 134 | ||
| 104 | DAPI_(HRESULT) AppParseCommandLine( | ||
| 105 | __in LPCWSTR wzCommandLine, | ||
| 106 | __in int* pArgc, | ||
| 107 | __in LPWSTR** pArgv | ||
| 108 | ) | ||
| 109 | { | ||
| 110 | HRESULT hr = S_OK; | ||
| 111 | LPWSTR sczCommandLine = NULL; | ||
| 112 | LPWSTR* argv = NULL; | ||
| 113 | int argc = 0; | ||
| 114 | |||
| 115 | // CommandLineToArgvW tries to treat the first argument as the path to the process, | ||
| 116 | // which fails pretty miserably if your first argument is something like | ||
| 117 | // FOO="C:\Program Files\My Company". So give it something harmless to play with. | ||
| 118 | hr = StrAllocConcat(&sczCommandLine, L"ignored ", 0); | ||
| 119 | AppExitOnFailure(hr, "Failed to initialize command line."); | ||
| 120 | |||
| 121 | hr = StrAllocConcat(&sczCommandLine, wzCommandLine, 0); | ||
| 122 | AppExitOnFailure(hr, "Failed to copy command line."); | ||
| 123 | |||
| 124 | argv = ::CommandLineToArgvW(sczCommandLine, &argc); | ||
| 125 | AppExitOnNullWithLastError(argv, hr, "Failed to parse command line."); | ||
| 126 | |||
| 127 | // Skip "ignored" argument/hack. | ||
| 128 | *pArgv = argv + 1; | ||
| 129 | *pArgc = argc - 1; | ||
| 130 | |||
| 131 | LExit: | ||
| 132 | ReleaseStr(sczCommandLine); | ||
| 133 | |||
| 134 | return hr; | ||
| 135 | } | ||
| 136 | |||
| 137 | DAPI_(HRESULT) AppAppendCommandLineArgument( | 135 | DAPI_(HRESULT) AppAppendCommandLineArgument( |
| 138 | __deref_inout_z LPWSTR* psczCommandLine, | 136 | __deref_inout_z LPWSTR* psczCommandLine, |
| 139 | __in_z LPCWSTR wzArgument | 137 | __in_z LPCWSTR wzArgument |
