Built-in DLLs resources are now specified in spec file.
Removed unnecessary flags in built-in DLLs tables.
This commit is contained in:
parent
8f74d8e610
commit
74e4a28a34
|
@ -1,6 +1,7 @@
|
||||||
name comctl32
|
name comctl32
|
||||||
type win32
|
type win32
|
||||||
init COMCTL32_LibMain
|
init COMCTL32_LibMain
|
||||||
|
rsrc comctl32
|
||||||
|
|
||||||
# Functions exported by the Win95 comctl32.dll
|
# Functions exported by the Win95 comctl32.dll
|
||||||
# (these need to have these exact ordinals, because some win95 dlls
|
# (these need to have these exact ordinals, because some win95 dlls
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
name comdlg32
|
name comdlg32
|
||||||
type win32
|
type win32
|
||||||
init COMDLG32_DllEntryPoint
|
init COMDLG32_DllEntryPoint
|
||||||
|
rsrc comdlg32
|
||||||
|
|
||||||
0 stub ArrowBtnWndProc
|
0 stub ArrowBtnWndProc
|
||||||
1 stdcall ChooseColorA(ptr) ChooseColorA
|
1 stdcall ChooseColorA(ptr) ChooseColorA
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
name display
|
name display
|
||||||
type win16
|
type win16
|
||||||
|
rsrc display
|
||||||
|
|
||||||
1 stub BitBlt
|
1 stub BitBlt
|
||||||
2 stub ColorInfo
|
2 stub ColorInfo
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
name mouse
|
name mouse
|
||||||
type win16
|
type win16
|
||||||
|
rsrc mouse
|
||||||
|
|
||||||
1 pascal16 Inquire(ptr) MOUSE_Inquire
|
1 pascal16 Inquire(ptr) MOUSE_Inquire
|
||||||
2 pascal16 Enable(segptr) WIN16_MOUSE_Enable
|
2 pascal16 Enable(segptr) WIN16_MOUSE_Enable
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
name shell32
|
name shell32
|
||||||
type win32
|
type win32
|
||||||
init Shell32LibMain
|
init Shell32LibMain
|
||||||
|
rsrc shell32
|
||||||
|
|
||||||
# Functions exported by the Win95 shell32.dll
|
# Functions exported by the Win95 shell32.dll
|
||||||
# (these need to have these exact ordinals, for some
|
# (these need to have these exact ordinals, for some
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
name winmm
|
name winmm
|
||||||
type win32
|
type win32
|
||||||
init WINMM_LibMain
|
init WINMM_LibMain
|
||||||
|
rsrc winmm
|
||||||
|
|
||||||
# ordinal exports
|
# ordinal exports
|
||||||
1 stdcall @(ptr long long) PlaySoundA
|
1 stdcall @(ptr long long) PlaySoundA
|
||||||
|
|
182
if1632/builtin.c
182
if1632/builtin.c
|
@ -24,7 +24,7 @@
|
||||||
#include "debugtools.h"
|
#include "debugtools.h"
|
||||||
#include "toolhelp.h"
|
#include "toolhelp.h"
|
||||||
|
|
||||||
DEFAULT_DEBUG_CHANNEL(module)
|
DEFAULT_DEBUG_CHANNEL(module);
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -33,16 +33,6 @@ typedef struct
|
||||||
DWORD res_size; /* size of resource data */
|
DWORD res_size; /* size of resource data */
|
||||||
} BUILTIN16_RESOURCE;
|
} 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 */
|
/* 16-bit DLLs */
|
||||||
|
|
||||||
|
@ -89,57 +79,60 @@ extern const WIN16_DESCRIPTOR WING_Descriptor;
|
||||||
extern const WIN16_DESCRIPTOR WINSOCK_Descriptor;
|
extern const WIN16_DESCRIPTOR WINSOCK_Descriptor;
|
||||||
extern const WIN16_DESCRIPTOR WPROCS_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 */
|
/* Table of all built-in DLLs */
|
||||||
|
|
||||||
static BUILTIN16_DLL BuiltinDLLs[] =
|
static const WIN16_DESCRIPTOR *BuiltinDLLs[] =
|
||||||
{
|
{
|
||||||
{ &KERNEL_Descriptor, 0, NULL },
|
&KERNEL_Descriptor,
|
||||||
{ &USER_Descriptor, 0, NULL },
|
&USER_Descriptor,
|
||||||
{ &GDI_Descriptor, 0, NULL },
|
&GDI_Descriptor,
|
||||||
{ &SYSTEM_Descriptor, DLL_FLAG_ALWAYS_USED, NULL },
|
&SYSTEM_Descriptor,
|
||||||
{ &DISPLAY_Descriptor, DLL_FLAG_ALWAYS_USED, &display_ResourceDescriptor },
|
&DISPLAY_Descriptor,
|
||||||
{ &WPROCS_Descriptor, DLL_FLAG_ALWAYS_USED, NULL },
|
&WPROCS_Descriptor,
|
||||||
{ &WINDEBUG_Descriptor, DLL_FLAG_NOT_USED, NULL },
|
&WINDEBUG_Descriptor,
|
||||||
{ &AVIFILE_Descriptor, DLL_FLAG_NOT_USED, NULL },
|
&AVIFILE_Descriptor,
|
||||||
{ &COMMDLG_Descriptor, DLL_FLAG_NOT_USED, NULL },
|
&COMMDLG_Descriptor,
|
||||||
{ &COMPOBJ_Descriptor, DLL_FLAG_NOT_USED, NULL },
|
&COMPOBJ_Descriptor,
|
||||||
{ &DDEML_Descriptor, DLL_FLAG_NOT_USED, NULL },
|
&DDEML_Descriptor,
|
||||||
{ &DISPDIB_Descriptor, 0, NULL },
|
&DISPDIB_Descriptor,
|
||||||
{ &KEYBOARD_Descriptor, 0, NULL },
|
&KEYBOARD_Descriptor,
|
||||||
{ &COMM_Descriptor, 0, NULL },
|
&COMM_Descriptor,
|
||||||
{ &LZEXPAND_Descriptor, 0, NULL },
|
&LZEXPAND_Descriptor,
|
||||||
{ &MMSYSTEM_Descriptor, 0, NULL },
|
&MMSYSTEM_Descriptor,
|
||||||
{ &MOUSE_Descriptor, 0, &mouse_ResourceDescriptor },
|
&MOUSE_Descriptor,
|
||||||
{ &MSACM_Descriptor, 0, NULL },
|
&MSACM_Descriptor,
|
||||||
{ &MSVIDEO_Descriptor, 0, NULL },
|
&MSVIDEO_Descriptor,
|
||||||
{ &OLE2CONV_Descriptor, DLL_FLAG_NOT_USED, NULL },
|
&OLE2CONV_Descriptor,
|
||||||
{ &OLE2DISP_Descriptor, DLL_FLAG_NOT_USED, NULL },
|
&OLE2DISP_Descriptor,
|
||||||
{ &OLE2NLS_Descriptor, DLL_FLAG_NOT_USED, NULL },
|
&OLE2NLS_Descriptor,
|
||||||
{ &OLE2PROX_Descriptor, DLL_FLAG_NOT_USED, NULL },
|
&OLE2PROX_Descriptor,
|
||||||
{ &OLE2THK_Descriptor, DLL_FLAG_NOT_USED, NULL },
|
&OLE2THK_Descriptor,
|
||||||
{ &OLE2_Descriptor, DLL_FLAG_NOT_USED, NULL },
|
&OLE2_Descriptor,
|
||||||
{ &OLECLI_Descriptor, DLL_FLAG_NOT_USED, NULL },
|
&OLECLI_Descriptor,
|
||||||
{ &OLESVR_Descriptor, DLL_FLAG_NOT_USED, NULL },
|
&OLESVR_Descriptor,
|
||||||
{ &RASAPI16_Descriptor, 0, NULL },
|
&RASAPI16_Descriptor,
|
||||||
{ &SHELL_Descriptor, 0, NULL },
|
&SHELL_Descriptor,
|
||||||
{ &SOUND_Descriptor, 0, NULL },
|
&SOUND_Descriptor,
|
||||||
{ &STORAGE_Descriptor, DLL_FLAG_NOT_USED, NULL },
|
&STORAGE_Descriptor,
|
||||||
{ &STRESS_Descriptor, 0, NULL },
|
&STRESS_Descriptor,
|
||||||
{ &TOOLHELP_Descriptor, 0, NULL },
|
&TOOLHELP_Descriptor,
|
||||||
{ &TYPELIB_Descriptor, DLL_FLAG_NOT_USED, NULL },
|
&TYPELIB_Descriptor,
|
||||||
{ &VER_Descriptor, 0, NULL },
|
&VER_Descriptor,
|
||||||
{ &W32SYS_Descriptor, DLL_FLAG_NOT_USED, NULL },
|
&W32SYS_Descriptor,
|
||||||
{ &WIN32S16_Descriptor, DLL_FLAG_NOT_USED, NULL },
|
&WIN32S16_Descriptor,
|
||||||
{ &WIN87EM_Descriptor, DLL_FLAG_NOT_USED, NULL },
|
&WIN87EM_Descriptor,
|
||||||
{ &WINASPI_Descriptor, 0, NULL },
|
&WINASPI_Descriptor,
|
||||||
{ &WINEPS_Descriptor, DLL_FLAG_ALWAYS_USED, NULL },
|
&WINEPS_Descriptor,
|
||||||
{ &WING_Descriptor, 0, NULL },
|
&WING_Descriptor,
|
||||||
{ &WINSOCK_Descriptor, 0, NULL },
|
&WINSOCK_Descriptor,
|
||||||
/* Last entry */
|
/* 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 */
|
/* 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
|
* Load a built-in Win16 module. Helper function for BUILTIN_LoadModule
|
||||||
* and BUILTIN_Init.
|
* and BUILTIN_Init.
|
||||||
*/
|
*/
|
||||||
static HMODULE16 BUILTIN_DoLoadModule16( const BUILTIN16_DLL *dll )
|
static HMODULE16 BUILTIN_DoLoadModule16( const WIN16_DESCRIPTOR *descr )
|
||||||
{
|
{
|
||||||
NE_MODULE *pModule;
|
NE_MODULE *pModule;
|
||||||
int minsize, res_off;
|
int minsize, res_off;
|
||||||
SEGTABLEENTRY *pSegTable;
|
SEGTABLEENTRY *pSegTable;
|
||||||
HMODULE16 hModule;
|
HMODULE16 hModule;
|
||||||
|
const BUILTIN16_RESOURCE *rsrc = descr->rsrc;
|
||||||
|
|
||||||
if ( !dll->res )
|
if (!rsrc)
|
||||||
{
|
{
|
||||||
hModule = GLOBAL_CreateBlock( GMEM_MOVEABLE, dll->descr->module_start,
|
hModule = GLOBAL_CreateBlock( GMEM_MOVEABLE, descr->module_start,
|
||||||
dll->descr->module_size, 0,
|
descr->module_size, 0,
|
||||||
FALSE, FALSE, FALSE, NULL );
|
FALSE, FALSE, FALSE, NULL );
|
||||||
if (!hModule) return 0;
|
if (!hModule) return 0;
|
||||||
FarSetOwner16( hModule, hModule );
|
FarSetOwner16( hModule, hModule );
|
||||||
|
|
||||||
pModule = (NE_MODULE *)GlobalLock16( hModule );
|
pModule = (NE_MODULE *)GlobalLock16( hModule );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ET_BUNDLE *bundle;
|
ET_BUNDLE *bundle;
|
||||||
|
|
||||||
hModule = GLOBAL_Alloc( GMEM_MOVEABLE,
|
hModule = GLOBAL_Alloc( GMEM_MOVEABLE,
|
||||||
dll->descr->module_size + dll->res->res_size,
|
descr->module_size + rsrc->res_size,
|
||||||
0, FALSE, FALSE, FALSE );
|
0, FALSE, FALSE, FALSE );
|
||||||
if (!hModule) return 0;
|
if (!hModule) return 0;
|
||||||
FarSetOwner16( hModule, hModule );
|
FarSetOwner16( hModule, hModule );
|
||||||
|
|
||||||
pModule = (NE_MODULE *)GlobalLock16( 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, descr->module_start, res_off );
|
||||||
memcpy( (LPBYTE)pModule + res_off, dll->res->res_start, dll->res->res_size );
|
memcpy( (LPBYTE)pModule + res_off, rsrc->res_start, rsrc->res_size );
|
||||||
memcpy( (LPBYTE)pModule + res_off + dll->res->res_size,
|
memcpy( (LPBYTE)pModule + res_off + rsrc->res_size,
|
||||||
dll->descr->module_start + res_off, dll->descr->module_size - res_off );
|
descr->module_start + res_off, descr->module_size - res_off );
|
||||||
|
|
||||||
/* Have to fix up various pModule-based near pointers. Ugh! */
|
/* Have to fix up various pModule-based near pointers. Ugh! */
|
||||||
pModule->name_table += dll->res->res_size;
|
pModule->name_table += rsrc->res_size;
|
||||||
pModule->modref_table += dll->res->res_size;
|
pModule->modref_table += rsrc->res_size;
|
||||||
pModule->import_table += dll->res->res_size;
|
pModule->import_table += rsrc->res_size;
|
||||||
pModule->entry_table += dll->res->res_size;
|
pModule->entry_table += rsrc->res_size;
|
||||||
|
|
||||||
for ( bundle = (ET_BUNDLE *)((LPBYTE)pModule + pModule->entry_table);
|
for ( bundle = (ET_BUNDLE *)((LPBYTE)pModule + pModule->entry_table);
|
||||||
bundle->next;
|
bundle->next;
|
||||||
bundle = (ET_BUNDLE *)((LPBYTE)pModule + 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 */
|
/* NOTE: (Ab)use the hRsrcMap parameter for resource data pointer */
|
||||||
pModule->hRsrcMap = dll->res->res_start;
|
pModule->hRsrcMap = rsrc->res_start;
|
||||||
}
|
}
|
||||||
pModule->self = hModule;
|
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 */
|
/* Allocate the code segment */
|
||||||
|
|
||||||
pSegTable = NE_SEG_TABLE( pModule );
|
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,
|
pSegTable->minsize, hModule,
|
||||||
TRUE, TRUE, FALSE, NULL );
|
TRUE, TRUE, FALSE, NULL );
|
||||||
if (!pSegTable->hSeg) return 0;
|
if (!pSegTable->hSeg) return 0;
|
||||||
|
@ -223,12 +217,12 @@ static HMODULE16 BUILTIN_DoLoadModule16( const BUILTIN16_DLL *dll )
|
||||||
hModule, FALSE, FALSE, FALSE );
|
hModule, FALSE, FALSE, FALSE );
|
||||||
if (!pSegTable->hSeg) return 0;
|
if (!pSegTable->hSeg) return 0;
|
||||||
if (pSegTable->minsize) memcpy( GlobalLock16( pSegTable->hSeg ),
|
if (pSegTable->minsize) memcpy( GlobalLock16( pSegTable->hSeg ),
|
||||||
dll->descr->data_start, pSegTable->minsize);
|
descr->data_start, pSegTable->minsize);
|
||||||
if (pModule->heap_size)
|
if (pModule->heap_size)
|
||||||
LocalInit16( GlobalHandleToSel16(pSegTable->hSeg),
|
LocalInit16( GlobalHandleToSel16(pSegTable->hSeg),
|
||||||
pSegTable->minsize, minsize );
|
pSegTable->minsize, minsize );
|
||||||
|
|
||||||
if (dll->res)
|
if (rsrc)
|
||||||
NE_InitResourceHandler(hModule);
|
NE_InitResourceHandler(hModule);
|
||||||
|
|
||||||
NE_RegisterModule( pModule );
|
NE_RegisterModule( pModule );
|
||||||
|
@ -243,14 +237,14 @@ static HMODULE16 BUILTIN_DoLoadModule16( const BUILTIN16_DLL *dll )
|
||||||
*/
|
*/
|
||||||
BOOL BUILTIN_Init(void)
|
BOOL BUILTIN_Init(void)
|
||||||
{
|
{
|
||||||
BUILTIN16_DLL *dll;
|
|
||||||
WORD vector;
|
WORD vector;
|
||||||
HMODULE16 hModule;
|
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_LoadModule( *ptr )) return FALSE;
|
||||||
if (!BUILTIN_DoLoadModule16( dll )) return FALSE;
|
ptr++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set interrupt vectors from entry points in WPROCS.DLL */
|
/* Set interrupt vectors from entry points in WPROCS.DLL */
|
||||||
|
@ -271,12 +265,11 @@ BOOL BUILTIN_Init(void)
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* BUILTIN_LoadModule
|
* BUILTIN_LoadModule
|
||||||
*
|
*
|
||||||
* Load a built-in module. If the 'force' parameter is FALSE, we only
|
* Load a built-in module.
|
||||||
* load the module if it has not been disabled via the -dll option.
|
|
||||||
*/
|
*/
|
||||||
HMODULE16 BUILTIN_LoadModule( LPCSTR name, BOOL force )
|
HMODULE16 BUILTIN_LoadModule( LPCSTR name )
|
||||||
{
|
{
|
||||||
BUILTIN16_DLL *table;
|
const WIN16_DESCRIPTOR **table;
|
||||||
char dllname[16], *p;
|
char dllname[16], *p;
|
||||||
|
|
||||||
/* Fix the name in case we have a full path and extension */
|
/* 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" );
|
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);
|
OFSTRUCT *pOfs = (OFSTRUCT *)((LPBYTE)pModule + pModule->fileinfo);
|
||||||
if (!lstrcmpiA( pOfs->szPathName, dllname )) break;
|
if (!lstrcmpiA( pOfs->szPathName, dllname )) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!table->descr) return (HMODULE16)2;
|
if (!*table) return (HMODULE16)2;
|
||||||
|
return BUILTIN_DoLoadModule16( *table );
|
||||||
if ((table->flags & DLL_FLAG_NOT_USED) && !force) return (HMODULE16)2;
|
|
||||||
|
|
||||||
return BUILTIN_DoLoadModule16( table );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ struct _CONTEXT86;
|
||||||
struct _STACK16FRAME;
|
struct _STACK16FRAME;
|
||||||
|
|
||||||
extern BOOL BUILTIN_Init(void);
|
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 LPCSTR BUILTIN_GetEntryPoint16( struct _STACK16FRAME *frame, LPSTR name, WORD *pOrd );
|
||||||
|
|
||||||
extern void RELAY_Unimplemented16(void);
|
extern void RELAY_Unimplemented16(void);
|
||||||
|
@ -82,6 +82,7 @@ typedef struct
|
||||||
int module_size; /* Size of the module data */
|
int module_size; /* Size of the module data */
|
||||||
const BYTE *code_start; /* 32-bit address of DLL code */
|
const BYTE *code_start; /* 32-bit address of DLL code */
|
||||||
const BYTE *data_start; /* 32-bit address of DLL data */
|
const BYTE *data_start; /* 32-bit address of DLL data */
|
||||||
|
const void *rsrc; /* resources data */
|
||||||
} WIN16_DESCRIPTOR;
|
} WIN16_DESCRIPTOR;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@ typedef struct
|
||||||
const unsigned int *argtypes; /* Pointer to argument types bitmask */
|
const unsigned int *argtypes; /* Pointer to argument types bitmask */
|
||||||
const char * const *imports; /* Pointer to imports */
|
const char * const *imports; /* Pointer to imports */
|
||||||
const ENTRYPOINT32 dllentrypoint;/* Pointer to LibMain function */
|
const ENTRYPOINT32 dllentrypoint;/* Pointer to LibMain function */
|
||||||
|
const void *rsrc; /* Resource descriptor */
|
||||||
} BUILTIN32_DESCRIPTOR;
|
} BUILTIN32_DESCRIPTOR;
|
||||||
|
|
||||||
extern ENTRYPOINT32 BUILTIN32_GetEntryPoint( char *buffer, void *relay,
|
extern ENTRYPOINT32 BUILTIN32_GetEntryPoint( char *buffer, void *relay,
|
||||||
|
|
|
@ -928,7 +928,7 @@ static HINSTANCE16 MODULE_LoadModule16( LPCSTR libname, BOOL implicit, BOOL lib_
|
||||||
|
|
||||||
case MODULE_LOADORDER_BI:
|
case MODULE_LOADORDER_BI:
|
||||||
TRACE("Trying built-in '%s'\n", libname);
|
TRACE("Trying built-in '%s'\n", libname);
|
||||||
hinst = BUILTIN_LoadModule(libname, TRUE);
|
hinst = BUILTIN_LoadModule(libname);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -17,9 +17,8 @@
|
||||||
#include "winerror.h"
|
#include "winerror.h"
|
||||||
#include "debugtools.h"
|
#include "debugtools.h"
|
||||||
|
|
||||||
DECLARE_DEBUG_CHANNEL(relay)
|
DEFAULT_DEBUG_CHANNEL(module);
|
||||||
DECLARE_DEBUG_CHANNEL(win32)
|
DECLARE_DEBUG_CHANNEL(relay);
|
||||||
DECLARE_DEBUG_CHANNEL(module)
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -40,14 +39,9 @@ typedef struct
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
const BUILTIN32_DESCRIPTOR *descr; /* DLL descriptor */
|
const BUILTIN32_DESCRIPTOR *descr; /* DLL descriptor */
|
||||||
DWORD flags;
|
|
||||||
HMODULE hModule;
|
HMODULE hModule;
|
||||||
const BUILTIN32_RESOURCE *rsc;
|
|
||||||
} BUILTIN32_DLL;
|
} BUILTIN32_DLL;
|
||||||
|
|
||||||
#define BI32_INSTANTIATED 0x01
|
|
||||||
#define BI32_DANGER 0x02
|
|
||||||
|
|
||||||
extern const BUILTIN32_DESCRIPTOR ADVAPI32_Descriptor;
|
extern const BUILTIN32_DESCRIPTOR ADVAPI32_Descriptor;
|
||||||
extern const BUILTIN32_DESCRIPTOR AVIFIL32_Descriptor;
|
extern const BUILTIN32_DESCRIPTOR AVIFIL32_Descriptor;
|
||||||
extern const BUILTIN32_DESCRIPTOR COMCTL32_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 WOW32_Descriptor;
|
||||||
extern const BUILTIN32_DESCRIPTOR WSOCK32_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[] =
|
static BUILTIN32_DLL BuiltinDLLs[] =
|
||||||
{
|
{
|
||||||
{ &ADVAPI32_Descriptor, 0, 0, NULL },
|
{ &ADVAPI32_Descriptor, 0 },
|
||||||
{ &AVIFIL32_Descriptor, 0, 0, NULL },
|
{ &AVIFIL32_Descriptor, 0 },
|
||||||
{ &COMCTL32_Descriptor, BI32_DANGER, 0, &comctl32_ResourceDescriptor },
|
{ &COMCTL32_Descriptor, 0 },
|
||||||
{ &COMDLG32_Descriptor, BI32_DANGER, 0, &comdlg32_ResourceDescriptor },
|
{ &COMDLG32_Descriptor, 0 },
|
||||||
{ &CRTDLL_Descriptor, BI32_DANGER, 0, NULL },
|
{ &CRTDLL_Descriptor, 0 },
|
||||||
{ &DCIMAN32_Descriptor, 0, 0, NULL },
|
{ &DCIMAN32_Descriptor, 0 },
|
||||||
{ &DDRAW_Descriptor, 0, 0, NULL },
|
{ &DDRAW_Descriptor, 0 },
|
||||||
{ &DINPUT_Descriptor, 0, 0, NULL },
|
{ &DINPUT_Descriptor, 0 },
|
||||||
{ &DPLAY_Descriptor, 0, 0, NULL },
|
{ &DPLAY_Descriptor, 0 },
|
||||||
{ &DPLAYX_Descriptor, 0, 0, NULL },
|
{ &DPLAYX_Descriptor, 0 },
|
||||||
{ &DSOUND_Descriptor, 0, 0, NULL },
|
{ &DSOUND_Descriptor, 0 },
|
||||||
{ &GDI32_Descriptor, 0, 0, NULL },
|
{ &GDI32_Descriptor, 0 },
|
||||||
{ &ICMP_Descriptor, 0, 0, NULL },
|
{ &ICMP_Descriptor, 0 },
|
||||||
{ &IMAGEHLP_Descriptor, BI32_DANGER, 0, NULL },
|
{ &IMAGEHLP_Descriptor, 0 },
|
||||||
{ &IMM32_Descriptor, 0, 0, NULL },
|
{ &IMM32_Descriptor, 0 },
|
||||||
{ &KERNEL32_Descriptor, 0, 0, NULL },
|
{ &KERNEL32_Descriptor, 0 },
|
||||||
{ &LZ32_Descriptor, 0, 0, NULL },
|
{ &LZ32_Descriptor, 0 },
|
||||||
{ &MCIANIM_Descriptor, 0, 0, NULL },
|
{ &MCIANIM_Descriptor, 0 },
|
||||||
{ &MCIAVI_Descriptor, 0, 0, NULL },
|
{ &MCIAVI_Descriptor, 0 },
|
||||||
{ &MCICDA_Descriptor, 0, 0, NULL },
|
{ &MCICDA_Descriptor, 0 },
|
||||||
{ &MCISEQ_Descriptor, 0, 0, NULL },
|
{ &MCISEQ_Descriptor, 0 },
|
||||||
{ &MCIWAVE_Descriptor, 0, 0, NULL },
|
{ &MCIWAVE_Descriptor, 0 },
|
||||||
{ &MIDIMAP_Descriptor, 0, 0, NULL },
|
{ &MIDIMAP_Descriptor, 0 },
|
||||||
{ &MPR_Descriptor, 0, 0, NULL },
|
{ &MPR_Descriptor, 0 },
|
||||||
{ &MSACM32_Descriptor, BI32_DANGER, 0, NULL },
|
{ &MSACM32_Descriptor, 0 },
|
||||||
{ &MSACMMAP_Descriptor, 0, 0, NULL },
|
{ &MSACMMAP_Descriptor, 0 },
|
||||||
{ &MSNET32_Descriptor, 0, 0, NULL },
|
{ &MSNET32_Descriptor, 0 },
|
||||||
{ &MSVFW32_Descriptor, 0, 0, NULL },
|
{ &MSVFW32_Descriptor, 0 },
|
||||||
{ &NTDLL_Descriptor, 0, 0, NULL },
|
{ &NTDLL_Descriptor, 0 },
|
||||||
{ &ODBC32_Descriptor, 0, 0, NULL },
|
{ &ODBC32_Descriptor, 0 },
|
||||||
{ &OLE32_Descriptor, 0, 0, NULL },
|
{ &OLE32_Descriptor, 0 },
|
||||||
{ &OLEAUT32_Descriptor, 0, 0, NULL },
|
{ &OLEAUT32_Descriptor, 0 },
|
||||||
{ &OLECLI32_Descriptor, 0, 0, NULL },
|
{ &OLECLI32_Descriptor, 0 },
|
||||||
{ &OLEDLG_Descriptor, 0, 0, NULL },
|
{ &OLEDLG_Descriptor, 0 },
|
||||||
{ &OLESVR32_Descriptor, 0, 0, NULL },
|
{ &OLESVR32_Descriptor, 0 },
|
||||||
{ &PSAPI_Descriptor, 0, 0, NULL },
|
{ &PSAPI_Descriptor, 0 },
|
||||||
{ &RASAPI32_Descriptor, 0, 0, NULL },
|
{ &RASAPI32_Descriptor, 0 },
|
||||||
{ &SHELL32_Descriptor, BI32_DANGER, 0, &shell32_ResourceDescriptor },
|
{ &SHELL32_Descriptor, 0 },
|
||||||
{ &SHLWAPI_Descriptor, 0, 0, NULL },
|
{ &SHLWAPI_Descriptor, 0 },
|
||||||
{ &TAPI32_Descriptor, 0, 0, NULL },
|
{ &TAPI32_Descriptor, 0 },
|
||||||
{ &USER32_Descriptor, 0, 0, &user32_ResourceDescriptor },
|
{ &USER32_Descriptor, 0 },
|
||||||
{ &VERSION_Descriptor, 0, 0, NULL },
|
{ &VERSION_Descriptor, 0 },
|
||||||
{ &W32SKRNL_Descriptor, 0, 0, NULL },
|
{ &W32SKRNL_Descriptor, 0 },
|
||||||
{ &WINMM_Descriptor, 0, 0, &winmm_ResourceDescriptor },
|
{ &WINMM_Descriptor, 0 },
|
||||||
{ &WINSPOOL_Descriptor, 0, 0, NULL },
|
{ &WINSPOOL_Descriptor, 0 },
|
||||||
{ &WINEOSS_Descriptor, 0, 0, NULL },
|
{ &WINEOSS_Descriptor, 0 },
|
||||||
{ &WNASPI32_Descriptor, 0, 0, NULL },
|
{ &WNASPI32_Descriptor, 0 },
|
||||||
{ &WOW32_Descriptor, 0, 0, NULL },
|
{ &WOW32_Descriptor, 0 },
|
||||||
{ &WSOCK32_Descriptor, 0, 0, NULL },
|
{ &WSOCK32_Descriptor, 0 },
|
||||||
/* Last entry */
|
/* Last entry */
|
||||||
{ NULL, 0, 0, NULL }
|
{ NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
extern void RELAY_CallFrom32();
|
extern void RELAY_CallFrom32();
|
||||||
extern void RELAY_CallFrom32Regs();
|
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
|
* BUILTIN32_DoLoadImage
|
||||||
*
|
*
|
||||||
|
@ -306,16 +321,17 @@ static HMODULE BUILTIN32_DoLoadImage( BUILTIN32_DLL *dll )
|
||||||
sec++;
|
sec++;
|
||||||
|
|
||||||
/* Build the resource directory */
|
/* Build the resource directory */
|
||||||
if(dll->rsc)
|
if(dll->descr->rsrc)
|
||||||
{
|
{
|
||||||
|
const BUILTIN32_RESOURCE *rsrc = dll->descr->rsrc;
|
||||||
int i;
|
int i;
|
||||||
void *rtab;
|
void *rtab;
|
||||||
IMAGE_RESOURCE_DATA_ENTRY *rdep;
|
IMAGE_RESOURCE_DATA_ENTRY *rdep;
|
||||||
|
|
||||||
rtab = HeapAlloc(GetProcessHeap(), 0, dll->rsc->restabsize);
|
rtab = HeapAlloc(GetProcessHeap(), 0, rsrc->restabsize);
|
||||||
if(!rtab)
|
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);
|
VirtualFree(addr, size, MEM_RELEASE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -324,15 +340,15 @@ static HMODULE BUILTIN32_DoLoadImage( BUILTIN32_DLL *dll )
|
||||||
* The resource directory has to be copied because it contains
|
* The resource directory has to be copied because it contains
|
||||||
* RVAs. These would be invalid if the dll is instantiated twice.
|
* 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 = &nt->OptionalHeader.DataDirectory[IMAGE_FILE_RESOURCE_DIRECTORY];
|
||||||
dir->VirtualAddress = (DWORD)rtab - (DWORD)addr;
|
dir->VirtualAddress = (DWORD)rtab - (DWORD)addr;
|
||||||
dir->Size = dll->rsc->restabsize;
|
dir->Size = rsrc->restabsize;
|
||||||
rdep = (IMAGE_RESOURCE_DATA_ENTRY *)((DWORD)rtab + (DWORD)dll->rsc->entries - (DWORD)dll->rsc->restab);
|
rdep = (IMAGE_RESOURCE_DATA_ENTRY *)((DWORD)rtab + (DWORD)rsrc->entries - (DWORD)rsrc->restab);
|
||||||
for(i = 0; i < dll->rsc->nresources; i++)
|
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 */
|
/* Load built-in module */
|
||||||
if ( (table->flags & BI32_INSTANTIATED) && (table->flags & BI32_DANGER) )
|
if (!table->hModule)
|
||||||
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
|
|
||||||
{
|
{
|
||||||
*err = ERROR_FILE_NOT_FOUND;
|
if (!(table->hModule = BUILTIN32_DoLoadImage( table )))
|
||||||
return NULL;
|
{
|
||||||
|
*err = ERROR_FILE_NOT_FOUND;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else BUILTIN32_WarnSecondInstance( table->descr->name );
|
||||||
|
|
||||||
/* Create 16-bit dummy module */
|
/* Create 16-bit dummy module */
|
||||||
if ((hModule16 = MODULE_CreateDummyModule( dllname, 0 )) < 32)
|
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 */
|
/* Create 32-bit MODREF */
|
||||||
if ( !(wm = PE_CreateModule( table->hModule, dllname, flags, TRUE )) )
|
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 */
|
FreeLibrary16( hModule16 ); /* FIXME: Should unload the builtin module */
|
||||||
*err = ERROR_OUTOFMEMORY;
|
*err = ERROR_OUTOFMEMORY;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -516,7 +527,7 @@ ENTRYPOINT32 BUILTIN32_GetEntryPoint( char *buffer, void *relay,
|
||||||
/* First find the module */
|
/* First find the module */
|
||||||
|
|
||||||
for (dll = BuiltinDLLs; dll->descr; dll++)
|
for (dll = BuiltinDLLs; dll->descr; dll++)
|
||||||
if ( dll->flags & BI32_INSTANTIATED )
|
if (dll->hModule)
|
||||||
{
|
{
|
||||||
IMAGE_SECTION_HEADER *sec = PE_SECTIONS(dll->hModule);
|
IMAGE_SECTION_HEADER *sec = PE_SECTIONS(dll->hModule);
|
||||||
DEBUG_ENTRY_POINT *debug =
|
DEBUG_ENTRY_POINT *debug =
|
||||||
|
@ -559,8 +570,7 @@ void BUILTIN32_SwitchRelayDebug(BOOL onoff) {
|
||||||
for (dll = BuiltinDLLs; dll->descr; dll++) {
|
for (dll = BuiltinDLLs; dll->descr; dll++) {
|
||||||
IMAGE_SECTION_HEADER *sec;
|
IMAGE_SECTION_HEADER *sec;
|
||||||
DEBUG_ENTRY_POINT *debug;
|
DEBUG_ENTRY_POINT *debug;
|
||||||
if (!(dll->flags & BI32_INSTANTIATED))
|
if (!dll->hModule) continue;
|
||||||
continue;
|
|
||||||
|
|
||||||
sec = PE_SECTIONS(dll->hModule);
|
sec = PE_SECTIONS(dll->hModule);
|
||||||
debug = (DEBUG_ENTRY_POINT *)((DWORD)dll->hModule + sec[1].VirtualAddress);
|
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" );
|
MESSAGE( "\n" );
|
||||||
ExitProcess(1);
|
ExitProcess(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
name user32
|
name user32
|
||||||
type win32
|
type win32
|
||||||
init MAIN_UserInit
|
init MAIN_UserInit
|
||||||
|
rsrc user32
|
||||||
|
|
||||||
1 stdcall ActivateKeyboardLayout(long long) ActivateKeyboardLayout
|
1 stdcall ActivateKeyboardLayout(long long) ActivateKeyboardLayout
|
||||||
2 stdcall AdjustWindowRect(ptr long long) AdjustWindowRect
|
2 stdcall AdjustWindowRect(ptr long long) AdjustWindowRect
|
||||||
|
|
|
@ -153,6 +153,7 @@ static FILE *SpecFp;
|
||||||
static WORD Code_Selector, Data_Selector;
|
static WORD Code_Selector, Data_Selector;
|
||||||
static char DLLInitFunc[80];
|
static char DLLInitFunc[80];
|
||||||
static char *DLLImports[MAX_IMPORTS];
|
static char *DLLImports[MAX_IMPORTS];
|
||||||
|
static char rsrc_name[80];
|
||||||
static int nb_imports;
|
static int nb_imports;
|
||||||
static int nb_entry_points;
|
static int nb_entry_points;
|
||||||
static int nb_names;
|
static int nb_names;
|
||||||
|
@ -715,6 +716,11 @@ static void ParseTopLevel(void)
|
||||||
fatal_error( "Imports not supported for Win16\n" );
|
fatal_error( "Imports not supported for Win16\n" );
|
||||||
DLLImports[nb_imports++] = xstrdup(GetToken());
|
DLLImports[nb_imports++] = xstrdup(GetToken());
|
||||||
}
|
}
|
||||||
|
else if (strcmp(token, "rsrc") == 0)
|
||||||
|
{
|
||||||
|
strcpy( rsrc_name, GetToken() );
|
||||||
|
strcat( rsrc_name, "_ResourceDescriptor" );
|
||||||
|
}
|
||||||
else if (strcmp(token, "@") == 0)
|
else if (strcmp(token, "@") == 0)
|
||||||
{
|
{
|
||||||
if (SpecType != SPEC_WIN32)
|
if (SpecType != SPEC_WIN32)
|
||||||
|
@ -1184,6 +1190,8 @@ static int BuildSpec32File( FILE *outfile )
|
||||||
|
|
||||||
/* Output the DLL descriptor */
|
/* 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",
|
fprintf( outfile, "const BUILTIN32_DESCRIPTOR %s_Descriptor =\n{\n",
|
||||||
DLLName );
|
DLLName );
|
||||||
fprintf( outfile, " \"%s\",\n", DLLName );
|
fprintf( outfile, " \"%s\",\n", DLLName );
|
||||||
|
@ -1200,8 +1208,9 @@ static int BuildSpec32File( FILE *outfile )
|
||||||
" FuncArgs,\n"
|
" FuncArgs,\n"
|
||||||
" ArgTypes,\n");
|
" ArgTypes,\n");
|
||||||
fprintf( outfile, " %s,\n", nb_imports ? "Imports" : "0" );
|
fprintf( outfile, " %s,\n", nb_imports ? "Imports" : "0" );
|
||||||
fprintf( outfile, " %s\n", DLLInitFunc[0] ? DLLInitFunc : "0" );
|
fprintf( outfile, " %s,\n", DLLInitFunc[0] ? DLLInitFunc : "0" );
|
||||||
fprintf( outfile, "};\n" );
|
fprintf( outfile, " %s\n", rsrc_name[0] ? rsrc_name : "0" );
|
||||||
|
fprintf( outfile, "};\n" );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1440,12 +1449,15 @@ static int BuildSpec16File( FILE *outfile )
|
||||||
|
|
||||||
/* Output the DLL descriptor */
|
/* 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, " \"%s\",\n", DLLName );
|
||||||
fprintf( outfile, " Module,\n" );
|
fprintf( outfile, " Module,\n" );
|
||||||
fprintf( outfile, " sizeof(Module),\n" );
|
fprintf( outfile, " sizeof(Module),\n" );
|
||||||
fprintf( outfile, " (BYTE *)&Code_Segment,\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" );
|
fprintf( outfile, "};\n" );
|
||||||
|
|
||||||
return 0;
|
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",
|
fprintf( outfile, ".stabs \"CallFrom16%s:F1\",36,0,0," PREFIX "CallFrom16%s\n",
|
||||||
name, name);
|
name, name);
|
||||||
#endif
|
#endif
|
||||||
|
fprintf( outfile, "\t.type " PREFIX "CallFrom16%s,@function\n", name );
|
||||||
fprintf( outfile, "\t.globl " PREFIX "CallFrom16%s\n", name );
|
fprintf( outfile, "\t.globl " PREFIX "CallFrom16%s\n", name );
|
||||||
fprintf( outfile, PREFIX "CallFrom16%s:\n", name );
|
fprintf( outfile, PREFIX "CallFrom16%s:\n", name );
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue