Release 970914
[wine] / include / module.h
1 /*
2  * Module definitions
3  *
4  * Copyright 1995 Alexandre Julliard
5  */
6
7 #ifndef __WINE_MODULE_H
8 #define __WINE_MODULE_H
9
10 #include "wintypes.h"
11 #include "pe_image.h"
12
13   /* In-memory module structure. See 'Windows Internals' p. 219 */
14 typedef struct
15 {
16     WORD    magic;            /* 00 'NE' signature */
17     WORD    count;            /* 02 Usage count */
18     WORD    entry_table;      /* 04 Near ptr to entry table */
19     HMODULE16  next;          /* 06 Selector to next module */
20     WORD    dgroup_entry;     /* 08 Near ptr to segment entry for DGROUP */
21     WORD    fileinfo;         /* 0a Near ptr to file info (OFSTRUCT) */
22     WORD    flags;            /* 0c Module flags */
23     WORD    dgroup;           /* 0e Logical segment for DGROUP */
24     WORD    heap_size;        /* 10 Initial heap size */
25     WORD    stack_size;       /* 12 Initial stack size */
26     WORD    ip;               /* 14 Initial ip */
27     WORD    cs;               /* 16 Initial cs (logical segment) */
28     WORD    sp;               /* 18 Initial stack pointer */
29     WORD    ss;               /* 1a Initial ss (logical segment) */
30     WORD    seg_count;        /* 1c Number of segments in segment table */
31     WORD    modref_count;     /* 1e Number of module references */
32     WORD    nrname_size;      /* 20 Size of non-resident names table */
33     WORD    seg_table;        /* 22 Near ptr to segment table */
34     WORD    res_table;        /* 24 Near ptr to resource table */
35     WORD    name_table;       /* 26 Near ptr to resident names table */
36     WORD    modref_table;     /* 28 Near ptr to module reference table */
37     WORD    import_table;     /* 2a Near ptr to imported names table */
38     DWORD   nrname_fpos;      /* 2c File offset of non-resident names table */
39     WORD    moveable_entries; /* 30 Number of moveable entries in entry table*/
40     WORD    alignment;        /* 32 Alignment shift count */
41     WORD    truetype;         /* 34 Set to 2 if TrueType font */
42     BYTE    os_flags;         /* 36 Operating system flags */
43     BYTE    misc_flags;       /* 37 Misc. flags */
44     HANDLE16   dlls_to_init;  /* 38 List of DLLs to initialize */
45     HANDLE16   nrname_handle; /* 3a Handle to non-resident name table */
46     WORD    min_swap_area;    /* 3c Min. swap area size */
47     WORD    expected_version; /* 3e Expected Windows version */
48     /* From here, these are extra fields not present in normal Windows */
49     PE_MODULE *pe_module;     /* 40 PE module handle for Win32 modules */
50     HMODULE16  self;          /* 44 Handle for this module */
51     WORD    self_loading_sel; /* 46 Selector used for self-loading apps. */
52 } NE_MODULE;
53
54
55   /* In-memory segment table */
56 typedef struct
57 {
58     WORD      filepos;   /* Position in file, in sectors */
59     WORD      size;      /* Segment size on disk */
60     WORD      flags;     /* Segment flags */
61     WORD      minsize;   /* Min. size of segment in memory */
62     HANDLE16  selector;  /* Selector of segment in memory */
63 } SEGTABLEENTRY;
64
65
66   /* Self-loading modules contain this structure in their first segment */
67
68 typedef struct
69 {
70     WORD      version;       /* Must be 0xA0 */
71     WORD      reserved;
72     FARPROC16 BootApp;       /* startup procedure */
73     FARPROC16 LoadAppSeg;    /* procedure to load a segment */
74     FARPROC16 reserved2;
75     FARPROC16 MyAlloc;       /* memory allocation procedure, 
76                               * wine must write this field */
77     FARPROC16 EntryAddrProc;
78     FARPROC16 ExitProc;      /* exit procedure */
79     WORD      reserved3[4];
80     FARPROC16 SetOwner;      /* Set Owner procedure, exported by wine */
81 } SELFLOADHEADER;
82
83 #pragma pack(1)
84
85   /* Parameters for LoadModule() */
86 typedef struct
87 {
88     HGLOBAL16 hEnvironment;         /* Environment segment */
89     SEGPTR    cmdLine WINE_PACKED;  /* Command-line */
90     SEGPTR    showCmd WINE_PACKED;  /* Code for ShowWindow() */
91     SEGPTR    reserved WINE_PACKED;
92 } LOADPARAMS;
93
94 #pragma pack(4)
95
96 /* Resource types */
97 typedef struct resource_typeinfo_s NE_TYPEINFO;
98 typedef struct resource_nameinfo_s NE_NAMEINFO;
99
100 #define NE_SEG_TABLE(pModule) \
101     ((SEGTABLEENTRY *)((char *)(pModule) + (pModule)->seg_table))
102
103 #define NE_MODULE_TABLE(pModule) \
104     ((WORD *)((char *)(pModule) + (pModule)->modref_table))
105
106 #define NE_MODULE_NAME(pModule) \
107     (((OFSTRUCT *)((char*)(pModule) + (pModule)->fileinfo))->szPathName)
108
109 #define NE_WIN32_MODULE(pModule) \
110     ((struct pe_data *)(((pModule)->flags & NE_FFLAGS_WIN32) ? \
111                     ((NE_WIN32_EXTRAINFO *)((pModule) + 1))->pe_module : 0))
112
113 /* module.c */
114 extern NE_MODULE *MODULE_GetPtr( HMODULE32 hModule );
115 extern HMODULE16 MODULE_HANDLEtoHMODULE16( HANDLE32 handle );
116 extern HMODULE32 MODULE_HANDLEtoHMODULE32( HANDLE32 handle );
117 extern void MODULE_DumpModule( HMODULE32 hmodule );
118 extern void MODULE_WalkModules(void);
119 extern int MODULE_OpenFile( HMODULE32 hModule );
120 extern LPSTR MODULE_GetModuleName( HMODULE32 hModule );
121 extern void MODULE_RegisterModule( NE_MODULE *pModule );
122 extern HMODULE32 MODULE_FindModule( LPCSTR path );
123 extern HINSTANCE16 MODULE_CreateInstance( HMODULE16 hModule, LOADPARAMS* paramBlock );
124 extern HINSTANCE16 MODULE_GetInstance( HMODULE32 hModule );
125 extern HMODULE32 MODULE_CreateDummyModule( const OFSTRUCT *ofs );
126 extern HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, UINT16 flags );
127 extern WORD MODULE_GetOrdinal( HMODULE32 hModule, const char *name );
128 extern FARPROC16 MODULE_GetEntryPoint( HMODULE32 hModule, WORD ordinal );
129 extern BOOL16 MODULE_SetEntryPoint( HMODULE32 hModule, WORD ordinal,
130                                     WORD offset );
131 extern FARPROC16 MODULE_GetWndProcEntry16( const char *name );
132 extern FARPROC16 WIN32_GetProcAddress16( HMODULE32 hmodule, LPSTR name );
133
134 /* builtin.c */
135 extern BOOL16 BUILTIN_Init(void);
136 extern HMODULE16 BUILTIN_LoadModule( LPCSTR name, BOOL16 force );
137 extern LPCSTR BUILTIN_GetEntryPoint16( WORD cs, WORD ip, WORD *pOrd );
138 extern LPCSTR BUILTIN_GetEntryPoint32( void *relay );
139 extern FARPROC32 BUILTIN_GetProcAddress32(NE_MODULE *pModule, LPCSTR function);
140 extern BOOL16 BUILTIN_ParseDLLOptions( const char *str );
141 extern void BUILTIN_PrintDLLs(void);
142
143 /* ne_image.c */
144 extern BOOL32 NE_LoadSegment( HMODULE16 hModule, WORD segnum );
145 extern void NE_FixupPrologs( NE_MODULE *pModule );
146 extern void NE_InitializeDLLs( HMODULE16 hModule );
147
148 #endif  /* __WINE_MODULE_H */