diff options
Diffstat (limited to '')
-rw-r--r-- | src/dutil/reswutil.cpp | 65 |
1 files changed, 40 insertions, 25 deletions
diff --git a/src/dutil/reswutil.cpp b/src/dutil/reswutil.cpp index e534fc09..42b49c55 100644 --- a/src/dutil/reswutil.cpp +++ b/src/dutil/reswutil.cpp | |||
@@ -2,6 +2,21 @@ | |||
2 | 2 | ||
3 | #include "precomp.h" | 3 | #include "precomp.h" |
4 | 4 | ||
5 | |||
6 | // Exit macros | ||
7 | #define ReswExitOnLastError(x, s, ...) ExitOnLastErrorSource(DUTIL_SOURCE_RESWUTIL, x, s, __VA_ARGS__) | ||
8 | #define ReswExitOnLastErrorDebugTrace(x, s, ...) ExitOnLastErrorDebugTraceSource(DUTIL_SOURCE_RESWUTIL, x, s, __VA_ARGS__) | ||
9 | #define ReswExitWithLastError(x, s, ...) ExitWithLastErrorSource(DUTIL_SOURCE_RESWUTIL, x, s, __VA_ARGS__) | ||
10 | #define ReswExitOnFailure(x, s, ...) ExitOnFailureSource(DUTIL_SOURCE_RESWUTIL, x, s, __VA_ARGS__) | ||
11 | #define ReswExitOnRootFailure(x, s, ...) ExitOnRootFailureSource(DUTIL_SOURCE_RESWUTIL, x, s, __VA_ARGS__) | ||
12 | #define ReswExitOnFailureDebugTrace(x, s, ...) ExitOnFailureDebugTraceSource(DUTIL_SOURCE_RESWUTIL, x, s, __VA_ARGS__) | ||
13 | #define ReswExitOnNull(p, x, e, s, ...) ExitOnNullSource(DUTIL_SOURCE_RESWUTIL, p, x, e, s, __VA_ARGS__) | ||
14 | #define ReswExitOnNullWithLastError(p, x, s, ...) ExitOnNullWithLastErrorSource(DUTIL_SOURCE_RESWUTIL, p, x, s, __VA_ARGS__) | ||
15 | #define ReswExitOnNullDebugTrace(p, x, e, s, ...) ExitOnNullDebugTraceSource(DUTIL_SOURCE_RESWUTIL, p, x, e, s, __VA_ARGS__) | ||
16 | #define ReswExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_RESWUTIL, p, x, s, __VA_ARGS__) | ||
17 | #define ReswExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_RESWUTIL, e, x, s, __VA_ARGS__) | ||
18 | #define ReswExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_RESWUTIL, g, x, s, __VA_ARGS__) | ||
19 | |||
5 | #define RES_STRINGS_PER_BLOCK 16 | 20 | #define RES_STRINGS_PER_BLOCK 16 |
6 | 21 | ||
7 | // Internal data structure format for a string block in a resource table. | 22 | // Internal data structure format for a string block in a resource table. |
@@ -66,31 +81,31 @@ extern "C" HRESULT DAPI ResWriteString( | |||
66 | DWORD dwStringId = (dwDataId % RES_STRINGS_PER_BLOCK); | 81 | DWORD dwStringId = (dwDataId % RES_STRINGS_PER_BLOCK); |
67 | 82 | ||
68 | hModule = LoadLibraryExW(wzResourceFile, NULL, DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE); | 83 | hModule = LoadLibraryExW(wzResourceFile, NULL, DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE); |
69 | ExitOnNullWithLastError(hModule, hr, "Failed to load library: %ls", wzResourceFile); | 84 | ReswExitOnNullWithLastError(hModule, hr, "Failed to load library: %ls", wzResourceFile); |
70 | 85 | ||
71 | hr = StringBlockInitialize(hModule, dwBlockId, wLangId, &StrBlock); | 86 | hr = StringBlockInitialize(hModule, dwBlockId, wLangId, &StrBlock); |
72 | ExitOnFailure(hr, "Failed to get string block to update."); | 87 | ReswExitOnFailure(hr, "Failed to get string block to update."); |
73 | 88 | ||
74 | hr = StringBlockChangeString(&StrBlock, dwStringId, wzData); | 89 | hr = StringBlockChangeString(&StrBlock, dwStringId, wzData); |
75 | ExitOnFailure(hr, "Failed to update string block string."); | 90 | ReswExitOnFailure(hr, "Failed to update string block string."); |
76 | 91 | ||
77 | hr = StringBlockConvertToResourceData(&StrBlock, &pvData, &cbData); | 92 | hr = StringBlockConvertToResourceData(&StrBlock, &pvData, &cbData); |
78 | ExitOnFailure(hr, "Failed to convert string block to resource data."); | 93 | ReswExitOnFailure(hr, "Failed to convert string block to resource data."); |
79 | 94 | ||
80 | ::FreeLibrary(hModule); | 95 | ::FreeLibrary(hModule); |
81 | hModule = NULL; | 96 | hModule = NULL; |
82 | 97 | ||
83 | hUpdate = ::BeginUpdateResourceW(wzResourceFile, FALSE); | 98 | hUpdate = ::BeginUpdateResourceW(wzResourceFile, FALSE); |
84 | ExitOnNullWithLastError(hUpdate, hr, "Failed to ::BeginUpdateResourcesW."); | 99 | ReswExitOnNullWithLastError(hUpdate, hr, "Failed to ::BeginUpdateResourcesW."); |
85 | 100 | ||
86 | if (!::UpdateResourceA(hUpdate, RT_STRING, MAKEINTRESOURCE(dwBlockId), wLangId, pvData, cbData)) | 101 | if (!::UpdateResourceA(hUpdate, RT_STRING, MAKEINTRESOURCE(dwBlockId), wLangId, pvData, cbData)) |
87 | { | 102 | { |
88 | ExitWithLastError(hr, "Failed to ::UpdateResourceA."); | 103 | ReswExitWithLastError(hr, "Failed to ::UpdateResourceA."); |
89 | } | 104 | } |
90 | 105 | ||
91 | if (!::EndUpdateResource(hUpdate, FALSE)) | 106 | if (!::EndUpdateResource(hUpdate, FALSE)) |
92 | { | 107 | { |
93 | ExitWithLastError(hr, "Failed to ::EndUpdateResourceW."); | 108 | ReswExitWithLastError(hr, "Failed to ::EndUpdateResourceW."); |
94 | } | 109 | } |
95 | 110 | ||
96 | hUpdate = NULL; | 111 | hUpdate = NULL; |
@@ -134,16 +149,16 @@ extern "C" HRESULT DAPI ResWriteData( | |||
134 | HANDLE hUpdate = NULL; | 149 | HANDLE hUpdate = NULL; |
135 | 150 | ||
136 | hUpdate = ::BeginUpdateResourceW(wzResourceFile, FALSE); | 151 | hUpdate = ::BeginUpdateResourceW(wzResourceFile, FALSE); |
137 | ExitOnNullWithLastError(hUpdate, hr, "Failed to ::BeginUpdateResourcesW."); | 152 | ReswExitOnNullWithLastError(hUpdate, hr, "Failed to ::BeginUpdateResourcesW."); |
138 | 153 | ||
139 | if (!::UpdateResourceA(hUpdate, RT_RCDATA, szDataName, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), pData, cbData)) | 154 | if (!::UpdateResourceA(hUpdate, RT_RCDATA, szDataName, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), pData, cbData)) |
140 | { | 155 | { |
141 | ExitWithLastError(hr, "Failed to ::UpdateResourceA."); | 156 | ReswExitWithLastError(hr, "Failed to ::UpdateResourceA."); |
142 | } | 157 | } |
143 | 158 | ||
144 | if (!::EndUpdateResource(hUpdate, FALSE)) | 159 | if (!::EndUpdateResource(hUpdate, FALSE)) |
145 | { | 160 | { |
146 | ExitWithLastError(hr, "Failed to ::EndUpdateResourceW."); | 161 | ReswExitWithLastError(hr, "Failed to ::EndUpdateResourceW."); |
147 | } | 162 | } |
148 | 163 | ||
149 | hUpdate = NULL; | 164 | hUpdate = NULL; |
@@ -177,23 +192,23 @@ extern "C" HRESULT DAPI ResImportDataFromFile( | |||
177 | hFile = ::CreateFileW(wzSourceFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); | 192 | hFile = ::CreateFileW(wzSourceFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); |
178 | if (INVALID_HANDLE_VALUE == hFile) | 193 | if (INVALID_HANDLE_VALUE == hFile) |
179 | { | 194 | { |
180 | ExitWithLastError(hr, "Failed to CreateFileW for %ls.", wzSourceFile); | 195 | ReswExitWithLastError(hr, "Failed to CreateFileW for %ls.", wzSourceFile); |
181 | } | 196 | } |
182 | 197 | ||
183 | cbFile = ::GetFileSize(hFile, NULL); | 198 | cbFile = ::GetFileSize(hFile, NULL); |
184 | if (!cbFile) | 199 | if (!cbFile) |
185 | { | 200 | { |
186 | ExitWithLastError(hr, "Failed to GetFileSize for %ls.", wzSourceFile); | 201 | ReswExitWithLastError(hr, "Failed to GetFileSize for %ls.", wzSourceFile); |
187 | } | 202 | } |
188 | 203 | ||
189 | hMap = ::CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL); | 204 | hMap = ::CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL); |
190 | ExitOnNullWithLastError(hMap, hr, "Failed to CreateFileMapping for %ls.", wzSourceFile); | 205 | ReswExitOnNullWithLastError(hMap, hr, "Failed to CreateFileMapping for %ls.", wzSourceFile); |
191 | 206 | ||
192 | pv = ::MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, cbFile); | 207 | pv = ::MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, cbFile); |
193 | ExitOnNullWithLastError(pv, hr, "Failed to MapViewOfFile for %ls.", wzSourceFile); | 208 | ReswExitOnNullWithLastError(pv, hr, "Failed to MapViewOfFile for %ls.", wzSourceFile); |
194 | 209 | ||
195 | hr = ResWriteData(wzTargetFile, szDataName, pv, cbFile); | 210 | hr = ResWriteData(wzTargetFile, szDataName, pv, cbFile); |
196 | ExitOnFailure(hr, "Failed to ResSetData %s on file %ls.", szDataName, wzTargetFile); | 211 | ReswExitOnFailure(hr, "Failed to ResSetData %s on file %ls.", szDataName, wzTargetFile); |
197 | 212 | ||
198 | LExit: | 213 | LExit: |
199 | if (pv) | 214 | if (pv) |
@@ -226,25 +241,25 @@ static HRESULT StringBlockInitialize( | |||
226 | DWORD cbData = 0; | 241 | DWORD cbData = 0; |
227 | 242 | ||
228 | hRsrc = ::FindResourceExA(hModule, RT_STRING, MAKEINTRESOURCE(dwBlockId), wLangId); | 243 | hRsrc = ::FindResourceExA(hModule, RT_STRING, MAKEINTRESOURCE(dwBlockId), wLangId); |
229 | ExitOnNullWithLastError(hRsrc, hr, "Failed to ::FindResourceExW."); | 244 | ReswExitOnNullWithLastError(hRsrc, hr, "Failed to ::FindResourceExW."); |
230 | 245 | ||
231 | hData = ::LoadResource(hModule, hRsrc); | 246 | hData = ::LoadResource(hModule, hRsrc); |
232 | ExitOnNullWithLastError(hData, hr, "Failed to ::LoadResource."); | 247 | ReswExitOnNullWithLastError(hData, hr, "Failed to ::LoadResource."); |
233 | 248 | ||
234 | cbData = ::SizeofResource(hModule, hRsrc); | 249 | cbData = ::SizeofResource(hModule, hRsrc); |
235 | if (!cbData) | 250 | if (!cbData) |
236 | { | 251 | { |
237 | ExitWithLastError(hr, "Failed to ::SizeofResource."); | 252 | ReswExitWithLastError(hr, "Failed to ::SizeofResource."); |
238 | } | 253 | } |
239 | 254 | ||
240 | pvData = ::LockResource(hData); | 255 | pvData = ::LockResource(hData); |
241 | ExitOnNullWithLastError(pvData, hr, "Failed to lock data resource."); | 256 | ReswExitOnNullWithLastError(pvData, hr, "Failed to lock data resource."); |
242 | 257 | ||
243 | pStrBlock->dwBlockId = dwBlockId; | 258 | pStrBlock->dwBlockId = dwBlockId; |
244 | pStrBlock->wLangId = wLangId; | 259 | pStrBlock->wLangId = wLangId; |
245 | 260 | ||
246 | hr = StringBlockConvertFromResourceData(pStrBlock, pvData, cbData); | 261 | hr = StringBlockConvertFromResourceData(pStrBlock, pvData, cbData); |
247 | ExitOnFailure(hr, "Failed to convert string block from resource data."); | 262 | ReswExitOnFailure(hr, "Failed to convert string block from resource data."); |
248 | 263 | ||
249 | LExit: | 264 | LExit: |
250 | return hr; | 265 | return hr; |
@@ -276,10 +291,10 @@ static HRESULT StringBlockChangeString( | |||
276 | DWORD cchData = lstrlenW(szData); | 291 | DWORD cchData = lstrlenW(szData); |
277 | 292 | ||
278 | pwzData = static_cast<LPWSTR>(MemAlloc((cchData + 1) * sizeof(WCHAR), TRUE)); | 293 | pwzData = static_cast<LPWSTR>(MemAlloc((cchData + 1) * sizeof(WCHAR), TRUE)); |
279 | ExitOnNull(pwzData, hr, E_OUTOFMEMORY, "Failed to allocate new block string."); | 294 | ReswExitOnNull(pwzData, hr, E_OUTOFMEMORY, "Failed to allocate new block string."); |
280 | 295 | ||
281 | hr = ::StringCchCopyW(pwzData, cchData + 1, szData); | 296 | hr = ::StringCchCopyW(pwzData, cchData + 1, szData); |
282 | ExitOnFailure(hr, "Failed to copy new block string."); | 297 | ReswExitOnFailure(hr, "Failed to copy new block string."); |
283 | 298 | ||
284 | ReleaseNullMem(pStrBlock->rgwz[dwStringId]); | 299 | ReleaseNullMem(pStrBlock->rgwz[dwStringId]); |
285 | 300 | ||
@@ -311,7 +326,7 @@ static HRESULT StringBlockConvertToResourceData( | |||
311 | cbData *= sizeof(WCHAR); | 326 | cbData *= sizeof(WCHAR); |
312 | 327 | ||
313 | pvData = MemAlloc(cbData, TRUE); | 328 | pvData = MemAlloc(cbData, TRUE); |
314 | ExitOnNull(pvData, hr, E_OUTOFMEMORY, "Failed to allocate buffer to convert string block."); | 329 | ReswExitOnNull(pvData, hr, E_OUTOFMEMORY, "Failed to allocate buffer to convert string block."); |
315 | 330 | ||
316 | pwz = static_cast<LPWSTR>(pvData); | 331 | pwz = static_cast<LPWSTR>(pvData); |
317 | for (DWORD i = 0; i < RES_STRINGS_PER_BLOCK; ++i) | 332 | for (DWORD i = 0; i < RES_STRINGS_PER_BLOCK; ++i) |
@@ -355,10 +370,10 @@ static HRESULT StringBlockConvertFromResourceData( | |||
355 | ++pwzParse; | 370 | ++pwzParse; |
356 | 371 | ||
357 | pStrBlock->rgwz[i] = static_cast<LPWSTR>(MemAlloc((cchParse + 1) * sizeof(WCHAR), TRUE)); | 372 | pStrBlock->rgwz[i] = static_cast<LPWSTR>(MemAlloc((cchParse + 1) * sizeof(WCHAR), TRUE)); |
358 | ExitOnNull(pStrBlock->rgwz[i], hr, E_OUTOFMEMORY, "Failed to populate pStrBlock."); | 373 | ReswExitOnNull(pStrBlock->rgwz[i], hr, E_OUTOFMEMORY, "Failed to populate pStrBlock."); |
359 | 374 | ||
360 | hr = ::StringCchCopyNExW(pStrBlock->rgwz[i], cchParse + 1, pwzParse, cchParse, NULL, NULL, STRSAFE_FILL_BEHIND_NULL); | 375 | hr = ::StringCchCopyNExW(pStrBlock->rgwz[i], cchParse + 1, pwzParse, cchParse, NULL, NULL, STRSAFE_FILL_BEHIND_NULL); |
361 | ExitOnFailure(hr, "Failed to copy parsed resource data into string block."); | 376 | ReswExitOnFailure(hr, "Failed to copy parsed resource data into string block."); |
362 | 377 | ||
363 | pwzParse += cchParse; | 378 | pwzParse += cchParse; |
364 | } | 379 | } |