https://git.reactos.org/?p=reactos.git;a=commitdiff;h=5c8ec78b71de9a2ea4faca...
commit 5c8ec78b71de9a2ea4faca4c7beec1e54a172a40 Author: Doug Lyons douglyons@douglyons.com AuthorDate: Sun Apr 30 08:34:26 2023 -0500 Commit: GitHub noreply@github.com CommitDate: Sun Apr 30 15:34:26 2023 +0200
[SETUPAPI] Sync setupapi/queue.c to Wine 4.8 (#5233)
Sync setupapi/queue.c to Wine 4.8 to improve cab extraction. This fixes 'fixme:(dll/win32/setupapi/queue.c:418) awful hack: extracting cabinet' --- dll/win32/setupapi/queue.c | 156 ++++++++++++++++----------------------------- media/doc/WINESYNC.txt | 2 +- 2 files changed, 55 insertions(+), 103 deletions(-)
diff --git a/dll/win32/setupapi/queue.c b/dll/win32/setupapi/queue.c index 54517205729..f33fbb8f6fe 100644 --- a/dll/win32/setupapi/queue.c +++ b/dll/win32/setupapi/queue.c @@ -361,12 +361,52 @@ static WCHAR *get_destination_dir( HINF hinf, const WCHAR *section ) return PARSER_get_dest_dir( &context ); }
+struct extract_cab_ctx +{ + const WCHAR *src; + const WCHAR *dst; +};
-#ifndef __REACTOS__ -static void (WINAPI *pExtractFiles)( LPSTR, LPSTR, DWORD, DWORD, DWORD, DWORD ); -#else -static void (WINAPI *pExtractFiles)( LPSTR, LPSTR, DWORD, LPSTR, LPVOID, DWORD ); -#endif +static UINT WINAPI extract_cab_cb( void *arg, UINT message, UINT_PTR param1, UINT_PTR param2 ) +{ + struct extract_cab_ctx *ctx = arg; + + switch (message) + { + case SPFILENOTIFY_FILEINCABINET: + { + FILE_IN_CABINET_INFO_W *info = (FILE_IN_CABINET_INFO_W *)param1; + const WCHAR *filename; + + if ((filename = strrchrW( info->NameInCabinet, '\' ))) + filename++; + else + filename = info->NameInCabinet; + + if (lstrcmpiW( filename, ctx->src )) + return FILEOP_SKIP; + + strcpyW( info->FullTargetName, ctx->dst ); + return FILEOP_DOIT; + } + case SPFILENOTIFY_FILEEXTRACTED: + { + const FILEPATHS_W *paths = (const FILEPATHS_W *)param1; + return paths->Win32Error; + } + case SPFILENOTIFY_NEEDNEWCABINET: + { + const CABINET_INFO_W *info = (const CABINET_INFO_W *)param1; + strcpyW( (WCHAR *)param2, info->CabinetPath ); + return ERROR_SUCCESS; + } + case SPFILENOTIFY_CABINETINFO: + return 0; + default: + FIXME("Unexpected message %#x.\n", message); + return 0; + } +}
/*********************************************************************** * extract_cabinet_file @@ -379,111 +419,23 @@ static BOOL extract_cabinet_file( const WCHAR *cabinet, const WCHAR *root, #ifndef __REACTOS__ static const WCHAR extW[] = {'.','c','a','b',0}; #endif - static HMODULE advpack; - - char *cab_path, *cab_file; - int len = strlenW( cabinet ); + static const WCHAR backslashW[] = {'\',0}; + WCHAR path[MAX_PATH]; + struct extract_cab_ctx ctx = {src, dst};
#ifdef __REACTOS__ TRACE("extract_cabinet_file(cab = '%s' ; root = '%s' ; src = '%s' ; dst = '%s')\n", debugstr_w(cabinet), debugstr_w(root), debugstr_w(src), debugstr_w(dst)); #else + int len = strlenW( cabinet ); /* make sure the cabinet file has a .cab extension */ if (len <= 4 || strcmpiW( cabinet + len - 4, extW )) return FALSE; #endif - if (!pExtractFiles) - { - if (!advpack && !(advpack = LoadLibraryA( "advpack.dll" ))) - { - ERR( "could not load advpack.dll\n" ); - return FALSE; - } - if (!(pExtractFiles = (void *)GetProcAddress( advpack, "ExtractFiles" ))) - { - ERR( "could not find ExtractFiles in advpack.dll\n" ); - return FALSE; - } - } - - if (!(cab_path = strdupWtoA( root ))) return FALSE; - len = WideCharToMultiByte( CP_ACP, 0, cabinet, -1, NULL, 0, NULL, NULL ); - if (!(cab_file = HeapAlloc( GetProcessHeap(), 0, strlen(cab_path) + len + 1 ))) - { - HeapFree( GetProcessHeap(), 0, cab_path ); - return FALSE; - } - strcpy( cab_file, cab_path ); - if (cab_file[0] && cab_file[strlen(cab_file)-1] != '\') strcat( cab_file, "\" ); - WideCharToMultiByte( CP_ACP, 0, cabinet, -1, cab_file + strlen(cab_file), len, NULL, NULL ); - FIXME( "awful hack: extracting cabinet %s\n", debugstr_a(cab_file) ); - -#ifdef __REACTOS__ - { - BOOL Success; - char *src_file; - const WCHAR *src_fileW; - WCHAR TempPath[MAX_PATH]; - - /* Retrieve the temporary path */ - if (!GetTempPathW(ARRAYSIZE(TempPath), TempPath)) - { - ERR("GetTempPathW error\n"); - HeapFree( GetProcessHeap(), 0, cab_file ); - return FALSE; - } + strcpyW(path, root); + strcatW(path, backslashW); + strcatW(path, cabinet);
- /* Build the real path to where the file will be extracted */ - HeapFree( GetProcessHeap(), 0, cab_path ); - if (!(cab_path = strdupWtoA( TempPath ))) - { - HeapFree( GetProcessHeap(), 0, cab_file ); - return FALSE; - } - - /* Build the file list */ - src_fileW = strrchrW(src, '\'); // Find where the filename starts. - if (src_fileW) ++src_fileW; - else src_fileW = src; - /* Convert to ANSI */ - if (!(src_file = strdupWtoA( src_fileW ))) - { - HeapFree( GetProcessHeap(), 0, cab_file ); - HeapFree( GetProcessHeap(), 0, cab_path ); - return FALSE; - } - - /* Prepare for the move operation */ - /* Build the full path to the extracted file, that will be renamed */ - if (!(src = HeapAlloc( GetProcessHeap(), 0, (strlenW(TempPath) + 1 + strlenW(src_fileW) + 1) * sizeof(WCHAR) ))) - { - HeapFree( GetProcessHeap(), 0, src_file ); - HeapFree( GetProcessHeap(), 0, cab_file ); - HeapFree( GetProcessHeap(), 0, cab_path ); - return FALSE; - } - concat_W( (WCHAR*)src, NULL, TempPath, src_fileW ); - - TRACE("pExtractFiles(cab_file = '%s' ; cab_path = '%s', src_file = '%s')\n", - debugstr_a(cab_file), debugstr_a(cab_path), debugstr_a(src_file)); - - /* Extract to temporary folder */ - pExtractFiles( cab_file, cab_path, 0, src_file, NULL, 0 ); - HeapFree( GetProcessHeap(), 0, src_file ); - HeapFree( GetProcessHeap(), 0, cab_file ); - HeapFree( GetProcessHeap(), 0, cab_path ); - - /* Move to destination, overwriting the original file if needed */ - TRACE("Renaming src = '%s' to dst = '%s')\n", debugstr_w(src), debugstr_w(dst)); - Success = MoveFileExW( src, dst , MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED ); - HeapFree( GetProcessHeap(), 0, (WCHAR*)src ); - return Success; - } -#else - pExtractFiles( cab_file, cab_path, 0, 0, 0, 0 ); - HeapFree( GetProcessHeap(), 0, cab_file ); - HeapFree( GetProcessHeap(), 0, cab_path ); - return CopyFileW( src, dst, FALSE /*FIXME*/ ); -#endif + return SetupIterateCabinetW( path, 0, extract_cab_cb, &ctx ); }
@@ -1493,7 +1445,7 @@ BOOL WINAPI SetupCommitFileQueueW( HWND owner, HSPFILEQ handle, PSP_FILE_CALLBAC if (op->src_tag) { if (extract_cabinet_file( op->src_tag, op->src_root, - paths.Source, paths.Target )) break; + op->src_file, paths.Target )) break; } paths.Win32Error = GetLastError(); op_result = handler( context, SPFILENOTIFY_COPYERROR, diff --git a/media/doc/WINESYNC.txt b/media/doc/WINESYNC.txt index cb460336c0d..5ae9963f7de 100644 --- a/media/doc/WINESYNC.txt +++ b/media/doc/WINESYNC.txt @@ -363,7 +363,7 @@ secur32 -
setupapi - dll/win32/setupapi/dialog.c # Synced to WineStaging-1.9.15 - dll/win32/setupapi/query.c # Partially synced to WineStaging-1.9.4 + dll/win32/setupapi/query.c # Partially synced to Wine-4.8 dll/win32/setupapi/setupcab.c # Synced to WineStaging-1.9.4
win32k -