diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2021-03-02 14:19:14 -0600 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2021-03-02 15:40:02 -0600 |
| commit | 10ebf674da5df9224e4eddd3545518434c5b455b (patch) | |
| tree | ea1f4063edd46e9942eab94dd7adb2f75c6c589e /src/dutil/cabutil.cpp | |
| parent | 3bbf1347b900ec115a12faf8f46965c9b7649696 (diff) | |
| download | wix-10ebf674da5df9224e4eddd3545518434c5b455b.tar.gz wix-10ebf674da5df9224e4eddd3545518434c5b455b.tar.bz2 wix-10ebf674da5df9224e4eddd3545518434c5b455b.zip | |
Update rest of dutil to use their own source with the Exit* macros.
Fix some CA warnings.
Diffstat (limited to 'src/dutil/cabutil.cpp')
| -rw-r--r-- | src/dutil/cabutil.cpp | 96 |
1 files changed, 56 insertions, 40 deletions
diff --git a/src/dutil/cabutil.cpp b/src/dutil/cabutil.cpp index e0efb717..4a6f7b7b 100644 --- a/src/dutil/cabutil.cpp +++ b/src/dutil/cabutil.cpp | |||
| @@ -2,6 +2,22 @@ | |||
| 2 | 2 | ||
| 3 | #include "precomp.h" | 3 | #include "precomp.h" |
| 4 | 4 | ||
| 5 | |||
| 6 | // Exit macros | ||
| 7 | #define CabExitOnLastError(x, s, ...) ExitOnLastErrorSource(DUTIL_SOURCE_CABUTIL, x, s, __VA_ARGS__) | ||
| 8 | #define CabExitOnLastErrorDebugTrace(x, s, ...) ExitOnLastErrorDebugTraceSource(DUTIL_SOURCE_CABUTIL, x, s, __VA_ARGS__) | ||
| 9 | #define CabExitWithLastError(x, s, ...) ExitWithLastErrorSource(DUTIL_SOURCE_CABUTIL, x, s, __VA_ARGS__) | ||
| 10 | #define CabExitOnFailure(x, s, ...) ExitOnFailureSource(DUTIL_SOURCE_CABUTIL, x, s, __VA_ARGS__) | ||
| 11 | #define CabExitOnRootFailure(x, s, ...) ExitOnRootFailureSource(DUTIL_SOURCE_CABUTIL, x, s, __VA_ARGS__) | ||
| 12 | #define CabExitOnFailureDebugTrace(x, s, ...) ExitOnFailureDebugTraceSource(DUTIL_SOURCE_CABUTIL, x, s, __VA_ARGS__) | ||
| 13 | #define CabExitOnNull(p, x, e, s, ...) ExitOnNullSource(DUTIL_SOURCE_CABUTIL, p, x, e, s, __VA_ARGS__) | ||
| 14 | #define CabExitOnNullWithLastError(p, x, s, ...) ExitOnNullWithLastErrorSource(DUTIL_SOURCE_CABUTIL, p, x, s, __VA_ARGS__) | ||
| 15 | #define CabExitOnNullDebugTrace(p, x, e, s, ...) ExitOnNullDebugTraceSource(DUTIL_SOURCE_CABUTIL, p, x, e, s, __VA_ARGS__) | ||
| 16 | #define CabExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_CABUTIL, p, x, s, __VA_ARGS__) | ||
| 17 | #define CabExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_CABUTIL, e, x, s, __VA_ARGS__) | ||
| 18 | #define CabExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_CABUTIL, g, x, s, __VA_ARGS__) | ||
| 19 | |||
| 20 | |||
| 5 | // external prototypes | 21 | // external prototypes |
| 6 | typedef BOOL (FAR DIAMONDAPI *PFNFDIDESTROY)(VOID*); | 22 | typedef BOOL (FAR DIAMONDAPI *PFNFDIDESTROY)(VOID*); |
| 7 | typedef HFDI (FAR DIAMONDAPI *PFNFDICREATE)(PFNALLOC, PFNFREE, PFNOPEN, PFNREAD, PFNWRITE, PFNCLOSE, PFNSEEK, int, PERF); | 23 | typedef HFDI (FAR DIAMONDAPI *PFNFDICREATE)(PFNALLOC, PFNFREE, PFNOPEN, PFNREAD, PFNWRITE, PFNCLOSE, PFNSEEK, int, PERF); |
| @@ -59,20 +75,20 @@ inline HRESULT LoadCabinetDll() | |||
| 59 | if (!vhCabinetDll) | 75 | if (!vhCabinetDll) |
| 60 | { | 76 | { |
| 61 | hr = LoadSystemLibrary(L"cabinet.dll", &vhCabinetDll); | 77 | hr = LoadSystemLibrary(L"cabinet.dll", &vhCabinetDll); |
| 62 | ExitOnFailure(hr, "failed to load cabinet.dll"); | 78 | CabExitOnFailure(hr, "failed to load cabinet.dll"); |
| 63 | 79 | ||
| 64 | // retrieve all address functions | 80 | // retrieve all address functions |
| 65 | vpfnFDICreate = reinterpret_cast<PFNFDICREATE>(::GetProcAddress(vhCabinetDll, "FDICreate")); | 81 | vpfnFDICreate = reinterpret_cast<PFNFDICREATE>(::GetProcAddress(vhCabinetDll, "FDICreate")); |
| 66 | ExitOnNullWithLastError(vpfnFDICreate, hr, "failed to import FDICreate from CABINET.DLL"); | 82 | CabExitOnNullWithLastError(vpfnFDICreate, hr, "failed to import FDICreate from CABINET.DLL"); |
| 67 | vpfnFDICopy = reinterpret_cast<PFNFDICOPY>(::GetProcAddress(vhCabinetDll, "FDICopy")); | 83 | vpfnFDICopy = reinterpret_cast<PFNFDICOPY>(::GetProcAddress(vhCabinetDll, "FDICopy")); |
| 68 | ExitOnNullWithLastError(vpfnFDICopy, hr, "failed to import FDICopy from CABINET.DLL"); | 84 | CabExitOnNullWithLastError(vpfnFDICopy, hr, "failed to import FDICopy from CABINET.DLL"); |
| 69 | vpfnFDIIsCabinet = reinterpret_cast<PFNFDIISCABINET>(::GetProcAddress(vhCabinetDll, "FDIIsCabinet")); | 85 | vpfnFDIIsCabinet = reinterpret_cast<PFNFDIISCABINET>(::GetProcAddress(vhCabinetDll, "FDIIsCabinet")); |
| 70 | ExitOnNullWithLastError(vpfnFDIIsCabinet, hr, "failed to import FDIIsCabinetfrom CABINET.DLL"); | 86 | CabExitOnNullWithLastError(vpfnFDIIsCabinet, hr, "failed to import FDIIsCabinetfrom CABINET.DLL"); |
| 71 | vpfnFDIDestroy = reinterpret_cast<PFNFDIDESTROY>(::GetProcAddress(vhCabinetDll, "FDIDestroy")); | 87 | vpfnFDIDestroy = reinterpret_cast<PFNFDIDESTROY>(::GetProcAddress(vhCabinetDll, "FDIDestroy")); |
| 72 | ExitOnNullWithLastError(vpfnFDIDestroy, hr, "failed to import FDIDestroyfrom CABINET.DLL"); | 88 | CabExitOnNullWithLastError(vpfnFDIDestroy, hr, "failed to import FDIDestroyfrom CABINET.DLL"); |
| 73 | 89 | ||
| 74 | vhfdi = vpfnFDICreate(CabExtractAlloc, CabExtractFree, CabExtractOpen, CabExtractRead, CabExtractWrite, CabExtractClose, CabExtractSeek, cpuUNKNOWN, &verf); | 90 | vhfdi = vpfnFDICreate(CabExtractAlloc, CabExtractFree, CabExtractOpen, CabExtractRead, CabExtractWrite, CabExtractClose, CabExtractSeek, cpuUNKNOWN, &verf); |
| 75 | ExitOnNull(vhfdi, hr, E_FAIL, "failed to initialize cabinet.dll"); | 91 | CabExitOnNull(vhfdi, hr, E_FAIL, "failed to initialize cabinet.dll"); |
| 76 | } | 92 | } |
| 77 | 93 | ||
| 78 | LExit: | 94 | LExit: |
| @@ -99,7 +115,7 @@ extern "C" HRESULT DAPI CabInitialize( | |||
| 99 | if (!fDelayLoad) | 115 | if (!fDelayLoad) |
| 100 | { | 116 | { |
| 101 | hr = LoadCabinetDll(); | 117 | hr = LoadCabinetDll(); |
| 102 | ExitOnFailure(hr, "failed to load CABINET.DLL"); | 118 | CabExitOnFailure(hr, "failed to load CABINET.DLL"); |
| 103 | } | 119 | } |
| 104 | 120 | ||
| 105 | LExit: | 121 | LExit: |
| @@ -143,8 +159,8 @@ extern "C" void DAPI CabUninitialize( | |||
| 143 | in the cabinet | 159 | in the cabinet |
| 144 | ********************************************************************/ | 160 | ********************************************************************/ |
| 145 | extern "C" HRESULT DAPI CabEnumerate( | 161 | extern "C" HRESULT DAPI CabEnumerate( |
| 146 | __in LPCWSTR wzCabinet, | 162 | __in_z LPCWSTR wzCabinet, |
| 147 | __in LPCWSTR wzEnumerateFile, | 163 | __in_z LPCWSTR wzEnumerateFile, |
| 148 | __in STDCALL_PFNFDINOTIFY pfnNotify, | 164 | __in STDCALL_PFNFDINOTIFY pfnNotify, |
| 149 | __in DWORD64 dw64EmbeddedOffset | 165 | __in DWORD64 dw64EmbeddedOffset |
| 150 | ) | 166 | ) |
| @@ -161,9 +177,9 @@ extern "C" HRESULT DAPI CabEnumerate( | |||
| 161 | if pfnBeginFile is NULL pfnEndFile must be NULL and vice versa | 177 | if pfnBeginFile is NULL pfnEndFile must be NULL and vice versa |
| 162 | ********************************************************************/ | 178 | ********************************************************************/ |
| 163 | extern "C" HRESULT DAPI CabExtract( | 179 | extern "C" HRESULT DAPI CabExtract( |
| 164 | __in LPCWSTR wzCabinet, | 180 | __in_z LPCWSTR wzCabinet, |
| 165 | __in LPCWSTR wzExtractFile, | 181 | __in_z LPCWSTR wzExtractFile, |
| 166 | __in LPCWSTR wzExtractDir, | 182 | __in_z LPCWSTR wzExtractDir, |
| 167 | __in_opt CAB_CALLBACK_PROGRESS pfnProgress, | 183 | __in_opt CAB_CALLBACK_PROGRESS pfnProgress, |
| 168 | __in_opt LPVOID pvContext, | 184 | __in_opt LPVOID pvContext, |
| 169 | __in DWORD64 dw64EmbeddedOffset | 185 | __in DWORD64 dw64EmbeddedOffset |
| @@ -238,21 +254,21 @@ static HRESULT DAPI CabOperation( | |||
| 238 | if (!vhfdi) | 254 | if (!vhfdi) |
| 239 | { | 255 | { |
| 240 | hr = LoadCabinetDll(); | 256 | hr = LoadCabinetDll(); |
| 241 | ExitOnFailure(hr, "failed to load CABINET.DLL"); | 257 | CabExitOnFailure(hr, "failed to load CABINET.DLL"); |
| 242 | } | 258 | } |
| 243 | 259 | ||
| 244 | hr = StrAllocString(&sczCabinet, wzCabinet, 0); | 260 | hr = StrAllocString(&sczCabinet, wzCabinet, 0); |
| 245 | ExitOnFailure(hr, "Failed to make copy of cabinet name:%ls", wzCabinet); | 261 | CabExitOnFailure(hr, "Failed to make copy of cabinet name:%ls", wzCabinet); |
| 246 | 262 | ||
| 247 | // | 263 | // |
| 248 | // split the cabinet full path into directory and filename and convert to multi-byte (ick!) | 264 | // split the cabinet full path into directory and filename and convert to multi-byte (ick!) |
| 249 | // | 265 | // |
| 250 | pwz = FileFromPath(sczCabinet); | 266 | pwz = FileFromPath(sczCabinet); |
| 251 | ExitOnNull(pwz, hr, E_INVALIDARG, "failed to process cabinet path: %ls", wzCabinet); | 267 | CabExitOnNull(pwz, hr, E_INVALIDARG, "failed to process cabinet path: %ls", wzCabinet); |
| 252 | 268 | ||
| 253 | if (!::WideCharToMultiByte(CP_UTF8, 0, pwz, -1, szCabFile, countof(szCabFile), NULL, NULL)) | 269 | if (!::WideCharToMultiByte(CP_UTF8, 0, pwz, -1, szCabFile, countof(szCabFile), NULL, NULL)) |
| 254 | { | 270 | { |
| 255 | ExitWithLastError(hr, "failed to convert cabinet filename to ASCII: %ls", pwz); | 271 | CabExitWithLastError(hr, "failed to convert cabinet filename to ASCII: %ls", pwz); |
| 256 | } | 272 | } |
| 257 | 273 | ||
| 258 | *pwz = '\0'; | 274 | *pwz = '\0'; |
| @@ -261,13 +277,13 @@ static HRESULT DAPI CabOperation( | |||
| 261 | if (wzCabinet == pwz) | 277 | if (wzCabinet == pwz) |
| 262 | { | 278 | { |
| 263 | hr = ::StringCchCopyA(szCabDirectory, countof(szCabDirectory), ".\\"); | 279 | hr = ::StringCchCopyA(szCabDirectory, countof(szCabDirectory), ".\\"); |
| 264 | ExitOnFailure(hr, "Failed to copy relative current directory as cabinet directory."); | 280 | CabExitOnFailure(hr, "Failed to copy relative current directory as cabinet directory."); |
| 265 | } | 281 | } |
| 266 | else | 282 | else |
| 267 | { | 283 | { |
| 268 | if (!::WideCharToMultiByte(CP_UTF8, 0, sczCabinet, -1, szCabDirectory, countof(szCabDirectory), NULL, NULL)) | 284 | if (!::WideCharToMultiByte(CP_UTF8, 0, sczCabinet, -1, szCabDirectory, countof(szCabDirectory), NULL, NULL)) |
| 269 | { | 285 | { |
| 270 | ExitWithLastError(hr, "failed to convert cabinet directory to ASCII: %ls", sczCabinet); | 286 | CabExitWithLastError(hr, "failed to convert cabinet directory to ASCII: %ls", sczCabinet); |
| 271 | } | 287 | } |
| 272 | } | 288 | } |
| 273 | 289 | ||
| @@ -295,7 +311,7 @@ static HRESULT DAPI CabOperation( | |||
| 295 | fResult = vpfnFDICopy(vhfdi, szCabFile, szCabDirectory, 0, pfnFdiNotify, NULL, static_cast<void*>(&ccs)); | 311 | fResult = vpfnFDICopy(vhfdi, szCabFile, szCabDirectory, 0, pfnFdiNotify, NULL, static_cast<void*>(&ccs)); |
| 296 | if (!fResult && !ccs.fStopExtracting) // if something went wrong and it wasn't us just stopping the extraction, then return a failure | 312 | if (!fResult && !ccs.fStopExtracting) // if something went wrong and it wasn't us just stopping the extraction, then return a failure |
| 297 | { | 313 | { |
| 298 | ExitWithLastError(hr, "failed to extract cabinet file: %ls", sczCabinet); | 314 | CabExitWithLastError(hr, "failed to extract cabinet file: %ls", sczCabinet); |
| 299 | } | 315 | } |
| 300 | 316 | ||
| 301 | LExit: | 317 | LExit: |
| @@ -331,22 +347,22 @@ static __callback INT_PTR FAR DIAMONDAPI CabExtractOpen(__in_z PSTR pszFile, __i | |||
| 331 | if ((oflag != (/*_O_BINARY*/ 0x8000 | /*_O_RDONLY*/ 0x0000)) || (pmode != (_S_IREAD | _S_IWRITE))) | 347 | if ((oflag != (/*_O_BINARY*/ 0x8000 | /*_O_RDONLY*/ 0x0000)) || (pmode != (_S_IREAD | _S_IWRITE))) |
| 332 | { | 348 | { |
| 333 | hr = E_OUTOFMEMORY; | 349 | hr = E_OUTOFMEMORY; |
| 334 | ExitOnFailure(hr, "FDI asked for a scratch file to be created, which is unsupported"); | 350 | CabExitOnFailure(hr, "FDI asked for a scratch file to be created, which is unsupported"); |
| 335 | } | 351 | } |
| 336 | 352 | ||
| 337 | hr = StrAllocStringAnsi(&sczCabFile, pszFile, 0, CP_UTF8); | 353 | hr = StrAllocStringAnsi(&sczCabFile, pszFile, 0, CP_UTF8); |
| 338 | ExitOnFailure(hr, "Failed to convert UTF8 cab file name to wide character string"); | 354 | CabExitOnFailure(hr, "Failed to convert UTF8 cab file name to wide character string"); |
| 339 | 355 | ||
| 340 | pFile = reinterpret_cast<INT_PTR>(::CreateFileW(sczCabFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)); | 356 | pFile = reinterpret_cast<INT_PTR>(::CreateFileW(sczCabFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)); |
| 341 | if (INVALID_HANDLE_VALUE == reinterpret_cast<HANDLE>(pFile)) | 357 | if (INVALID_HANDLE_VALUE == reinterpret_cast<HANDLE>(pFile)) |
| 342 | { | 358 | { |
| 343 | ExitWithLastError(hr, "failed to open file: %ls", sczCabFile); | 359 | CabExitWithLastError(hr, "failed to open file: %ls", sczCabFile); |
| 344 | } | 360 | } |
| 345 | 361 | ||
| 346 | if (vdw64EmbeddedOffset) | 362 | if (vdw64EmbeddedOffset) |
| 347 | { | 363 | { |
| 348 | hr = CabExtractSeek(pFile, 0, 0); | 364 | hr = CabExtractSeek(pFile, 0, 0); |
| 349 | ExitOnFailure(hr, "Failed to seek to embedded offset %I64d", vdw64EmbeddedOffset); | 365 | CabExitOnFailure(hr, "Failed to seek to embedded offset %I64d", vdw64EmbeddedOffset); |
| 350 | } | 366 | } |
| 351 | 367 | ||
| 352 | LExit: | 368 | LExit: |
| @@ -361,10 +377,10 @@ static __callback UINT FAR DIAMONDAPI CabExtractRead(__in INT_PTR hf, __out void | |||
| 361 | HRESULT hr = S_OK; | 377 | HRESULT hr = S_OK; |
| 362 | DWORD cbRead = 0; | 378 | DWORD cbRead = 0; |
| 363 | 379 | ||
| 364 | ExitOnNull(hf, hr, E_INVALIDARG, "Failed to read file during cabinet extraction - no file given to read"); | 380 | CabExitOnNull(hf, hr, E_INVALIDARG, "Failed to read file during cabinet extraction - no file given to read"); |
| 365 | if (!::ReadFile(reinterpret_cast<HANDLE>(hf), pv, cb, &cbRead, NULL)) | 381 | if (!::ReadFile(reinterpret_cast<HANDLE>(hf), pv, cb, &cbRead, NULL)) |
| 366 | { | 382 | { |
| 367 | ExitWithLastError(hr, "failed to read during cabinet extraction"); | 383 | CabExitWithLastError(hr, "failed to read during cabinet extraction"); |
| 368 | } | 384 | } |
| 369 | 385 | ||
| 370 | LExit: | 386 | LExit: |
| @@ -377,10 +393,10 @@ static __callback UINT FAR DIAMONDAPI CabExtractWrite(__in INT_PTR hf, __in void | |||
| 377 | HRESULT hr = S_OK; | 393 | HRESULT hr = S_OK; |
| 378 | DWORD cbWrite = 0; | 394 | DWORD cbWrite = 0; |
| 379 | 395 | ||
| 380 | ExitOnNull(hf, hr, E_INVALIDARG, "Failed to write file during cabinet extraction - no file given to write"); | 396 | CabExitOnNull(hf, hr, E_INVALIDARG, "Failed to write file during cabinet extraction - no file given to write"); |
| 381 | if (!::WriteFile(reinterpret_cast<HANDLE>(hf), pv, cb, &cbWrite, NULL)) | 397 | if (!::WriteFile(reinterpret_cast<HANDLE>(hf), pv, cb, &cbWrite, NULL)) |
| 382 | { | 398 | { |
| 383 | ExitWithLastError(hr, "failed to write during cabinet extraction"); | 399 | CabExitWithLastError(hr, "failed to write during cabinet extraction"); |
| 384 | } | 400 | } |
| 385 | 401 | ||
| 386 | LExit: | 402 | LExit: |
| @@ -409,7 +425,7 @@ static __callback long FAR DIAMONDAPI CabExtractSeek(__in INT_PTR hf, __in long | |||
| 409 | default : | 425 | default : |
| 410 | dwMoveMethod = 0; | 426 | dwMoveMethod = 0; |
| 411 | hr = E_UNEXPECTED; | 427 | hr = E_UNEXPECTED; |
| 412 | ExitOnFailure(hr, "unexpected seektype in FDISeek(): %d", seektype); | 428 | CabExitOnFailure(hr, "unexpected seektype in FDISeek(): %d", seektype); |
| 413 | } | 429 | } |
| 414 | 430 | ||
| 415 | // SetFilePointer returns -1 if it fails (this will cause FDI to quit with an FDIERROR_USER_ABORT error. | 431 | // SetFilePointer returns -1 if it fails (this will cause FDI to quit with an FDIERROR_USER_ABORT error. |
| @@ -417,7 +433,7 @@ static __callback long FAR DIAMONDAPI CabExtractSeek(__in INT_PTR hf, __in long | |||
| 417 | lMove = ::SetFilePointer(reinterpret_cast<HANDLE>(hf), dist, NULL, dwMoveMethod); | 433 | lMove = ::SetFilePointer(reinterpret_cast<HANDLE>(hf), dist, NULL, dwMoveMethod); |
| 418 | if (0xFFFFFFFF == lMove) | 434 | if (0xFFFFFFFF == lMove) |
| 419 | { | 435 | { |
| 420 | ExitWithLastError(hr, "failed to move file pointer %d bytes", dist); | 436 | CabExitWithLastError(hr, "failed to move file pointer %d bytes", dist); |
| 421 | } | 437 | } |
| 422 | 438 | ||
| 423 | LExit: | 439 | LExit: |
| @@ -431,7 +447,7 @@ static __callback int FAR DIAMONDAPI CabExtractClose(__in INT_PTR hf) | |||
| 431 | 447 | ||
| 432 | if (!::CloseHandle(reinterpret_cast<HANDLE>(hf))) | 448 | if (!::CloseHandle(reinterpret_cast<HANDLE>(hf))) |
| 433 | { | 449 | { |
| 434 | ExitWithLastError(hr, "failed to close file during cabinet extraction"); | 450 | CabExitWithLastError(hr, "failed to close file during cabinet extraction"); |
| 435 | } | 451 | } |
| 436 | 452 | ||
| 437 | LExit: | 453 | LExit: |
| @@ -454,8 +470,8 @@ static __callback INT_PTR DIAMONDAPI CabExtractCallback(__in FDINOTIFICATIONTYPE | |||
| 454 | switch (iNotification) | 470 | switch (iNotification) |
| 455 | { | 471 | { |
| 456 | case fdintCOPY_FILE: // begin extracting a resource from cabinet | 472 | case fdintCOPY_FILE: // begin extracting a resource from cabinet |
| 457 | ExitOnNull(pFDINotify->psz1, hr, E_INVALIDARG, "No cabinet file ID given to convert"); | 473 | CabExitOnNull(pFDINotify->psz1, hr, E_INVALIDARG, "No cabinet file ID given to convert"); |
| 458 | ExitOnNull(pccs, hr, E_INVALIDARG, "Failed to call cabextract callback, because no callback struct was provided"); | 474 | CabExitOnNull(pccs, hr, E_INVALIDARG, "Failed to call cabextract callback, because no callback struct was provided"); |
| 459 | 475 | ||
| 460 | if (pccs->fStopExtracting) | 476 | if (pccs->fStopExtracting) |
| 461 | { | 477 | { |
| @@ -466,7 +482,7 @@ static __callback INT_PTR DIAMONDAPI CabExtractCallback(__in FDINOTIFICATIONTYPE | |||
| 466 | sz = static_cast<LPCSTR>(pFDINotify->psz1); | 482 | sz = static_cast<LPCSTR>(pFDINotify->psz1); |
| 467 | if (!::MultiByteToWideChar(CP_ACP, 0, sz, -1, wz, countof(wz))) | 483 | if (!::MultiByteToWideChar(CP_ACP, 0, sz, -1, wz, countof(wz))) |
| 468 | { | 484 | { |
| 469 | ExitWithLastError(hr, "failed to convert cabinet file id to unicode: %s", sz); | 485 | CabExitWithLastError(hr, "failed to convert cabinet file id to unicode: %s", sz); |
| 470 | } | 486 | } |
| 471 | 487 | ||
| 472 | if (pccs->pfnProgress) | 488 | if (pccs->pfnProgress) |
| @@ -484,21 +500,21 @@ static __callback INT_PTR DIAMONDAPI CabExtractCallback(__in FDINOTIFICATIONTYPE | |||
| 484 | FILETIME ftLocal; | 500 | FILETIME ftLocal; |
| 485 | if (!::DosDateTimeToFileTime(pFDINotify->date, pFDINotify->time, &ftLocal)) | 501 | if (!::DosDateTimeToFileTime(pFDINotify->date, pFDINotify->time, &ftLocal)) |
| 486 | { | 502 | { |
| 487 | ExitWithLastError(hr, "failed to get time for resource: %ls", wz); | 503 | CabExitWithLastError(hr, "failed to get time for resource: %ls", wz); |
| 488 | } | 504 | } |
| 489 | ::LocalFileTimeToFileTime(&ftLocal, &ft); | 505 | ::LocalFileTimeToFileTime(&ftLocal, &ft); |
| 490 | 506 | ||
| 491 | 507 | ||
| 492 | WCHAR wzPath[MAX_PATH]; | 508 | WCHAR wzPath[MAX_PATH]; |
| 493 | hr = ::StringCchCopyW(wzPath, countof(wzPath), pccs->pwzExtractDir); | 509 | hr = ::StringCchCopyW(wzPath, countof(wzPath), pccs->pwzExtractDir); |
| 494 | ExitOnFailure(hr, "failed to copy in extract directory: %ls for file: %ls", pccs->pwzExtractDir, wz); | 510 | CabExitOnFailure(hr, "failed to copy in extract directory: %ls for file: %ls", pccs->pwzExtractDir, wz); |
| 495 | hr = ::StringCchCatW(wzPath, countof(wzPath), wz); | 511 | hr = ::StringCchCatW(wzPath, countof(wzPath), wz); |
| 496 | ExitOnFailure(hr, "failed to concat onto path: %ls file: %ls", wzPath, wz); | 512 | CabExitOnFailure(hr, "failed to concat onto path: %ls file: %ls", wzPath, wz); |
| 497 | 513 | ||
| 498 | ipResult = reinterpret_cast<INT_PTR>(::CreateFileW(wzPath, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)); | 514 | ipResult = reinterpret_cast<INT_PTR>(::CreateFileW(wzPath, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)); |
| 499 | if (INVALID_HANDLE_VALUE == reinterpret_cast<HANDLE>(ipResult)) | 515 | if (INVALID_HANDLE_VALUE == reinterpret_cast<HANDLE>(ipResult)) |
| 500 | { | 516 | { |
| 501 | ExitWithLastError(hr, "failed to create file: %s", wzPath); | 517 | CabExitWithLastError(hr, "failed to create file: %ls", wzPath); |
| 502 | } | 518 | } |
| 503 | 519 | ||
| 504 | ::SetFileTime(reinterpret_cast<HANDLE>(ipResult), &ft, &ft, &ft); // try to set the file time (who cares if it fails) | 520 | ::SetFileTime(reinterpret_cast<HANDLE>(ipResult), &ft, &ft, &ft); // try to set the file time (who cares if it fails) |
| @@ -520,15 +536,15 @@ static __callback INT_PTR DIAMONDAPI CabExtractCallback(__in FDINOTIFICATIONTYPE | |||
| 520 | break; | 536 | break; |
| 521 | case fdintCLOSE_FILE_INFO: // resource extraction complete | 537 | case fdintCLOSE_FILE_INFO: // resource extraction complete |
| 522 | Assert(pFDINotify->hf && pFDINotify->psz1); | 538 | Assert(pFDINotify->hf && pFDINotify->psz1); |
| 523 | ExitOnNull(pccs, hr, E_INVALIDARG, "Failed to call cabextract callback, because no callback struct was provided"); | 539 | CabExitOnNull(pccs, hr, E_INVALIDARG, "Failed to call cabextract callback, because no callback struct was provided"); |
| 524 | 540 | ||
| 525 | // convert params to useful variables | 541 | // convert params to useful variables |
| 526 | sz = static_cast<LPCSTR>(pFDINotify->psz1); | 542 | sz = static_cast<LPCSTR>(pFDINotify->psz1); |
| 527 | ExitOnNull(sz, hr, E_INVALIDARG, "Failed to convert cabinet file id, because no cabinet file id was provided"); | 543 | CabExitOnNull(sz, hr, E_INVALIDARG, "Failed to convert cabinet file id, because no cabinet file id was provided"); |
| 528 | 544 | ||
| 529 | if (!::MultiByteToWideChar(CP_ACP, 0, sz, -1, wz, countof(wz))) | 545 | if (!::MultiByteToWideChar(CP_ACP, 0, sz, -1, wz, countof(wz))) |
| 530 | { | 546 | { |
| 531 | ExitWithLastError(hr, "failed to convert cabinet file id to unicode: %s", sz); | 547 | CabExitWithLastError(hr, "failed to convert cabinet file id to unicode: %s", sz); |
| 532 | } | 548 | } |
| 533 | 549 | ||
| 534 | if (NULL != pFDINotify->hf) // just close the file | 550 | if (NULL != pFDINotify->hf) // just close the file |
