[PATCH 2/3] setupapi: Store the original INF file path in a .pnf file.

Zebediah Figura z.figura12 at gmail.com
Thu Jun 11 11:16:31 CDT 2020


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
I've added todo_wine to the tests rather than try to fix SetupUninstallOEMInf(),
since fixing that function would require a nontrivial amount of work, whereas
the now failing tests seem unlikely to cause any more problems in real
applications.

 dlls/setupapi/Makefile.in        |  2 +-
 dlls/setupapi/misc.c             | 17 ++++++++++++++++-
 dlls/setupapi/setupapi_private.h |  2 ++
 dlls/setupapi/tests/misc.c       |  4 ++--
 4 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/dlls/setupapi/Makefile.in b/dlls/setupapi/Makefile.in
index 6c31365546f..539bfed0caa 100644
--- a/dlls/setupapi/Makefile.in
+++ b/dlls/setupapi/Makefile.in
@@ -1,7 +1,7 @@
 EXTRADEFS = -D_SETUPAPI_
 MODULE    = setupapi.dll
 IMPORTLIB = setupapi
-IMPORTS   = uuid version advapi32 rpcrt4
+IMPORTS   = uuid version advapi32 rpcrt4 kernelbase
 DELAYIMPORTS = shell32 wintrust ole32 winspool.drv comdlg32 user32
 
 EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/setupapi/misc.c b/dlls/setupapi/misc.c
index 3b0c9477747..26e5359804c 100644
--- a/dlls/setupapi/misc.c
+++ b/dlls/setupapi/misc.c
@@ -31,6 +31,7 @@
 #include "softpub.h"
 #include "mscat.h"
 #include "shlobj.h"
+#include "shlwapi.h"
 
 #include "wine/debug.h"
 
@@ -962,10 +963,11 @@ BOOL WINAPI SetupCopyOEMInfW( PCWSTR source, PCWSTR location,
                               DWORD buffer_size, DWORD *required_size, WCHAR **filepart )
 {
     BOOL ret = FALSE;
-    WCHAR target[MAX_PATH], catalog_file[MAX_PATH], *p;
+    WCHAR target[MAX_PATH], catalog_file[MAX_PATH], pnf_path[MAX_PATH], *p;
     static const WCHAR inf[] = { '\\','i','n','f','\\',0 };
     static const WCHAR wszVersion[] = { 'V','e','r','s','i','o','n',0 };
     static const WCHAR wszCatalogFile[] = { 'C','a','t','a','l','o','g','F','i','l','e',0 };
+    FILE *pnf_file;
     unsigned int i;
     DWORD size;
     HINF hinf;
@@ -1069,6 +1071,19 @@ done:
     if (style & SP_COPY_DELETESOURCE)
         DeleteFileW( source );
 
+    if (ret)
+    {
+        wcscpy(pnf_path, target);
+        PathRemoveExtensionW(pnf_path);
+        PathAddExtensionW(pnf_path, L".pnf");
+        if ((pnf_file = _wfopen(pnf_path, L"w")))
+        {
+            fputws(PNF_HEADER, pnf_file);
+            fputws(source, pnf_file);
+            fclose(pnf_file);
+        }
+    }
+
     size = lstrlenW( target ) + 1;
     if (dest)
     {
diff --git a/dlls/setupapi/setupapi_private.h b/dlls/setupapi/setupapi_private.h
index f4685ab2b4c..21ac50e0f3c 100644
--- a/dlls/setupapi/setupapi_private.h
+++ b/dlls/setupapi/setupapi_private.h
@@ -43,6 +43,8 @@
 #define REGPART_RENAME "\\Rename"
 #define REG_VERSIONCONFLICT "Software\\Microsoft\\VersionConflictManager"
 
+#define PNF_HEADER L"Wine PNF header\n"
+
 extern HINSTANCE SETUPAPI_hInstance DECLSPEC_HIDDEN;
 
 static inline void * __WINE_ALLOC_SIZE(2) heap_realloc_zero(void *mem, size_t len)
diff --git a/dlls/setupapi/tests/misc.c b/dlls/setupapi/tests/misc.c
index 3bb308ef4a7..f16f310b3f7 100644
--- a/dlls/setupapi/tests/misc.c
+++ b/dlls/setupapi/tests/misc.c
@@ -320,7 +320,7 @@ static void test_SetupCopyOEMInf(void)
     DeleteFileA(dest);
     strcpy(pnf, dest);
     *(strrchr(pnf, '.') + 1) = 'p';
-    ok(!file_exists(pnf), "Expected pnf '%s' to not exist\n", pnf);
+    todo_wine ok(!file_exists(pnf), "Expected pnf '%s' to not exist\n", pnf);
 
     res = SetupUninstallOEMInfA(strrchr(orig_dest, '\\') + 1, 0, NULL);
     ok(res, "Failed to uninstall '%s', error %u.\n", orig_dest, GetLastError());
@@ -328,7 +328,7 @@ static void test_SetupCopyOEMInf(void)
     DeleteFileA(orig_dest);
     strcpy(pnf, dest);
     *(strrchr(pnf, '.') + 1) = 'p';
-    ok(!file_exists(pnf), "Expected pnf '%s' to not exist\n", pnf);
+    todo_wine ok(!file_exists(pnf), "Expected pnf '%s' to not exist\n", pnf);
 
     GetWindowsDirectoryA(orig_dest, sizeof(orig_dest));
     strcat(orig_dest, "\\inf\\");
-- 
2.27.0




More information about the wine-devel mailing list