Alexandre Julliard : setupapi: Support arbitrary wildcards in fake dlls creation.

Alexandre Julliard julliard at winehq.org
Thu Mar 18 16:43:53 CDT 2021


Module: wine
Branch: master
Commit: 5d3d73f80360014c13d8a44d06a384288c89b19d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=5d3d73f80360014c13d8a44d06a384288c89b19d

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Mar 18 12:48:45 2021 +0100

setupapi: Support arbitrary wildcards in fake dlls creation.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/setupapi/fakedll.c | 58 +++++++++++++++++++++++++------------------------
 loader/wine.inf.in      | 28 ++----------------------
 2 files changed, 32 insertions(+), 54 deletions(-)

diff --git a/dlls/setupapi/fakedll.c b/dlls/setupapi/fakedll.c
index 3196708a7f7..552bec27f31 100644
--- a/dlls/setupapi/fakedll.c
+++ b/dlls/setupapi/fakedll.c
@@ -466,7 +466,7 @@ done:
 }
 
 /* create the fake dll destination file */
-static HANDLE create_dest_file( const WCHAR *name )
+static HANDLE create_dest_file( const WCHAR *name, BOOL delete )
 {
     /* first check for an existing file */
     HANDLE h = CreateFileW( name, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL );
@@ -478,11 +478,17 @@ static HANDLE create_dest_file( const WCHAR *name )
             CloseHandle( h );
             return 0;
         }
+        if (delete)
+        {
+            CloseHandle( h );
+            DeleteFileW( name );
+            return INVALID_HANDLE_VALUE;
+        }
         /* truncate the file */
         SetFilePointer( h, 0, NULL, FILE_BEGIN );
         SetEndOfFile( h );
     }
