aboutsummaryrefslogtreecommitdiff
path: root/src/dutil/reswutil.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/dutil/reswutil.cpp65
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
198LExit: 213LExit:
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
249LExit: 264LExit:
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 }