/* $Id: dlls.h,v 1.2 1993/07/04 04:04:21 root Exp root $
 */
/*
 * Copyright  Robert J. Amstadt, 1993
 */

#ifndef DLLS_H
#define DLLS_H

#define MAX_NAME_LENGTH		64

typedef struct resource_name_table
{
    struct resource_name_table *next;
    unsigned short type_ord;
    unsigned short id_ord;
    char id[MAX_NAME_LENGTH];
} RESNAMTAB;

struct ne_data {
    struct ne_header_s *ne_header;
    struct ne_segment_table_entry_s *seg_table;
    struct segment_descriptor_s *selector_table;
    char *lookup_table;
    char *nrname_table;
    char *rname_table;
    RESNAMTAB *resnamtab;
};

struct pe_data {
	struct pe_header_s *pe_header;
	struct pe_segment_table *pe_seg;
	struct PE_Import_Directory *pe_import;
	struct PE_Export_Directory *pe_export;
	struct PE_Resource_Directory *pe_resource;
	int resource_offset; /* offset to resource typedirectory in file */
};

struct w_files
{
    struct w_files  * next;
    char * name;   /* Name, as it appears in the windows binaries */
    char * filename; /* Actual name of the unix file that satisfies this */
    int fd;
    unsigned short hinstance;
    int initialised;
    struct mz_header_s *mz_header;
    struct ne_data *ne;
    struct pe_data *pe;
};

extern struct  w_files *wine_files;

typedef struct dll_arg_relocation_s
{
    unsigned short dst_arg;	/* Offset to argument on stack		*/
    unsigned char src_type;	/* Argument type			*/
} DLL_ARG;

#define DLL	0
#define EXE	1

#define DLL_ARGTYPE_SIGNEDWORD	0
#define DLL_ARGTYPE_WORD	1
#define DLL_ARGTYPE_LONG	2
#define DLL_ARGTYPE_FARPTR	3
#define DLL_MAX_ARGS		16

#define DLL_HANDLERTYPE_PASCAL	16
#define DLL_HANDLERTYPE_C	17

struct dll_table_entry_s
{
    /*
     * Relocation data
     */
    unsigned int selector;	/* Selector to access this entry point	  */
    void *address;		/* Offset in segment of entry point	  */

    /*
     * 16->32 bit interface data
     */
    char *export_name;
    void *handler;		/* Address of function to process request */
    int handler_type;		/* C or PASCAL calling convention	  */
#ifdef WINESTAT
    int used;			/* Number of times this function referenced */
#endif
    int n_args;			/* Number of arguments passed to function */
    DLL_ARG args[DLL_MAX_ARGS]; /* Argument conversion data		  */
};

struct dll_name_table_entry_s
{
    char *dll_name;
    struct dll_table_entry_s *dll_table;
    int dll_table_length;
    int dll_number;
};

extern struct dll_table_entry_s KERNEL_table[];
extern struct dll_table_entry_s USER_table[];
extern struct dll_table_entry_s GDI_table[];
extern struct dll_table_entry_s UNIXLIB_table[];
extern struct dll_table_entry_s WIN87EM_table[];
extern struct dll_table_entry_s MMSYSTEM_table[];
extern struct dll_table_entry_s SHELL_table[];
extern struct dll_table_entry_s SOUND_table[];
extern struct dll_table_entry_s KEYBOARD_table[];
extern struct dll_table_entry_s WINSOCK_table[];
extern struct dll_table_entry_s STRESS_table[];
extern struct dll_table_entry_s SYSTEM_table[];
extern struct dll_table_entry_s TOOLHELP_table[];
extern struct dll_table_entry_s MOUSE_table[];
extern struct dll_table_entry_s COMMDLG_table[];

#define N_BUILTINS	15

#endif /* DLLS_H */
