Alexandre Julliard | 4776085 | 2005-05-16 19:44:54 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Kernel 16-bit private definitions |
| 3 | * |
| 4 | * Copyright 1995 Alexandre Julliard |
| 5 | * |
| 6 | * This library is free software; you can redistribute it and/or |
| 7 | * modify it under the terms of the GNU Lesser General Public |
| 8 | * License as published by the Free Software Foundation; either |
| 9 | * version 2.1 of the License, or (at your option) any later version. |
| 10 | * |
| 11 | * This library is distributed in the hope that it will be useful, |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 14 | * Lesser General Public License for more details. |
| 15 | * |
| 16 | * You should have received a copy of the GNU Lesser General Public |
| 17 | * License along with this library; if not, write to the Free Software |
Jonathan Ernst | 360a3f9 | 2006-05-18 14:49:52 +0200 | [diff] [blame] | 18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
Alexandre Julliard | 4776085 | 2005-05-16 19:44:54 +0000 | [diff] [blame] | 19 | */ |
| 20 | |
| 21 | #ifndef __WINE_KERNEL16_PRIVATE_H |
| 22 | #define __WINE_KERNEL16_PRIVATE_H |
| 23 | |
| 24 | #include "wine/winbase16.h" |
| 25 | #include "winreg.h" |
| 26 | #include "winternl.h" |
Alexandre Julliard | 4776085 | 2005-05-16 19:44:54 +0000 | [diff] [blame] | 27 | |
| 28 | #include "pshpack1.h" |
| 29 | |
Alexandre Julliard | e8a23c9 | 2005-05-17 10:21:29 +0000 | [diff] [blame] | 30 | /* In-memory module structure. See 'Windows Internals' p. 219 */ |
| 31 | typedef struct _NE_MODULE |
| 32 | { |
Alexandre Julliard | 4417574 | 2005-05-17 14:36:09 +0000 | [diff] [blame] | 33 | WORD ne_magic; /* 00 'NE' signature */ |
| 34 | WORD count; /* 02 Usage count (ne_ver/ne_rev on disk) */ |
| 35 | WORD ne_enttab; /* 04 Near ptr to entry table */ |
| 36 | HMODULE16 next; /* 06 Selector to next module (ne_cbenttab on disk) */ |
| 37 | WORD dgroup_entry; /* 08 Near ptr to segment entry for DGROUP (ne_crc on disk) */ |
| 38 | WORD fileinfo; /* 0a Near ptr to file info (OFSTRUCT) (ne_crc on disk) */ |
| 39 | WORD ne_flags; /* 0c Module flags */ |
| 40 | WORD ne_autodata; /* 0e Logical segment for DGROUP */ |
| 41 | WORD ne_heap; /* 10 Initial heap size */ |
| 42 | WORD ne_stack; /* 12 Initial stack size */ |
| 43 | DWORD ne_csip; /* 14 Initial cs:ip */ |
| 44 | DWORD ne_sssp; /* 18 Initial ss:sp */ |
| 45 | WORD ne_cseg; /* 1c Number of segments in segment table */ |
| 46 | WORD ne_cmod; /* 1e Number of module references */ |
| 47 | WORD ne_cbnrestab; /* 20 Size of non-resident names table */ |
| 48 | WORD ne_segtab; /* 22 Near ptr to segment table */ |
| 49 | WORD ne_rsrctab; /* 24 Near ptr to resource table */ |
| 50 | WORD ne_restab; /* 26 Near ptr to resident names table */ |
| 51 | WORD ne_modtab; /* 28 Near ptr to module reference table */ |
| 52 | WORD ne_imptab; /* 2a Near ptr to imported names table */ |
| 53 | DWORD ne_nrestab; /* 2c File offset of non-resident names table */ |
| 54 | WORD ne_cmovent; /* 30 Number of moveable entries in entry table*/ |
| 55 | WORD ne_align; /* 32 Alignment shift count */ |
| 56 | WORD ne_cres; /* 34 # of resource segments */ |
| 57 | BYTE ne_exetyp; /* 36 Operating system flags */ |
| 58 | BYTE ne_flagsothers; /* 37 Misc. flags */ |
| 59 | HANDLE16 dlls_to_init; /* 38 List of DLLs to initialize (ne_pretthunks on disk) */ |
| 60 | HANDLE16 nrname_handle; /* 3a Handle to non-resident name table (ne_psegrefbytes on disk) */ |
| 61 | WORD ne_swaparea; /* 3c Min. swap area size */ |
| 62 | WORD ne_expver; /* 3e Expected Windows version */ |
Alexandre Julliard | e8a23c9 | 2005-05-17 10:21:29 +0000 | [diff] [blame] | 63 | /* From here, these are extra fields not present in normal Windows */ |
Alexandre Julliard | 8eb1630 | 2005-05-19 12:05:28 +0000 | [diff] [blame] | 64 | HMODULE module32; /* PE module handle for Win32 modules */ |
Alexandre Julliard | 5c819a9 | 2005-05-23 12:15:26 +0000 | [diff] [blame] | 65 | HMODULE owner32; /* PE module containing this one for 16-bit builtins */ |
Alexandre Julliard | 8eb1630 | 2005-05-19 12:05:28 +0000 | [diff] [blame] | 66 | HMODULE16 self; /* Handle for this module */ |
| 67 | WORD self_loading_sel; /* Selector used for self-loading apps. */ |
| 68 | LPVOID rsrc32_map; /* HRSRC 16->32 map (for 32-bit modules) */ |
| 69 | LPCVOID mapping; /* mapping of the binary file */ |
| 70 | SIZE_T mapping_size; /* size of the file mapping */ |
Alexandre Julliard | e8a23c9 | 2005-05-17 10:21:29 +0000 | [diff] [blame] | 71 | } NE_MODULE; |
| 72 | |
Alexandre Julliard | b3e0a03 | 2005-05-18 18:27:54 +0000 | [diff] [blame] | 73 | typedef struct |
| 74 | { |
| 75 | BYTE type; |
| 76 | BYTE flags; |
| 77 | BYTE segnum; |
| 78 | WORD offs; |
| 79 | } ET_ENTRY; |
| 80 | |
| 81 | typedef struct |
| 82 | { |
| 83 | WORD first; /* ordinal */ |
| 84 | WORD last; /* ordinal */ |
| 85 | WORD next; /* bundle */ |
| 86 | } ET_BUNDLE; |
| 87 | |
| 88 | |
| 89 | /* In-memory segment table */ |
| 90 | typedef struct |
| 91 | { |
| 92 | WORD filepos; /* Position in file, in sectors */ |
| 93 | WORD size; /* Segment size on disk */ |
| 94 | WORD flags; /* Segment flags */ |
| 95 | WORD minsize; /* Min. size of segment in memory */ |
| 96 | HANDLE16 hSeg; /* Selector or handle (selector - 1) of segment in memory */ |
| 97 | } SEGTABLEENTRY; |
| 98 | |
Alexandre Julliard | 4776085 | 2005-05-16 19:44:54 +0000 | [diff] [blame] | 99 | /* this structure is always located at offset 0 of the DGROUP segment */ |
| 100 | typedef struct |
| 101 | { |
| 102 | WORD null; /* Always 0 */ |
| 103 | DWORD old_ss_sp; /* Stack pointer; used by SwitchTaskTo() */ |
| 104 | WORD heap; /* Pointer to the local heap information (if any) */ |
| 105 | WORD atomtable; /* Pointer to the local atom table (if any) */ |
| 106 | WORD stacktop; /* Top of the stack */ |
| 107 | WORD stackmin; /* Lowest stack address used so far */ |
| 108 | WORD stackbottom; /* Bottom of the stack */ |
| 109 | } INSTANCEDATA; |
| 110 | |
Alexandre Julliard | 70d0439 | 2005-05-23 12:07:15 +0000 | [diff] [blame] | 111 | /* relay entry points */ |
| 112 | |
Alexandre Julliard | 70d0439 | 2005-05-23 12:07:15 +0000 | [diff] [blame] | 113 | typedef struct |
| 114 | { |
| 115 | WORD pushw_bp; /* pushw %bp */ |
| 116 | BYTE pushl; /* pushl $target */ |
| 117 | void (*target)(); |
| 118 | WORD call; /* call CALLFROM16 */ |
| 119 | short callfrom16; |
| 120 | } ENTRYPOINT16; |
| 121 | |
| 122 | typedef struct |
| 123 | { |
| 124 | BYTE pushl; /* pushl $relay */ |
| 125 | void *relay; |
| 126 | BYTE lcall; /* lcall __FLATCS__:glue */ |
| 127 | void *glue; |
| 128 | WORD flatcs; |
Alexandre Julliard | 96508ad | 2005-09-18 12:25:22 +0000 | [diff] [blame] | 129 | WORD ret[5]; /* return sequence */ |
| 130 | WORD movl; /* movl arg_types[1],arg_types[0](%esi) */ |
Alexandre Julliard | 70d0439 | 2005-05-23 12:07:15 +0000 | [diff] [blame] | 131 | DWORD arg_types[2]; /* type of each argument */ |
| 132 | } CALLFROM16; |
| 133 | |
Alexandre Julliard | 4776085 | 2005-05-16 19:44:54 +0000 | [diff] [blame] | 134 | /* THHOOK Kernel Data Structure */ |
| 135 | typedef struct _THHOOK |
| 136 | { |
| 137 | HANDLE16 hGlobalHeap; /* 00 (handle BURGERMASTER) */ |
| 138 | WORD pGlobalHeap; /* 02 (selector BURGERMASTER) */ |
| 139 | HMODULE16 hExeHead; /* 04 hFirstModule */ |
| 140 | HMODULE16 hExeSweep; /* 06 (unused) */ |
| 141 | HANDLE16 TopPDB; /* 08 (handle of KERNEL PDB) */ |
| 142 | HANDLE16 HeadPDB; /* 0A (first PDB in list) */ |
| 143 | HANDLE16 TopSizePDB; /* 0C (unused) */ |
| 144 | HTASK16 HeadTDB; /* 0E hFirstTask */ |
| 145 | HTASK16 CurTDB; /* 10 hCurrentTask */ |
| 146 | HTASK16 LoadTDB; /* 12 (unused) */ |
| 147 | HTASK16 LockTDB; /* 14 hLockedTask */ |
| 148 | } THHOOK; |
| 149 | |
Alexandre Julliard | 96508ad | 2005-09-18 12:25:22 +0000 | [diff] [blame] | 150 | extern LONG __wine_call_from_16(); |
| 151 | extern void __wine_call_from_16_regs(); |
| 152 | |
Alexandre Julliard | 4776085 | 2005-05-16 19:44:54 +0000 | [diff] [blame] | 153 | extern THHOOK *pThhook; |
| 154 | |
| 155 | #include "poppack.h" |
| 156 | |
| 157 | #define NE_SEG_TABLE(pModule) \ |
Alexandre Julliard | 4417574 | 2005-05-17 14:36:09 +0000 | [diff] [blame] | 158 | ((SEGTABLEENTRY *)((char *)(pModule) + (pModule)->ne_segtab)) |
Alexandre Julliard | 4776085 | 2005-05-16 19:44:54 +0000 | [diff] [blame] | 159 | |
| 160 | #define NE_MODULE_NAME(pModule) \ |
| 161 | (((OFSTRUCT *)((char*)(pModule) + (pModule)->fileinfo))->szPathName) |
| 162 | |
Alexandre Julliard | 8eb1630 | 2005-05-19 12:05:28 +0000 | [diff] [blame] | 163 | #define NE_GET_DATA(pModule,offset,size) \ |
| 164 | ((const void *)(((offset)+(size) <= pModule->mapping_size) ? \ |
| 165 | (const char *)pModule->mapping + (offset) : NULL)) |
| 166 | |
| 167 | #define NE_READ_DATA(pModule,buffer,offset,size) \ |
| 168 | (((offset)+(size) <= pModule->mapping_size) ? \ |
| 169 | (memcpy( buffer, (const char *)pModule->mapping + (offset), (size) ), TRUE) : FALSE) |
| 170 | |
Alexandre Julliard | 4776085 | 2005-05-16 19:44:54 +0000 | [diff] [blame] | 171 | #define CURRENT_STACK16 ((STACK16FRAME*)MapSL((SEGPTR)NtCurrentTeb()->WOW32Reserved)) |
| 172 | #define CURRENT_DS (CURRENT_STACK16->ds) |
| 173 | |
| 174 | /* push bytes on the 16-bit stack of a thread; return a segptr to the first pushed byte */ |
| 175 | static inline SEGPTR stack16_push( int size ) |
| 176 | { |
| 177 | STACK16FRAME *frame = CURRENT_STACK16; |
| 178 | memmove( (char*)frame - size, frame, sizeof(*frame) ); |
| 179 | NtCurrentTeb()->WOW32Reserved = (char *)NtCurrentTeb()->WOW32Reserved - size; |
| 180 | return (SEGPTR)((char *)NtCurrentTeb()->WOW32Reserved + sizeof(*frame)); |
| 181 | } |
| 182 | |
| 183 | /* pop bytes from the 16-bit stack of a thread */ |
| 184 | static inline void stack16_pop( int size ) |
| 185 | { |
| 186 | STACK16FRAME *frame = CURRENT_STACK16; |
| 187 | memmove( (char*)frame + size, frame, sizeof(*frame) ); |
| 188 | NtCurrentTeb()->WOW32Reserved = (char *)NtCurrentTeb()->WOW32Reserved + size; |
| 189 | } |
| 190 | |
| 191 | /* ne_module.c */ |
| 192 | extern NE_MODULE *NE_GetPtr( HMODULE16 hModule ); |
| 193 | extern WORD NE_GetOrdinal( HMODULE16 hModule, const char *name ); |
| 194 | extern FARPROC16 WINAPI NE_GetEntryPoint( HMODULE16 hModule, WORD ordinal ); |
| 195 | extern FARPROC16 NE_GetEntryPointEx( HMODULE16 hModule, WORD ordinal, BOOL16 snoop ); |
| 196 | extern BOOL16 NE_SetEntryPoint( HMODULE16 hModule, WORD ordinal, WORD offset ); |
Alexandre Julliard | 4776085 | 2005-05-16 19:44:54 +0000 | [diff] [blame] | 197 | extern DWORD NE_StartTask(void); |
| 198 | |
| 199 | /* ne_segment.c */ |
| 200 | extern BOOL NE_LoadSegment( NE_MODULE *pModule, WORD segnum ); |
| 201 | extern BOOL NE_LoadAllSegments( NE_MODULE *pModule ); |
| 202 | extern BOOL NE_CreateSegment( NE_MODULE *pModule, int segnum ); |
| 203 | extern BOOL NE_CreateAllSegments( NE_MODULE *pModule ); |
| 204 | extern HINSTANCE16 NE_GetInstance( NE_MODULE *pModule ); |
| 205 | extern void NE_InitializeDLLs( HMODULE16 hModule ); |
| 206 | extern void NE_DllProcessAttach( HMODULE16 hModule ); |
| 207 | extern void NE_CallUserSignalProc( HMODULE16 hModule, UINT16 code ); |
| 208 | |
| 209 | /* selector.c */ |
| 210 | extern WORD SELECTOR_AllocBlock( const void *base, DWORD size, unsigned char flags ); |
| 211 | extern WORD SELECTOR_ReallocBlock( WORD sel, const void *base, DWORD size ); |
| 212 | extern void SELECTOR_FreeBlock( WORD sel ); |
| 213 | #define IS_SELECTOR_32BIT(sel) \ |
| 214 | (wine_ldt_is_system(sel) || (wine_ldt_copy.flags[LOWORD(sel) >> 3] & WINE_LDT_FLAGS_32BIT)) |
| 215 | |
Alexandre Julliard | 2b33634 | 2005-07-05 12:52:07 +0000 | [diff] [blame] | 216 | /* relay16.c */ |
| 217 | extern int relay_call_from_16( void *entry_point, unsigned char *args16, CONTEXT86 *context ); |
| 218 | |
Alexandre Julliard | 964b7fb | 2005-05-18 09:58:43 +0000 | [diff] [blame] | 219 | /* snoop16.c */ |
| 220 | extern void SNOOP16_RegisterDLL(HMODULE16,LPCSTR); |
| 221 | extern FARPROC16 SNOOP16_GetProcAddress16(HMODULE16,DWORD,FARPROC16); |
| 222 | extern int SNOOP16_ShowDebugmsgSnoop(const char *dll,int ord,const char *fname); |
| 223 | |
Alexandre Julliard | 4776085 | 2005-05-16 19:44:54 +0000 | [diff] [blame] | 224 | /* task.c */ |
| 225 | extern void TASK_CreateMainTask(void); |
| 226 | extern HTASK16 TASK_SpawnTask( NE_MODULE *pModule, WORD cmdShow, |
| 227 | LPCSTR cmdline, BYTE len, HANDLE *hThread ); |
| 228 | extern void TASK_ExitTask(void); |
| 229 | extern HTASK16 TASK_GetTaskFromThread( DWORD thread ); |
| 230 | extern TDB *TASK_GetCurrent(void); |
| 231 | extern void TASK_InstallTHHook( THHOOK *pNewThook ); |
| 232 | |
Alexandre Julliard | 6c6a572 | 2005-08-27 10:18:03 +0000 | [diff] [blame] | 233 | extern BOOL WOWTHUNK_Init(void); |
| 234 | |
Alexandre Julliard | 1a0f286 | 2005-07-03 11:28:44 +0000 | [diff] [blame] | 235 | extern DWORD CallTo16_DataSelector; |
| 236 | extern DWORD CallTo16_TebSelector; |
Alexandre Julliard | 7191412 | 2005-07-01 16:24:32 +0000 | [diff] [blame] | 237 | extern SEGPTR CALL32_CBClient_RetAddr; |
| 238 | extern SEGPTR CALL32_CBClientEx_RetAddr; |
| 239 | |
Alexandre Julliard | 4776085 | 2005-05-16 19:44:54 +0000 | [diff] [blame] | 240 | #endif /* __WINE_KERNEL16_PRIVATE_H */ |