From 74e4a28a344289ac50c221e46f61cb4bace812c4 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Sun, 9 Jan 2000 04:20:31 +0000 Subject: [PATCH] Built-in DLLs resources are now specified in spec file. Removed unnecessary flags in built-in DLLs tables. --- dlls/comctl32/comctl32.spec | 1 + dlls/commdlg/comdlg32.spec | 1 + dlls/display/display.spec | 1 + dlls/mouse/mouse.spec | 1 + dlls/shell32/shell32.spec | 1 + dlls/winmm/winmm.spec | 1 + if1632/builtin.c | 182 +++++++++++++++++------------------ include/builtin16.h | 3 +- include/builtin32.h | 1 + loader/ne/module.c | 2 +- relay32/builtin32.c | 185 +++++++++++++++++++----------------- relay32/user32.spec | 1 + tools/build.c | 21 +++- 13 files changed, 211 insertions(+), 190 deletions(-) diff --git a/dlls/comctl32/comctl32.spec b/dlls/comctl32/comctl32.spec index 3fe9162b577..dbe440f12ac 100644 --- a/dlls/comctl32/comctl32.spec +++ b/dlls/comctl32/comctl32.spec @@ -1,6 +1,7 @@ name comctl32 type win32 init COMCTL32_LibMain +rsrc comctl32 # Functions exported by the Win95 comctl32.dll # (these need to have these exact ordinals, because some win95 dlls diff --git a/dlls/commdlg/comdlg32.spec b/dlls/commdlg/comdlg32.spec index 25c6fac6bd1..779b598643f 100644 --- a/dlls/commdlg/comdlg32.spec +++ b/dlls/commdlg/comdlg32.spec @@ -1,6 +1,7 @@ name comdlg32 type win32 init COMDLG32_DllEntryPoint +rsrc comdlg32 0 stub ArrowBtnWndProc 1 stdcall ChooseColorA(ptr) ChooseColorA diff --git a/dlls/display/display.spec b/dlls/display/display.spec index c475a956383..d1fdab97cfb 100644 --- a/dlls/display/display.spec +++ b/dlls/display/display.spec @@ -1,5 +1,6 @@ name display type win16 +rsrc display 1 stub BitBlt 2 stub ColorInfo diff --git a/dlls/mouse/mouse.spec b/dlls/mouse/mouse.spec index 4bda02c9bbf..e9b2ca4c7d3 100644 --- a/dlls/mouse/mouse.spec +++ b/dlls/mouse/mouse.spec @@ -1,5 +1,6 @@ name mouse type win16 +rsrc mouse 1 pascal16 Inquire(ptr) MOUSE_Inquire 2 pascal16 Enable(segptr) WIN16_MOUSE_Enable diff --git a/dlls/shell32/shell32.spec b/dlls/shell32/shell32.spec index 115867f4ba3..246262298ff 100644 --- a/dlls/shell32/shell32.spec +++ b/dlls/shell32/shell32.spec @@ -1,6 +1,7 @@ name shell32 type win32 init Shell32LibMain +rsrc shell32 # Functions exported by the Win95 shell32.dll # (these need to have these exact ordinals, for some diff --git a/dlls/winmm/winmm.spec b/dlls/winmm/winmm.spec index cca5e098a39..54e1a0b259e 100644 --- a/dlls/winmm/winmm.spec +++ b/dlls/winmm/winmm.spec @@ -1,6 +1,7 @@ name winmm type win32 init WINMM_LibMain +rsrc winmm # ordinal exports 1 stdcall @(ptr long long) PlaySoundA diff --git a/if1632/builtin.c b/if1632/builtin.c index 6836d2820d9..93de0253fdd 100644 --- a/if1632/builtin.c +++ b/if1632/builtin.c @@ -24,7 +24,7 @@ #include "debugtools.h" #include "toolhelp.h" -DEFAULT_DEBUG_CHANNEL(module) +DEFAULT_DEBUG_CHANNEL(module); typedef struct { @@ -33,16 +33,6 @@ typedef struct DWORD res_size; /* size of resource data */ } BUILTIN16_RESOURCE; -typedef struct -{ - const WIN16_DESCRIPTOR *descr; /* DLL descriptor */ - int flags; /* flags (see below) */ - const BUILTIN16_RESOURCE *res; /* resource descriptor */ -} BUILTIN16_DLL; - -/* DLL flags */ -#define DLL_FLAG_NOT_USED 0x01 /* Use original Windows DLL if possible */ -#define DLL_FLAG_ALWAYS_USED 0x02 /* Always use built-in DLL */ /* 16-bit DLLs */ @@ -89,57 +79,60 @@ extern const WIN16_DESCRIPTOR WING_Descriptor; extern const WIN16_DESCRIPTOR WINSOCK_Descriptor; extern const WIN16_DESCRIPTOR WPROCS_Descriptor; -extern const BUILTIN16_RESOURCE display_ResourceDescriptor; -extern const BUILTIN16_RESOURCE mouse_ResourceDescriptor; - /* Table of all built-in DLLs */ -static BUILTIN16_DLL BuiltinDLLs[] = +static const WIN16_DESCRIPTOR *BuiltinDLLs[] = { - { &KERNEL_Descriptor, 0, NULL }, - { &USER_Descriptor, 0, NULL }, - { &GDI_Descriptor, 0, NULL }, - { &SYSTEM_Descriptor, DLL_FLAG_ALWAYS_USED, NULL }, - { &DISPLAY_Descriptor, DLL_FLAG_ALWAYS_USED, &display_ResourceDescriptor }, - { &WPROCS_Descriptor, DLL_FLAG_ALWAYS_USED, NULL }, - { &WINDEBUG_Descriptor, DLL_FLAG_NOT_USED, NULL }, - { &AVIFILE_Descriptor, DLL_FLAG_NOT_USED, NULL }, - { &COMMDLG_Descriptor, DLL_FLAG_NOT_USED, NULL }, - { &COMPOBJ_Descriptor, DLL_FLAG_NOT_USED, NULL }, - { &DDEML_Descriptor, DLL_FLAG_NOT_USED, NULL }, - { &DISPDIB_Descriptor, 0, NULL }, - { &KEYBOARD_Descriptor, 0, NULL }, - { &COMM_Descriptor, 0, NULL }, - { &LZEXPAND_Descriptor, 0, NULL }, - { &MMSYSTEM_Descriptor, 0, NULL }, - { &MOUSE_Descriptor, 0, &mouse_ResourceDescriptor }, - { &MSACM_Descriptor, 0, NULL }, - { &MSVIDEO_Descriptor, 0, NULL }, - { &OLE2CONV_Descriptor, DLL_FLAG_NOT_USED, NULL }, - { &OLE2DISP_Descriptor, DLL_FLAG_NOT_USED, NULL }, - { &OLE2NLS_Descriptor, DLL_FLAG_NOT_USED, NULL }, - { &OLE2PROX_Descriptor, DLL_FLAG_NOT_USED, NULL }, - { &OLE2THK_Descriptor, DLL_FLAG_NOT_USED, NULL }, - { &OLE2_Descriptor, DLL_FLAG_NOT_USED, NULL }, - { &OLECLI_Descriptor, DLL_FLAG_NOT_USED, NULL }, - { &OLESVR_Descriptor, DLL_FLAG_NOT_USED, NULL }, - { &RASAPI16_Descriptor, 0, NULL }, - { &SHELL_Descriptor, 0, NULL }, - { &SOUND_Descriptor, 0, NULL }, - { &STORAGE_Descriptor, DLL_FLAG_NOT_USED, NULL }, - { &STRESS_Descriptor, 0, NULL }, - { &TOOLHELP_Descriptor, 0, NULL }, - { &TYPELIB_Descriptor, DLL_FLAG_NOT_USED, NULL }, - { &VER_Descriptor, 0, NULL }, - { &W32SYS_Descriptor, DLL_FLAG_NOT_USED, NULL }, - { &WIN32S16_Descriptor, DLL_FLAG_NOT_USED, NULL }, - { &WIN87EM_Descriptor, DLL_FLAG_NOT_USED, NULL }, - { &WINASPI_Descriptor, 0, NULL }, - { &WINEPS_Descriptor, DLL_FLAG_ALWAYS_USED, NULL }, - { &WING_Descriptor, 0, NULL }, - { &WINSOCK_Descriptor, 0, NULL }, + &KERNEL_Descriptor, + &USER_Descriptor, + &GDI_Descriptor, + &SYSTEM_Descriptor, + &DISPLAY_Descriptor, + &WPROCS_Descriptor, + &WINDEBUG_Descriptor, + &AVIFILE_Descriptor, + &COMMDLG_Descriptor, + &COMPOBJ_Descriptor, + &DDEML_Descriptor, + &DISPDIB_Descriptor, + &KEYBOARD_Descriptor, + &COMM_Descriptor, + &LZEXPAND_Descriptor, + &MMSYSTEM_Descriptor, + &MOUSE_Descriptor, + &MSACM_Descriptor, + &MSVIDEO_Descriptor, + &OLE2CONV_Descriptor, + &OLE2DISP_Descriptor, + &OLE2NLS_Descriptor, + &OLE2PROX_Descriptor, + &OLE2THK_Descriptor, + &OLE2_Descriptor, + &OLECLI_Descriptor, + &OLESVR_Descriptor, + &RASAPI16_Descriptor, + &SHELL_Descriptor, + &SOUND_Descriptor, + &STORAGE_Descriptor, + &STRESS_Descriptor, + &TOOLHELP_Descriptor, + &TYPELIB_Descriptor, + &VER_Descriptor, + &W32SYS_Descriptor, + &WIN32S16_Descriptor, + &WIN87EM_Descriptor, + &WINASPI_Descriptor, + &WINEPS_Descriptor, + &WING_Descriptor, + &WINSOCK_Descriptor, /* Last entry */ - { NULL, 0, NULL } + NULL +}; + +/* list of DLLs that should always be loaded at startup */ +static const char * const always_load[] = +{ + "system", "display", "wprocs", "wineps", NULL }; /* Ordinal number for interrupt 0 handler in WPROCS.DLL */ @@ -152,63 +145,64 @@ static BUILTIN16_DLL BuiltinDLLs[] = * Load a built-in Win16 module. Helper function for BUILTIN_LoadModule * and BUILTIN_Init. */ -static HMODULE16 BUILTIN_DoLoadModule16( const BUILTIN16_DLL *dll ) +static HMODULE16 BUILTIN_DoLoadModule16( const WIN16_DESCRIPTOR *descr ) { NE_MODULE *pModule; int minsize, res_off; SEGTABLEENTRY *pSegTable; HMODULE16 hModule; + const BUILTIN16_RESOURCE *rsrc = descr->rsrc; - if ( !dll->res ) + if (!rsrc) { - hModule = GLOBAL_CreateBlock( GMEM_MOVEABLE, dll->descr->module_start, - dll->descr->module_size, 0, + hModule = GLOBAL_CreateBlock( GMEM_MOVEABLE, descr->module_start, + descr->module_size, 0, FALSE, FALSE, FALSE, NULL ); - if (!hModule) return 0; - FarSetOwner16( hModule, hModule ); + if (!hModule) return 0; + FarSetOwner16( hModule, hModule ); - pModule = (NE_MODULE *)GlobalLock16( hModule ); + pModule = (NE_MODULE *)GlobalLock16( hModule ); } else { ET_BUNDLE *bundle; hModule = GLOBAL_Alloc( GMEM_MOVEABLE, - dll->descr->module_size + dll->res->res_size, + descr->module_size + rsrc->res_size, 0, FALSE, FALSE, FALSE ); if (!hModule) return 0; FarSetOwner16( hModule, hModule ); pModule = (NE_MODULE *)GlobalLock16( hModule ); - res_off = ((NE_MODULE *)dll->descr->module_start)->res_table; + res_off = ((NE_MODULE *)descr->module_start)->res_table; - memcpy( (LPBYTE)pModule, dll->descr->module_start, res_off ); - memcpy( (LPBYTE)pModule + res_off, dll->res->res_start, dll->res->res_size ); - memcpy( (LPBYTE)pModule + res_off + dll->res->res_size, - dll->descr->module_start + res_off, dll->descr->module_size - res_off ); + memcpy( (LPBYTE)pModule, descr->module_start, res_off ); + memcpy( (LPBYTE)pModule + res_off, rsrc->res_start, rsrc->res_size ); + memcpy( (LPBYTE)pModule + res_off + rsrc->res_size, + descr->module_start + res_off, descr->module_size - res_off ); /* Have to fix up various pModule-based near pointers. Ugh! */ - pModule->name_table += dll->res->res_size; - pModule->modref_table += dll->res->res_size; - pModule->import_table += dll->res->res_size; - pModule->entry_table += dll->res->res_size; + pModule->name_table += rsrc->res_size; + pModule->modref_table += rsrc->res_size; + pModule->import_table += rsrc->res_size; + pModule->entry_table += rsrc->res_size; for ( bundle = (ET_BUNDLE *)((LPBYTE)pModule + pModule->entry_table); bundle->next; bundle = (ET_BUNDLE *)((LPBYTE)pModule + bundle->next) ) - bundle->next += dll->res->res_size; + bundle->next += rsrc->res_size; /* NOTE: (Ab)use the hRsrcMap parameter for resource data pointer */ - pModule->hRsrcMap = dll->res->res_start; + pModule->hRsrcMap = rsrc->res_start; } pModule->self = hModule; - TRACE( "Built-in %s: hmodule=%04x\n", dll->descr->name, hModule ); + TRACE( "Built-in %s: hmodule=%04x\n", descr->name, hModule ); /* Allocate the code segment */ pSegTable = NE_SEG_TABLE( pModule ); - pSegTable->hSeg = GLOBAL_CreateBlock( GMEM_FIXED, dll->descr->code_start, + pSegTable->hSeg = GLOBAL_CreateBlock( GMEM_FIXED, descr->code_start, pSegTable->minsize, hModule, TRUE, TRUE, FALSE, NULL ); if (!pSegTable->hSeg) return 0; @@ -223,12 +217,12 @@ static HMODULE16 BUILTIN_DoLoadModule16( const BUILTIN16_DLL *dll ) hModule, FALSE, FALSE, FALSE ); if (!pSegTable->hSeg) return 0; if (pSegTable->minsize) memcpy( GlobalLock16( pSegTable->hSeg ), - dll->descr->data_start, pSegTable->minsize); + descr->data_start, pSegTable->minsize); if (pModule->heap_size) LocalInit16( GlobalHandleToSel16(pSegTable->hSeg), pSegTable->minsize, minsize ); - if (dll->res) + if (rsrc) NE_InitResourceHandler(hModule); NE_RegisterModule( pModule ); @@ -243,14 +237,14 @@ static HMODULE16 BUILTIN_DoLoadModule16( const BUILTIN16_DLL *dll ) */ BOOL BUILTIN_Init(void) { - BUILTIN16_DLL *dll; WORD vector; HMODULE16 hModule; + const char * const *ptr = always_load; - for (dll = BuiltinDLLs; dll->descr; dll++) + while (*ptr) { - if (dll->flags & DLL_FLAG_ALWAYS_USED) - if (!BUILTIN_DoLoadModule16( dll )) return FALSE; + if (!BUILTIN_LoadModule( *ptr )) return FALSE; + ptr++; } /* Set interrupt vectors from entry points in WPROCS.DLL */ @@ -271,12 +265,11 @@ BOOL BUILTIN_Init(void) /*********************************************************************** * BUILTIN_LoadModule * - * Load a built-in module. If the 'force' parameter is FALSE, we only - * load the module if it has not been disabled via the -dll option. + * Load a built-in module. */ -HMODULE16 BUILTIN_LoadModule( LPCSTR name, BOOL force ) +HMODULE16 BUILTIN_LoadModule( LPCSTR name ) { - BUILTIN16_DLL *table; + const WIN16_DESCRIPTOR **table; char dllname[16], *p; /* Fix the name in case we have a full path and extension */ @@ -287,18 +280,15 @@ HMODULE16 BUILTIN_LoadModule( LPCSTR name, BOOL force ) if (!p) strcat( dllname, ".dll" ); - for (table = BuiltinDLLs; table->descr; table++) + for (table = BuiltinDLLs; *table; table++) { - NE_MODULE *pModule = (NE_MODULE *)table->descr->module_start; + NE_MODULE *pModule = (NE_MODULE *)(*table)->module_start; OFSTRUCT *pOfs = (OFSTRUCT *)((LPBYTE)pModule + pModule->fileinfo); if (!lstrcmpiA( pOfs->szPathName, dllname )) break; } - if (!table->descr) return (HMODULE16)2; - - if ((table->flags & DLL_FLAG_NOT_USED) && !force) return (HMODULE16)2; - - return BUILTIN_DoLoadModule16( table ); + if (!*table) return (HMODULE16)2; + return BUILTIN_DoLoadModule16( *table ); } diff --git a/include/builtin16.h b/include/builtin16.h index 3aac33e6e88..373d0f7c718 100644 --- a/include/builtin16.h +++ b/include/builtin16.h @@ -14,7 +14,7 @@ struct _CONTEXT86; struct _STACK16FRAME; extern BOOL BUILTIN_Init(void); -extern HMODULE16 BUILTIN_LoadModule( LPCSTR name, BOOL force ); +extern HMODULE16 BUILTIN_LoadModule( LPCSTR name ); extern LPCSTR BUILTIN_GetEntryPoint16( struct _STACK16FRAME *frame, LPSTR name, WORD *pOrd ); extern void RELAY_Unimplemented16(void); @@ -82,6 +82,7 @@ typedef struct int module_size; /* Size of the module data */ const BYTE *code_start; /* 32-bit address of DLL code */ const BYTE *data_start; /* 32-bit address of DLL data */ + const void *rsrc; /* resources data */ } WIN16_DESCRIPTOR; diff --git a/include/builtin32.h b/include/builtin32.h index 87197567f9f..659a5c28ec4 100644 --- a/include/builtin32.h +++ b/include/builtin32.h @@ -25,6 +25,7 @@ typedef struct const unsigned int *argtypes; /* Pointer to argument types bitmask */ const char * const *imports; /* Pointer to imports */ const ENTRYPOINT32 dllentrypoint;/* Pointer to LibMain function */ + const void *rsrc; /* Resource descriptor */ } BUILTIN32_DESCRIPTOR; extern ENTRYPOINT32 BUILTIN32_GetEntryPoint( char *buffer, void *relay, diff --git a/loader/ne/module.c b/loader/ne/module.c index 856c18a09c6..89ca1ddd15a 100644 --- a/loader/ne/module.c +++ b/loader/ne/module.c @@ -928,7 +928,7 @@ static HINSTANCE16 MODULE_LoadModule16( LPCSTR libname, BOOL implicit, BOOL lib_ case MODULE_LOADORDER_BI: TRACE("Trying built-in '%s'\n", libname); - hinst = BUILTIN_LoadModule(libname, TRUE); + hinst = BUILTIN_LoadModule(libname); break; default: diff --git a/relay32/builtin32.c b/relay32/builtin32.c index bbbc11e830f..581fdf91657 100644 --- a/relay32/builtin32.c +++ b/relay32/builtin32.c @@ -17,9 +17,8 @@ #include "winerror.h" #include "debugtools.h" -DECLARE_DEBUG_CHANNEL(relay) -DECLARE_DEBUG_CHANNEL(win32) -DECLARE_DEBUG_CHANNEL(module) +DEFAULT_DEBUG_CHANNEL(module); +DECLARE_DEBUG_CHANNEL(relay); typedef struct { @@ -40,14 +39,9 @@ typedef struct typedef struct { const BUILTIN32_DESCRIPTOR *descr; /* DLL descriptor */ - DWORD flags; HMODULE hModule; - const BUILTIN32_RESOURCE *rsc; } BUILTIN32_DLL; -#define BI32_INSTANTIATED 0x01 -#define BI32_DANGER 0x02 - extern const BUILTIN32_DESCRIPTOR ADVAPI32_Descriptor; extern const BUILTIN32_DESCRIPTOR AVIFIL32_Descriptor; extern const BUILTIN32_DESCRIPTOR COMCTL32_Descriptor; @@ -98,70 +92,91 @@ extern const BUILTIN32_DESCRIPTOR WNASPI32_Descriptor; extern const BUILTIN32_DESCRIPTOR WOW32_Descriptor; extern const BUILTIN32_DESCRIPTOR WSOCK32_Descriptor; -extern const BUILTIN32_RESOURCE comctl32_ResourceDescriptor; -extern const BUILTIN32_RESOURCE comdlg32_ResourceDescriptor; -extern const BUILTIN32_RESOURCE shell32_ResourceDescriptor; -extern const BUILTIN32_RESOURCE user32_ResourceDescriptor; -extern const BUILTIN32_RESOURCE winmm_ResourceDescriptor; static BUILTIN32_DLL BuiltinDLLs[] = { - { &ADVAPI32_Descriptor, 0, 0, NULL }, - { &AVIFIL32_Descriptor, 0, 0, NULL }, - { &COMCTL32_Descriptor, BI32_DANGER, 0, &comctl32_ResourceDescriptor }, - { &COMDLG32_Descriptor, BI32_DANGER, 0, &comdlg32_ResourceDescriptor }, - { &CRTDLL_Descriptor, BI32_DANGER, 0, NULL }, - { &DCIMAN32_Descriptor, 0, 0, NULL }, - { &DDRAW_Descriptor, 0, 0, NULL }, - { &DINPUT_Descriptor, 0, 0, NULL }, - { &DPLAY_Descriptor, 0, 0, NULL }, - { &DPLAYX_Descriptor, 0, 0, NULL }, - { &DSOUND_Descriptor, 0, 0, NULL }, - { &GDI32_Descriptor, 0, 0, NULL }, - { &ICMP_Descriptor, 0, 0, NULL }, - { &IMAGEHLP_Descriptor, BI32_DANGER, 0, NULL }, - { &IMM32_Descriptor, 0, 0, NULL }, - { &KERNEL32_Descriptor, 0, 0, NULL }, - { &LZ32_Descriptor, 0, 0, NULL }, - { &MCIANIM_Descriptor, 0, 0, NULL }, - { &MCIAVI_Descriptor, 0, 0, NULL }, - { &MCICDA_Descriptor, 0, 0, NULL }, - { &MCISEQ_Descriptor, 0, 0, NULL }, - { &MCIWAVE_Descriptor, 0, 0, NULL }, - { &MIDIMAP_Descriptor, 0, 0, NULL }, - { &MPR_Descriptor, 0, 0, NULL }, - { &MSACM32_Descriptor, BI32_DANGER, 0, NULL }, - { &MSACMMAP_Descriptor, 0, 0, NULL }, - { &MSNET32_Descriptor, 0, 0, NULL }, - { &MSVFW32_Descriptor, 0, 0, NULL }, - { &NTDLL_Descriptor, 0, 0, NULL }, - { &ODBC32_Descriptor, 0, 0, NULL }, - { &OLE32_Descriptor, 0, 0, NULL }, - { &OLEAUT32_Descriptor, 0, 0, NULL }, - { &OLECLI32_Descriptor, 0, 0, NULL }, - { &OLEDLG_Descriptor, 0, 0, NULL }, - { &OLESVR32_Descriptor, 0, 0, NULL }, - { &PSAPI_Descriptor, 0, 0, NULL }, - { &RASAPI32_Descriptor, 0, 0, NULL }, - { &SHELL32_Descriptor, BI32_DANGER, 0, &shell32_ResourceDescriptor }, - { &SHLWAPI_Descriptor, 0, 0, NULL }, - { &TAPI32_Descriptor, 0, 0, NULL }, - { &USER32_Descriptor, 0, 0, &user32_ResourceDescriptor }, - { &VERSION_Descriptor, 0, 0, NULL }, - { &W32SKRNL_Descriptor, 0, 0, NULL }, - { &WINMM_Descriptor, 0, 0, &winmm_ResourceDescriptor }, - { &WINSPOOL_Descriptor, 0, 0, NULL }, - { &WINEOSS_Descriptor, 0, 0, NULL }, - { &WNASPI32_Descriptor, 0, 0, NULL }, - { &WOW32_Descriptor, 0, 0, NULL }, - { &WSOCK32_Descriptor, 0, 0, NULL }, + { &ADVAPI32_Descriptor, 0 }, + { &AVIFIL32_Descriptor, 0 }, + { &COMCTL32_Descriptor, 0 }, + { &COMDLG32_Descriptor, 0 }, + { &CRTDLL_Descriptor, 0 }, + { &DCIMAN32_Descriptor, 0 }, + { &DDRAW_Descriptor, 0 }, + { &DINPUT_Descriptor, 0 }, + { &DPLAY_Descriptor, 0 }, + { &DPLAYX_Descriptor, 0 }, + { &DSOUND_Descriptor, 0 }, + { &GDI32_Descriptor, 0 }, + { &ICMP_Descriptor, 0 }, + { &IMAGEHLP_Descriptor, 0 }, + { &IMM32_Descriptor, 0 }, + { &KERNEL32_Descriptor, 0 }, + { &LZ32_Descriptor, 0 }, + { &MCIANIM_Descriptor, 0 }, + { &MCIAVI_Descriptor, 0 }, + { &MCICDA_Descriptor, 0 }, + { &MCISEQ_Descriptor, 0 }, + { &MCIWAVE_Descriptor, 0 }, + { &MIDIMAP_Descriptor, 0 }, + { &MPR_Descriptor, 0 }, + { &MSACM32_Descriptor, 0 }, + { &MSACMMAP_Descriptor, 0 }, + { &MSNET32_Descriptor, 0 }, + { &MSVFW32_Descriptor, 0 }, + { &NTDLL_Descriptor, 0 }, + { &ODBC32_Descriptor, 0 }, + { &OLE32_Descriptor, 0 }, + { &OLEAUT32_Descriptor, 0 }, + { &OLECLI32_Descriptor, 0 }, + { &OLEDLG_Descriptor, 0 }, + { &OLESVR32_Descriptor, 0 }, + { &PSAPI_Descriptor, 0 }, + { &RASAPI32_Descriptor, 0 }, + { &SHELL32_Descriptor, 0 }, + { &SHLWAPI_Descriptor, 0 }, + { &TAPI32_Descriptor, 0 }, + { &USER32_Descriptor, 0 }, + { &VERSION_Descriptor, 0 }, + { &W32SKRNL_Descriptor, 0 }, + { &WINMM_Descriptor, 0 }, + { &WINSPOOL_Descriptor, 0 }, + { &WINEOSS_Descriptor, 0 }, + { &WNASPI32_Descriptor, 0 }, + { &WOW32_Descriptor, 0 }, + { &WSOCK32_Descriptor, 0 }, /* Last entry */ - { NULL, 0, 0, NULL } + { NULL, 0 } }; extern void RELAY_CallFrom32(); extern void RELAY_CallFrom32Regs(); + +/*********************************************************************** + * BUILTIN32_WarnSecondInstance + * + * Emit a warning when we are creating a second instance for a DLL + * that is known to not support this. + */ +static void BUILTIN32_WarnSecondInstance( const char *name ) +{ + static const char * const warning_list[] = + { "comctl32", "comdlg32", "crtdll", "imagehlp", "msacm32", "shell32", NULL }; + + const char * const *ptr = warning_list; + + while (*ptr) + { + if (!strcasecmp( *ptr, name )) + { + ERR( "Attempt to instantiate built-in dll '%s' twice " + "in the same address space. Expect trouble!\n", name ); + return; + } + ptr++; + } +} + /*********************************************************************** * BUILTIN32_DoLoadImage * @@ -306,16 +321,17 @@ static HMODULE BUILTIN32_DoLoadImage( BUILTIN32_DLL *dll ) sec++; /* Build the resource directory */ - if(dll->rsc) + if(dll->descr->rsrc) { + const BUILTIN32_RESOURCE *rsrc = dll->descr->rsrc; int i; void *rtab; IMAGE_RESOURCE_DATA_ENTRY *rdep; - rtab = HeapAlloc(GetProcessHeap(), 0, dll->rsc->restabsize); + rtab = HeapAlloc(GetProcessHeap(), 0, rsrc->restabsize); if(!rtab) { - ERR_(module)("Failed to get memory for resource directory\n"); + ERR("Failed to get memory for resource directory\n"); VirtualFree(addr, size, MEM_RELEASE); return 0; } @@ -324,15 +340,15 @@ static HMODULE BUILTIN32_DoLoadImage( BUILTIN32_DLL *dll ) * The resource directory has to be copied because it contains * RVAs. These would be invalid if the dll is instantiated twice. */ - memcpy(rtab, dll->rsc->restab, dll->rsc->restabsize); + memcpy(rtab, rsrc->restab, rsrc->restabsize); dir = &nt->OptionalHeader.DataDirectory[IMAGE_FILE_RESOURCE_DIRECTORY]; dir->VirtualAddress = (DWORD)rtab - (DWORD)addr; - dir->Size = dll->rsc->restabsize; - rdep = (IMAGE_RESOURCE_DATA_ENTRY *)((DWORD)rtab + (DWORD)dll->rsc->entries - (DWORD)dll->rsc->restab); - for(i = 0; i < dll->rsc->nresources; i++) + dir->Size = rsrc->restabsize; + rdep = (IMAGE_RESOURCE_DATA_ENTRY *)((DWORD)rtab + (DWORD)rsrc->entries - (DWORD)rsrc->restab); + for(i = 0; i < rsrc->nresources; i++) { - rdep[i].OffsetToData += (DWORD)dll->rsc->restab - (DWORD)addr; + rdep[i].OffsetToData += (DWORD)rsrc->restab - (DWORD)addr; } } @@ -444,20 +460,15 @@ WINE_MODREF *BUILTIN32_LoadLibraryExA(LPCSTR path, DWORD flags, DWORD *err) } /* Load built-in module */ - if ( (table->flags & BI32_INSTANTIATED) && (table->flags & BI32_DANGER) ) - ERR_(module)( "Attempt to instantiate built-in dll '%s' twice " - "in the same address-space. Expect trouble!\n", - table->descr->name ); - - if ( !table->hModule ) - table->hModule = BUILTIN32_DoLoadImage( table ); - if ( table->hModule ) - table->flags |= BI32_INSTANTIATED; - else + if (!table->hModule) { - *err = ERROR_FILE_NOT_FOUND; - return NULL; + if (!(table->hModule = BUILTIN32_DoLoadImage( table ))) + { + *err = ERROR_FILE_NOT_FOUND; + return NULL; + } } + else BUILTIN32_WarnSecondInstance( table->descr->name ); /* Create 16-bit dummy module */ if ((hModule16 = MODULE_CreateDummyModule( dllname, 0 )) < 32) @@ -473,7 +484,7 @@ WINE_MODREF *BUILTIN32_LoadLibraryExA(LPCSTR path, DWORD flags, DWORD *err) /* Create 32-bit MODREF */ if ( !(wm = PE_CreateModule( table->hModule, dllname, flags, TRUE )) ) { - ERR_(win32)( "can't load %s\n", path ); + ERR( "can't load %s\n", path ); FreeLibrary16( hModule16 ); /* FIXME: Should unload the builtin module */ *err = ERROR_OUTOFMEMORY; return NULL; @@ -516,7 +527,7 @@ ENTRYPOINT32 BUILTIN32_GetEntryPoint( char *buffer, void *relay, /* First find the module */ for (dll = BuiltinDLLs; dll->descr; dll++) - if ( dll->flags & BI32_INSTANTIATED ) + if (dll->hModule) { IMAGE_SECTION_HEADER *sec = PE_SECTIONS(dll->hModule); DEBUG_ENTRY_POINT *debug = @@ -559,8 +570,7 @@ void BUILTIN32_SwitchRelayDebug(BOOL onoff) { for (dll = BuiltinDLLs; dll->descr; dll++) { IMAGE_SECTION_HEADER *sec; DEBUG_ENTRY_POINT *debug; - if (!(dll->flags & BI32_INSTANTIATED)) - continue; + if (!dll->hModule) continue; sec = PE_SECTIONS(dll->hModule); debug = (DEBUG_ENTRY_POINT *)((DWORD)dll->hModule + sec[1].VirtualAddress); @@ -608,4 +618,3 @@ void BUILTIN32_Unimplemented( const BUILTIN32_DESCRIPTOR *descr, int ordinal ) MESSAGE( "\n" ); ExitProcess(1); } - diff --git a/relay32/user32.spec b/relay32/user32.spec index e840e6dff29..ffe001e2161 100644 --- a/relay32/user32.spec +++ b/relay32/user32.spec @@ -1,6 +1,7 @@ name user32 type win32 init MAIN_UserInit +rsrc user32 1 stdcall ActivateKeyboardLayout(long long) ActivateKeyboardLayout 2 stdcall AdjustWindowRect(ptr long long) AdjustWindowRect diff --git a/tools/build.c b/tools/build.c index 8b60e955e5c..f9c117a866f 100644 --- a/tools/build.c +++ b/tools/build.c @@ -153,6 +153,7 @@ static FILE *SpecFp; static WORD Code_Selector, Data_Selector; static char DLLInitFunc[80]; static char *DLLImports[MAX_IMPORTS]; +static char rsrc_name[80]; static int nb_imports; static int nb_entry_points; static int nb_names; @@ -715,6 +716,11 @@ static void ParseTopLevel(void) fatal_error( "Imports not supported for Win16\n" ); DLLImports[nb_imports++] = xstrdup(GetToken()); } + else if (strcmp(token, "rsrc") == 0) + { + strcpy( rsrc_name, GetToken() ); + strcat( rsrc_name, "_ResourceDescriptor" ); + } else if (strcmp(token, "@") == 0) { if (SpecType != SPEC_WIN32) @@ -1184,6 +1190,8 @@ static int BuildSpec32File( FILE *outfile ) /* Output the DLL descriptor */ + if (rsrc_name[0]) fprintf( outfile, "extern const char %s[];\n\n", rsrc_name ); + fprintf( outfile, "const BUILTIN32_DESCRIPTOR %s_Descriptor =\n{\n", DLLName ); fprintf( outfile, " \"%s\",\n", DLLName ); @@ -1200,8 +1208,9 @@ static int BuildSpec32File( FILE *outfile ) " FuncArgs,\n" " ArgTypes,\n"); fprintf( outfile, " %s,\n", nb_imports ? "Imports" : "0" ); - fprintf( outfile, " %s\n", DLLInitFunc[0] ? DLLInitFunc : "0" ); - fprintf( outfile, "};\n" ); + fprintf( outfile, " %s,\n", DLLInitFunc[0] ? DLLInitFunc : "0" ); + fprintf( outfile, " %s\n", rsrc_name[0] ? rsrc_name : "0" ); + fprintf( outfile, "};\n" ); return 0; } @@ -1440,12 +1449,15 @@ static int BuildSpec16File( FILE *outfile ) /* Output the DLL descriptor */ - fprintf( outfile, "\nWIN16_DESCRIPTOR %s_Descriptor = \n{\n", DLLName ); + if (rsrc_name[0]) fprintf( outfile, "extern const char %s[];\n\n", rsrc_name ); + + fprintf( outfile, "\nconst WIN16_DESCRIPTOR %s_Descriptor = \n{\n", DLLName ); fprintf( outfile, " \"%s\",\n", DLLName ); fprintf( outfile, " Module,\n" ); fprintf( outfile, " sizeof(Module),\n" ); fprintf( outfile, " (BYTE *)&Code_Segment,\n" ); - fprintf( outfile, " (BYTE *)Data_Segment\n" ); + fprintf( outfile, " (BYTE *)Data_Segment,\n" ); + fprintf( outfile, " %s\n", rsrc_name[0] ? rsrc_name : "0" ); fprintf( outfile, "};\n" ); return 0; @@ -1768,6 +1780,7 @@ static void BuildCallFrom16Core( FILE *outfile, int reg_func, int thunk, int sho fprintf( outfile, ".stabs \"CallFrom16%s:F1\",36,0,0," PREFIX "CallFrom16%s\n", name, name); #endif + fprintf( outfile, "\t.type " PREFIX "CallFrom16%s,@function\n", name ); fprintf( outfile, "\t.globl " PREFIX "CallFrom16%s\n", name ); fprintf( outfile, PREFIX "CallFrom16%s:\n", name );