Reorganization of the loader to correctly load and free libraries and implementation of load order to load different types of libraries.
diff --git a/include/builtin32.h b/include/builtin32.h index 7423cdb..3b263d6 100644 --- a/include/builtin32.h +++ b/include/builtin32.h
@@ -27,8 +27,6 @@ unsigned int *typemask ); extern void BUILTIN32_Unimplemented( const BUILTIN32_DESCRIPTOR *descr, int ordinal ); -extern void BUILTIN32_PrintDLLs(void); extern void BUILTIN32_SwitchRelayDebug(int onoff); -extern int BUILTIN32_EnableDLL( const char *name, int len, int enable ); #endif /* __WINE_BUILTIN32_H */
diff --git a/include/module.h b/include/module.h index ff320b8..fa35eca 100644 --- a/include/module.h +++ b/include/module.h
@@ -121,7 +121,13 @@ #pragma pack(4) /* internal representation of 32bit modules. per process. */ -typedef enum { MODULE32_PE=1, MODULE32_ELF /* ,... */ } MODULE32_TYPE; +typedef enum { + MODULE32_PE = 1, + MODULE32_ELF, + MODULE32_ELFDLL, + MODULE32_BI +} MODULE32_TYPE; + typedef struct _wine_modref { struct _wine_modref *next; @@ -132,7 +138,7 @@ ELF_MODREF elf; } binfmt; - HMODULE module; + HMODULE module; int nDeps; struct _wine_modref **deps; @@ -148,7 +154,6 @@ #define WINE_MODREF_INTERNAL 0x00000001 #define WINE_MODREF_NO_DLL_CALLS 0x00000002 #define WINE_MODREF_PROCESS_ATTACHED 0x00000004 -#define WINE_MODREF_PROCESS_DETACHED 0x00000008 #define WINE_MODREF_LOAD_AS_DATAFILE 0x00000010 #define WINE_MODREF_DONT_RESOLVE_REFS 0x00000020 #define WINE_MODREF_MARKER 0x80000000 @@ -171,13 +176,17 @@ /* module.c */ extern FARPROC MODULE_GetProcAddress( HMODULE hModule, LPCSTR function, BOOL snoop ); extern WINE_MODREF *MODULE32_LookupHMODULE( HMODULE hModule ); -extern void MODULE_InitializeDLLs( HMODULE root, DWORD type, LPVOID lpReserved ); -extern HMODULE MODULE_FindModule( LPCSTR path ); +extern BOOL MODULE_DllProcessAttach( WINE_MODREF *wm, LPVOID lpReserved ); +extern void MODULE_DllProcessDetach( BOOL bForceDetach, LPVOID lpReserved ); +extern void MODULE_DllThreadAttach( LPVOID lpReserved ); +extern void MODULE_DllThreadDetach( LPVOID lpReserved ); +extern WINE_MODREF *MODULE_LoadLibraryExA( LPCSTR libname, HFILE hfile, DWORD flags ); +extern BOOL MODULE_FreeLibrary( WINE_MODREF *wm ); +extern WINE_MODREF *MODULE_FindModule( LPCSTR path ); extern HMODULE MODULE_CreateDummyModule( const OFSTRUCT *ofs, LPCSTR modName ); extern FARPROC16 MODULE_GetWndProcEntry16( const char *name ); extern FARPROC16 WINAPI WIN32_GetProcAddress16( HMODULE hmodule, LPCSTR name ); extern SEGPTR WINAPI HasGPHandler16( SEGPTR address ); -HMODULE MODULE_LoadLibraryExA( LPCSTR libname, HFILE hfile, DWORD flags ); /* resource.c */ extern INT WINAPI AccessResource(HMODULE,HRSRC); @@ -192,7 +201,7 @@ extern FARPROC16 NE_GetEntryPointEx( HMODULE16 hModule, WORD ordinal, BOOL16 snoop ); extern BOOL16 NE_SetEntryPoint( HMODULE16 hModule, WORD ordinal, WORD offset ); extern HANDLE NE_OpenFile( NE_MODULE *pModule ); -extern HINSTANCE16 NE_LoadModule( LPCSTR name, BOOL implicit ); +extern HINSTANCE16 MODULE_LoadModule16( LPCSTR name, BOOL implicit ); extern BOOL NE_CreateProcess( HFILE hFile, OFSTRUCT *ofs, LPCSTR cmd_line, LPCSTR env, LPSECURITY_ATTRIBUTES psa, LPSECURITY_ATTRIBUTES tsa, BOOL inherit, LPSTARTUPINFOA startup, @@ -225,12 +234,11 @@ extern BOOL BUILTIN_Init(void); extern HMODULE16 BUILTIN_LoadModule( LPCSTR name, BOOL force ); extern LPCSTR BUILTIN_GetEntryPoint16( WORD cs, WORD ip, WORD *pOrd ); -extern BOOL BUILTIN_ParseDLLOptions( char *str ); -extern void BUILTIN_PrintDLLs(void); /* relay32/builtin.c */ extern HMODULE BUILTIN32_LoadImage( LPCSTR name, OFSTRUCT *ofs, BOOL force ); -extern BOOL BUILTIN32_ParseDLLOptions( char *str ); +extern WINE_MODREF *BUILTIN32_LoadLibraryExA(LPCSTR name, DWORD flags, DWORD *err); +extern void BUILTIN32_UnloadLibrary(WINE_MODREF *wm); /* if1632/builtin.c */ extern HMODULE16 (*fnBUILTIN_LoadModule)(LPCSTR name, BOOL force);
diff --git a/include/pe_image.h b/include/pe_image.h index 9ce289f..9439658 100644 --- a/include/pe_image.h +++ b/include/pe_image.h
@@ -25,7 +25,8 @@ extern BOOL PE_EnumResourceLanguagesW(HMODULE,LPCWSTR,LPCWSTR,ENUMRESLANGPROCW,LONG); extern HRSRC PE_FindResourceExW(struct _wine_modref*,LPCWSTR,LPCWSTR,WORD); extern DWORD PE_SizeofResource(HMODULE,HRSRC); -extern HMODULE PE_LoadLibraryExA(LPCSTR,HFILE,DWORD); +extern struct _wine_modref *PE_LoadLibraryExA(LPCSTR, DWORD, DWORD *); +extern void PE_UnloadLibrary(struct _wine_modref *); extern HGLOBAL PE_LoadResource(struct _wine_modref *wm,HRSRC); extern HMODULE PE_LoadImage( HFILE hFile, OFSTRUCT *ofs, LPCSTR *modName ); extern struct _wine_modref *PE_CreateModule( HMODULE hModule, OFSTRUCT *ofs, @@ -36,7 +37,7 @@ LPPROCESS_INFORMATION info ); extern void PE_InitTls(void); -extern void PE_InitDLL(struct _wine_modref *wm, DWORD type, LPVOID lpReserved); +extern BOOL PE_InitDLL(struct _wine_modref *wm, DWORD type, LPVOID lpReserved); extern PIMAGE_RESOURCE_DIRECTORY GetResDirEntryA(PIMAGE_RESOURCE_DIRECTORY,LPCSTR,DWORD,BOOL); extern PIMAGE_RESOURCE_DIRECTORY GetResDirEntryW(PIMAGE_RESOURCE_DIRECTORY,LPCWSTR,DWORD,BOOL); @@ -64,7 +65,8 @@ } ELF_MODREF; extern struct _wine_modref *ELF_CreateDummyModule(LPCSTR,LPCSTR); -extern HMODULE ELF_LoadLibraryExA(LPCSTR,HFILE,DWORD); +extern struct _wine_modref *ELF_LoadLibraryExA( LPCSTR libname, DWORD flags, DWORD *err); +extern void ELF_UnloadLibrary(struct _wine_modref *); extern FARPROC ELF_FindExportedFunction(struct _wine_modref *wm, LPCSTR funcName); #endif /* __WINE_PE_IMAGE_H */
diff --git a/include/winerror.h b/include/winerror.h index 0c73c7d..0b047a4 100644 --- a/include/winerror.h +++ b/include/winerror.h
@@ -245,6 +245,7 @@ #define ERROR_BADKEY 1010 /* Config reg key invalid */ #define ERROR_CANTREAD 1012 /* Config reg key couldn't be read */ #define ERROR_CANTWRITE 1013 /* Config reg key couldn't be written */ +#define ERROR_DLL_INIT_FAILED 1114 #define ERROR_IO_DEVICE 1117 #define ERROR_POSSIBLE_DEADLOCK 1131 #define ERROR_BAD_DEVICE 1200