Alexandre Julliard : setupapi: Add support for using a wildcard in fake dll creation.
Alexandre Julliard
julliard at winehq.org
Thu Oct 15 08:54:39 CDT 2009
Module: wine
Branch: master
Commit: 7acd74ee0743974b5e500f43d340560899ba9eee
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7acd74ee0743974b5e500f43d340560899ba9eee
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Oct 15 13:53:14 2009 +0200
setupapi: Add support for using a wildcard in fake dll creation.
This creates fake dlls for all the files we can't find and that
haven't been created already.
---
dlls/setupapi/fakedll.c | 121 +++++++++++++++++++++++++++++++++++++++++++++++
tools/wine.inf.in | 78 +-----------------------------
2 files changed, 123 insertions(+), 76 deletions(-)
diff --git a/dlls/setupapi/fakedll.c b/dlls/setupapi/fakedll.c
index fa89ace..6397950 100644
--- a/dlls/setupapi/fakedll.c
+++ b/dlls/setupapi/fakedll.c
@@ -23,6 +23,9 @@
#include <stdarg.h>
#include <fcntl.h>
+#ifdef HAVE_DIRENT_H
+# include <dirent.h>
+#endif
#ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
#endif
@@ -49,6 +52,7 @@ static const char fakedll_signature[] = "Wine placeholder DLL";
static const unsigned int file_alignment = 512;
static const unsigned int section_alignment = 4096;
+static const unsigned int max_dll_name_len = 64;
static void *file_buffer;
static size_t file_buffer_size;
@@ -127,6 +131,16 @@ static char *dll_name_WtoA( char *nameA, const WCHAR *nameW, unsigned int len )
return nameA;
}
+/* convert a dll name A->W without depending on the current codepage */
+static WCHAR *dll_name_AtoW( WCHAR *nameW, const char *nameA, unsigned int len )
+{
+ unsigned int i;
+
+ for (i = 0; i < len; i++) nameW[i] = nameA[i];
+ nameW[i] = 0;
+ return nameW;
+}
+
/* add a dll to the list of dll that have been taken care of */
static BOOL add_handled_dll( const WCHAR *name )
{
@@ -451,6 +465,111 @@ static HANDLE create_dest_file( const WCHAR *name )
return h;
}
+/* copy a fake dll file to the dest directory */
+static void install_fake_dll( WCHAR *dest, char *file, const char *ext )
+{
+ int ret;
+ size_t size;
+ void *data;
+ DWORD written;
+ WCHAR *destname = dest + strlenW(dest);
+ char *name = strrchr( file, '/' ) + 1;
+ char *end = name + strlen(name);
+
+ if (ext) strcpy( end, ext );
+ if (!(ret = read_file( file, &data, &size ))) return;
+
+ if (end > name + 2 && !strncmp( end - 2, "16", 2 )) end -= 2; /* remove "16" suffix */
+ dll_name_AtoW( destname, name, end - name );
+ if (!add_handled_dll( destname )) ret = -1;
+
+ if (ret != -1)
+ {
+ HANDLE h = create_dest_file( dest );
+
+ if (h && h != INVALID_HANDLE_VALUE)
+ {
+ TRACE( "%s -> %s\n", debugstr_a(file), debugstr_w(dest) );
+
+ ret = (WriteFile( h, data, size, &written, NULL ) && written == size);
+ if (!ret) ERR( "failed to write to %s (error=%u)\n", debugstr_w(dest), GetLastError() );
+ CloseHandle( h );
+ if (!ret) DeleteFileW( dest );
+ }
+ }
+ *destname = 0; /* restore it for next file */
+}
+
+/* find and install all fake dlls in a given lib directory */
+static void install_lib_dir( WCHAR *dest, char *file, const char *default_ext )
+{
+ DIR *dir;
+ struct dirent *de;
+ char *name;
+
+ if (!(dir = opendir( file ))) return;
+ name = file + strlen(file);
+ *name++ = '/';
+ while ((de = readdir( dir )))
+ {
+ if (strlen( de->d_name ) > max_dll_name_len) continue;
+ if (!strcmp( de->d_name, "." )) continue;
+ if (!strcmp( de->d_name, ".." )) continue;
+ strcpy( name, de->d_name );
+ if (default_ext) /* inside build dir */
+ {
+ strcat( name, "/" );
+ strcat( name, de->d_name );
+ if (!strchr( de->d_name, '.' )) strcat( name, default_ext );
+ install_fake_dll( dest, file, ".fake" );
+ }
+ else install_fake_dll( dest, file, NULL );
+ }
+ closedir( dir );
+}
+
+/* create fake dlls in dirname for all the files we can find */
+static BOOL create_wildcard_dlls( const WCHAR *dirname )
+{
+ const char *build_dir = wine_get_build_dir();
+ const char *path;
+ unsigned int i, maxlen = 0;
+ char *file;
+ WCHAR *dest;
+
+ if (build_dir) maxlen = strlen(build_dir) + sizeof("/programs/");
+ for (i = 0; (path = wine_dll_enum_load_path(i)); i++) maxlen = max( maxlen, strlen(path) );
+ maxlen += 2 * max_dll_name_len + 2 + sizeof(".dll.fake");
+ if (!(file = HeapAlloc( GetProcessHeap(), 0, maxlen ))) return FALSE;
+
+ if (!(dest = HeapAlloc( GetProcessHeap(), 0, (strlenW(dirname) + max_dll_name_len) * sizeof(WCHAR) )))
+ {
+ HeapFree( GetProcessHeap(), 0, file );
+ return FALSE;
+ }
+ strcpyW( dest, dirname );
+ dest[strlenW(dest) - 1] = 0; /* remove wildcard */
+
+ if (build_dir)
+ {
+ strcpy( file, build_dir );
+ strcat( file, "/dlls" );
+ install_lib_dir( dest, file, ".dll" );
+ strcpy( file, build_dir );
+ strcat( file, "/programs" );
+ install_lib_dir( dest, file, ".exe" );
+ }
+ for (i = 0; (path = wine_dll_enum_load_path( i )); i++)
+ {
+ strcpy( file, path );
+ strcat( file, "/fakedlls" );
+ install_lib_dir( dest, file, NULL );
+ }
+ HeapFree( GetProcessHeap(), 0, file );
+ HeapFree( GetProcessHeap(), 0, dest );
+ return TRUE;
+}
+
/***********************************************************************
* create_fake_dll
*/
@@ -471,6 +590,8 @@ 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 );
+
add_handled_dll( filename );
if (!(h = create_dest_file( name ))) return TRUE; /* not a fake dll */
diff --git a/tools/wine.inf.in b/tools/wine.inf.in
index 6b6acf9..9f0a2de 100644
--- a/tools/wine.inf.in
+++ b/tools/wine.inf.in
@@ -2446,93 +2446,19 @@ HKLM,%CurrentVersion%\Telephony\Country List\998,"SameAreaRule",,"G"
10,,hh.exe
10,,notepad.exe
10,,regedit.exe
+10,,twain.dll,twain.dll16
10,,twain_32.dll
10,,winhelp.exe,winhelp.exe16
10,,winhlp32.exe
10,command,start.exe
-11,,actxprxy.dll
-11,,advapi32.dll
-11,,advpack.dll
-11,,appwiz.cpl
-11,,cabinet.dll
-11,,cmd.exe
-11,,comctl32.dll
-11,,comdlg32.dll
-11,,control.exe
-11,,crypt32.dll
-11,,d3d8.dll
-11,,d3d9.dll
-11,,dbghelp.dll
-11,,ddeml.dll,ddeml.dll16
11,,ddhelp.exe
-11,,ddraw.dll
-11,,dinput8.dll
11,,dosx.exe
-11,,dsound.dll
11,,dsound.vxd
-11,,dxdiagn.dll
-11,,gdi32.dll
-11,,glu32.dll
-11,,hal.dll
-11,,hhctrl.ocx
-11,,imaadp32.acm
-11,,imagehlp.dll
-11,,itircl.dll
-11,,itss.dll
-11,,kernel32.dll
-11,,mapi32.dll
-11,,msadp32.acm
-11,,msg711.acm
-11,,msgsm32.acm
-11,,mshtml.dll
-11,,msi.dll
-11,,msiexec.exe
-11,,msvcrt.dll
-11,,msxml3.dll
11,,notepad.exe
-11,,ntdll.dll
-11,,ntoskrnl.exe
-11,,ole32.dll
-11,,oleaut32.dll
-11,,oledlg.dll
-11,,olepro32.dll
-11,,opengl32.dll
-11,,progman.exe
-11,,psapi.dll
-11,,pstorec.dll
-11,,quartz.dll
-11,,regsvr32.exe
-11,,reg.exe
-11,,riched20.dll
-11,,riched32.dll
-11,,rpcrt4.dll
-11,,rsabase.dll
-11,,rsaenh.dll
-11,,rundll32.exe
-11,,schannel.dll
-11,,sensapi.dll
-11,,setupapi.dll
-11,,shdocvw.dll
-11,,shell32.dll
-11,,shfolder.dll
-11,,shlwapi.dll
-11,,stdole2.tlb
-11,,urlmon.dll
-11,,user32.dll
-11,,version.dll
-11,,windowscodecs.dll
-11,,winebrowser.exe
11,,winhlp32.exe
-11,,wininet.dll
-11,,winmm.dll
-11,,winspool.drv
-11,,wintab32.dll
-11,,winver.exe
-11,,wordpad.exe
-11,,ws2_32.dll
-11,,wsock32.dll
12,,mountmgr.sys
16422,Internet Explorer,iexplore.exe
+11,,*
[SystemIni]
system.ini, mci,,"MPEGVideo=mciqtz32.dll"
More information about the wine-cvs
mailing list