Alexandre Julliard : setupapi: Support installing both types of builtins from the same directory.

Alexandre Julliard julliard at winehq.org
Mon Apr 26 15:51:31 CDT 2021


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Apr 26 12:39:46 2021 +0200

setupapi: Support installing both types of builtins from the same directory.

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

---

 dlls/setupapi/fakedll.c | 47 +++++++++++++++++++++++------------------------
 1 file changed, 23 insertions(+), 24 deletions(-)

diff --git a/dlls/setupapi/fakedll.c b/dlls/setupapi/fakedll.c
index 852cef3d54f..7fcc4a6fe89 100644
--- a/dlls/setupapi/fakedll.c
+++ b/dlls/setupapi/fakedll.c
@@ -190,14 +190,13 @@ static void extract_16bit_image( IMAGE_NT_HEADERS *nt, void **data, SIZE_T *size
 
 /* read in the contents of a file into the global file buffer */
 /* return 1 on success, 0 on nonexistent file, -1 on other error */
-static int read_file( const WCHAR *name, void **data, SIZE_T *size, BOOL expect_builtin )
+static int read_file( const WCHAR *name, void **data, SIZE_T *size )
 {
     struct stat st;
     int fd, ret = -1;
     size_t header_size;
     IMAGE_DOS_HEADER *dos;
     IMAGE_NT_HEADERS *nt;
-    const char *signature = expect_builtin ? builtin_signature : fakedll_signature;
     const size_t min_size = sizeof(*dos) + 32 +
         FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader.MajorLinkerVersion );
 
@@ -220,8 +219,9 @@ static int read_file( const WCHAR *name, void **data, SIZE_T *size, BOOL expect_
     if (read( fd, file_buffer, header_size ) != header_size) goto done;
     dos = file_buffer;
     if (dos->e_magic != IMAGE_DOS_SIGNATURE) goto done;
-    if (dos->e_lfanew < strlen(signature) + 1) goto done;
-    if (memcmp( dos + 1, signature, strlen(signature) + 1 )) goto done;
+    if (dos->e_lfanew < sizeof(*dos) + 32) goto done;
+    if (memcmp( dos + 1, builtin_signature, strlen(builtin_signature) + 1 ) &&
+        memcmp( dos + 1, fakedll_signature, strlen(fakedll_signature) + 1 )) goto done;
     if (dos->e_lfanew + FIELD_OFFSET(IMAGE_NT_HEADERS,OptionalHeader.MajorLinkerVersion) > header_size)
         goto done;
     nt = (IMAGE_NT_HEADERS *)((char *)file_buffer + dos->e_lfanew);
@@ -432,9 +432,9 @@ static void *load_fake_dll( const WCHAR *name, SIZE_T *size )
         ptr = prepend( ptr, ptr, namelen );
         ptr = prepend( ptr, L"\\dlls", 5 );
         ptr = prepend( ptr, build_dir, lstrlenW(build_dir) );
-        if ((res = read_file( ptr, &data, size, TRUE ))) goto done;
+        if ((res = read_file( ptr, &data, size ))) goto done;
         lstrcpyW( file + pos + len + 1, L".fake" );
-        if ((res = read_file( ptr, &data, size, FALSE ))) goto done;
+        if ((res = read_file( ptr, &data, size ))) goto done;
 
         /* now as a program */
         ptr = file + pos;
@@ -444,19 +444,19 @@ static void *load_fake_dll( const WCHAR *name, SIZE_T *size )
         ptr = prepend( ptr, ptr, namelen );
         ptr = prepend( ptr, L"\\programs", 9 );
         ptr = prepend( ptr, build_dir, lstrlenW(build_dir) );
-        if ((res = read_file( ptr, &data, size, TRUE ))) goto done;
+        if ((res = read_file( ptr, &data, size ))) goto done;
         lstrcpyW( file + pos + len + 1, L".fake" );
-        if ((res = read_file( ptr, &data, size, FALSE ))) goto done;
+        if ((res = read_file( ptr, &data, size ))) goto done;
     }
 
     file[pos + len + 1] = 0;
     for (i = 0; (path = enum_load_path( i )); i++)
     {
         ptr = prepend( file + pos, path, lstrlenW(path) );
-        if ((res = read_file( ptr, &data, size, TRUE ))) break;
+        if ((res = read_file( ptr, &data, size ))) break;
         ptr = prepend( file + pos, L"\\fakedlls", 9 );
         ptr = prepend( ptr, path, lstrlenW(path) );
-        if ((res = read_file( ptr, &data, size, FALSE ))) break;
+        if ((res = read_file( ptr, &data, size ))) break;
     }
 
 done:
@@ -881,7 +881,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 delete, BOOL expect_builtin, struct list *delay_copy )
+static int install_fake_dll( WCHAR *dest, WCHAR *file, const WCHAR *ext, BOOL delete, struct list *delay_copy )
 {
     int ret;
     SIZE_T size;
@@ -893,7 +893,7 @@ static int install_fake_dll( WCHAR *dest, WCHAR *file, const WCHAR *ext, BOOL de
     SIZE_T len = end - name;
 
     if (ext) lstrcpyW( end, ext );
-    if (!(ret = read_file( file, &data, &size, expect_builtin )))
+    if (!(ret = read_file( file, &data, &size )))
     {
         *end = 0;
         return 0;
@@ -936,8 +936,7 @@ static void delay_copy_files( struct list *delay_copy )
     LIST_FOR_EACH_ENTRY_SAFE( copy, next, delay_copy, struct delay_copy, entry )
     {
         list_remove( &copy->entry );
-        ret = read_file( copy->src, &data, &size, TRUE );
-        if (ret == -1) ret = read_file( copy->src, &data, &size, FALSE );
+        ret = read_file( copy->src, &data, &size );
         if (ret != 1)
         {
             HeapFree( GetProcessHeap(), 0, copy );
@@ -958,7 +957,7 @@ 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 *wildcard,
-                             const WCHAR *default_ext, BOOL delete, BOOL expect_builtin )
+                             const WCHAR *default_ext, BOOL delete )
 {
     WCHAR *name;
     intptr_t handle;
@@ -983,14 +982,14 @@ static void install_lib_dir( WCHAR *dest, WCHAR *file, const WCHAR *wildcard,
             lstrcatW( name, data.name );
             if (wcschr( data.name, '.' )) /* module possibly already has an extension */
             {
-                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;
+                if (install_fake_dll( dest, file, NULL, delete, &delay_copy )) continue;
+                if (install_fake_dll( dest, file, L".fake", delete, &delay_copy )) continue;
             }
             lstrcatW( name, default_ext );
-            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;
+            if (install_fake_dll( dest, file, NULL, delete, &delay_copy )) continue;
+            if (install_fake_dll( dest, file, L".fake", delete, &delay_copy )) continue;
         }
-        else install_fake_dll( dest, file, NULL, delete, expect_builtin, &delay_copy );
+        else install_fake_dll( dest, file, NULL, delete, &delay_copy );
     }
     while (!_wfindnext( handle, &data ));
     _findclose( handle );
@@ -1023,18 +1022,18 @@ static BOOL create_wildcard_dlls( const WCHAR *dirname, const WCHAR *wildcard, B
     {
         lstrcpyW( file, build_dir );
         lstrcatW( file, L"\\dlls" );
-        install_lib_dir( dest, file, wildcard, L".dll", delete, TRUE );
+        install_lib_dir( dest, file, wildcard, L".dll", delete );
         lstrcpyW( file, build_dir );
         lstrcatW( file, L"\\programs" );
-        install_lib_dir( dest, file, wildcard, L".exe", delete, TRUE );
+        install_lib_dir( dest, file, wildcard, L".exe", delete );
     }
     for (i = 0; (path = enum_load_path( i )); i++)
     {
         lstrcpyW( file, path );
-        install_lib_dir( dest, file, wildcard, NULL, delete, TRUE );
+        install_lib_dir( dest, file, wildcard, NULL, delete );
         lstrcpyW( file, path );
         lstrcatW( file, L"\\fakedlls" );
-        install_lib_dir( dest, file, wildcard, NULL, delete, FALSE );
+        install_lib_dir( dest, file, wildcard, NULL, delete );
     }
     HeapFree( GetProcessHeap(), 0, file );
     HeapFree( GetProcessHeap(), 0, dest );




More information about the wine-cvs mailing list