- Fixed resource functions to work directly from the HMODULE instead of
requiring a modref.
- Attempted to get LOAD_LIBRARY_AS_DATAFILE right (based on patches by
Eric Pouech and Dusan Lacko).
- Simplified modref structure and handling.
diff --git a/include/module.h b/include/module.h
index 5ede2d9..3c3f457 100644
--- a/include/module.h
+++ b/include/module.h
@@ -8,7 +8,7 @@
#define __WINE_MODULE_H
#include "windef.h"
-#include "pe_image.h"
+#include "winbase.h"
/* In-memory module structure. See 'Windows Internals' p. 219 */
typedef struct _NE_MODULE
@@ -118,23 +118,15 @@
#include "poppack.h"
/* internal representation of 32bit modules. per process. */
-typedef enum {
- MODULE32_PE = 1,
- MODULE32_ELF,
- MODULE32_ELFDLL
-} MODULE32_TYPE;
-
typedef struct _wine_modref
{
- struct _wine_modref *next;
- struct _wine_modref *prev;
- MODULE32_TYPE type;
- union {
- PE_MODREF pe;
- ELF_MODREF elf;
- } binfmt;
+ struct _wine_modref *next;
+ struct _wine_modref *prev;
+ HMODULE module;
+ void *dlhandle; /* handle returned by dlopen() */
+ int tlsindex; /* TLS index or -1 if none */
- HMODULE module;
+ FARPROC (*find_export)( struct _wine_modref *wm, LPCSTR func, BOOL snoop );
int nDeps;
struct _wine_modref **deps;
@@ -151,12 +143,10 @@
#define WINE_MODREF_INTERNAL 0x00000001
#define WINE_MODREF_NO_DLL_CALLS 0x00000002
#define WINE_MODREF_PROCESS_ATTACHED 0x00000004
-#define WINE_MODREF_LOAD_AS_DATAFILE 0x00000010
#define WINE_MODREF_DONT_RESOLVE_REFS 0x00000020
#define WINE_MODREF_MARKER 0x80000000
-
/* Resource types */
typedef struct resource_typeinfo_s NE_TYPEINFO;
typedef struct resource_nameinfo_s NE_NAMEINFO;
@@ -170,9 +160,17 @@
#define NE_MODULE_NAME(pModule) \
(((OFSTRUCT *)((char*)(pModule) + (pModule)->fileinfo))->szPathName)
+#define PE_HEADER(module) \
+ ((IMAGE_NT_HEADERS*)((LPBYTE)(module) + \
+ (((IMAGE_DOS_HEADER*)(module))->e_lfanew)))
+
+#define PE_SECTIONS(module) \
+ ((IMAGE_SECTION_HEADER*)((LPBYTE)&PE_HEADER(module)->OptionalHeader + \
+ PE_HEADER(module)->FileHeader.SizeOfOptionalHeader))
+
/* module.c */
+extern WINE_MODREF *MODULE_AllocModRef( HMODULE hModule, LPCSTR filename );
extern FARPROC MODULE_GetProcAddress( HMODULE hModule, LPCSTR function, BOOL snoop );
-extern WINE_MODREF *MODULE32_LookupHMODULE( HMODULE hModule );
extern BOOL MODULE_DllProcessAttach( WINE_MODREF *wm, LPVOID lpReserved );
extern void MODULE_DllProcessDetach( BOOL bForceDetach, LPVOID lpReserved );
extern void MODULE_DllThreadAttach( LPVOID lpReserved );
@@ -223,10 +221,27 @@
/* loader/ne/convert.c */
HGLOBAL16 NE_LoadPEResource( NE_MODULE *pModule, WORD type, LPVOID bits, DWORD size );
+/* loader/pe_resource.c */
+extern HRSRC PE_FindResourceExW(HMODULE,LPCWSTR,LPCWSTR,WORD);
+extern DWORD PE_SizeofResource(HMODULE,HRSRC);
+extern HGLOBAL PE_LoadResource(HMODULE,HRSRC);
+extern PIMAGE_RESOURCE_DIRECTORY GetResDirEntryA(PIMAGE_RESOURCE_DIRECTORY,LPCSTR,DWORD,BOOL);
+extern PIMAGE_RESOURCE_DIRECTORY GetResDirEntryW(PIMAGE_RESOURCE_DIRECTORY,LPCWSTR,DWORD,BOOL);
+
+/* loader/pe_image.c */
+extern WINE_MODREF *PE_LoadLibraryExA(LPCSTR, DWORD);
+extern HMODULE PE_LoadImage( HANDLE hFile, LPCSTR filename, DWORD flags );
+extern WINE_MODREF *PE_CreateModule( HMODULE hModule, LPCSTR filename,
+ DWORD flags, HFILE hFile, BOOL builtin );
+extern void PE_InitTls(void);
+extern BOOL PE_InitDLL( HMODULE module, DWORD type, LPVOID lpReserved );
+
+/* loader/elf.c */
+extern WINE_MODREF *ELF_LoadLibraryExA( LPCSTR libname, DWORD flags);
+
/* relay32/builtin.c */
extern WINE_MODREF *BUILTIN32_LoadLibraryExA(LPCSTR name, DWORD flags);
extern HMODULE BUILTIN32_LoadExeModule(void);
-extern void BUILTIN32_UnloadLibrary(WINE_MODREF *wm);
extern void *BUILTIN32_dlopen( const char *name );
extern int BUILTIN32_dlclose( void *handle );