-    else
+    else if (!delete)
     {
         if (GetLastError() == ERROR_PATH_NOT_FOUND) create_directories( name );
 
@@ -872,7 +878,7 @@ static void register_fake_dll( const WCHAR *name, const void *data, size_t size,
 }
 
 /* copy a fake dll file to the dest directory */
-static int install_fake_dll( WCHAR *dest, WCHAR *file, const WCHAR *ext, BOOL expect_builtin, struct list *delay_copy )
+static int install_fake_dll( WCHAR *dest, WCHAR *file, const WCHAR *ext, BOOL delete, BOOL expect_builtin, struct list *delay_copy )
 {
     int ret;
     SIZE_T size;
@@ -897,7 +903,7 @@ static int install_fake_dll( WCHAR *dest, WCHAR *file, const WCHAR *ext, BOOL ex
 
     if (ret != -1)
     {
-        HANDLE h = create_dest_file( dest );
+        HANDLE h = create_dest_file( dest, delete );
 
         if (h && h != INVALID_HANDLE_VALUE)
         {
@@ -935,7 +941,7 @@ static void delay_copy_files( struct list *delay_copy )
             continue;
         }
 
-        h = create_dest_file( copy->dest );
+        h = create_dest_file( copy->dest, FALSE );
         if (h && h != INVALID_HANDLE_VALUE)
         {
             ret = (WriteFile( h, data, size, &written, NULL ) && written == size);
@@ -948,7 +954,8 @@ static void delay_copy_files( struct list *delay_copy )
 }
 
 /* find and install all fake dlls in a given lib directory */
-static void install_lib_dir( WCHAR *dest, WCHAR *file, const WCHAR *default_ext, BOOL expect_builtin )
+static void install_lib_dir( WCHAR *dest, WCHAR *file, const WCHAR *wildcard,
+                             const WCHAR *default_ext, BOOL delete, BOOL expect_builtin )
 {
     WCHAR *name;
     intptr_t handle;
@@ -958,7 +965,7 @@ static void install_lib_dir( WCHAR *dest, WCHAR *file, const WCHAR *default_ext,
     file[1] = '\\';  /* change \??\ to \\?\ */
     name = file + lstrlenW(file);
     *name++ = '\\';
-    lstrcpyW( name, L"*" );
+    lstrcpyW( name, wildcard );
 
     if ((handle = _wfindfirst( file, &data )) == -1) return;
     do
@@ -973,14 +980,14 @@ static void install_lib_dir( WCHAR *dest, WCHAR *file, const WCHAR *default_ext,
             lstrcatW( name, data.name );
             if (wcschr( data.name, '.' )) /* module possibly already has an extension */
             {
-                if (install_fake_dll( dest, file, NULL, expect_builtin, &delay_copy )) continue;
-                if (install_fake_dll( dest, file, L".fake", FALSE, &delay_copy )) continue;
+                if (install_fake_dll( dest, file, NULL, delete, expect_builtin, &delay_copy )) continue;
+                if (install_fake_dll( dest, file, L".fake", delete, FALSE, &delay_copy )) continue;
             }
             lstrcatW( name, default_ext );
-            if (install_fake_dll( dest, file, NULL, expect_builtin, &delay_copy )) continue;
-            if (install_fake_dll( dest, file, L".fake", FALSE, &delay_copy )) continue;
+            if (install_fake_dll( dest, file, NULL, delete, expect_builtin, &delay_copy )) continue;
+            if (install_fake_dll( dest, file, L".fake", delete, FALSE, &delay_copy )) continue;
         }
-        else install_fake_dll( dest, file, NULL, expect_builtin, &delay_copy );
+        else install_fake_dll( dest, file, NULL, delete, expect_builtin, &delay_copy );
     }
     while (!_wfindnext( handle, &data ));
     _findclose( handle );
@@ -989,12 +996,12 @@ static void install_lib_dir( WCHAR *dest, WCHAR *file, const WCHAR *default_ext,
 }
 
 /* create fake dlls in dirname for all the files we can find */
-static BOOL create_wildcard_dlls( const WCHAR *dirname )
+static BOOL create_wildcard_dlls( const WCHAR *dirname, const WCHAR *wildcard, BOOL delete )
 {
     const WCHAR *build_dir = _wgetenv( L"WINEBUILDDIR" );
     const WCHAR *path;
     unsigned int i, maxlen = 0;
-    WCHAR *file, *dest;
+    WCHAR *file, *dest, *p;
 
     if (build_dir) maxlen = lstrlenW(build_dir) + ARRAY_SIZE(L"\\programs") + 1;
     for (i = 0; (path = enum_load_path(i)); i++) maxlen = max( maxlen, lstrlenW(path) );
@@ -1007,24 +1014,24 @@ static BOOL create_wildcard_dlls( const WCHAR *dirname )
         return FALSE;
     }
     lstrcpyW( dest, dirname );
-    dest[lstrlenW(dest) - 1] = 0;  /* remove wildcard */
+    if ((p = wcsrchr( dest, '\\' ))) p[1] = 0;  /* remove wildcard */
 
     if (build_dir)
     {
         lstrcpyW( file, build_dir );
         lstrcatW( file, L"\\dlls" );
-        install_lib_dir( dest, file, L".dll", TRUE );
+        install_lib_dir( dest, file, wildcard, L".dll", delete, TRUE );
         lstrcpyW( file, build_dir );
         lstrcatW( file, L"\\programs" );
-        install_lib_dir( dest, file, L".exe", TRUE );
+        install_lib_dir( dest, file, wildcard, L".exe", delete, TRUE );
     }
     for (i = 0; (path = enum_load_path( i )); i++)
     {
         lstrcpyW( file, path );
-        install_lib_dir( dest, file, NULL, TRUE );
+        install_lib_dir( dest, file, wildcard, NULL, delete, TRUE );
         lstrcpyW( file, path );
         lstrcatW( file, L"\\fakedlls" );
-        install_lib_dir( dest, file, NULL, FALSE );
+        install_lib_dir( dest, file, wildcard, NULL, delete, FALSE );
     }
     HeapFree( GetProcessHeap(), 0, file );
     HeapFree( GetProcessHeap(), 0, dest );
@@ -1042,6 +1049,7 @@ BOOL create_fake_dll( const WCHAR *name, const WCHAR *source )
     SIZE_T size;
     const WCHAR *filename;
     void *buffer;
+    BOOL delete = !wcscmp( source, L"-" );  /* '-' source means delete the file */
 
     if (!(filename = wcsrchr( name, '\\' ))) filename = name;
     else filename++;
@@ -1052,20 +1060,14 @@ BOOL create_fake_dll( const WCHAR *name, const WCHAR *source )
         create_directories( name );
         return TRUE;
     }
-    if (filename[0] == '*' && !filename[1]) return create_wildcard_dlls( name );
+    if (wcspbrk( filename, L"*?" )) return create_wildcard_dlls( name, filename, delete );
 
     add_handled_dll( filename );
 
-    if (!(h = create_dest_file( name ))) return TRUE;  /* not a fake dll */
+    if (!(h = create_dest_file( name, delete ))) return TRUE;  /* not a fake dll */
     if (h == INVALID_HANDLE_VALUE) return FALSE;
 
-    if (source[0] == '-' && !source[1])
-    {
-        /* '-' source means delete the file */
-        TRACE( "deleting %s\n", debugstr_w(name) );
-        ret = FALSE;
-    }
-    else if ((buffer = load_fake_dll( source, &size )))
+    if ((buffer = load_fake_dll( source, &size )))
     {
         DWORD written;
 
diff --git a/loader/wine.inf.in b/loader/wine.inf.in
index 4cef944fb88..3abcc41ffa1 100644
--- a/loader/wine.inf.in
+++ b/loader/wine.inf.in
@@ -2630,19 +2630,6 @@ HKLM,%CurrentVersion%\Telephony\Country List\998,"SameAreaRule",,"G"
 10,syswow64,stdole2.tlb
 11,,iexplore.exe
 11,,winetest.exe,-
-12,,fltmgr.sys,-
-12,,hidclass.sys,-
-12,,http.sys,-
-12,,ksecdd.sys,-
-12,,mountmgr.sys,-
-12,,ndis.sys,-
-12,,netio.sys,-
-12,,scsiport.sys,-
-12,,tdi.sys,-
-12,,usbd.sys,-
-12,,winebus.sys,-
-12,,winehid.sys,-
-12,,wineusb.sys,-
 ; skip .NET fake dlls in Wine Mono package
 11,,aspnet_regiis.exe,-
 11,,ngen.exe,-
@@ -2665,6 +2652,7 @@ HKLM,%CurrentVersion%\Telephony\Country List\998,"SameAreaRule",,"G"
 16427,System\OLE DB,oledb32.dll
 16427,System\OLE DB,msdaps.dll
 16427,System\ADO,msado15.dll
+12,,*.sys,-
 11,,*
 
 [FakeDlls]
@@ -2685,19 +2673,6 @@ HKLM,%CurrentVersion%\Telephony\Country List\998,"SameAreaRule",,"G"
 11,,iexplore.exe
 11,,notepad.exe
 11,,winetest.exe,-
-12,,fltmgr.sys
-12,,hidclass.sys
-12,,http.sys
-12,,ksecdd.sys
-12,,mountmgr.sys
-12,,ndis.sys
-12,,netio.sys
-12,,scsiport.sys
-12,,tdi.sys
-12,,usbd.sys
-12,,winebus.sys
-12,,winehid.sys
-12,,wineusb.sys
 ; skip .NET fake dlls in Wine Mono package
 11,,aspnet_regiis.exe,-
 11,,ngen.exe,-
@@ -2732,6 +2707,7 @@ HKLM,%CurrentVersion%\Telephony\Country List\998,"SameAreaRule",,"G"
 16427,System\OLE DB,oledb32.dll
 16427,System\OLE DB,msdaps.dll
 16427,System\ADO,msado15.dll
+12,,*.sys,-
 11,,*
 
 [SystemIni]




More information about the wine-cvs mailing list