This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

optimization/3480: gcc-3.0, bad code generated with -O3 -fomit-frame-pointer on intel x86 <synopsis of the problem (one line)>



>Number:         3480
>Category:       optimization
>Synopsis:       gcc-3.0, bad code generated with -O3 -fomit-frame-pointer on intel x86
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          wrong-code
>Submitter-Id:   net
>Arrival-Date:   Fri Jun 29 08:46:01 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator:     Juergen Keil
>Release:        3.0
>Organization:
Tools GmbH 
>Environment:
System: SunOS elise 5.8 Generic_108529-07 i86pc i386 i86pc
Architecture: i86pc

	
host: i386-pc-solaris2.8
build: i386-pc-solaris2.8
target: i386-pc-solaris2.8
configured with: ../gcc-3.0/configure --prefix=/usr/local/gcc-3.0 --with-as=/opt/sfw/bin/gas --enable-languages=c,c++ : (reconfigured) ../gcc-3.0/configure --prefix=/usr/local/gcc-3.0 --with-as=/opt/sfw/bin/gas --enable-languages=c,c++
>Description:
	
gcc-3.0 produces buggy code for acmStreamOpen() with
"-O3 -fomit-frame-pointer" or "-O2 -fomit-frame-pointer
-finline-functions -frename-registers" (code is OK with sole -O2),
the bad code accesses parameters via %ebp without setting up a
propper %ebp first!
>How-To-Repeat:
	
Compile the appended "afl.i" with "gcc -O3 -fomit-frame-pointer -S afl.i",
and inspect the assembler code generated for function "acmStreamOpen".
It contains a printf call right at the start; the printf prints the
value of one of the function's parameters.  The function parameter is accessed
via the %ebp register,  but apparently the %ebp register has been optimized out
of this function, that is, a new stack frame was not setup and register %ebp is
*not* properly initialized (the correct code should access the parameter as
offset(%esp)).

Here's the buggy assembler code, with a comment from me:

.globl acmStreamOpen
        .type   acmStreamOpen,@function
acmStreamOpen:
        pushl   %ebp
        pushl   %edi
        pushl   %esi
        pushl   %ebx
        subl    $96, %esp
        movl    12(%ebp), %esi	<--- accesses pwfxSrc as offset(%ebp), no
				<--- valid %ebp setup yet!
        movzwl  16(%esi), %edx
        movl    16(%ebp), %ebx
        pushl   %edx
        pushl   %esi
        pushl   $.LC6
        call    printf

====== afl.i =================================================================
typedef __builtin_va_list __gnuc_va_list;
#pragma ident "@(#)stdio.h	1.78	99/12/08 SMI"

#pragma ident "@(#)stdio_iso.h	1.2	99/10/25 SMI"


#pragma ident "@(#)feature_tests.h	1.18	99/07/26 SMI"

#pragma ident "@(#)isa_defs.h	1.20	99/05/04 SMI"
#pragma ident "@(#)va_list.h	1.12	99/05/04 SMI"
typedef void *__va_list;
#pragma ident "@(#)stdio_tag.h	1.3	98/04/20 SMI"
typedef struct __FILE __FILE;
#pragma ident "@(#)stdio_impl.h	1.8	99/06/10 SMI"

typedef int ssize_t;
struct __FILE
{




        ssize_t _cnt;
        unsigned char *_ptr;

        unsigned char *_base;
        unsigned char _flag;
        unsigned char _file;
        unsigned __orientation:2;
        unsigned __ionolock:1;
        unsigned __filler:5;
};
typedef long long __longlong_t;
typedef __FILE FILE;







typedef unsigned int size_t;




typedef long fpos_t;
extern __FILE __iob[60];
extern int remove(const char *);
extern int rename(const char *, const char *);
extern FILE *tmpfile(void);
extern char *tmpnam(char *);
extern int fclose(FILE *);
extern int fflush(FILE *);
extern FILE *fopen(const char *, const char *);
extern FILE *freopen(const char *, const char *, FILE *);
extern void setbuf(FILE *, char *);
extern int setvbuf(FILE *, char *, int, size_t);

extern int fprintf(FILE *, const char *, ...);

extern int fscanf(FILE *, const char *, ...);

extern int printf(const char *, ...);

extern int scanf(const char *, ...);

extern int sprintf(char *, const char *, ...);

extern int sscanf(const char *, const char *, ...);
extern int vfprintf(FILE *, const char *, __va_list);
extern int vprintf(const char *, __va_list);
extern int vsprintf(char *, const char *, __va_list);
extern int fgetc(FILE *);
extern char *fgets(char *, int, FILE *);
extern int fputc(int, FILE *);
extern int fputs(const char *, FILE *);


extern int getc(FILE *);
extern int putc(int, FILE *);



extern int getchar(void);
extern int putchar(int);

extern char *gets(char *);
extern int puts(const char *);
extern int ungetc(int, FILE *);
extern size_t fread(void *, size_t, size_t, FILE *);
extern size_t fwrite(const void *, size_t, size_t, FILE *);
extern int fgetpos(FILE *, fpos_t *);
extern int fseek(FILE *, long, int);
extern int fsetpos(FILE *, const fpos_t *);
extern long ftell(FILE *);
extern void rewind(FILE *);


extern void clearerr(FILE *);
extern int feof(FILE *);
extern int ferror(FILE *);

extern void perror(const char *);


extern int __filbuf(FILE *);
extern int __flsbuf(int, FILE *);
typedef long off_t;







typedef __longlong_t off64_t;
typedef __longlong_t fpos64_t;
extern unsigned char _sibuf[], _sobuf[];
extern unsigned char *_bufendtab[];
extern FILE *_lastbuf;
extern void setbuffer(FILE *, char *, size_t);
extern int setlinebuf(FILE *);





extern int snprintf(char *, size_t, const char *, ...);




extern int vsnprintf(char *, size_t, const char *, __gnuc_va_list);
extern FILE *fdopen(int, const char *);
extern char *ctermid(char *);
extern int fileno(FILE *);
extern FILE *popen(const char *, const char *);
extern char *cuserid(char *);
extern char *tempnam(const char *, const char *);
extern int getopt(int, char *const *, const char *);

extern int getsubopt(char **, char *const *, char **);

extern char *optarg;
extern int optind, opterr, optopt;
extern int getw(FILE *);
extern int putw(int, FILE *);
extern int pclose(FILE *);







extern int fseeko(FILE *, off_t, int);
extern off_t ftello(FILE *);
extern FILE *fopen64(const char *, const char *);
extern FILE *freopen64(const char *, const char *, FILE *);
extern FILE *tmpfile64(void);
extern int fgetpos64(FILE *, fpos64_t *);
extern int fsetpos64(FILE *, const fpos64_t *);
extern int fseeko64(FILE *, off64_t, int);
extern off64_t ftello64(FILE *);
#pragma ident "@(#)stdlib.h	1.47	99/11/03 SMI"

#pragma ident "@(#)stdlib_iso.h	1.2	99/12/21 SMI"







extern unsigned char __ctype[];
typedef struct {
        int quot;
        int rem;
} div_t;

typedef struct {
        long quot;
        long rem;
} ldiv_t;
typedef long wchar_t;






extern void abort(void);
extern int abs(int);
extern int atexit(void (*)(void));
extern double atof(const char *);
extern int atoi(const char *);
extern long int atol(const char *);
extern void *bsearch(const void *, const void *, size_t, size_t,
        int (*)(const void *, const void *));
extern void *calloc(size_t, size_t);
extern div_t div(int, int);
extern void exit(int);
extern void free(void *);
extern char *getenv(const char *);
extern long int labs(long);
extern ldiv_t ldiv(long, long);
extern void *malloc(size_t);
extern int mblen(const char *, size_t);
extern size_t mbstowcs(wchar_t *, const char *, size_t);
extern int mbtowc(wchar_t *, const char *, size_t);
extern void qsort(void *, size_t, size_t,
        int (*)(const void *, const void *));
extern int rand(void);
extern void *realloc(void *, size_t);
extern void srand(unsigned int);
extern double strtod(const char *, char **);
extern long int strtol(const char *, char **, int);
extern unsigned long int strtoul(const char *, char **, int);
extern int system(const char *);
extern int wctomb(char *, wchar_t);
extern size_t wcstombs(char *, const wchar_t *, size_t);
typedef struct {
        long long quot;
        long long rem;
} lldiv_t;







typedef long uid_t;
extern void _exithandle(void);




extern double drand48(void);
extern double erand48(unsigned short *);
extern long jrand48(unsigned short *);
extern void lcong48(unsigned short *);
extern long lrand48(void);
extern long mrand48(void);
extern long nrand48(unsigned short *);
extern unsigned short *seed48(unsigned short *);
extern void srand48(long);
extern int putenv(char *);
extern void setkey(const char *);
extern void swab(const char *, char *, ssize_t);





extern int mkstemp(char *);




extern int mkstemp64(char *);





extern long a64l(const char *);
extern char *ecvt(double, int, int *, int *);
extern char *fcvt(double, int, int *, int *);
extern char *gcvt(double, int, char *);
extern int getsubopt(char **, char *const *, char **);
extern int grantpt(int);
extern char *initstate(unsigned, char *, size_t);
extern char *l64a(long);
extern char *mktemp(char *);
extern char *ptsname(int);
extern long random(void);
extern char *realpath(const char *, char *);
extern char *setstate(const char *);
extern void srandom(unsigned);
extern int ttyslot(void);
extern int unlockpt(int);
extern void *valloc(size_t);




extern int dup2(int, int);
extern char *qecvt(long double, int, int *, int *);
extern char *qfcvt(long double, int, int *, int *);
extern char *qgcvt(long double, int, char *);
extern char *getcwd(char *, size_t);
extern const char *getexecname(void);
extern char *getlogin(void);
extern int getopt(int, char *const *, const char *);
extern char *optarg;
extern int optind, opterr, optopt;
extern char *getpass(const char *);
extern char *getpassphrase(const char *);
extern int getpw(uid_t, char *);
extern int isatty(int);
extern void *memalign(size_t, size_t);
extern char *ttyname(int);


extern long long atoll(const char *);
extern long long llabs(long long);
extern lldiv_t lldiv(long long, long long);
extern char *lltostr(long long, char *);
extern long long strtoll(const char *, char **, int);
extern unsigned long long strtoull(const char *, char **, int);
extern char *ulltostr(unsigned long long, char *);
#pragma ident "@(#)string.h	1.24	99/08/10 SMI"

#pragma ident "@(#)string_iso.h	1.2	99/11/09 SMI"


extern int memcmp(const void *, const void *, size_t);
extern void *memcpy(void *, const void *, size_t);
extern void *memmove(void *, const void *, size_t);
extern void *memset(void *, int, size_t);
extern char *strcat(char *, const char *);
extern int strcmp(const char *, const char *);
extern char *strcpy(char *, const char *);
extern int strcoll(const char *, const char *);
extern size_t strcspn(const char *, const char *);
extern char *strerror(int);
extern size_t strlen(const char *);
extern char *strncat(char *, const char *, size_t);
extern int strncmp(const char *, const char *, size_t);
extern char *strncpy(char *, const char *, size_t);
extern size_t strspn(const char *, const char *);
extern char *strtok(char *, const char *);
extern size_t strxfrm(char *, const char *, size_t);
extern void *memchr(const void *, int, size_t);
extern char *strchr(const char *, int);
extern char *strpbrk(const char *, const char *);
extern char *strrchr(const char *, int);
extern char *strstr(const char *, const char *);
extern void *memccpy(void *, const void *, int, size_t);




extern char *strsignal(int);
extern int ffs(int);
extern int strcasecmp(const char *, const char *);
extern int strncasecmp(const char *, const char *, size_t);
extern size_t strlcpy(char *, const char *, size_t);
extern size_t strlcat(char *, const char *, size_t);





extern char *strdup(const char *);




#pragma ident "@(#)time.h	1.39	99/08/10 SMI"

#pragma ident "@(#)types.h	1.66	00/02/14 SMI"





#pragma ident "@(#)machtypes.h	1.8	99/05/04 SMI"




#pragma ident "@(#)machtypes.h	1.1	99/05/04 SMI"
typedef struct _label_t { long val[6]; } label_t;



typedef unsigned char lock_t;
#pragma ident "@(#)int_types.h	1.6	97/08/20 SMI"
typedef char int8_t;





typedef short int16_t;
typedef int int32_t;




typedef long long int64_t;



typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;




typedef unsigned long long uint64_t;
typedef int64_t intmax_t;
typedef uint64_t uintmax_t;
typedef int intptr_t;
typedef unsigned int uintptr_t;







typedef char int_least8_t;





typedef short int_least16_t;
typedef int int_least32_t;




typedef long long int_least64_t;



typedef unsigned char uint_least8_t;
typedef unsigned short uint_least16_t;
typedef unsigned int uint_least32_t;




typedef unsigned long long uint_least64_t;
typedef long long longlong_t;
typedef unsigned long long u_longlong_t;
typedef long t_scalar_t;
typedef unsigned long t_uscalar_t;





typedef unsigned char uchar_t;
typedef unsigned short ushort_t;
typedef unsigned int uint_t;
typedef unsigned long ulong_t;

typedef char *caddr_t;
typedef long daddr_t;
typedef short cnt_t;


typedef ulong_t paddr_t;
typedef int ptrdiff_t;
typedef ulong_t pfn_t;
typedef ulong_t pgcnt_t;
typedef long spgcnt_t;

typedef uchar_t use_t;
typedef short sysid_t;
typedef short index_t;
typedef void *timeout_id_t;
typedef void *bufcall_id_t;
typedef ulong_t ino_t;
typedef long blkcnt_t;
typedef ulong_t fsblkcnt_t;
typedef ulong_t fsfilcnt_t;
typedef u_longlong_t ino64_t;
typedef longlong_t blkcnt64_t;
typedef u_longlong_t fsblkcnt64_t;
typedef u_longlong_t fsfilcnt64_t;






typedef long blksize_t;





typedef enum { B_FALSE, B_TRUE } boolean_t;
typedef int64_t pad64_t;
typedef uint64_t upad64_t;
typedef longlong_t offset_t;
typedef u_longlong_t u_offset_t;
typedef u_longlong_t len_t;
typedef longlong_t diskaddr_t;







typedef union {
        offset_t _f;
        struct {
                int32_t _l;
                int32_t _u;
        } _p;
} lloff_t;
typedef union {
        diskaddr_t _f;
        struct {
                int32_t _l;
                int32_t _u;
        } _p;
} lldaddr_t;
typedef uint_t k_fltset_t;
typedef long id_t;






typedef uint_t useconds_t;



typedef long suseconds_t;
typedef ulong_t major_t;
typedef ulong_t minor_t;





typedef short pri_t;
typedef ushort_t o_mode_t;
typedef short o_dev_t;
typedef ushort_t o_uid_t;
typedef o_uid_t o_gid_t;
typedef short o_nlink_t;
typedef short o_pid_t;
typedef ushort_t o_ino_t;





typedef int key_t;



typedef ulong_t mode_t;
typedef uid_t gid_t;

typedef id_t taskid_t;
typedef id_t projid_t;






typedef unsigned int pthread_t;
typedef unsigned int pthread_key_t;

typedef struct _pthread_mutex {
        struct {
                uint16_t __pthread_mutex_flag1;
                uint8_t __pthread_mutex_flag2;
                uint8_t __pthread_mutex_ceiling;
                uint32_t __pthread_mutex_type;
        } __pthread_mutex_flags;
        union {
                struct {
                        uint8_t __pthread_mutex_pad[8];
                } __pthread_mutex_lock64;
                upad64_t __pthread_mutex_owner64;
        } __pthread_mutex_lock;
        upad64_t __pthread_mutex_data;
} pthread_mutex_t;

typedef struct _pthread_cond {
        struct {
                uint8_t __pthread_cond_flag[4];
                uint32_t __pthread_cond_type;
        } __pthread_cond_flags;
        upad64_t __pthread_cond_data;
} pthread_cond_t;




typedef struct _pthread_rwlock {
        int32_t __pthread_rwlock_readers;
        uint16_t __pthread_rwlock_type;
        uint16_t __pthread_rwlock_magic;
        upad64_t __pthread_rwlock_pad1[3];
        upad64_t __pthread_rwlock_pad2[2];
        upad64_t __pthread_rwlock_pad3[2];
} pthread_rwlock_t;




typedef struct _pthread_attr {
        void *__pthread_attrp;
} pthread_attr_t;





typedef struct _pthread_mutexattr {
        void *__pthread_mutexattrp;
} pthread_mutexattr_t;





typedef struct _pthread_condattr {
        void *__pthread_condattrp;
} pthread_condattr_t;




typedef struct _once {
        upad64_t __pthread_once_pad[4];
} pthread_once_t;





typedef struct _pthread_rwlockattr {
        void *__pthread_rwlockattrp;
} pthread_rwlockattr_t;

typedef ulong_t dev_t;





typedef ulong_t nlink_t;
typedef long pid_t;
typedef long time_t;




typedef long clock_t;




typedef int clockid_t;




typedef int timer_t;






typedef unsigned char unchar;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned long ulong;
typedef unsigned char u_char;
typedef unsigned short u_short;
typedef unsigned int u_int;
typedef unsigned long u_long;
typedef struct _quad { int val[2]; } quad_t;
typedef quad_t quad;






#pragma ident "@(#)select.h	1.16	98/04/27 SMI"



#pragma ident "@(#)time.h	2.66	01/01/17 SMI"

struct timeval {
        time_t tv_sec;
        suseconds_t tv_usec;
};
struct timezone {
        int tz_minuteswest;
        int tz_dsttime;
};
struct itimerval {
        struct timeval it_interval;
        struct timeval it_value;
};
typedef longlong_t hrtime_t;
int adjtime(struct timeval *, struct timeval *);
int getitimer(int, struct itimerval *);
int utimes(const char *, const struct timeval *);



int setitimer(int, struct itimerval *, struct itimerval *);
int settimeofday(struct timeval *, void *);

hrtime_t gethrtime(void);
hrtime_t gethrvtime(void);
int gettimeofday(struct timeval *, void *);
typedef long fd_mask;

typedef long fds_mask;
typedef struct fd_set {



        long fds_bits[(((1024)+(((sizeof (fds_mask) * 8))-1))/((sizeof (fds_mask) * 8)))];
} fd_set;
extern int select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
#pragma ident "@(#)time_iso.h	1.1	99/08/09 SMI"

struct tm {
        int tm_sec;
        int tm_min;
        int tm_hour;
        int tm_mday;
        int tm_mon;
        int tm_year;
        int tm_wday;
        int tm_yday;
        int tm_isdst;
};




extern char *asctime(const struct tm *);
extern clock_t clock(void);
extern char *ctime(const time_t *);
extern double difftime(time_t, time_t);
extern struct tm *gmtime(const time_t *);
extern struct tm *localtime(const time_t *);
extern time_t mktime(struct tm *);
extern time_t time(time_t *);
extern size_t strftime(char *, size_t, const char *, const struct tm *);
extern char *strptime(const char *, const char *, struct tm *);
#pragma ident "@(#)time_impl.h	1.5	99/10/05 SMI"

typedef struct timespec {
        time_t tv_sec;
        long tv_nsec;
} timespec_t;
typedef struct timespec timestruc_t;
typedef struct itimerspec {
        struct timespec it_interval;
        struct timespec it_value;
} itimerspec_t;
union sigval {
        int sival_int;
        void *sival_ptr;
};




struct sigevent {
        int sigev_notify;
        int sigev_signo;
        union sigval sigev_value;
        void (*sigev_notify_function)(union sigval);
        pthread_attr_t *sigev_notify_attributes;
        int __sigev_pad2;
};


extern int clock_getres(clockid_t, struct timespec *);
extern int clock_gettime(clockid_t, struct timespec *);
extern int clock_settime(clockid_t, const struct timespec *);
extern int timer_create(clockid_t, struct sigevent *, timer_t *);
extern int timer_delete(timer_t);
extern int timer_getoverrun(timer_t);
extern int timer_gettime(timer_t, struct itimerspec *);
extern int timer_settime(timer_t, int, const struct itimerspec *,
                struct itimerspec *);
extern int nanosleep(const struct timespec *, struct timespec *);




extern void tzset(void);

extern char *tzname[2];


extern long _sysconf(int);






extern long timezone;
extern int daylight;





extern int cftime(char *, char *, const time_t *);
extern int ascftime(char *, const char *, const struct tm *);
extern long altzone;




extern struct tm *getdate(const char *);






extern int getdate_err;

typedef void VOID;
typedef int INT;
typedef unsigned int UINT;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef unsigned long ULONG;
typedef unsigned char BYTE;
typedef long LONG;
typedef short SHORT;
typedef unsigned short USHORT;
typedef char CHAR;
typedef unsigned char UCHAR;

typedef LONG SCODE;


typedef unsigned short WCHAR;
typedef int WIN_BOOL;
typedef double DATE;
typedef double DOUBLE;
typedef long long LONGLONG;
typedef unsigned long long ULONGLONG;
typedef UINT HANDLE;



typedef HANDLE *LPHANDLE;


typedef UINT WPARAM;
typedef LONG LPARAM;
typedef LONG HRESULT;
typedef LONG LRESULT;
typedef WORD ATOM;
typedef WORD CATCHBUF[9];
typedef WORD *LPCATCHBUF;
typedef HANDLE HHOOK;
typedef HANDLE HMONITOR;
typedef DWORD LCID;
typedef WORD LANGID;
typedef DWORD LCTYPE;
typedef float FLOAT;



typedef VOID *PVOID;
typedef const void *PCVOID;
typedef CHAR *PCHAR;
typedef UCHAR *PUCHAR;
typedef BYTE *PBYTE;
typedef WORD *PWORD;
typedef USHORT *PUSHORT;
typedef SHORT *PSHORT;
typedef ULONG *PULONG;
typedef LONG *PLONG;
typedef DWORD *PDWORD;

typedef CHAR *LPSTR;
typedef CHAR *PSTR;
typedef const CHAR *LPCSTR;
typedef const CHAR *PCSTR;
typedef WCHAR *LPWSTR;
typedef WCHAR *PWSTR;
typedef const WCHAR *LPCWSTR;
typedef const WCHAR *PCWSTR;
typedef BYTE *LPBYTE;
typedef WORD *LPWORD;
typedef DWORD *LPDWORD;
typedef LONG *LPLONG;
typedef VOID *LPVOID;
typedef const VOID *LPCVOID;
typedef INT *PINT;
typedef INT *LPINT;
typedef UINT *PUINT;
typedef UINT *LPUINT;
typedef FLOAT *PFLOAT;
typedef FLOAT *LPFLOAT;
typedef WIN_BOOL *PWIN_BOOL;
typedef WIN_BOOL *LPWIN_BOOL;






typedef void* SEGPTR;
typedef HANDLE HACMDRIVERID; typedef HACMDRIVERID *PHACMDRIVERID; typedef HACMDRIVERID *LPHACMDRIVERID;
typedef HANDLE HACMDRIVER; typedef HACMDRIVER *PHACMDRIVER; typedef HACMDRIVER *LPHACMDRIVER;
typedef HANDLE HACMOBJ; typedef HACMOBJ *PHACMOBJ; typedef HACMOBJ *LPHACMOBJ;
typedef HANDLE HACMSTREAM; typedef HACMSTREAM *PHACMSTREAM; typedef HACMSTREAM *LPHACMSTREAM;
typedef HANDLE HMETAFILEPICT; typedef HMETAFILEPICT *PHMETAFILEPICT; typedef HMETAFILEPICT *LPHMETAFILEPICT;

typedef HANDLE HACCEL; typedef HACCEL *PHACCEL; typedef HACCEL *LPHACCEL;
typedef HANDLE HBITMAP; typedef HBITMAP *PHBITMAP; typedef HBITMAP *LPHBITMAP;
typedef HANDLE HBRUSH; typedef HBRUSH *PHBRUSH; typedef HBRUSH *LPHBRUSH;
typedef HANDLE HCOLORSPACE; typedef HCOLORSPACE *PHCOLORSPACE; typedef HCOLORSPACE *LPHCOLORSPACE;
typedef HANDLE HCURSOR; typedef HCURSOR *PHCURSOR; typedef HCURSOR *LPHCURSOR;
typedef HANDLE HDC; typedef HDC *PHDC; typedef HDC *LPHDC;
typedef HANDLE HDROP; typedef HDROP *PHDROP; typedef HDROP *LPHDROP;
typedef HANDLE HDRVR; typedef HDRVR *PHDRVR; typedef HDRVR *LPHDRVR;
typedef HANDLE HDWP; typedef HDWP *PHDWP; typedef HDWP *LPHDWP;
typedef HANDLE HENHMETAFILE; typedef HENHMETAFILE *PHENHMETAFILE; typedef HENHMETAFILE *LPHENHMETAFILE;
typedef HANDLE HFILE; typedef HFILE *PHFILE; typedef HFILE *LPHFILE;
typedef HANDLE HFONT; typedef HFONT *PHFONT; typedef HFONT *LPHFONT;
typedef HANDLE HICON; typedef HICON *PHICON; typedef HICON *LPHICON;
typedef HANDLE HINSTANCE; typedef HINSTANCE *PHINSTANCE; typedef HINSTANCE *LPHINSTANCE;
typedef HANDLE HKEY; typedef HKEY *PHKEY; typedef HKEY *LPHKEY;
typedef HANDLE HMENU; typedef HMENU *PHMENU; typedef HMENU *LPHMENU;
typedef HANDLE HMETAFILE; typedef HMETAFILE *PHMETAFILE; typedef HMETAFILE *LPHMETAFILE;
typedef HANDLE HMIDI; typedef HMIDI *PHMIDI; typedef HMIDI *LPHMIDI;
typedef HANDLE HMIDIIN; typedef HMIDIIN *PHMIDIIN; typedef HMIDIIN *LPHMIDIIN;
typedef HANDLE HMIDIOUT; typedef HMIDIOUT *PHMIDIOUT; typedef HMIDIOUT *LPHMIDIOUT;
typedef HANDLE HMIDISTRM; typedef HMIDISTRM *PHMIDISTRM; typedef HMIDISTRM *LPHMIDISTRM;
typedef HANDLE HMIXER; typedef HMIXER *PHMIXER; typedef HMIXER *LPHMIXER;
typedef HANDLE HMIXEROBJ; typedef HMIXEROBJ *PHMIXEROBJ; typedef HMIXEROBJ *LPHMIXEROBJ;
typedef HANDLE HMMIO; typedef HMMIO *PHMMIO; typedef HMMIO *LPHMMIO;
typedef HANDLE HPALETTE; typedef HPALETTE *PHPALETTE; typedef HPALETTE *LPHPALETTE;
typedef HANDLE HPEN; typedef HPEN *PHPEN; typedef HPEN *LPHPEN;
typedef HANDLE HQUEUE; typedef HQUEUE *PHQUEUE; typedef HQUEUE *LPHQUEUE;
typedef HANDLE HRGN; typedef HRGN *PHRGN; typedef HRGN *LPHRGN;
typedef HANDLE HRSRC; typedef HRSRC *PHRSRC; typedef HRSRC *LPHRSRC;
typedef HANDLE HTASK; typedef HTASK *PHTASK; typedef HTASK *LPHTASK;
typedef HANDLE HWAVE; typedef HWAVE *PHWAVE; typedef HWAVE *LPHWAVE;
typedef HANDLE HWAVEIN; typedef HWAVEIN *PHWAVEIN; typedef HWAVEIN *LPHWAVEIN;
typedef HANDLE HWAVEOUT; typedef HWAVEOUT *PHWAVEOUT; typedef HWAVEOUT *LPHWAVEOUT;
typedef HANDLE HWINSTA; typedef HWINSTA *PHWINSTA; typedef HWINSTA *LPHWINSTA;
typedef HANDLE HDESK; typedef HDESK *PHDESK; typedef HDESK *LPHDESK;
typedef HANDLE HWND; typedef HWND *PHWND; typedef HWND *LPHWND;
typedef HANDLE HKL; typedef HKL *PHKL; typedef HKL *LPHKL;
typedef HANDLE HIC; typedef HIC *PHIC; typedef HIC *LPHIC;
typedef HANDLE HRASCONN; typedef HRASCONN *PHRASCONN; typedef HRASCONN *LPHRASCONN;



typedef HINSTANCE HMODULE;
typedef HANDLE HGDIOBJ;
typedef HANDLE HGLOBAL;
typedef HANDLE HLOCAL;
typedef HANDLE GLOBALHANDLE;
typedef HANDLE LOCALHANDLE;




typedef WIN_BOOL __attribute__((__stdcall__)) (* DATEFMT_ENUMPROCA)(LPSTR);
typedef WIN_BOOL __attribute__((__stdcall__)) (* DATEFMT_ENUMPROCW)(LPWSTR);
typedef DATEFMT_ENUMPROCA DATEFMT_ENUMPROC;
typedef WIN_BOOL __attribute__((__stdcall__)) (*DLGPROC)(HWND,UINT,WPARAM,LPARAM);
typedef LRESULT __attribute__((__stdcall__)) (*DRIVERPROC)(DWORD,HDRVR,UINT,LPARAM,LPARAM);
typedef INT __attribute__((__stdcall__)) (*EDITWORDBREAKPROCA)(LPSTR,INT,INT,INT);
typedef INT __attribute__((__stdcall__)) (*EDITWORDBREAKPROCW)(LPWSTR,INT,INT,INT);
typedef EDITWORDBREAKPROCA EDITWORDBREAKPROC;
typedef LRESULT __attribute__((__stdcall__)) (*FARPROC)();
typedef INT __attribute__((__stdcall__)) (*PROC)();
typedef WIN_BOOL __attribute__((__stdcall__)) (*GRAYSTRINGPROC)(HDC,LPARAM,INT);
typedef LRESULT __attribute__((__stdcall__)) (*HOOKPROC)(INT,WPARAM,LPARAM);
typedef WIN_BOOL __attribute__((__stdcall__)) (*PROPENUMPROCA)(HWND,LPCSTR,HANDLE);
typedef WIN_BOOL __attribute__((__stdcall__)) (*PROPENUMPROCW)(HWND,LPCWSTR,HANDLE);
typedef PROPENUMPROCA PROPENUMPROC;
typedef WIN_BOOL __attribute__((__stdcall__)) (*PROPENUMPROCEXA)(HWND,LPCSTR,HANDLE,LPARAM);
typedef WIN_BOOL __attribute__((__stdcall__)) (*PROPENUMPROCEXW)(HWND,LPCWSTR,HANDLE,LPARAM);
typedef PROPENUMPROCEXA PROPENUMPROCEX;
typedef WIN_BOOL __attribute__((__stdcall__)) (* TIMEFMT_ENUMPROCA)(LPSTR);
typedef WIN_BOOL __attribute__((__stdcall__)) (* TIMEFMT_ENUMPROCW)(LPWSTR);
typedef TIMEFMT_ENUMPROCA TIMEFMT_ENUMPROC;
typedef VOID __attribute__((__stdcall__)) (*TIMERPROC)(HWND,UINT,UINT,DWORD);
typedef WIN_BOOL __attribute__((__stdcall__)) (*WNDENUMPROC)(HWND,LPARAM);
typedef LRESULT __attribute__((__stdcall__)) (*WNDPROC)(HWND,UINT,WPARAM,LPARAM);



typedef short INT16;
typedef unsigned short UINT16;
typedef unsigned short WIN_BOOL16;

typedef UINT16 HANDLE16;
typedef HANDLE16 *LPHANDLE16;

typedef UINT16 WPARAM16;
typedef INT16 *LPINT16;
typedef UINT16 *LPUINT16;







typedef HANDLE16 HACMDRIVERID16; typedef HACMDRIVERID16 *PHACMDRIVERID16; typedef HACMDRIVERID16 *NPHACMDRIVERID16; typedef HACMDRIVERID16 *LPHACMDRIVERID16;
typedef HANDLE16 HACMDRIVER16; typedef HACMDRIVER16 *PHACMDRIVER16; typedef HACMDRIVER16 *NPHACMDRIVER16; typedef HACMDRIVER16 *LPHACMDRIVER16;
typedef HANDLE16 HACMOBJ16; typedef HACMOBJ16 *PHACMOBJ16; typedef HACMOBJ16 *NPHACMOBJ16; typedef HACMOBJ16 *LPHACMOBJ16;
typedef HANDLE16 HACMSTREAM16; typedef HACMSTREAM16 *PHACMSTREAM16; typedef HACMSTREAM16 *NPHACMSTREAM16; typedef HACMSTREAM16 *LPHACMSTREAM16;
typedef HANDLE16 HMETAFILEPICT16; typedef HMETAFILEPICT16 *PHMETAFILEPICT16; typedef HMETAFILEPICT16 *NPHMETAFILEPICT16; typedef HMETAFILEPICT16 *LPHMETAFILEPICT16;

typedef HANDLE16 HACCEL16; typedef HACCEL16 *PHACCEL16; typedef HACCEL16 *NPHACCEL16; typedef HACCEL16 *LPHACCEL16;
typedef HANDLE16 HBITMAP16; typedef HBITMAP16 *PHBITMAP16; typedef HBITMAP16 *NPHBITMAP16; typedef HBITMAP16 *LPHBITMAP16;
typedef HANDLE16 HBRUSH16; typedef HBRUSH16 *PHBRUSH16; typedef HBRUSH16 *NPHBRUSH16; typedef HBRUSH16 *LPHBRUSH16;
typedef HANDLE16 HCOLORSPACE16; typedef HCOLORSPACE16 *PHCOLORSPACE16; typedef HCOLORSPACE16 *NPHCOLORSPACE16; typedef HCOLORSPACE16 *LPHCOLORSPACE16;
typedef HANDLE16 HCURSOR16; typedef HCURSOR16 *PHCURSOR16; typedef HCURSOR16 *NPHCURSOR16; typedef HCURSOR16 *LPHCURSOR16;
typedef HANDLE16 HDC16; typedef HDC16 *PHDC16; typedef HDC16 *NPHDC16; typedef HDC16 *LPHDC16;
typedef HANDLE16 HDROP16; typedef HDROP16 *PHDROP16; typedef HDROP16 *NPHDROP16; typedef HDROP16 *LPHDROP16;
typedef HANDLE16 HDRVR16; typedef HDRVR16 *PHDRVR16; typedef HDRVR16 *NPHDRVR16; typedef HDRVR16 *LPHDRVR16;
typedef HANDLE16 HDWP16; typedef HDWP16 *PHDWP16; typedef HDWP16 *NPHDWP16; typedef HDWP16 *LPHDWP16;
typedef HANDLE16 HENHMETAFILE16; typedef HENHMETAFILE16 *PHENHMETAFILE16; typedef HENHMETAFILE16 *NPHENHMETAFILE16; typedef HENHMETAFILE16 *LPHENHMETAFILE16;
typedef HANDLE16 HFILE16; typedef HFILE16 *PHFILE16; typedef HFILE16 *NPHFILE16; typedef HFILE16 *LPHFILE16;
typedef HANDLE16 HFONT16; typedef HFONT16 *PHFONT16; typedef HFONT16 *NPHFONT16; typedef HFONT16 *LPHFONT16;
typedef HANDLE16 HICON16; typedef HICON16 *PHICON16; typedef HICON16 *NPHICON16; typedef HICON16 *LPHICON16;
typedef HANDLE16 HINSTANCE16; typedef HINSTANCE16 *PHINSTANCE16; typedef HINSTANCE16 *NPHINSTANCE16; typedef HINSTANCE16 *LPHINSTANCE16;
typedef HANDLE16 HKEY16; typedef HKEY16 *PHKEY16; typedef HKEY16 *NPHKEY16; typedef HKEY16 *LPHKEY16;
typedef HANDLE16 HMENU16; typedef HMENU16 *PHMENU16; typedef HMENU16 *NPHMENU16; typedef HMENU16 *LPHMENU16;
typedef HANDLE16 HMETAFILE16; typedef HMETAFILE16 *PHMETAFILE16; typedef HMETAFILE16 *NPHMETAFILE16; typedef HMETAFILE16 *LPHMETAFILE16;
typedef HANDLE16 HMIDI16; typedef HMIDI16 *PHMIDI16; typedef HMIDI16 *NPHMIDI16; typedef HMIDI16 *LPHMIDI16;
typedef HANDLE16 HMIDIIN16; typedef HMIDIIN16 *PHMIDIIN16; typedef HMIDIIN16 *NPHMIDIIN16; typedef HMIDIIN16 *LPHMIDIIN16;
typedef HANDLE16 HMIDIOUT16; typedef HMIDIOUT16 *PHMIDIOUT16; typedef HMIDIOUT16 *NPHMIDIOUT16; typedef HMIDIOUT16 *LPHMIDIOUT16;
typedef HANDLE16 HMIDISTRM16; typedef HMIDISTRM16 *PHMIDISTRM16; typedef HMIDISTRM16 *NPHMIDISTRM16; typedef HMIDISTRM16 *LPHMIDISTRM16;
typedef HANDLE16 HMIXER16; typedef HMIXER16 *PHMIXER16; typedef HMIXER16 *NPHMIXER16; typedef HMIXER16 *LPHMIXER16;
typedef HANDLE16 HMIXEROBJ16; typedef HMIXEROBJ16 *PHMIXEROBJ16; typedef HMIXEROBJ16 *NPHMIXEROBJ16; typedef HMIXEROBJ16 *LPHMIXEROBJ16;
typedef HANDLE16 HMMIO16; typedef HMMIO16 *PHMMIO16; typedef HMMIO16 *NPHMMIO16; typedef HMMIO16 *LPHMMIO16;
typedef HANDLE16 HPALETTE16; typedef HPALETTE16 *PHPALETTE16; typedef HPALETTE16 *NPHPALETTE16; typedef HPALETTE16 *LPHPALETTE16;
typedef HANDLE16 HPEN16; typedef HPEN16 *PHPEN16; typedef HPEN16 *NPHPEN16; typedef HPEN16 *LPHPEN16;
typedef HANDLE16 HQUEUE16; typedef HQUEUE16 *PHQUEUE16; typedef HQUEUE16 *NPHQUEUE16; typedef HQUEUE16 *LPHQUEUE16;
typedef HANDLE16 HRGN16; typedef HRGN16 *PHRGN16; typedef HRGN16 *NPHRGN16; typedef HRGN16 *LPHRGN16;
typedef HANDLE16 HRSRC16; typedef HRSRC16 *PHRSRC16; typedef HRSRC16 *NPHRSRC16; typedef HRSRC16 *LPHRSRC16;
typedef HANDLE16 HTASK16; typedef HTASK16 *PHTASK16; typedef HTASK16 *NPHTASK16; typedef HTASK16 *LPHTASK16;
typedef HANDLE16 HWAVE16; typedef HWAVE16 *PHWAVE16; typedef HWAVE16 *NPHWAVE16; typedef HWAVE16 *LPHWAVE16;
typedef HANDLE16 HWAVEIN16; typedef HWAVEIN16 *PHWAVEIN16; typedef HWAVEIN16 *NPHWAVEIN16; typedef HWAVEIN16 *LPHWAVEIN16;
typedef HANDLE16 HWAVEOUT16; typedef HWAVEOUT16 *PHWAVEOUT16; typedef HWAVEOUT16 *NPHWAVEOUT16; typedef HWAVEOUT16 *LPHWAVEOUT16;
typedef HANDLE16 HWINSTA16; typedef HWINSTA16 *PHWINSTA16; typedef HWINSTA16 *NPHWINSTA16; typedef HWINSTA16 *LPHWINSTA16;
typedef HANDLE16 HDESK16; typedef HDESK16 *PHDESK16; typedef HDESK16 *NPHDESK16; typedef HDESK16 *LPHDESK16;
typedef HANDLE16 HWND16; typedef HWND16 *PHWND16; typedef HWND16 *NPHWND16; typedef HWND16 *LPHWND16;
typedef HANDLE16 HKL16; typedef HKL16 *PHKL16; typedef HKL16 *NPHKL16; typedef HKL16 *LPHKL16;
typedef HANDLE16 HIC16; typedef HIC16 *PHIC16; typedef HIC16 *NPHIC16; typedef HIC16 *LPHIC16;
typedef HANDLE16 HRASCONN16; typedef HRASCONN16 *PHRASCONN16; typedef HRASCONN16 *NPHRASCONN16; typedef HRASCONN16 *LPHRASCONN16;


typedef HINSTANCE16 HMODULE16;
typedef HANDLE16 HGDIOBJ16;
typedef HANDLE16 HGLOBAL16;
typedef HANDLE16 HLOCAL16;


typedef struct
{
    INT16 cx;
    INT16 cy;
} SIZE16, *PSIZE16, *LPSIZE16;



typedef struct
{
    INT16 x;
    INT16 y;
} POINT16, *PPOINT16, *LPPOINT16;



typedef struct
{
    INT16 left;
    INT16 top;
    INT16 right;
    INT16 bottom;
} RECT16, *LPRECT16;



typedef LRESULT __attribute__((__stdcall__)) (*DRIVERPROC16)(DWORD,HDRVR16,UINT16,LPARAM,LPARAM);
typedef WIN_BOOL16 __attribute__((__stdcall__)) (*DLGPROC16)(HWND16,UINT16,WPARAM16,LPARAM);
typedef INT16 __attribute__((__stdcall__)) (*EDITWORDBREAKPROC16)(LPSTR,INT16,INT16,INT16);
typedef LRESULT __attribute__((__stdcall__)) (*FARPROC16)();
typedef INT16 __attribute__((__stdcall__)) (*PROC16)();
typedef WIN_BOOL16 __attribute__((__stdcall__)) (*GRAYSTRINGPROC16)(HDC16,LPARAM,INT16);
typedef LRESULT __attribute__((__stdcall__)) (*HOOKPROC16)(INT16,WPARAM16,LPARAM);
typedef WIN_BOOL16 __attribute__((__stdcall__)) (*PROPENUMPROC16)(HWND16,SEGPTR,HANDLE16);
typedef VOID __attribute__((__stdcall__)) (*TIMERPROC16)(HWND16,UINT16,UINT16,DWORD);
typedef LRESULT __attribute__((__stdcall__)) (*WNDENUMPROC16)(HWND16,LPARAM);
typedef LRESULT __attribute__((__stdcall__)) (*WNDPROC16)(HWND16,UINT16,WPARAM16,LPARAM);
typedef struct tagSIZE
{
    INT cx;
    INT cy;
} SIZE, *PSIZE, *LPSIZE;


typedef SIZE SIZEL, *PSIZEL, *LPSIZEL;







typedef struct tagPOINT
{
    LONG x;
    LONG y;
} POINT, *PPOINT, *LPPOINT;

typedef struct _POINTL
{
    LONG x;
    LONG y;
} POINTL;
typedef struct tagPOINTS
{
        SHORT x;
        SHORT y;
} POINTS, *PPOINTS, *LPPOINTS;






typedef struct tagRECT
{
    short left;
    short top;
    short right;
    short bottom;
} RECT, *PRECT, *LPRECT;
typedef const RECT *LPCRECT;


typedef struct tagRECTL
{
    LONG left;
    LONG top;
    LONG right;
    LONG bottom;
} RECTL, *PRECTL, *LPRECTL;

typedef const RECTL *LPCRECTL;



typedef char __int8;
typedef unsigned char __uint8;

typedef short __int16;
typedef unsigned short __uint16;

typedef int __int32;
typedef unsigned int __uint32;

typedef long long __int64;
typedef unsigned long long __uint64;
typedef void *__ptr32;
typedef __uint64 __ptr64;





typedef __int32 LONG32;


typedef LONG32 *PLONG32;




typedef __uint32 ULONG32;
typedef __uint32 DWORD32;
typedef __uint32 UINT32;

typedef ULONG32 *PULONG32;
typedef DWORD32 *PDWORD32;
typedef UINT32 *PUINT32;



typedef __int64 LONG64;
typedef __int64 INT64;

typedef LONG64 *PLONG64;
typedef INT64 *PINT64;



typedef __uint64 ULONG64;
typedef __uint64 DWORD64;
typedef __uint64 UINT64;

typedef ULONG64 *PULONG64;
typedef DWORD64 *PDWORD64;
typedef UINT64 *PUINT64;
typedef __int32 INT_PTR, *PINT_PTR;
typedef __uint32 UINT_PTR, *PUINT_PTR;





typedef __int16 HALF_PTR, *PHALF_PTR;
typedef __uint16 UHALF_PTR, *PUHALF_PTR;





typedef __int32 LONG_PTR, *PLONG_PTR;
typedef __uint32 ULONG_PTR, *PULONG_PTR;
typedef __uint32 DWORD_PTR, *PDWORD_PTR;



typedef INT_PTR SSIZE_T, *PSSIZE_T;
typedef UINT_PTR SIZE_T, *PSIZE_T;




typedef char TCHAR, *PTCHAR;
typedef LPSTR PTSTR, LPTSTR;
typedef LPCSTR PCTSTR, LPCTSTR;





typedef BYTE BOOLEAN;
typedef BOOLEAN *PBOOLEAN;

typedef struct _LIST_ENTRY {
  struct _LIST_ENTRY *Flink;
  struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY;

typedef struct _SINGLE_LIST_ENTRY {
  struct _SINGLE_LIST_ENTRY *Next;
} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
typedef struct _FLOATING_SAVE_AREA
{
    DWORD ControlWord;
    DWORD StatusWord;
    DWORD TagWord;
    DWORD ErrorOffset;
    DWORD ErrorSelector;
    DWORD DataOffset;
    DWORD DataSelector;
    BYTE RegisterArea[80];
    DWORD Cr0NpxState;
} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;

typedef struct _CONTEXT86
{
    DWORD ContextFlags;


    DWORD Dr0;
    DWORD Dr1;
    DWORD Dr2;
    DWORD Dr3;
    DWORD Dr6;
    DWORD Dr7;


    FLOATING_SAVE_AREA FloatSave;


    DWORD SegGs;
    DWORD SegFs;
    DWORD SegEs;
    DWORD SegDs;


    DWORD Edi;
    DWORD Esi;
    DWORD Ebx;
    DWORD Edx;
    DWORD Ecx;
    DWORD Eax;


    DWORD Ebp;
    DWORD Eip;
    DWORD SegCs;
    DWORD EFlags;
    DWORD Esp;
    DWORD SegSs;
} CONTEXT86;
typedef CONTEXT86 CONTEXT;
typedef CONTEXT *PCONTEXT;
typedef HANDLE *PHANDLE;
typedef struct __EXCEPTION_RECORD
{
    DWORD ExceptionCode;
    DWORD ExceptionFlags;
    struct __EXCEPTION_RECORD *ExceptionRecord;

    LPVOID ExceptionAddress;
    DWORD NumberParameters;
    DWORD ExceptionInformation[15];
} EXCEPTION_RECORD, *PEXCEPTION_RECORD;






typedef struct _EXCEPTION_POINTERS
{
  PEXCEPTION_RECORD ExceptionRecord;
  PCONTEXT ContextRecord;
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
struct __EXCEPTION_FRAME;

typedef DWORD (*PEXCEPTION_HANDLER)(PEXCEPTION_RECORD,struct __EXCEPTION_FRAME*,
                                    PCONTEXT,struct __EXCEPTION_FRAME **);

typedef struct __EXCEPTION_FRAME
{
  struct __EXCEPTION_FRAME *Prev;
  PEXCEPTION_HANDLER Handler;
} EXCEPTION_FRAME, *PEXCEPTION_FRAME;





#pragma pack()





typedef LONG __attribute__((__stdcall__)) (*PTOP_LEVEL_EXCEPTION_FILTER)(PEXCEPTION_POINTERS ExceptionInfo);
typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;

DWORD __attribute__((__stdcall__)) UnhandledExceptionFilter( PEXCEPTION_POINTERS epointers );
LPTOP_LEVEL_EXCEPTION_FILTER
__attribute__((__stdcall__)) SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER filter );
typedef struct _NT_TIB
{
        struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
        PVOID StackBase;
        PVOID StackLimit;
        PVOID SubSystemTib;
        union {
          PVOID FiberData;
          DWORD Version;
        } u;
        PVOID ArbitraryUserPointer;
        struct _NT_TIB *Self;
} NT_TIB, *PNT_TIB;

struct _TEB;
typedef struct _IMAGE_DOS_HEADER {
    WORD e_magic;
    WORD e_cblp;
    WORD e_cp;
    WORD e_crlc;
    WORD e_cparhdr;
    WORD e_minalloc;
    WORD e_maxalloc;
    WORD e_ss;
    WORD e_sp;
    WORD e_csum;
    WORD e_ip;
    WORD e_cs;
    WORD e_lfarlc;
    WORD e_ovno;
    WORD e_res[4];
    WORD e_oemid;
    WORD e_oeminfo;
    WORD e_res2[10];
    DWORD e_lfanew;
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
typedef struct
{
    WORD ne_magic;
    BYTE ne_ver;
    BYTE ne_rev;
    WORD ne_enttab;
    WORD ne_cbenttab;
    LONG ne_crc;
    WORD ne_flags;
    WORD ne_autodata;
    WORD ne_heap;
    WORD ne_stack;
    DWORD ne_csip;
    DWORD ne_sssp;
    WORD ne_cseg;
    WORD ne_cmod;
    WORD ne_cbnrestab;
    WORD ne_segtab;
    WORD ne_rsrctab;
    WORD ne_restab;
    WORD ne_modtab;
    WORD ne_imptab;
    DWORD ne_nrestab;
    WORD ne_cmovent;
    WORD ne_align;
    WORD ne_cres;
    BYTE ne_exetyp;
    BYTE ne_flagsothers;
    WORD fastload_offset;
    WORD fastload_length;
    WORD ne_swaparea;
    WORD ne_expver;
} IMAGE_OS2_HEADER,*PIMAGE_OS2_HEADER;

typedef struct _IMAGE_VXD_HEADER {
  WORD e32_magic;
  BYTE e32_border;
  BYTE e32_worder;
  DWORD e32_level;
  WORD e32_cpu;
  WORD e32_os;
  DWORD e32_ver;
  DWORD e32_mflags;
  DWORD e32_mpages;
  DWORD e32_startobj;
  DWORD e32_eip;
  DWORD e32_stackobj;
  DWORD e32_esp;
  DWORD e32_pagesize;
  DWORD e32_lastpagesize;
  DWORD e32_fixupsize;
  DWORD e32_fixupsum;
  DWORD e32_ldrsize;
  DWORD e32_ldrsum;
  DWORD e32_objtab;
  DWORD e32_objcnt;
  DWORD e32_objmap;
  DWORD e32_itermap;
  DWORD e32_rsrctab;
  DWORD e32_rsrccnt;
  DWORD e32_restab;
  DWORD e32_enttab;
  DWORD e32_dirtab;
  DWORD e32_dircnt;
  DWORD e32_fpagetab;
  DWORD e32_frectab;
  DWORD e32_impmod;
  DWORD e32_impmodcnt;
  DWORD e32_impproc;
  DWORD e32_pagesum;
  DWORD e32_datapage;
  DWORD e32_preload;
  DWORD e32_nrestab;
  DWORD e32_cbnrestab;
  DWORD e32_nressum;
  DWORD e32_autodata;
  DWORD e32_debuginfo;
  DWORD e32_debuglen;
  DWORD e32_instpreload;
  DWORD e32_instdemand;
  DWORD e32_heapsize;
  BYTE e32_res3[12];
  DWORD e32_winresoff;
  DWORD e32_winreslen;
  WORD e32_devid;
  WORD e32_ddkver;
} IMAGE_VXD_HEADER, *PIMAGE_VXD_HEADER;
typedef struct _IMAGE_FILE_HEADER {
  WORD Machine;
  WORD NumberOfSections;
  DWORD TimeDateStamp;
  DWORD PointerToSymbolTable;
  DWORD NumberOfSymbols;
  WORD SizeOfOptionalHeader;
  WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

typedef struct _IMAGE_DATA_DIRECTORY {
  DWORD VirtualAddress;
  DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;



typedef struct _IMAGE_OPTIONAL_HEADER {



  WORD Magic;
  BYTE MajorLinkerVersion;
  BYTE MinorLinkerVersion;
  DWORD SizeOfCode;
  DWORD SizeOfInitializedData;
  DWORD SizeOfUninitializedData;
  DWORD AddressOfEntryPoint;
  DWORD BaseOfCode;
  DWORD BaseOfData;



  DWORD ImageBase;
  DWORD SectionAlignment;
  DWORD FileAlignment;
  WORD MajorOperatingSystemVersion;
  WORD MinorOperatingSystemVersion;
  WORD MajorImageVersion;
  WORD MinorImageVersion;
  WORD MajorSubsystemVersion;
  WORD MinorSubsystemVersion;
  DWORD Win32VersionValue;
  DWORD SizeOfImage;
  DWORD SizeOfHeaders;
  DWORD CheckSum;
  WORD Subsystem;
  WORD DllCharacteristics;
  DWORD SizeOfStackReserve;
  DWORD SizeOfStackCommit;
  DWORD SizeOfHeapReserve;
  DWORD SizeOfHeapCommit;
  DWORD LoaderFlags;
  DWORD NumberOfRvaAndSizes;
  IMAGE_DATA_DIRECTORY DataDirectory[16];
} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;

typedef struct _IMAGE_NT_HEADERS {
  DWORD Signature;
  IMAGE_FILE_HEADER FileHeader;
  IMAGE_OPTIONAL_HEADER OptionalHeader;
} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;



typedef struct _IMAGE_SECTION_HEADER {
  BYTE Name[8];
  union {
    DWORD PhysicalAddress;
    DWORD VirtualSize;
  } Misc;
  DWORD VirtualAddress;
  DWORD SizeOfRawData;
  DWORD PointerToRawData;
  DWORD PointerToRelocations;
  DWORD PointerToLinenumbers;
  WORD NumberOfRelocations;
  WORD NumberOfLinenumbers;
  DWORD Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

typedef struct _IMAGE_SYMBOL {
    union {
        BYTE ShortName[8];
        struct {
            DWORD Short;
            DWORD Long;
        } Name;
        DWORD LongName[2];
    } N;
    DWORD Value;
    SHORT SectionNumber;
    WORD Type;
    BYTE StorageClass;
    BYTE NumberOfAuxSymbols;
} IMAGE_SYMBOL;
typedef IMAGE_SYMBOL *PIMAGE_SYMBOL;



typedef struct _IMAGE_LINENUMBER {
    union {
        DWORD SymbolTableIndex;
        DWORD VirtualAddress;
    } Type;
    WORD Linenumber;
} IMAGE_LINENUMBER;
typedef IMAGE_LINENUMBER *PIMAGE_LINENUMBER;



typedef union _IMAGE_AUX_SYMBOL {
    struct {
        DWORD TagIndex;
        union {
            struct {
                WORD Linenumber;
                WORD Size;
            } LnSz;
           DWORD TotalSize;
        } Misc;
        union {
            struct {
                DWORD PointerToLinenumber;
                DWORD PointerToNextFunction;
            } Function;
            struct {
                WORD Dimension[4];
            } Array;
        } FcnAry;
        WORD TvIndex;
    } Sym;
    struct {
        BYTE Name[18];
    } File;
    struct {
        DWORD Length;
        WORD NumberOfRelocations;
        WORD NumberOfLinenumbers;
        DWORD CheckSum;
        SHORT Number;
        BYTE Selection;
    } Section;
} IMAGE_AUX_SYMBOL;
typedef IMAGE_AUX_SYMBOL *PIMAGE_AUX_SYMBOL;







#pragma pack()
typedef struct _IMAGE_EXPORT_DIRECTORY {
        DWORD Characteristics;
        DWORD TimeDateStamp;
        WORD MajorVersion;
        WORD MinorVersion;
        DWORD Name;
        DWORD Base;
        DWORD NumberOfFunctions;
        DWORD NumberOfNames;
        LPDWORD *AddressOfFunctions;
        LPDWORD *AddressOfNames;
        LPWORD *AddressOfNameOrdinals;
} IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY;


typedef struct _IMAGE_IMPORT_BY_NAME {
        WORD Hint;
        BYTE Name[1];
} IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME;


typedef struct _IMAGE_THUNK_DATA {
        union {
                LPBYTE ForwarderString;
                FARPROC Function;
                DWORD Ordinal;
                PIMAGE_IMPORT_BY_NAME AddressOfData;
        } u1;
} IMAGE_THUNK_DATA,*PIMAGE_THUNK_DATA;



typedef struct _IMAGE_IMPORT_DESCRIPTOR {
        union {
                DWORD Characteristics;
                PIMAGE_THUNK_DATA OriginalFirstThunk;
        } u;
        DWORD TimeDateStamp;






        DWORD ForwarderChain;
        DWORD Name;

        PIMAGE_THUNK_DATA FirstThunk;
} IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR;





typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR
{
    DWORD TimeDateStamp;
    WORD OffsetModuleName;
    WORD NumberOfModuleForwarderRefs;

} IMAGE_BOUND_IMPORT_DESCRIPTOR, *PIMAGE_BOUND_IMPORT_DESCRIPTOR;

typedef struct _IMAGE_BOUND_FORWARDER_REF
{
    DWORD TimeDateStamp;
    WORD OffsetModuleName;
    WORD Reserved;
} IMAGE_BOUND_FORWARDER_REF, *PIMAGE_BOUND_FORWARDER_REF;

typedef struct _IMAGE_BASE_RELOCATION
{
        DWORD VirtualAddress;
        DWORD SizeOfBlock;
        WORD TypeOffset[1];
} IMAGE_BASE_RELOCATION,*PIMAGE_BASE_RELOCATION;

typedef struct _IMAGE_RELOCATION
{
    union {
        DWORD VirtualAddress;
        DWORD RelocCount;
    } u;
    DWORD SymbolTableIndex;
    WORD Type;
} IMAGE_RELOCATION;
typedef IMAGE_RELOCATION *PIMAGE_RELOCATION;
typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER
{
    BYTE Name[16];
    BYTE Date[12];
    BYTE UserID[6];
    BYTE GroupID[6];
    BYTE Mode[8];
    BYTE Size[10];
    BYTE EndHeader[2];
} IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER;






typedef struct _IMAGE_RESOURCE_DIRECTORY {
        DWORD Characteristics;
        DWORD TimeDateStamp;
        WORD MajorVersion;
        WORD MinorVersion;
        WORD NumberOfNamedEntries;
        WORD NumberOfIdEntries;

} IMAGE_RESOURCE_DIRECTORY,*PIMAGE_RESOURCE_DIRECTORY;




typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
        union {
                struct {
                        unsigned NameOffset:31;
                        unsigned NameIsString:1;
                } s;
                DWORD Name;
                WORD Id;
        } u1;
        union {
                DWORD OffsetToData;
                struct {
                        unsigned OffsetToDirectory:31;
                        unsigned DataIsDirectory:1;
                } s;
        } u2;
} IMAGE_RESOURCE_DIRECTORY_ENTRY,*PIMAGE_RESOURCE_DIRECTORY_ENTRY;


typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
        WORD Length;
        CHAR NameString[ 1 ];
} IMAGE_RESOURCE_DIRECTORY_STRING,*PIMAGE_RESOURCE_DIRECTORY_STRING;

typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
        WORD Length;
        WCHAR NameString[ 1 ];
} IMAGE_RESOURCE_DIR_STRING_U,*PIMAGE_RESOURCE_DIR_STRING_U;

typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
        DWORD OffsetToData;
        DWORD Size;
        DWORD CodePage;
        DWORD ResourceHandle;
} IMAGE_RESOURCE_DATA_ENTRY,*PIMAGE_RESOURCE_DATA_ENTRY;


typedef VOID __attribute__((__stdcall__)) (*PIMAGE_TLS_CALLBACK)(
        LPVOID DllHandle,DWORD Reason,LPVOID Reserved
);

typedef struct _IMAGE_TLS_DIRECTORY {
        DWORD StartAddressOfRawData;
        DWORD EndAddressOfRawData;
        LPDWORD AddressOfIndex;
        PIMAGE_TLS_CALLBACK *AddressOfCallBacks;
        DWORD SizeOfZeroFill;
        DWORD Characteristics;
} IMAGE_TLS_DIRECTORY,*PIMAGE_TLS_DIRECTORY;

typedef struct _IMAGE_DEBUG_DIRECTORY {
  DWORD Characteristics;
  DWORD TimeDateStamp;
  WORD MajorVersion;
  WORD MinorVersion;
  DWORD Type;
  DWORD SizeOfData;
  DWORD AddressOfRawData;
  DWORD PointerToRawData;
} IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY;
typedef struct _IMAGE_COFF_SYMBOLS_HEADER {
  DWORD NumberOfSymbols;
  DWORD LvaToFirstSymbol;
  DWORD NumberOfLinenumbers;
  DWORD LvaToFirstLinenumber;
  DWORD RvaToFirstByteOfCode;
  DWORD RvaToLastByteOfCode;
  DWORD RvaToFirstByteOfData;
  DWORD RvaToLastByteOfData;
} IMAGE_COFF_SYMBOLS_HEADER, *PIMAGE_COFF_SYMBOLS_HEADER;






typedef struct _FPO_DATA {
  DWORD ulOffStart;
  DWORD cbProcSize;
  DWORD cdwLocals;
  WORD cdwParams;
  unsigned cbProlog : 8;
  unsigned cbRegs : 3;
  unsigned fHasSEH : 1;
  unsigned fUseBP : 1;
  unsigned reserved : 1;
  unsigned cbFrame : 2;
} FPO_DATA, *PFPO_DATA;

typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY {
  DWORD Characteristics;
  DWORD TimeDateStamp;
  WORD MajorVersion;
  WORD MinorVersion;
  DWORD GlobalFlagsClear;
  DWORD GlobalFlagsSet;
  DWORD CriticalSectionDefaultTimeout;
  DWORD DeCommitFreeBlockThreshold;
  DWORD DeCommitTotalFreeThreshold;
  PVOID LockPrefixTable;
  DWORD MaximumAllocationSize;
  DWORD VirtualMemoryThreshold;
  DWORD ProcessHeapFlags;
  DWORD ProcessAffinityMask;
  WORD CSDVersion;
  WORD Reserved1;
  PVOID EditList;
  DWORD Reserved[1];
} IMAGE_LOAD_CONFIG_DIRECTORY, *PIMAGE_LOAD_CONFIG_DIRECTORY;

typedef struct _IMAGE_FUNCTION_ENTRY {
  DWORD StartingAddress;
  DWORD EndingAddress;
  DWORD EndOfPrologue;
} IMAGE_FUNCTION_ENTRY, *PIMAGE_FUNCTION_ENTRY;



typedef struct _IMAGE_SEPARATE_DEBUG_HEADER {
        WORD Signature;
        WORD Flags;
        WORD Machine;
        WORD Characteristics;
        DWORD TimeDateStamp;
        DWORD CheckSum;
        DWORD ImageBase;
        DWORD SizeOfImage;
        DWORD NumberOfSections;
        DWORD ExportedNamesSize;
        DWORD DebugDirectorySize;
        DWORD SectionAlignment;
        DWORD Reserved[ 2 ];
} IMAGE_SEPARATE_DEBUG_HEADER,*PIMAGE_SEPARATE_DEBUG_HEADER;




typedef struct tagMESSAGE_RESOURCE_ENTRY {
        WORD Length;
        WORD Flags;
        BYTE Text[1];
} MESSAGE_RESOURCE_ENTRY,*PMESSAGE_RESOURCE_ENTRY;


typedef struct tagMESSAGE_RESOURCE_BLOCK {
        DWORD LowId;
        DWORD HighId;
        DWORD OffsetToEntries;
} MESSAGE_RESOURCE_BLOCK,*PMESSAGE_RESOURCE_BLOCK;

typedef struct tagMESSAGE_RESOURCE_DATA {
        DWORD NumberOfBlocks;
        MESSAGE_RESOURCE_BLOCK Blocks[ 1 ];
} MESSAGE_RESOURCE_DATA,*PMESSAGE_RESOURCE_DATA;
typedef PVOID PACCESS_TOKEN;





typedef enum _TOKEN_INFORMATION_CLASS {
  TokenUser = 1,
  TokenGroups,
  TokenPrivileges,
  TokenOwner,
  TokenPrimaryGroup,
  TokenDefaultDacl,
  TokenSource,
  TokenType,
  TokenImpersonationLevel,
  TokenStatistics
} TOKEN_INFORMATION_CLASS;





typedef DWORD ACCESS_MASK, *PACCESS_MASK;

typedef struct _GENERIC_MAPPING {
    ACCESS_MASK GenericRead;
    ACCESS_MASK GenericWrite;
    ACCESS_MASK GenericExecute;
    ACCESS_MASK GenericAll;
} GENERIC_MAPPING, *PGENERIC_MAPPING;



typedef struct {
    BYTE Value[6];
} SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY;




typedef struct _SID {
    BYTE Revision;
    BYTE SubAuthorityCount;
    SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
    DWORD SubAuthority[1];
} SID,*PSID;
typedef struct _ACL {
    BYTE AclRevision;
    BYTE Sbz1;
    WORD AclSize;
    WORD AceCount;
    WORD Sbz2;
} ACL, *PACL;
typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION;
typedef WORD SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;


typedef struct {
    BYTE Revision;
    BYTE Sbz1;
    SECURITY_DESCRIPTOR_CONTROL Control;
    DWORD Owner;
    DWORD Group;
    DWORD Sacl;
    DWORD Dacl;
} SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;

typedef struct {
    BYTE Revision;
    BYTE Sbz1;
    SECURITY_DESCRIPTOR_CONTROL Control;
    PSID Owner;
    PSID Group;
    PACL Sacl;
    PACL Dacl;
} SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR;







#pragma pack()








typedef struct _SID_AND_ATTRIBUTES {
  PSID Sid;
  DWORD Attributes;
} SID_AND_ATTRIBUTES ;
typedef struct _TOKEN_USER {
  SID_AND_ATTRIBUTES User;
} TOKEN_USER;





typedef struct _TOKEN_GROUPS {
  DWORD GroupCount;
  SID_AND_ATTRIBUTES Groups[1];
} TOKEN_GROUPS;





typedef union _LARGE_INTEGER {
    struct {
        DWORD LowPart;
        LONG HighPart;
    } s;
    LONGLONG QuadPart;
} LARGE_INTEGER, *LPLARGE_INTEGER, *PLARGE_INTEGER;

typedef union _ULARGE_INTEGER {
    struct {
        DWORD LowPart;
        LONG HighPart;
    } s;
    LONGLONG QuadPart;
} ULARGE_INTEGER, *LPULARGE_INTEGER, *PULARGE_INTEGER;





typedef LARGE_INTEGER LUID,*PLUID;

typedef struct _LUID_AND_ATTRIBUTES {
  LUID Luid;
  DWORD Attributes;
} LUID_AND_ATTRIBUTES;





typedef struct _PRIVILEGE_SET {
    DWORD PrivilegeCount;
    DWORD Control;
    LUID_AND_ATTRIBUTES Privilege[1];
} PRIVILEGE_SET, *PPRIVILEGE_SET;





typedef struct _TOKEN_PRIVILEGES {
  DWORD PrivilegeCount;
  LUID_AND_ATTRIBUTES Privileges[1];
} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;





typedef struct _TOKEN_OWNER {
  PSID Owner;
} TOKEN_OWNER;





typedef struct _TOKEN_PRIMARY_GROUP {
  PSID PrimaryGroup;
} TOKEN_PRIMARY_GROUP;






typedef struct _TOKEN_DEFAULT_DACL {
  PACL DefaultDacl;
} TOKEN_DEFAULT_DACL;





typedef struct _TOKEN_SOURCE {
  char Sourcename[8];
  LUID SourceIdentifier;
} TOKEN_SOURCE;





typedef enum tagTOKEN_TYPE {
  TokenPrimary = 1,
  TokenImpersonation
} TOKEN_TYPE;





typedef enum _SECURITY_IMPERSONATION_LEVEL {
  SecurityAnonymous,
  SecurityIdentification,
  SecurityImpersonation,
  SecurityDelegation
} SECURITY_IMPERSONATION_LEVEL, *PSECURITY_IMPERSONATION_LEVEL;


typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE,
        * PSECURITY_CONTEXT_TRACKING_MODE;




typedef struct _SECURITY_QUALITY_OF_SERVICE {
  DWORD Length;
  SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
  SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
  WIN_BOOL EffectiveOnly;
} SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;





typedef struct _TOKEN_STATISTICS {
  LUID TokenId;
  LUID AuthenticationId;
  LARGE_INTEGER ExpirationTime;
  TOKEN_TYPE TokenType;
  SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
  DWORD DynamicCharged;
  DWORD DynamicAvailable;
  DWORD GroupCount;
  DWORD PrivilegeCount;
  LUID ModifiedId;
} TOKEN_STATISTICS;
typedef struct _ACE_HEADER {
        BYTE AceType;
        BYTE AceFlags;
        WORD AceSize;
} ACE_HEADER,*PACE_HEADER;
typedef struct _ACCESS_ALLOWED_ACE {
        ACE_HEADER Header;
        DWORD Mask;
        DWORD SidStart;
} ACCESS_ALLOWED_ACE,*PACCESS_ALLOWED_ACE;

typedef struct _ACCESS_DENIED_ACE {
        ACE_HEADER Header;
        DWORD Mask;
        DWORD SidStart;
} ACCESS_DENIED_ACE,*PACCESS_DENIED_ACE;

typedef struct _SYSTEM_AUDIT_ACE {
        ACE_HEADER Header;
        DWORD Mask;
        DWORD SidStart;
} SYSTEM_AUDIT_ACE,*PSYSTEM_AUDIT_ACE;

typedef struct _SYSTEM_ALARM_ACE {
        ACE_HEADER Header;
        DWORD Mask;
        DWORD SidStart;
} SYSTEM_ALARM_ACE,*PSYSTEM_ALARM_ACE;

typedef enum tagSID_NAME_USE {
        SidTypeUser = 1,
        SidTypeGroup,
        SidTypeDomain,
        SidTypeAlias,
        SidTypeWellKnownGroup,
        SidTypeDeletedAccount,
        SidTypeInvalid,
        SidTypeUnknown
} SID_NAME_USE,*PSID_NAME_USE;




#pragma pack()




LPWSTR __attribute__((__stdcall__)) lstrcpyAtoW(LPWSTR,LPCSTR);
LPSTR __attribute__((__stdcall__)) lstrcpyWtoA(LPSTR,LPCWSTR);
LPWSTR __attribute__((__stdcall__)) lstrcpynAtoW(LPWSTR,LPCSTR,INT);
LPSTR __attribute__((__stdcall__)) lstrcpynWtoA(LPSTR,LPCWSTR,INT);






typedef struct tagCOORD {
    INT16 x;
    INT16 y;
} COORD, *LPCOORD;






typedef DWORD __attribute__((__stdcall__)) (*LPTHREAD_START_ROUTINE)(LPVOID);
typedef struct _EXCEPTION_DEBUG_INFO {
    EXCEPTION_RECORD ExceptionRecord;
    DWORD dwFirstChance;
} EXCEPTION_DEBUG_INFO;

typedef struct _CREATE_THREAD_DEBUG_INFO {
    HANDLE hThread;
    LPVOID lpThreadLocalBase;
    LPTHREAD_START_ROUTINE lpStartAddress;
} CREATE_THREAD_DEBUG_INFO;

typedef struct _CREATE_PROCESS_DEBUG_INFO {
    HANDLE hFile;
    HANDLE hProcess;
    HANDLE hThread;
    LPVOID lpBaseOfImage;
    DWORD dwDebugInfoFileOffset;
    DWORD nDebugInfoSize;
    LPVOID lpThreadLocalBase;
    LPTHREAD_START_ROUTINE lpStartAddress;
    LPVOID lpImageName;
    WORD fUnicode;
} CREATE_PROCESS_DEBUG_INFO;

typedef struct _EXIT_THREAD_DEBUG_INFO {
    DWORD dwExitCode;
} EXIT_THREAD_DEBUG_INFO;

typedef struct _EXIT_PROCESS_DEBUG_INFO {
    DWORD dwExitCode;
} EXIT_PROCESS_DEBUG_INFO;

typedef struct _LOAD_DLL_DEBUG_INFO {
    HANDLE hFile;
    LPVOID lpBaseOfDll;
    DWORD dwDebugInfoFileOffset;
    DWORD nDebugInfoSize;
    LPVOID lpImageName;
    WORD fUnicode;
} LOAD_DLL_DEBUG_INFO;

typedef struct _UNLOAD_DLL_DEBUG_INFO {
    LPVOID lpBaseOfDll;
} UNLOAD_DLL_DEBUG_INFO;

typedef struct _OUTPUT_DEBUG_STRING_INFO {
    LPSTR lpDebugStringData;
    WORD fUnicode;
    WORD nDebugStringLength;
} OUTPUT_DEBUG_STRING_INFO;

typedef struct _RIP_INFO {
    DWORD dwError;
    DWORD dwType;
} RIP_INFO;

typedef struct _DEBUG_EVENT {
    DWORD dwDebugEventCode;
    DWORD dwProcessId;
    DWORD dwThreadId;
    union {
        EXCEPTION_DEBUG_INFO Exception;
        CREATE_THREAD_DEBUG_INFO CreateThread;
        CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
        EXIT_THREAD_DEBUG_INFO ExitThread;
        EXIT_PROCESS_DEBUG_INFO ExitProcess;
        LOAD_DLL_DEBUG_INFO LoadDll;
        UNLOAD_DLL_DEBUG_INFO UnloadDll;
        OUTPUT_DEBUG_STRING_INFO DebugString;
        RIP_INFO RipInfo;
    } u;
} DEBUG_EVENT, *LPDEBUG_EVENT;


typedef struct
{
    BYTE cBytes;
    BYTE fFixedDisk;
    WORD nErrCode;
    BYTE reserved[4];
    BYTE szPathName[128];
} OFSTRUCT, *LPOFSTRUCT;
typedef struct _SECURITY_ATTRIBUTES
{
    DWORD nLength;
    LPVOID lpSecurityDescriptor;
    WIN_BOOL bInheritHandle;
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;




typedef struct
{
  DWORD dwLowDateTime;
  DWORD dwHighDateTime;
} FILETIME, *LPFILETIME;



typedef struct
{
    DWORD dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD nFileSizeHigh;
    DWORD nFileSizeLow;
    DWORD dwReserved0;
    DWORD dwReserved1;
    CHAR cFileName[260];
    CHAR cAlternateFileName[14];
} WIN32_FIND_DATAA, *LPWIN32_FIND_DATAA;

typedef struct
{
    DWORD dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD nFileSizeHigh;
    DWORD nFileSizeLow;
    DWORD dwReserved0;
    DWORD dwReserved1;
    WCHAR cFileName[260];
    WCHAR cAlternateFileName[14];
} WIN32_FIND_DATAW, *LPWIN32_FIND_DATAW;

typedef WIN32_FIND_DATAA WIN32_FIND_DATA;
typedef LPWIN32_FIND_DATAA LPWIN32_FIND_DATA;

typedef struct
{
    LPVOID lpData;
    DWORD cbData;
    BYTE cbOverhead;
    BYTE iRegionIndex;
    WORD wFlags;
    union {
        struct {
            HANDLE hMem;
            DWORD dwReserved[3];
        } Block;
        struct {
            DWORD dwCommittedSize;
            DWORD dwUnCommittedSize;
            LPVOID lpFirstBlock;
            LPVOID lpLastBlock;
        } Region;
    } Foo;
} PROCESS_HEAP_ENTRY, *LPPROCESS_HEAP_ENTRY;
typedef struct tagMEMORYSTATUS
{
    DWORD dwLength;
    DWORD dwMemoryLoad;
    DWORD dwTotalPhys;
    DWORD dwAvailPhys;
    DWORD dwTotalPageFile;
    DWORD dwAvailPageFile;
    DWORD dwTotalVirtual;
    DWORD dwAvailVirtual;
} MEMORYSTATUS, *LPMEMORYSTATUS;
typedef struct
{
    UINT16 flags;
    DWORD dwOptions __attribute__((packed));
    DWORD dwFilter __attribute__((packed));
    CHAR achAllocModule[8] __attribute__((packed));
    DWORD dwAllocBreak __attribute__((packed));
    DWORD dwAllocCount __attribute__((packed));
} WINDEBUGINFO, *LPWINDEBUGINFO;
typedef struct {
        WORD wYear;
        WORD wMonth;
        WORD wDayOfWeek;
        WORD wDay;
        WORD wHour;
        WORD wMinute;
        WORD wSecond;
        WORD wMilliseconds;
} SYSTEMTIME, *LPSYSTEMTIME;



typedef struct {
        DWORD Internal;
        DWORD InternalHigh;
        DWORD Offset;
        DWORD OffsetHigh;
        HANDLE hEvent;
} OVERLAPPED, *LPOVERLAPPED;
typedef struct {
        DWORD cb;
        LPSTR lpReserved;
        LPSTR lpDesktop;
        LPSTR lpTitle;
        DWORD dwX;
        DWORD dwY;
        DWORD dwXSize;
        DWORD dwYSize;
        DWORD dwXCountChars;
        DWORD dwYCountChars;
        DWORD dwFillAttribute;
        DWORD dwFlags;
        WORD wShowWindow;
        WORD cbReserved2;
        BYTE *lpReserved2;
        HANDLE hStdInput;
        HANDLE hStdOutput;
        HANDLE hStdError;
} STARTUPINFOA, *LPSTARTUPINFOA;

typedef struct {
        DWORD cb;
        LPWSTR lpReserved;
        LPWSTR lpDesktop;
        LPWSTR lpTitle;
        DWORD dwX;
        DWORD dwY;
        DWORD dwXSize;
        DWORD dwYSize;
        DWORD dwXCountChars;
        DWORD dwYCountChars;
        DWORD dwFillAttribute;
        DWORD dwFlags;
        WORD wShowWindow;
        WORD cbReserved2;
        BYTE *lpReserved2;
        HANDLE hStdInput;
        HANDLE hStdOutput;
        HANDLE hStdError;
} STARTUPINFOW, *LPSTARTUPINFOW;

typedef STARTUPINFOA STARTUPINFO;
typedef LPSTARTUPINFOA LPSTARTUPINFO;

typedef struct {
        HANDLE hProcess;
        HANDLE hThread;
        DWORD dwProcessId;
        DWORD dwThreadId;
} PROCESS_INFORMATION,*LPPROCESS_INFORMATION;

typedef struct {
        LONG Bias;
        WCHAR StandardName[32];
        SYSTEMTIME StandardDate;
        LONG StandardBias;
        WCHAR DaylightName[32];
        SYSTEMTIME DaylightDate;
        LONG DaylightBias;
} TIME_ZONE_INFORMATION, *LPTIME_ZONE_INFORMATION;
typedef struct
{
  int dwFileAttributes;
  FILETIME ftCreationTime;
  FILETIME ftLastAccessTime;
  FILETIME ftLastWriteTime;
  int dwVolumeSerialNumber;
  int nFileSizeHigh;
  int nFileSizeLow;
  int nNumberOfLinks;
  int nFileIndexHigh;
  int nFileIndexLow;
} BY_HANDLE_FILE_INFORMATION ;


typedef struct _SYSTEM_POWER_STATUS
{
  WIN_BOOL16 ACLineStatus;
  BYTE BatteryFlag;
  BYTE BatteryLifePercent;
  BYTE reserved;
  DWORD BatteryLifeTime;
  DWORD BatteryFullLifeTime;
} SYSTEM_POWER_STATUS, *LPSYSTEM_POWER_STATUS;

typedef struct _MEMORY_BASIC_INFORMATION
{
    LPVOID BaseAddress;
    LPVOID AllocationBase;
    DWORD AllocationProtect;
    DWORD RegionSize;
    DWORD State;
    DWORD Protect;
    DWORD Type;
} MEMORY_BASIC_INFORMATION,*LPMEMORY_BASIC_INFORMATION;


typedef WIN_BOOL __attribute__((__stdcall__)) (*CODEPAGE_ENUMPROCA)(LPSTR);
typedef WIN_BOOL __attribute__((__stdcall__)) (*CODEPAGE_ENUMPROCW)(LPWSTR);
typedef CODEPAGE_ENUMPROCA CODEPAGE_ENUMPROC;
typedef WIN_BOOL __attribute__((__stdcall__)) (*LOCALE_ENUMPROCA)(LPSTR);
typedef WIN_BOOL __attribute__((__stdcall__)) (*LOCALE_ENUMPROCW)(LPWSTR);
typedef LOCALE_ENUMPROCA LOCALE_ENUMPROC;

typedef struct tagSYSTEM_INFO
{
    union {
        DWORD dwOemId;
        struct {
                WORD wProcessorArchitecture;
                WORD wReserved;
        } s;
    } u;
    DWORD dwPageSize;
    LPVOID lpMinimumApplicationAddress;
    LPVOID lpMaximumApplicationAddress;
    DWORD dwActiveProcessorMask;
    DWORD dwNumberOfProcessors;
    DWORD dwProcessorType;
    DWORD dwAllocationGranularity;
    WORD wProcessorLevel;
    WORD wProcessorRevision;
} SYSTEM_INFO, *LPSYSTEM_INFO;







typedef WIN_BOOL __attribute__((__stdcall__)) (*ENUMRESTYPEPROCA)(HMODULE,LPSTR,LONG);
typedef WIN_BOOL __attribute__((__stdcall__)) (*ENUMRESTYPEPROCW)(HMODULE,LPWSTR,LONG);
typedef WIN_BOOL __attribute__((__stdcall__)) (*ENUMRESNAMEPROCA)(HMODULE,LPCSTR,LPSTR,LONG);
typedef WIN_BOOL __attribute__((__stdcall__)) (*ENUMRESNAMEPROCW)(HMODULE,LPCWSTR,LPWSTR,LONG);
typedef WIN_BOOL __attribute__((__stdcall__)) (*ENUMRESLANGPROCA)(HMODULE,LPCSTR,LPCSTR,WORD,LONG);
typedef WIN_BOOL __attribute__((__stdcall__)) (*ENUMRESLANGPROCW)(HMODULE,LPCWSTR,LPCWSTR,WORD,LONG);

typedef ENUMRESTYPEPROCA ENUMRESTYPEPROC;
typedef ENUMRESNAMEPROCA ENUMRESNAMEPROC;
typedef ENUMRESLANGPROCA ENUMRESLANGPROC;







typedef struct _LDT_ENTRY {
    WORD LimitLow;
    WORD BaseLow;
    union {
        struct {
            BYTE BaseMid;
            BYTE Flags1;
            BYTE Flags2;
            BYTE BaseHi;
        } Bytes;
        struct {
            unsigned BaseMid : 8;
            unsigned Type : 5;
            unsigned Dpl : 2;
            unsigned Pres : 1;
            unsigned LimitHi : 4;
            unsigned Sys : 1;
            unsigned Reserved_0 : 1;
            unsigned Default_Big : 1;
            unsigned Granularity : 1;
            unsigned BaseHi : 8;
        } Bits;
    } HighWord;
} LDT_ENTRY, *LPLDT_ENTRY;


typedef enum _GET_FILEEX_INFO_LEVELS {
    GetFileExInfoStandard
} GET_FILEEX_INFO_LEVELS;

typedef struct _WIN32_FILE_ATTRIBUTES_DATA {
    DWORD dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD nFileSizeHigh;
    DWORD nFileSizeLow;
} WIN32_FILE_ATTRIBUTE_DATA, *LPWIN32_FILE_ATTRIBUTE_DATA;

typedef struct _DllVersionInfo {
    DWORD cbSize;
    DWORD dwMajorVersion;
    DWORD dwMinorVersion;
    DWORD dwBuildNumber;
    DWORD dwPlatformID;
} DLLVERSIONINFO;





typedef DWORD __attribute__((__stdcall__)) (*LPPROGRESS_ROUTINE)(LARGE_INTEGER, LARGE_INTEGER, LARGE_INTEGER,
                                           LARGE_INTEGER, DWORD, DWORD, HANDLE,
                                           HANDLE, LPVOID);
typedef struct {
        LPVOID DebugInfo;
        LONG LockCount;
        LONG RecursionCount;
        HANDLE OwningThread;
        HANDLE LockSemaphore;
        DWORD Reserved;
}CRITICAL_SECTION;





typedef struct {
        DWORD dwOSVersionInfoSize;
        DWORD dwMajorVersion;
        DWORD dwMinorVersion;
        DWORD dwBuildNumber;
        DWORD dwPlatformId;
        CHAR szCSDVersion[128];
} OSVERSIONINFO16;

typedef struct {
        DWORD dwOSVersionInfoSize;
        DWORD dwMajorVersion;
        DWORD dwMinorVersion;
        DWORD dwBuildNumber;
        DWORD dwPlatformId;
        CHAR szCSDVersion[128];
} OSVERSIONINFOA;

typedef struct {
        DWORD dwOSVersionInfoSize;
        DWORD dwMajorVersion;
        DWORD dwMinorVersion;
        DWORD dwBuildNumber;
        DWORD dwPlatformId;
        WCHAR szCSDVersion[128];
} OSVERSIONINFOW;

typedef OSVERSIONINFOA OSVERSIONINFO;





typedef struct tagCOMSTAT
{
    DWORD status;
    DWORD cbInQue;
    DWORD cbOutQue;
} COMSTAT,*LPCOMSTAT;

typedef struct tagDCB
{
    DWORD DCBlength;
    DWORD BaudRate;
    unsigned fBinary :1;
    unsigned fParity :1;
    unsigned fOutxCtsFlow :1;
    unsigned fOutxDsrFlow :1;
    unsigned fDtrControl :2;
    unsigned fDsrSensitivity :1;
    unsigned fTXContinueOnXoff :1;
    unsigned fOutX :1;
    unsigned fInX :1;
    unsigned fErrorChar :1;
    unsigned fNull :1;
    unsigned fRtsControl :2;
    unsigned fAbortOnError :1;
    unsigned fDummy2 :17;
    WORD wReserved;
    WORD XonLim;
    WORD XoffLim;
    BYTE ByteSize;
    BYTE Parity;
    BYTE StopBits;
    char XonChar;
    char XoffChar;
    char ErrorChar;
    char EofChar;
    char EvtChar;
} DCB, *LPDCB;



typedef struct tagCOMMTIMEOUTS {
        DWORD ReadIntervalTimeout;
        DWORD ReadTotalTimeoutMultiplier;
        DWORD ReadTotalTimeoutConstant;
        DWORD WriteTotalTimeoutMultiplier;
        DWORD WriteTotalTimeoutConstant;
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;





#pragma pack()

typedef void __attribute__((__stdcall__)) (*PAPCFUNC)(ULONG_PTR);
typedef void __attribute__((__stdcall__)) (*PTIMERAPCROUTINE)(LPVOID,DWORD,DWORD);

WIN_BOOL __attribute__((__stdcall__)) ClearCommError(INT,LPDWORD,LPCOMSTAT);
WIN_BOOL __attribute__((__stdcall__)) BuildCommDCBA(LPCSTR,LPDCB);
WIN_BOOL __attribute__((__stdcall__)) BuildCommDCBW(LPCWSTR,LPDCB);

WIN_BOOL __attribute__((__stdcall__)) BuildCommDCBAndTimeoutsA(LPCSTR,LPDCB,LPCOMMTIMEOUTS);
WIN_BOOL __attribute__((__stdcall__)) BuildCommDCBAndTimeoutsW(LPCWSTR,LPDCB,LPCOMMTIMEOUTS);

WIN_BOOL __attribute__((__stdcall__)) GetCommTimeouts(HANDLE,LPCOMMTIMEOUTS);
WIN_BOOL __attribute__((__stdcall__)) SetCommTimeouts(HANDLE,LPCOMMTIMEOUTS);
WIN_BOOL __attribute__((__stdcall__)) GetCommState(INT,LPDCB);
WIN_BOOL __attribute__((__stdcall__)) SetCommState(INT,LPDCB);
WIN_BOOL __attribute__((__stdcall__)) TransmitCommChar(INT,CHAR);
WIN_BOOL __attribute__((__stdcall__)) SetupComm(HANDLE, DWORD, DWORD);
WIN_BOOL __attribute__((__stdcall__)) GetCommProperties(HANDLE, LPDCB *);


WIN_BOOL16 __attribute__((__stdcall__)) GetVersionEx16(OSVERSIONINFO16*);
WIN_BOOL __attribute__((__stdcall__)) GetVersionExA(OSVERSIONINFOA*);
WIN_BOOL __attribute__((__stdcall__)) GetVersionExW(OSVERSIONINFOW*);




void __attribute__((__stdcall__)) DeleteCriticalSection(CRITICAL_SECTION *lpCrit);
void __attribute__((__stdcall__)) EnterCriticalSection(CRITICAL_SECTION *lpCrit);
WIN_BOOL __attribute__((__stdcall__)) TryEnterCriticalSection(CRITICAL_SECTION *lpCrit);
void __attribute__((__stdcall__)) InitializeCriticalSection(CRITICAL_SECTION *lpCrit);
void __attribute__((__stdcall__)) LeaveCriticalSection(CRITICAL_SECTION *lpCrit);
void __attribute__((__stdcall__)) MakeCriticalSectionGlobal(CRITICAL_SECTION *lpCrit);
WIN_BOOL __attribute__((__stdcall__)) GetProcessWorkingSetSize(HANDLE,LPDWORD,LPDWORD);
DWORD __attribute__((__stdcall__)) QueueUserAPC(PAPCFUNC,HANDLE,ULONG_PTR);
void __attribute__((__stdcall__)) RaiseException(DWORD,DWORD,DWORD,const LPDWORD);
WIN_BOOL __attribute__((__stdcall__)) SetProcessWorkingSetSize(HANDLE,DWORD,DWORD);
WIN_BOOL __attribute__((__stdcall__)) TerminateProcess(HANDLE,DWORD);
WIN_BOOL __attribute__((__stdcall__)) TerminateThread(HANDLE,DWORD);
WIN_BOOL __attribute__((__stdcall__)) GetExitCodeThread(HANDLE,LPDWORD);
WIN_BOOL __attribute__((__stdcall__)) GetBinaryTypeA( LPCSTR lpApplicationName, LPDWORD lpBinaryType );
WIN_BOOL __attribute__((__stdcall__)) GetBinaryTypeW( LPCWSTR lpApplicationName, LPDWORD lpBinaryType );


WIN_BOOL16 __attribute__((__stdcall__)) GetWinDebugInfo16(LPWINDEBUGINFO,UINT16);
WIN_BOOL16 __attribute__((__stdcall__)) SetWinDebugInfo16(LPWINDEBUGINFO);



WIN_BOOL __attribute__((__stdcall__)) AttachThreadInput(DWORD,DWORD,WIN_BOOL);
WIN_BOOL __attribute__((__stdcall__)) AccessCheck(PSECURITY_DESCRIPTOR,HANDLE,DWORD,PGENERIC_MAPPING,PPRIVILEGE_SET,LPDWORD,LPDWORD,LPWIN_BOOL);
WIN_BOOL __attribute__((__stdcall__)) AdjustTokenPrivileges(HANDLE,WIN_BOOL,LPVOID,DWORD,LPVOID,LPDWORD);
WIN_BOOL __attribute__((__stdcall__)) AllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY,BYTE,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,PSID *);
WIN_BOOL __attribute__((__stdcall__)) AllocateLocallyUniqueId(PLUID);
WIN_BOOL __attribute__((__stdcall__)) AllocConsole(void);
WIN_BOOL __attribute__((__stdcall__)) AreFileApisANSI(void);
WIN_BOOL __attribute__((__stdcall__)) BackupEventLogA(HANDLE,LPCSTR);
WIN_BOOL __attribute__((__stdcall__)) BackupEventLogW(HANDLE,LPCWSTR);

WIN_BOOL __attribute__((__stdcall__)) Beep(DWORD,DWORD);
WIN_BOOL __attribute__((__stdcall__)) CancelWaitableTimer(HANDLE);
WIN_BOOL __attribute__((__stdcall__)) ClearEventLogA(HANDLE,LPCSTR);
WIN_BOOL __attribute__((__stdcall__)) ClearEventLogW(HANDLE,LPCWSTR);

WIN_BOOL __attribute__((__stdcall__)) CloseEventLog(HANDLE);
WIN_BOOL __attribute__((__stdcall__)) CloseHandle(HANDLE);
WIN_BOOL __attribute__((__stdcall__)) ContinueDebugEvent(DWORD,DWORD,DWORD);
HANDLE __attribute__((__stdcall__)) ConvertToGlobalHandle(HANDLE hSrc);
WIN_BOOL __attribute__((__stdcall__)) CopyFileA(LPCSTR,LPCSTR,WIN_BOOL);
WIN_BOOL __attribute__((__stdcall__)) CopyFileW(LPCWSTR,LPCWSTR,WIN_BOOL);

WIN_BOOL __attribute__((__stdcall__)) CopyFileExA(LPCSTR, LPCSTR, LPPROGRESS_ROUTINE, LPVOID, LPWIN_BOOL, DWORD);
WIN_BOOL __attribute__((__stdcall__)) CopyFileExW(LPCWSTR, LPCWSTR, LPPROGRESS_ROUTINE, LPVOID, LPWIN_BOOL, DWORD);

WIN_BOOL __attribute__((__stdcall__)) CopySid(DWORD,PSID,PSID);
INT __attribute__((__stdcall__)) CompareFileTime(LPFILETIME,LPFILETIME);
HANDLE __attribute__((__stdcall__)) CreateEventA(LPSECURITY_ATTRIBUTES,WIN_BOOL,WIN_BOOL,LPCSTR);
HANDLE __attribute__((__stdcall__)) CreateEventW(LPSECURITY_ATTRIBUTES,WIN_BOOL,WIN_BOOL,LPCWSTR);

HANDLE __attribute__((__stdcall__)) CreateFileA(LPCSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,
                                 DWORD,DWORD,HANDLE);
HANDLE __attribute__((__stdcall__)) CreateFileW(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,
                                 DWORD,DWORD,HANDLE);

HANDLE __attribute__((__stdcall__)) CreateFileMappingA(HANDLE,LPSECURITY_ATTRIBUTES,DWORD,
                                        DWORD,DWORD,LPCSTR);
HANDLE __attribute__((__stdcall__)) CreateFileMappingW(HANDLE,LPSECURITY_ATTRIBUTES,DWORD,
                                        DWORD,DWORD,LPCWSTR);

HANDLE __attribute__((__stdcall__)) CreateMutexA(LPSECURITY_ATTRIBUTES,WIN_BOOL,LPCSTR);
HANDLE __attribute__((__stdcall__)) CreateMutexW(LPSECURITY_ATTRIBUTES,WIN_BOOL,LPCWSTR);

WIN_BOOL __attribute__((__stdcall__)) CreatePipe(PHANDLE,PHANDLE,LPSECURITY_ATTRIBUTES,DWORD);
WIN_BOOL __attribute__((__stdcall__)) CreateProcessA(LPCSTR,LPSTR,LPSECURITY_ATTRIBUTES,
                                    LPSECURITY_ATTRIBUTES,WIN_BOOL,DWORD,LPVOID,LPCSTR,
                                    LPSTARTUPINFOA,LPPROCESS_INFORMATION);
WIN_BOOL __attribute__((__stdcall__)) CreateProcessW(LPCWSTR,LPWSTR,LPSECURITY_ATTRIBUTES,
                                    LPSECURITY_ATTRIBUTES,WIN_BOOL,DWORD,LPVOID,LPCWSTR,
                                    LPSTARTUPINFOW,LPPROCESS_INFORMATION);

HANDLE __attribute__((__stdcall__)) CreateSemaphoreA(LPSECURITY_ATTRIBUTES,LONG,LONG,LPCSTR);
HANDLE __attribute__((__stdcall__)) CreateSemaphoreW(LPSECURITY_ATTRIBUTES,LONG,LONG,LPCWSTR);

HANDLE __attribute__((__stdcall__)) CreateThread(LPSECURITY_ATTRIBUTES,DWORD,LPTHREAD_START_ROUTINE,LPVOID,DWORD,LPDWORD);
HANDLE __attribute__((__stdcall__)) CreateWaitableTimerA(LPSECURITY_ATTRIBUTES,WIN_BOOL,LPCSTR);
HANDLE __attribute__((__stdcall__)) CreateWaitableTimerW(LPSECURITY_ATTRIBUTES,WIN_BOOL,LPCWSTR);

WIN_BOOL __attribute__((__stdcall__)) DebugActiveProcess(DWORD);
void __attribute__((__stdcall__)) DebugBreak(void);
WIN_BOOL __attribute__((__stdcall__)) DeregisterEventSource(HANDLE);
WIN_BOOL __attribute__((__stdcall__)) DisableThreadLibraryCalls(HMODULE);
WIN_BOOL __attribute__((__stdcall__)) DosDateTimeToFileTime(WORD,WORD,LPFILETIME);
WIN_BOOL __attribute__((__stdcall__)) DuplicateHandle(HANDLE,HANDLE,HANDLE,HANDLE*,DWORD,WIN_BOOL,DWORD);
WIN_BOOL __attribute__((__stdcall__)) EnumDateFormatsA(DATEFMT_ENUMPROCA lpDateFmtEnumProc, LCID Locale, DWORD dwFlags);
WIN_BOOL __attribute__((__stdcall__)) EnumDateFormatsW(DATEFMT_ENUMPROCW lpDateFmtEnumProc, LCID Locale, DWORD dwFlags);

WIN_BOOL __attribute__((__stdcall__)) EnumResourceLanguagesA(HMODULE,LPCSTR,LPCSTR,
                                            ENUMRESLANGPROCA,LONG);
WIN_BOOL __attribute__((__stdcall__)) EnumResourceLanguagesW(HMODULE,LPCWSTR,LPCWSTR,
                                            ENUMRESLANGPROCW,LONG);

WIN_BOOL __attribute__((__stdcall__)) EnumResourceNamesA(HMODULE,LPCSTR,ENUMRESNAMEPROCA,
                                        LONG);
WIN_BOOL __attribute__((__stdcall__)) EnumResourceNamesW(HMODULE,LPCWSTR,ENUMRESNAMEPROCW,
                                        LONG);

WIN_BOOL __attribute__((__stdcall__)) EnumResourceTypesA(HMODULE,ENUMRESTYPEPROCA,LONG);
WIN_BOOL __attribute__((__stdcall__)) EnumResourceTypesW(HMODULE,ENUMRESTYPEPROCW,LONG);

WIN_BOOL __attribute__((__stdcall__)) EnumSystemCodePagesA(CODEPAGE_ENUMPROCA,DWORD);
WIN_BOOL __attribute__((__stdcall__)) EnumSystemCodePagesW(CODEPAGE_ENUMPROCW,DWORD);

WIN_BOOL __attribute__((__stdcall__)) EnumSystemLocalesA(LOCALE_ENUMPROCA,DWORD);
WIN_BOOL __attribute__((__stdcall__)) EnumSystemLocalesW(LOCALE_ENUMPROCW,DWORD);

WIN_BOOL __attribute__((__stdcall__)) EnumTimeFormatsA(TIMEFMT_ENUMPROCA lpTimeFmtEnumProc, LCID Locale, DWORD dwFlags);
WIN_BOOL __attribute__((__stdcall__)) EnumTimeFormatsW(TIMEFMT_ENUMPROCW lpTimeFmtEnumProc, LCID Locale, DWORD dwFlags);

WIN_BOOL __attribute__((__stdcall__)) EqualSid(PSID, PSID);
WIN_BOOL __attribute__((__stdcall__)) EqualPrefixSid(PSID,PSID);
VOID __attribute__((__stdcall__)) ExitProcess(DWORD) __attribute__((noreturn));
VOID __attribute__((__stdcall__)) ExitThread(DWORD) __attribute__((noreturn));
DWORD __attribute__((__stdcall__)) ExpandEnvironmentStringsA(LPCSTR,LPSTR,DWORD);
DWORD __attribute__((__stdcall__)) ExpandEnvironmentStringsW(LPCWSTR,LPWSTR,DWORD);

WIN_BOOL __attribute__((__stdcall__)) FileTimeToDosDateTime(const FILETIME*,LPWORD,LPWORD);
WIN_BOOL __attribute__((__stdcall__)) FileTimeToLocalFileTime(const FILETIME*,LPFILETIME);
WIN_BOOL __attribute__((__stdcall__)) FileTimeToSystemTime(const FILETIME*,LPSYSTEMTIME);
HANDLE __attribute__((__stdcall__)) FindFirstChangeNotificationA(LPCSTR,WIN_BOOL,DWORD);
HANDLE __attribute__((__stdcall__)) FindFirstChangeNotificationW(LPCWSTR,WIN_BOOL,DWORD);

WIN_BOOL __attribute__((__stdcall__)) FindNextChangeNotification(HANDLE);
WIN_BOOL __attribute__((__stdcall__)) FindCloseChangeNotification(HANDLE);
HRSRC __attribute__((__stdcall__)) FindResourceExA(HMODULE,LPCSTR,LPCSTR,WORD);
HRSRC __attribute__((__stdcall__)) FindResourceExW(HMODULE,LPCWSTR,LPCWSTR,WORD);

WIN_BOOL __attribute__((__stdcall__)) FlushConsoleInputBuffer(HANDLE);
WIN_BOOL __attribute__((__stdcall__)) FlushFileBuffers(HANDLE);
WIN_BOOL __attribute__((__stdcall__)) FlushViewOfFile(LPCVOID, DWORD);
DWORD __attribute__((__stdcall__)) FormatMessageA(DWORD,LPCVOID,DWORD,DWORD,LPSTR,
                                    DWORD,LPDWORD);
DWORD __attribute__((__stdcall__)) FormatMessageW(DWORD,LPCVOID,DWORD,DWORD,LPWSTR,
                                    DWORD,LPDWORD);

WIN_BOOL __attribute__((__stdcall__)) FreeConsole(void);
WIN_BOOL __attribute__((__stdcall__)) FreeEnvironmentStringsA(LPSTR);
WIN_BOOL __attribute__((__stdcall__)) FreeEnvironmentStringsW(LPWSTR);

PVOID __attribute__((__stdcall__)) FreeSid(PSID);
UINT __attribute__((__stdcall__)) GetACP(void);
LPCSTR __attribute__((__stdcall__)) GetCommandLineA(void);
LPCWSTR __attribute__((__stdcall__)) GetCommandLineW(void);

WIN_BOOL __attribute__((__stdcall__)) GetComputerNameA(LPSTR,LPDWORD);
WIN_BOOL __attribute__((__stdcall__)) GetComputerNameW(LPWSTR,LPDWORD);

UINT __attribute__((__stdcall__)) GetConsoleCP(void);
WIN_BOOL __attribute__((__stdcall__)) GetConsoleMode(HANDLE,LPDWORD);
UINT __attribute__((__stdcall__)) GetConsoleOutputCP(void);
DWORD __attribute__((__stdcall__)) GetConsoleTitleA(LPSTR,DWORD);
DWORD __attribute__((__stdcall__)) GetConsoleTitleW(LPWSTR,DWORD);

WIN_BOOL __attribute__((__stdcall__)) GetCommMask(HANDLE, LPDWORD);
WIN_BOOL __attribute__((__stdcall__)) GetCommModemStatus(HANDLE, LPDWORD);
HANDLE __attribute__((__stdcall__)) GetCurrentProcess(void);
HANDLE __attribute__((__stdcall__)) GetCurrentThread(void);
INT __attribute__((__stdcall__)) GetDateFormatA(LCID,DWORD,LPSYSTEMTIME,LPCSTR,LPSTR,INT);
INT __attribute__((__stdcall__)) GetDateFormatW(LCID,DWORD,LPSYSTEMTIME,LPCWSTR,LPWSTR,INT);

LPSTR __attribute__((__stdcall__)) GetEnvironmentStringsA(void);
LPWSTR __attribute__((__stdcall__)) GetEnvironmentStringsW(void);

DWORD __attribute__((__stdcall__)) GetEnvironmentVariableA(LPCSTR,LPSTR,DWORD);
DWORD __attribute__((__stdcall__)) GetEnvironmentVariableW(LPCWSTR,LPWSTR,DWORD);

WIN_BOOL __attribute__((__stdcall__)) GetFileAttributesExA(LPCSTR,GET_FILEEX_INFO_LEVELS,LPVOID);
WIN_BOOL __attribute__((__stdcall__)) GetFileAttributesExW(LPCWSTR,GET_FILEEX_INFO_LEVELS,LPVOID);

DWORD __attribute__((__stdcall__)) GetFileInformationByHandle(HANDLE,BY_HANDLE_FILE_INFORMATION*);
WIN_BOOL __attribute__((__stdcall__)) GetFileSecurityA(LPCSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,LPDWORD);
WIN_BOOL __attribute__((__stdcall__)) GetFileSecurityW(LPCWSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,LPDWORD);

DWORD __attribute__((__stdcall__)) GetFileSize(HANDLE,LPDWORD);
WIN_BOOL __attribute__((__stdcall__)) GetFileTime(HANDLE,LPFILETIME,LPFILETIME,LPFILETIME);
DWORD __attribute__((__stdcall__)) GetFileType(HANDLE);
DWORD __attribute__((__stdcall__)) GetFullPathNameA(LPCSTR,DWORD,LPSTR,LPSTR*);
DWORD __attribute__((__stdcall__)) GetFullPathNameW(LPCWSTR,DWORD,LPWSTR,LPWSTR*);

WIN_BOOL __attribute__((__stdcall__)) GetHandleInformation(HANDLE,LPDWORD);
COORD __attribute__((__stdcall__)) GetLargestConsoleWindowSize(HANDLE);
DWORD __attribute__((__stdcall__)) GetLengthSid(PSID);
VOID __attribute__((__stdcall__)) GetLocalTime(LPSYSTEMTIME);
DWORD __attribute__((__stdcall__)) GetLogicalDrives(void);
DWORD __attribute__((__stdcall__)) GetLongPathNameA(LPCSTR,LPSTR,DWORD);
DWORD __attribute__((__stdcall__)) GetLongPathNameW(LPCWSTR,LPWSTR,DWORD);

WIN_BOOL __attribute__((__stdcall__)) GetNumberOfConsoleInputEvents(HANDLE,LPDWORD);
WIN_BOOL __attribute__((__stdcall__)) GetNumberOfConsoleMouseButtons(LPDWORD);
WIN_BOOL __attribute__((__stdcall__)) GetNumberOfEventLogRecords(HANDLE,PDWORD);
UINT __attribute__((__stdcall__)) GetOEMCP(void);
WIN_BOOL __attribute__((__stdcall__)) GetOldestEventLogRecord(HANDLE,PDWORD);
DWORD __attribute__((__stdcall__)) GetPriorityClass(HANDLE);
DWORD __attribute__((__stdcall__)) GetProcessVersion(DWORD);
WIN_BOOL __attribute__((__stdcall__)) GetSecurityDescriptorControl(PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR_CONTROL,LPDWORD);
WIN_BOOL __attribute__((__stdcall__)) GetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR,LPWIN_BOOL,PACL *,LPWIN_BOOL);
WIN_BOOL __attribute__((__stdcall__)) GetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR,PSID *,LPWIN_BOOL);
DWORD __attribute__((__stdcall__)) GetSecurityDescriptorLength(PSECURITY_DESCRIPTOR);
WIN_BOOL __attribute__((__stdcall__)) GetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR,PSID *,LPWIN_BOOL);
WIN_BOOL __attribute__((__stdcall__)) GetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR,LPWIN_BOOL,PACL *,LPWIN_BOOL);
PSID_IDENTIFIER_AUTHORITY __attribute__((__stdcall__)) GetSidIdentifierAuthority(PSID);
DWORD __attribute__((__stdcall__)) GetSidLengthRequired(BYTE);
PDWORD __attribute__((__stdcall__)) GetSidSubAuthority(PSID,DWORD);
PUCHAR __attribute__((__stdcall__)) GetSidSubAuthorityCount(PSID);
DWORD __attribute__((__stdcall__)) GetShortPathNameA(LPCSTR,LPSTR,DWORD);
DWORD __attribute__((__stdcall__)) GetShortPathNameW(LPCWSTR,LPWSTR,DWORD);

HFILE __attribute__((__stdcall__)) GetStdHandle(DWORD);
WIN_BOOL __attribute__((__stdcall__)) GetStringTypeExA(LCID,DWORD,LPCSTR,INT,LPWORD);
WIN_BOOL __attribute__((__stdcall__)) GetStringTypeExW(LCID,DWORD,LPCWSTR,INT,LPWORD);

VOID __attribute__((__stdcall__)) GetSystemInfo(LPSYSTEM_INFO);
WIN_BOOL __attribute__((__stdcall__)) GetSystemPowerStatus(LPSYSTEM_POWER_STATUS);
VOID __attribute__((__stdcall__)) GetSystemTime(LPSYSTEMTIME);
VOID __attribute__((__stdcall__)) GetSystemTimeAsFileTime(LPFILETIME);
INT __attribute__((__stdcall__)) GetTimeFormatA(LCID,DWORD,LPSYSTEMTIME,LPCSTR,LPSTR,INT);
INT __attribute__((__stdcall__)) GetTimeFormatW(LCID,DWORD,LPSYSTEMTIME,LPCWSTR,LPWSTR,INT);

WIN_BOOL __attribute__((__stdcall__)) GetThreadContext(HANDLE,CONTEXT *);
LCID __attribute__((__stdcall__)) GetThreadLocale(void);
INT __attribute__((__stdcall__)) GetThreadPriority(HANDLE);
WIN_BOOL __attribute__((__stdcall__)) GetThreadSelectorEntry(HANDLE,DWORD,LPLDT_ENTRY);
WIN_BOOL __attribute__((__stdcall__)) GetThreadTimes(HANDLE,LPFILETIME,LPFILETIME,LPFILETIME,LPFILETIME);
WIN_BOOL __attribute__((__stdcall__)) GetTokenInformation(HANDLE,TOKEN_INFORMATION_CLASS,LPVOID,DWORD,LPDWORD);
WIN_BOOL __attribute__((__stdcall__)) GetUserNameA(LPSTR,LPDWORD);
WIN_BOOL __attribute__((__stdcall__)) GetUserNameW(LPWSTR,LPDWORD);

VOID __attribute__((__stdcall__)) GlobalMemoryStatus(LPMEMORYSTATUS);
LPVOID __attribute__((__stdcall__)) HeapAlloc(HANDLE,DWORD,DWORD);
DWORD __attribute__((__stdcall__)) HeapCompact(HANDLE,DWORD);
HANDLE __attribute__((__stdcall__)) HeapCreate(DWORD,DWORD,DWORD);
WIN_BOOL __attribute__((__stdcall__)) HeapDestroy(HANDLE);
WIN_BOOL __attribute__((__stdcall__)) HeapFree(HANDLE,DWORD,LPVOID);
WIN_BOOL __attribute__((__stdcall__)) HeapLock(HANDLE);
LPVOID __attribute__((__stdcall__)) HeapReAlloc(HANDLE,DWORD,LPVOID,DWORD);
DWORD __attribute__((__stdcall__)) HeapSize(HANDLE,DWORD,LPVOID);
WIN_BOOL __attribute__((__stdcall__)) HeapUnlock(HANDLE);
WIN_BOOL __attribute__((__stdcall__)) HeapValidate(HANDLE,DWORD,LPCVOID);
WIN_BOOL __attribute__((__stdcall__)) HeapWalk(HANDLE,LPPROCESS_HEAP_ENTRY);
WIN_BOOL __attribute__((__stdcall__)) InitializeSid(PSID,PSID_IDENTIFIER_AUTHORITY,BYTE);
WIN_BOOL __attribute__((__stdcall__)) IsValidSecurityDescriptor(PSECURITY_DESCRIPTOR);
WIN_BOOL __attribute__((__stdcall__)) IsValidSid(PSID);
WIN_BOOL __attribute__((__stdcall__)) ImpersonateSelf(SECURITY_IMPERSONATION_LEVEL);
WIN_BOOL __attribute__((__stdcall__)) IsDBCSLeadByteEx(UINT,BYTE);
WIN_BOOL __attribute__((__stdcall__)) IsProcessorFeaturePresent(DWORD);
WIN_BOOL __attribute__((__stdcall__)) IsValidLocale(DWORD,DWORD);
WIN_BOOL __attribute__((__stdcall__)) LookupAccountSidA(LPCSTR,PSID,LPSTR,LPDWORD,LPSTR,LPDWORD,PSID_NAME_USE);
WIN_BOOL __attribute__((__stdcall__)) LookupAccountSidW(LPCWSTR,PSID,LPWSTR,LPDWORD,LPWSTR,LPDWORD,PSID_NAME_USE);

WIN_BOOL __attribute__((__stdcall__)) LocalFileTimeToFileTime(const FILETIME*,LPFILETIME);
WIN_BOOL __attribute__((__stdcall__)) LockFile(HANDLE,DWORD,DWORD,DWORD,DWORD);
WIN_BOOL __attribute__((__stdcall__)) LockFileEx(HANDLE, DWORD, DWORD, DWORD, DWORD, LPOVERLAPPED);
WIN_BOOL __attribute__((__stdcall__)) LookupPrivilegeValueA(LPCSTR,LPCSTR,LPVOID);
WIN_BOOL __attribute__((__stdcall__)) LookupPrivilegeValueW(LPCWSTR,LPCWSTR,LPVOID);

WIN_BOOL __attribute__((__stdcall__)) MakeSelfRelativeSD(PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR,LPDWORD);
HMODULE __attribute__((__stdcall__)) MapHModuleSL(HMODULE16);
HMODULE16 __attribute__((__stdcall__)) MapHModuleLS(HMODULE);
SEGPTR __attribute__((__stdcall__)) MapLS(LPVOID);
LPVOID __attribute__((__stdcall__)) MapSL(SEGPTR);
LPVOID __attribute__((__stdcall__)) MapViewOfFile(HANDLE,DWORD,DWORD,DWORD,DWORD);
LPVOID __attribute__((__stdcall__)) MapViewOfFileEx(HANDLE,DWORD,DWORD,DWORD,DWORD,LPVOID);
WIN_BOOL __attribute__((__stdcall__)) MoveFileA(LPCSTR,LPCSTR);
WIN_BOOL __attribute__((__stdcall__)) MoveFileW(LPCWSTR,LPCWSTR);

WIN_BOOL __attribute__((__stdcall__)) MoveFileExA(LPCSTR,LPCSTR,DWORD);
WIN_BOOL __attribute__((__stdcall__)) MoveFileExW(LPCWSTR,LPCWSTR,DWORD);

INT __attribute__((__stdcall__)) MultiByteToWideChar(UINT,DWORD,LPCSTR,INT,LPWSTR,INT);
WIN_BOOL __attribute__((__stdcall__)) NotifyChangeEventLog(HANDLE,HANDLE);
INT __attribute__((__stdcall__)) WideCharToMultiByte(UINT,DWORD,LPCWSTR,INT,LPSTR,INT,LPCSTR,WIN_BOOL*);
HANDLE __attribute__((__stdcall__)) OpenBackupEventLogA(LPCSTR,LPCSTR);
HANDLE __attribute__((__stdcall__)) OpenBackupEventLogW(LPCWSTR,LPCWSTR);

HANDLE __attribute__((__stdcall__)) OpenEventA(DWORD,WIN_BOOL,LPCSTR);
HANDLE __attribute__((__stdcall__)) OpenEventW(DWORD,WIN_BOOL,LPCWSTR);

HANDLE __attribute__((__stdcall__)) OpenEventLogA(LPCSTR,LPCSTR);
HANDLE __attribute__((__stdcall__)) OpenEventLogW(LPCWSTR,LPCWSTR);

HANDLE __attribute__((__stdcall__)) OpenFileMappingA(DWORD,WIN_BOOL,LPCSTR);
HANDLE __attribute__((__stdcall__)) OpenFileMappingW(DWORD,WIN_BOOL,LPCWSTR);

HANDLE __attribute__((__stdcall__)) OpenMutexA(DWORD,WIN_BOOL,LPCSTR);
HANDLE __attribute__((__stdcall__)) OpenMutexW(DWORD,WIN_BOOL,LPCWSTR);

HANDLE __attribute__((__stdcall__)) OpenProcess(DWORD,WIN_BOOL,DWORD);
WIN_BOOL __attribute__((__stdcall__)) OpenProcessToken(HANDLE,DWORD,PHANDLE);
HANDLE __attribute__((__stdcall__)) OpenSemaphoreA(DWORD,WIN_BOOL,LPCSTR);
HANDLE __attribute__((__stdcall__)) OpenSemaphoreW(DWORD,WIN_BOOL,LPCWSTR);

WIN_BOOL __attribute__((__stdcall__)) OpenThreadToken(HANDLE,DWORD,WIN_BOOL,PHANDLE);
HANDLE __attribute__((__stdcall__)) OpenWaitableTimerA(DWORD,WIN_BOOL,LPCSTR);
HANDLE __attribute__((__stdcall__)) OpenWaitableTimerW(DWORD,WIN_BOOL,LPCWSTR);

WIN_BOOL __attribute__((__stdcall__)) PulseEvent(HANDLE);
WIN_BOOL __attribute__((__stdcall__)) PurgeComm(HANDLE,DWORD);
DWORD __attribute__((__stdcall__)) QueryDosDeviceA(LPCSTR,LPSTR,DWORD);
DWORD __attribute__((__stdcall__)) QueryDosDeviceW(LPCWSTR,LPWSTR,DWORD);

WIN_BOOL __attribute__((__stdcall__)) QueryPerformanceCounter(PLARGE_INTEGER);
WIN_BOOL __attribute__((__stdcall__)) ReadConsoleA(HANDLE,LPVOID,DWORD,LPDWORD,LPVOID);
WIN_BOOL __attribute__((__stdcall__)) ReadConsoleW(HANDLE,LPVOID,DWORD,LPDWORD,LPVOID);

WIN_BOOL __attribute__((__stdcall__)) ReadConsoleOutputCharacterA(HANDLE,LPSTR,DWORD,
                                                 COORD,LPDWORD);

WIN_BOOL __attribute__((__stdcall__)) ReadEventLogA(HANDLE,DWORD,DWORD,LPVOID,DWORD,DWORD *,DWORD *);
WIN_BOOL __attribute__((__stdcall__)) ReadEventLogW(HANDLE,DWORD,DWORD,LPVOID,DWORD,DWORD *,DWORD *);

WIN_BOOL __attribute__((__stdcall__)) ReadFile(HANDLE,LPVOID,DWORD,LPDWORD,LPOVERLAPPED);
HANDLE __attribute__((__stdcall__)) RegisterEventSourceA(LPCSTR,LPCSTR);
HANDLE __attribute__((__stdcall__)) RegisterEventSourceW(LPCWSTR,LPCWSTR);

WIN_BOOL __attribute__((__stdcall__)) ReleaseMutex(HANDLE);
WIN_BOOL __attribute__((__stdcall__)) ReleaseSemaphore(HANDLE,LONG,LPLONG);
WIN_BOOL __attribute__((__stdcall__)) ReportEventA(HANDLE,WORD,WORD,DWORD,PSID,WORD,DWORD,LPCSTR *,LPVOID);
WIN_BOOL __attribute__((__stdcall__)) ReportEventW(HANDLE,WORD,WORD,DWORD,PSID,WORD,DWORD,LPCWSTR *,LPVOID);

WIN_BOOL __attribute__((__stdcall__)) ResetEvent(HANDLE);
DWORD __attribute__((__stdcall__)) ResumeThread(HANDLE);
WIN_BOOL __attribute__((__stdcall__)) RevertToSelf(void);
DWORD __attribute__((__stdcall__)) SearchPathA(LPCSTR,LPCSTR,LPCSTR,DWORD,LPSTR,LPSTR*);
DWORD __attribute__((__stdcall__)) SearchPathW(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,LPWSTR,LPWSTR*);

WIN_BOOL __attribute__((__stdcall__)) SetCommMask(INT,DWORD);
WIN_BOOL __attribute__((__stdcall__)) SetComputerNameA(LPCSTR);
WIN_BOOL __attribute__((__stdcall__)) SetComputerNameW(LPCWSTR);

WIN_BOOL __attribute__((__stdcall__)) SetConsoleCursorPosition(HANDLE,COORD);
WIN_BOOL __attribute__((__stdcall__)) SetConsoleMode(HANDLE,DWORD);
WIN_BOOL __attribute__((__stdcall__)) SetConsoleTitleA(LPCSTR);
WIN_BOOL __attribute__((__stdcall__)) SetConsoleTitleW(LPCWSTR);

WIN_BOOL __attribute__((__stdcall__)) SetEndOfFile(HANDLE);
WIN_BOOL __attribute__((__stdcall__)) SetEnvironmentVariableA(LPCSTR,LPCSTR);
WIN_BOOL __attribute__((__stdcall__)) SetEnvironmentVariableW(LPCWSTR,LPCWSTR);

WIN_BOOL __attribute__((__stdcall__)) SetEvent(HANDLE);
VOID __attribute__((__stdcall__)) SetFileApisToANSI(void);
VOID __attribute__((__stdcall__)) SetFileApisToOEM(void);
DWORD __attribute__((__stdcall__)) SetFilePointer(HANDLE,LONG,LPLONG,DWORD);
WIN_BOOL __attribute__((__stdcall__)) SetFileSecurityA(LPCSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR);
WIN_BOOL __attribute__((__stdcall__)) SetFileSecurityW(LPCWSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR);

WIN_BOOL __attribute__((__stdcall__)) SetFileTime(HANDLE,const FILETIME*,const FILETIME*,const FILETIME*);
WIN_BOOL __attribute__((__stdcall__)) SetHandleInformation(HANDLE,DWORD,DWORD);
WIN_BOOL __attribute__((__stdcall__)) SetPriorityClass(HANDLE,DWORD);
WIN_BOOL __attribute__((__stdcall__)) SetLocalTime(const SYSTEMTIME*);
WIN_BOOL __attribute__((__stdcall__)) SetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR,WIN_BOOL,PACL,WIN_BOOL);
WIN_BOOL __attribute__((__stdcall__)) SetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR,PSID,WIN_BOOL);
WIN_BOOL __attribute__((__stdcall__)) SetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR,PSID,WIN_BOOL);
WIN_BOOL __attribute__((__stdcall__)) SetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR,WIN_BOOL,PACL,WIN_BOOL);
WIN_BOOL __attribute__((__stdcall__)) SetStdHandle(DWORD,HANDLE);
WIN_BOOL __attribute__((__stdcall__)) SetSystemPowerState(WIN_BOOL,WIN_BOOL);
WIN_BOOL __attribute__((__stdcall__)) SetSystemTime(const SYSTEMTIME*);
DWORD __attribute__((__stdcall__)) SetThreadAffinityMask(HANDLE,DWORD);
WIN_BOOL __attribute__((__stdcall__)) SetThreadContext(HANDLE,const CONTEXT *);
WIN_BOOL __attribute__((__stdcall__)) SetThreadLocale(LCID);
WIN_BOOL __attribute__((__stdcall__)) SetThreadPriority(HANDLE,INT);
WIN_BOOL __attribute__((__stdcall__)) SetTimeZoneInformation(const LPTIME_ZONE_INFORMATION);
WIN_BOOL __attribute__((__stdcall__)) SetWaitableTimer(HANDLE,const LARGE_INTEGER*,LONG,PTIMERAPCROUTINE,LPVOID,WIN_BOOL);
VOID __attribute__((__stdcall__)) Sleep(DWORD);
DWORD __attribute__((__stdcall__)) SleepEx(DWORD,WIN_BOOL);
DWORD __attribute__((__stdcall__)) SuspendThread(HANDLE);
WIN_BOOL __attribute__((__stdcall__)) SystemTimeToFileTime(const SYSTEMTIME*,LPFILETIME);
DWORD __attribute__((__stdcall__)) TlsAlloc(void);
WIN_BOOL __attribute__((__stdcall__)) TlsFree(DWORD);
LPVOID __attribute__((__stdcall__)) TlsGetValue(DWORD);
WIN_BOOL __attribute__((__stdcall__)) TlsSetValue(DWORD,LPVOID);
VOID __attribute__((__stdcall__)) UnMapLS(SEGPTR);
WIN_BOOL __attribute__((__stdcall__)) UnlockFile(HANDLE,DWORD,DWORD,DWORD,DWORD);
WIN_BOOL __attribute__((__stdcall__)) UnmapViewOfFile(LPVOID);
LPVOID __attribute__((__stdcall__)) VirtualAlloc(LPVOID,DWORD,DWORD,DWORD);
WIN_BOOL __attribute__((__stdcall__)) VirtualFree(LPVOID,DWORD,DWORD);
WIN_BOOL __attribute__((__stdcall__)) VirtualLock(LPVOID,DWORD);
WIN_BOOL __attribute__((__stdcall__)) VirtualProtect(LPVOID,DWORD,DWORD,LPDWORD);
WIN_BOOL __attribute__((__stdcall__)) VirtualProtectEx(HANDLE,LPVOID,DWORD,DWORD,LPDWORD);
DWORD __attribute__((__stdcall__)) VirtualQuery(LPCVOID,LPMEMORY_BASIC_INFORMATION,DWORD);
DWORD __attribute__((__stdcall__)) VirtualQueryEx(HANDLE,LPCVOID,LPMEMORY_BASIC_INFORMATION,DWORD);
WIN_BOOL __attribute__((__stdcall__)) VirtualUnlock(LPVOID,DWORD);
WIN_BOOL __attribute__((__stdcall__)) WaitCommEvent(HANDLE,LPDWORD,LPOVERLAPPED);
WIN_BOOL __attribute__((__stdcall__)) WaitForDebugEvent(LPDEBUG_EVENT,DWORD);
DWORD __attribute__((__stdcall__)) WaitForMultipleObjects(DWORD,const HANDLE*,WIN_BOOL,DWORD);
DWORD __attribute__((__stdcall__)) WaitForMultipleObjectsEx(DWORD,const HANDLE*,WIN_BOOL,DWORD,WIN_BOOL);
DWORD __attribute__((__stdcall__)) WaitForSingleObject(HANDLE,DWORD);
DWORD __attribute__((__stdcall__)) WaitForSingleObjectEx(HANDLE,DWORD,WIN_BOOL);
WIN_BOOL __attribute__((__stdcall__)) WriteConsoleA(HANDLE,LPCVOID,DWORD,LPDWORD,LPVOID);
WIN_BOOL __attribute__((__stdcall__)) WriteConsoleW(HANDLE,LPCVOID,DWORD,LPDWORD,LPVOID);

WIN_BOOL __attribute__((__stdcall__)) WriteFile(HANDLE,LPCVOID,DWORD,LPDWORD,LPOVERLAPPED);
LANGID __attribute__((__stdcall__)) GetSystemDefaultLangID(void);
LCID __attribute__((__stdcall__)) GetSystemDefaultLCID(void);
LANGID __attribute__((__stdcall__)) GetUserDefaultLangID(void);
LCID __attribute__((__stdcall__)) GetUserDefaultLCID(void);
ATOM __attribute__((__stdcall__)) AddAtomA(LPCSTR);
ATOM __attribute__((__stdcall__)) AddAtomW(LPCWSTR);

UINT __attribute__((__stdcall__)) CompareStringA(DWORD,DWORD,LPCSTR,DWORD,LPCSTR,DWORD);
UINT __attribute__((__stdcall__)) CompareStringW(DWORD,DWORD,LPCWSTR,DWORD,LPCWSTR,DWORD);

WIN_BOOL __attribute__((__stdcall__)) CreateDirectoryA(LPCSTR,LPSECURITY_ATTRIBUTES);
WIN_BOOL __attribute__((__stdcall__)) CreateDirectoryW(LPCWSTR,LPSECURITY_ATTRIBUTES);

WIN_BOOL __attribute__((__stdcall__)) CreateDirectoryExA(LPCSTR,LPCSTR,LPSECURITY_ATTRIBUTES);
WIN_BOOL __attribute__((__stdcall__)) CreateDirectoryExW(LPCWSTR,LPCWSTR,LPSECURITY_ATTRIBUTES);

WIN_BOOL __attribute__((__stdcall__)) DefineDosDeviceA(DWORD,LPCSTR,LPCSTR);

ATOM __attribute__((__stdcall__)) DeleteAtom(ATOM);
WIN_BOOL __attribute__((__stdcall__)) DeleteFileA(LPCSTR);
WIN_BOOL __attribute__((__stdcall__)) DeleteFileW(LPCWSTR);

void __attribute__((__stdcall__)) FatalAppExitA(UINT,LPCSTR);
void __attribute__((__stdcall__)) FatalAppExitW(UINT,LPCWSTR);

ATOM __attribute__((__stdcall__)) FindAtomA(LPCSTR);
ATOM __attribute__((__stdcall__)) FindAtomW(LPCWSTR);

WIN_BOOL __attribute__((__stdcall__)) FindClose(HANDLE);
HANDLE16 __attribute__((__stdcall__)) FindFirstFile16(LPCSTR,LPWIN32_FIND_DATAA);
HANDLE __attribute__((__stdcall__)) FindFirstFileA(LPCSTR,LPWIN32_FIND_DATAA);
HANDLE __attribute__((__stdcall__)) FindFirstFileW(LPCWSTR,LPWIN32_FIND_DATAW);

WIN_BOOL16 __attribute__((__stdcall__)) FindNextFile16(HANDLE16,LPWIN32_FIND_DATAA);
WIN_BOOL __attribute__((__stdcall__)) FindNextFileA(HANDLE,LPWIN32_FIND_DATAA);
WIN_BOOL __attribute__((__stdcall__)) FindNextFileW(HANDLE,LPWIN32_FIND_DATAW);

HRSRC __attribute__((__stdcall__)) FindResourceA(HMODULE,LPCSTR,LPCSTR);
HRSRC __attribute__((__stdcall__)) FindResourceW(HMODULE,LPCWSTR,LPCWSTR);

VOID __attribute__((__stdcall__)) FreeLibrary16(HINSTANCE16);
WIN_BOOL __attribute__((__stdcall__)) FreeLibrary(HMODULE);


WIN_BOOL __attribute__((__stdcall__)) FreeResource(HGLOBAL);
UINT __attribute__((__stdcall__)) GetAtomNameA(ATOM,LPSTR,INT);
UINT __attribute__((__stdcall__)) GetAtomNameW(ATOM,LPWSTR,INT);

UINT __attribute__((__stdcall__)) GetCurrentDirectoryA(UINT,LPSTR);
UINT __attribute__((__stdcall__)) GetCurrentDirectoryW(UINT,LPWSTR);

WIN_BOOL __attribute__((__stdcall__)) GetDiskFreeSpaceA(LPCSTR,LPDWORD,LPDWORD,LPDWORD,LPDWORD);
WIN_BOOL __attribute__((__stdcall__)) GetDiskFreeSpaceW(LPCWSTR,LPDWORD,LPDWORD,LPDWORD,LPDWORD);

WIN_BOOL __attribute__((__stdcall__)) GetDiskFreeSpaceExA(LPCSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER);
WIN_BOOL __attribute__((__stdcall__)) GetDiskFreeSpaceExW(LPCWSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER);

UINT __attribute__((__stdcall__)) GetDriveTypeA(LPCSTR);
UINT __attribute__((__stdcall__)) GetDriveTypeW(LPCWSTR);

DWORD __attribute__((__stdcall__)) GetFileAttributesA(LPCSTR);
DWORD __attribute__((__stdcall__)) GetFileAttributesW(LPCWSTR);


UINT __attribute__((__stdcall__)) GetLogicalDriveStringsA(UINT,LPSTR);
UINT __attribute__((__stdcall__)) GetLogicalDriveStringsW(UINT,LPWSTR);

INT __attribute__((__stdcall__)) GetLocaleInfoA(LCID,LCTYPE,LPSTR,INT);
INT __attribute__((__stdcall__)) GetLocaleInfoW(LCID,LCTYPE,LPWSTR,INT);

DWORD __attribute__((__stdcall__)) GetModuleFileNameA(HMODULE,LPSTR,DWORD);
DWORD __attribute__((__stdcall__)) GetModuleFileNameW(HMODULE,LPWSTR,DWORD);

HMODULE __attribute__((__stdcall__)) GetModuleHandleA(LPCSTR);
HMODULE __attribute__((__stdcall__)) GetModuleHandleW(LPCWSTR);

WIN_BOOL __attribute__((__stdcall__)) GetOverlappedResult(HANDLE,LPOVERLAPPED,LPDWORD,WIN_BOOL);
UINT __attribute__((__stdcall__)) GetPrivateProfileIntA(LPCSTR,LPCSTR,INT,LPCSTR);
UINT __attribute__((__stdcall__)) GetPrivateProfileIntW(LPCWSTR,LPCWSTR,INT,LPCWSTR);

INT __attribute__((__stdcall__)) GetPrivateProfileSectionA(LPCSTR,LPSTR,DWORD,LPCSTR);
INT __attribute__((__stdcall__)) GetPrivateProfileSectionW(LPCWSTR,LPWSTR,DWORD,LPCWSTR);

DWORD __attribute__((__stdcall__)) GetPrivateProfileSectionNamesA(LPSTR,DWORD,LPCSTR);
DWORD __attribute__((__stdcall__)) GetPrivateProfileSectionNamesW(LPWSTR,DWORD,LPCWSTR);

INT __attribute__((__stdcall__)) GetPrivateProfileStringA(LPCSTR,LPCSTR,LPCSTR,LPSTR,UINT,LPCSTR);
INT __attribute__((__stdcall__)) GetPrivateProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,UINT,LPCWSTR);

WIN_BOOL __attribute__((__stdcall__)) GetPrivateProfileStructA(LPCSTR,LPCSTR,LPVOID,UINT,LPCSTR);
WIN_BOOL __attribute__((__stdcall__)) GetPrivateProfileStructW(LPCWSTR,LPCWSTR,LPVOID,UINT,LPCWSTR);

FARPROC __attribute__((__stdcall__)) GetProcAddress(HMODULE,LPCSTR);
UINT __attribute__((__stdcall__)) GetProfileIntA(LPCSTR,LPCSTR,INT);
UINT __attribute__((__stdcall__)) GetProfileIntW(LPCWSTR,LPCWSTR,INT);

INT __attribute__((__stdcall__)) GetProfileSectionA(LPCSTR,LPSTR,DWORD);
INT __attribute__((__stdcall__)) GetProfileSectionW(LPCWSTR,LPWSTR,DWORD);

INT __attribute__((__stdcall__)) GetProfileStringA(LPCSTR,LPCSTR,LPCSTR,LPSTR,UINT);
INT __attribute__((__stdcall__)) GetProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,UINT);

VOID __attribute__((__stdcall__)) GetStartupInfoA(LPSTARTUPINFOA);
VOID __attribute__((__stdcall__)) GetStartupInfoW(LPSTARTUPINFOW);

WIN_BOOL __attribute__((__stdcall__)) GetStringTypeA(LCID,DWORD,LPCSTR,INT,LPWORD);
WIN_BOOL __attribute__((__stdcall__)) GetStringTypeW(DWORD,LPCWSTR,INT,LPWORD);

UINT __attribute__((__stdcall__)) GetSystemDirectoryA(LPSTR,UINT);
UINT __attribute__((__stdcall__)) GetSystemDirectoryW(LPWSTR,UINT);

UINT __attribute__((__stdcall__)) GetTempFileNameA(LPCSTR,LPCSTR,UINT,LPSTR);
UINT __attribute__((__stdcall__)) GetTempFileNameW(LPCWSTR,LPCWSTR,UINT,LPWSTR);

UINT __attribute__((__stdcall__)) GetTempPathA(UINT,LPSTR);
UINT __attribute__((__stdcall__)) GetTempPathW(UINT,LPWSTR);

LONG __attribute__((__stdcall__)) GetVersion(void);
WIN_BOOL __attribute__((__stdcall__)) GetExitCodeProcess(HANDLE,LPDWORD);
WIN_BOOL __attribute__((__stdcall__)) GetVolumeInformationA(LPCSTR,LPSTR,DWORD,LPDWORD,LPDWORD,LPDWORD,LPSTR,DWORD);
WIN_BOOL __attribute__((__stdcall__)) GetVolumeInformationW(LPCWSTR,LPWSTR,DWORD,LPDWORD,LPDWORD,LPDWORD,LPWSTR,DWORD);

UINT __attribute__((__stdcall__)) GetWindowsDirectoryA(LPSTR,UINT);
UINT __attribute__((__stdcall__)) GetWindowsDirectoryW(LPWSTR,UINT);

HGLOBAL16 __attribute__((__stdcall__)) GlobalAlloc16(UINT16,DWORD);
HGLOBAL __attribute__((__stdcall__)) GlobalAlloc(UINT,DWORD);
DWORD __attribute__((__stdcall__)) GlobalCompact(DWORD);
UINT __attribute__((__stdcall__)) GlobalFlags(HGLOBAL);
HGLOBAL16 __attribute__((__stdcall__)) GlobalFree16(HGLOBAL16);
HGLOBAL __attribute__((__stdcall__)) GlobalFree(HGLOBAL);
HGLOBAL __attribute__((__stdcall__)) GlobalHandle(LPCVOID);
WORD __attribute__((__stdcall__)) GlobalFix16(HGLOBAL16);
VOID __attribute__((__stdcall__)) GlobalFix(HGLOBAL);
LPVOID __attribute__((__stdcall__)) GlobalLock16(HGLOBAL16);
LPVOID __attribute__((__stdcall__)) GlobalLock(HGLOBAL);
HGLOBAL __attribute__((__stdcall__)) GlobalReAlloc(HGLOBAL,DWORD,UINT);
DWORD __attribute__((__stdcall__)) GlobalSize16(HGLOBAL16);
DWORD __attribute__((__stdcall__)) GlobalSize(HGLOBAL);
VOID __attribute__((__stdcall__)) GlobalUnfix16(HGLOBAL16);
VOID __attribute__((__stdcall__)) GlobalUnfix(HGLOBAL);
WIN_BOOL16 __attribute__((__stdcall__)) GlobalUnlock16(HGLOBAL16);
WIN_BOOL __attribute__((__stdcall__)) GlobalUnlock(HGLOBAL);
WIN_BOOL16 __attribute__((__stdcall__)) GlobalUnWire16(HGLOBAL16);
WIN_BOOL __attribute__((__stdcall__)) GlobalUnWire(HGLOBAL);
SEGPTR __attribute__((__stdcall__)) GlobalWire16(HGLOBAL16);
LPVOID __attribute__((__stdcall__)) GlobalWire(HGLOBAL);
WIN_BOOL __attribute__((__stdcall__)) InitAtomTable(DWORD);
WIN_BOOL __attribute__((__stdcall__)) IsBadCodePtr(FARPROC);
WIN_BOOL __attribute__((__stdcall__)) IsBadHugeReadPtr(LPCVOID,UINT);
WIN_BOOL __attribute__((__stdcall__)) IsBadHugeWritePtr(LPVOID,UINT);
WIN_BOOL __attribute__((__stdcall__)) IsBadReadPtr(LPCVOID,UINT);
WIN_BOOL __attribute__((__stdcall__)) IsBadStringPtrA(LPCSTR,UINT);
WIN_BOOL __attribute__((__stdcall__)) IsBadStringPtrW(LPCWSTR,UINT);

WIN_BOOL __attribute__((__stdcall__)) IsBadWritePtr(LPVOID,UINT);
WIN_BOOL __attribute__((__stdcall__)) IsDBCSLeadByte(BYTE);
WIN_BOOL __attribute__((__stdcall__)) IsDebuggerPresent(void);
HINSTANCE16 __attribute__((__stdcall__)) LoadLibrary16(LPCSTR);
HMODULE __attribute__((__stdcall__)) LoadLibraryA(LPCSTR);
HMODULE __attribute__((__stdcall__)) LoadLibraryW(LPCWSTR);

HMODULE __attribute__((__stdcall__)) LoadLibraryExA(LPCSTR,HANDLE,DWORD);
HMODULE __attribute__((__stdcall__)) LoadLibraryExW(LPCWSTR,HANDLE,DWORD);

HINSTANCE16 __attribute__((__stdcall__)) LoadModule16(LPCSTR,LPVOID);
HINSTANCE __attribute__((__stdcall__)) LoadModule(LPCSTR,LPVOID);
HGLOBAL __attribute__((__stdcall__)) LoadResource(HMODULE,HRSRC);
HLOCAL __attribute__((__stdcall__)) LocalAlloc(UINT,DWORD);
UINT __attribute__((__stdcall__)) LocalCompact(UINT);
UINT __attribute__((__stdcall__)) LocalFlags(HLOCAL);
HLOCAL __attribute__((__stdcall__)) LocalFree(HLOCAL);
HLOCAL __attribute__((__stdcall__)) LocalHandle(LPCVOID);
LPVOID __attribute__((__stdcall__)) LocalLock(HLOCAL);
HLOCAL __attribute__((__stdcall__)) LocalReAlloc(HLOCAL,DWORD,UINT);
UINT __attribute__((__stdcall__)) LocalShrink(HGLOBAL,UINT);
UINT __attribute__((__stdcall__)) LocalSize(HLOCAL);
WIN_BOOL __attribute__((__stdcall__)) LocalUnlock(HLOCAL);
LPVOID __attribute__((__stdcall__)) LockResource(HGLOBAL);


HFILE16 __attribute__((__stdcall__)) OpenFile16(LPCSTR,OFSTRUCT*,UINT16);
HFILE __attribute__((__stdcall__)) OpenFile(LPCSTR,OFSTRUCT*,UINT);
VOID __attribute__((__stdcall__)) OutputDebugStringA(LPCSTR);
VOID __attribute__((__stdcall__)) OutputDebugStringW(LPCWSTR);

WIN_BOOL __attribute__((__stdcall__)) ReadProcessMemory(HANDLE, LPCVOID, LPVOID, DWORD, LPDWORD);
WIN_BOOL __attribute__((__stdcall__)) RemoveDirectoryA(LPCSTR);
WIN_BOOL __attribute__((__stdcall__)) RemoveDirectoryW(LPCWSTR);

WIN_BOOL __attribute__((__stdcall__)) SetCurrentDirectoryA(LPCSTR);
WIN_BOOL __attribute__((__stdcall__)) SetCurrentDirectoryW(LPCWSTR);

UINT __attribute__((__stdcall__)) SetErrorMode(UINT);
WIN_BOOL __attribute__((__stdcall__)) SetFileAttributesA(LPCSTR,DWORD);
WIN_BOOL __attribute__((__stdcall__)) SetFileAttributesW(LPCWSTR,DWORD);

UINT __attribute__((__stdcall__)) SetHandleCount(UINT);

WIN_BOOL __attribute__((__stdcall__)) SetVolumeLabelA(LPCSTR,LPCSTR);
WIN_BOOL __attribute__((__stdcall__)) SetVolumeLabelW(LPCWSTR,LPCWSTR);

DWORD __attribute__((__stdcall__)) SizeofResource(HMODULE,HRSRC);

WIN_BOOL __attribute__((__stdcall__)) WritePrivateProfileSectionA(LPCSTR,LPCSTR,LPCSTR);
WIN_BOOL __attribute__((__stdcall__)) WritePrivateProfileSectionW(LPCWSTR,LPCWSTR,LPCWSTR);

WIN_BOOL __attribute__((__stdcall__)) WritePrivateProfileStringA(LPCSTR,LPCSTR,LPCSTR,LPCSTR);
WIN_BOOL __attribute__((__stdcall__)) WritePrivateProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR);

WIN_BOOL __attribute__((__stdcall__)) WriteProfileSectionA(LPCSTR,LPCSTR);
WIN_BOOL __attribute__((__stdcall__)) WriteProfileSectionW(LPCWSTR,LPCWSTR);

WIN_BOOL __attribute__((__stdcall__)) WritePrivateProfileStructA(LPCSTR,LPCSTR,LPVOID,UINT,LPCSTR);
WIN_BOOL __attribute__((__stdcall__)) WritePrivateProfileStructW(LPCWSTR,LPCWSTR,LPVOID,UINT,LPCWSTR);

WIN_BOOL __attribute__((__stdcall__)) WriteProcessMemory(HANDLE, LPVOID, LPVOID, DWORD, LPDWORD);
WIN_BOOL __attribute__((__stdcall__)) WriteProfileStringA(LPCSTR,LPCSTR,LPCSTR);
WIN_BOOL __attribute__((__stdcall__)) WriteProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR);


LPSTR __attribute__((__stdcall__)) lstrcatA(LPSTR,LPCSTR);
LPWSTR __attribute__((__stdcall__)) lstrcatW(LPWSTR,LPCWSTR);

LPSTR __attribute__((__stdcall__)) lstrcpyA(LPSTR,LPCSTR);
LPWSTR __attribute__((__stdcall__)) lstrcpyW(LPWSTR,LPCWSTR);

LPSTR __attribute__((__stdcall__)) lstrcpynA(LPSTR,LPCSTR,INT);
LPWSTR __attribute__((__stdcall__)) lstrcpynW(LPWSTR,LPCWSTR,INT);

INT __attribute__((__stdcall__)) lstrlenA(LPCSTR);
INT __attribute__((__stdcall__)) lstrlenW(LPCWSTR);

HINSTANCE __attribute__((__stdcall__)) WinExec(LPCSTR,UINT);
LONG __attribute__((__stdcall__)) _hread(HFILE,LPVOID,LONG);
LONG __attribute__((__stdcall__)) _hwrite(HFILE,LPCSTR,LONG);
HFILE __attribute__((__stdcall__)) _lcreat(LPCSTR,INT);
HFILE __attribute__((__stdcall__)) _lclose(HFILE);
LONG __attribute__((__stdcall__)) _llseek(HFILE,LONG,INT);
HFILE __attribute__((__stdcall__)) _lopen(LPCSTR,INT);
UINT __attribute__((__stdcall__)) _lread(HFILE,LPVOID,UINT);
UINT __attribute__((__stdcall__)) _lwrite(HFILE,LPCSTR,UINT);
SEGPTR __attribute__((__stdcall__)) WIN16_GlobalLock16(HGLOBAL16);
INT __attribute__((__stdcall__)) lstrcmpA(LPCSTR,LPCSTR);
INT __attribute__((__stdcall__)) lstrcmpW(LPCWSTR,LPCWSTR);

INT __attribute__((__stdcall__)) lstrcmpiA(LPCSTR,LPCSTR);
INT __attribute__((__stdcall__)) lstrcmpiW(LPCWSTR,LPCWSTR);
DWORD __attribute__((__stdcall__)) GetCurrentProcessId(void);
DWORD __attribute__((__stdcall__)) GetCurrentThreadId(void);
DWORD __attribute__((__stdcall__)) GetLastError(void);
HANDLE __attribute__((__stdcall__)) GetProcessHeap(void);
PVOID __attribute__((__stdcall__)) InterlockedCompareExchange(PVOID*,PVOID,PVOID);
LONG __attribute__((__stdcall__)) InterlockedDecrement(PLONG);
LONG __attribute__((__stdcall__)) InterlockedExchange(PLONG,LONG);
LONG __attribute__((__stdcall__)) InterlockedExchangeAdd(PLONG,LONG);
LONG __attribute__((__stdcall__)) InterlockedIncrement(PLONG);
VOID __attribute__((__stdcall__)) SetLastError(DWORD);
void* CoTaskMemAlloc(unsigned long cb);
void CoTaskMemFree(void* cb);

typedef struct
{
    long f1;
    short f2;
    short f3;
    char f4[8];
} GUID;

extern GUID IID_IUnknown;
extern GUID IID_IClassFactory;

typedef long (*GETCLASSOBJECT) (GUID* clsid, GUID* iid, void** ppv);
int RegisterComClass(GUID* clsid, GETCLASSOBJECT gcs);





struct IUnknown;
struct IClassFactory;
struct IUnknown_vt
{
    long __attribute__((__stdcall__)) (*QueryInterface)(struct IUnknown* _this, GUID* iid, void** ppv);
    long __attribute__((__stdcall__)) (*AddRef)(struct IUnknown* _this) ;
    long __attribute__((__stdcall__)) (*Release)(struct IUnknown* _this) ;
} ;
struct IUnknown
{
    struct IUnknown_vt* vt;
};

struct IClassFactory_vt
{
    long __attribute__((__stdcall__)) (*QueryInterface)(struct IUnknown* _this, GUID* iid, void** ppv);
    long __attribute__((__stdcall__)) (*AddRef)(struct IUnknown* _this) ;
    long __attribute__((__stdcall__)) (*Release)(struct IUnknown* _this) ;
    long __attribute__((__stdcall__)) (*CreateInstance)(struct IClassFactory* _this, struct IUnknown* pUnkOuter, GUID* riid, void** ppvObject);
};

struct IClassFactory
{
    struct IClassFactory_vt* vt;
};

long CoCreateInstance(GUID* rclsid, struct IUnknown* pUnkOuter,
                    long dwClsContext, GUID* riid, void** ppv);

extern void* my_mreq(int size, int to_zero);
extern int my_release(void* memory);
extern int my_size(char* memory);
extern int my_garbagecollection(void);


typedef struct {
    UINT uDriverSignature;
    HINSTANCE hDriverModule;
    DRIVERPROC DriverProc;
    DWORD dwDriverID;
} DRVR;

typedef DRVR *PDRVR;
typedef DRVR *NPDRVR;
typedef DRVR *LPDRVR;

typedef struct tls_s tls_t;

extern int __attribute__((__stdcall__)) ext_unknown(void);

extern int __attribute__((__stdcall__)) expIsBadWritePtr(void* ptr, unsigned int count);
extern int __attribute__((__stdcall__)) expIsBadReadPtr(void* ptr, unsigned int count);
extern int __attribute__((__stdcall__)) expDisableThreadLibraryCalls(int module);
extern void* __attribute__((__stdcall__)) expGetDriverModuleHandle(DRVR* pdrv);
extern void* __attribute__((__stdcall__)) expGetModuleHandleA(const char* name);
extern void* __attribute__((__stdcall__)) expCreateThread(void* pSecAttr, long dwStackSize, void* lpStartAddress,
                                    void* lpParameter, long dwFlags, long* dwThreadId);
extern void* __attribute__((__stdcall__)) expCreateEventA(void* pSecAttr, char bManualReset,
                                    char bInitialState, const char* name);
extern void* __attribute__((__stdcall__)) expSetEvent(void* event);
extern void* __attribute__((__stdcall__)) expResetEvent(void* event);
extern void* __attribute__((__stdcall__)) expWaitForSingleObject(void* object, int duration);
extern WIN_BOOL __attribute__((__stdcall__)) expIsProcessorFeaturePresent(DWORD v);
extern void __attribute__((__stdcall__)) expGetSystemInfo(SYSTEM_INFO* si);
extern long __attribute__((__stdcall__)) expGetVersion(void);
long __attribute__((__stdcall__)) expGetVersionExA(OSVERSIONINFOA* c);
extern HANDLE __attribute__((__stdcall__)) expHeapCreate(long flags, long init_size, long max_size);
extern void* __attribute__((__stdcall__)) expHeapAlloc(HANDLE heap, int flags, int size);
extern long __attribute__((__stdcall__)) expHeapDestroy(void* heap);
extern long __attribute__((__stdcall__)) expHeapFree(int arg1, int arg2, void* ptr);
extern long __attribute__((__stdcall__)) expHeapSize(int heap, int flags, void* pointer);
extern long __attribute__((__stdcall__)) expGetProcessHeap(void);
extern void* __attribute__((__stdcall__)) expVirtualAlloc(void* v1, long v2, long v3, long v4);
extern int __attribute__((__stdcall__)) expVirtualFree(void* v1, int v2, int v3);
extern void __attribute__((__stdcall__)) expInitializeCriticalSection(CRITICAL_SECTION* c);
extern void __attribute__((__stdcall__)) expEnterCriticalSection(CRITICAL_SECTION* c);
extern void __attribute__((__stdcall__)) expLeaveCriticalSection(CRITICAL_SECTION* c);
extern void __attribute__((__stdcall__)) expDeleteCriticalSection(CRITICAL_SECTION *c);
extern int __attribute__((__stdcall__)) expGetCurrentThreadId(void);
extern int __attribute__((__stdcall__)) expGetCurrentProcess(void);
extern void* __attribute__((__stdcall__)) expTlsAlloc(void);
extern int __attribute__((__stdcall__)) expTlsSetValue(tls_t* index, void* value);
extern void* __attribute__((__stdcall__)) expTlsGetValue(tls_t* index);
extern int __attribute__((__stdcall__)) expTlsFree(tls_t* index);
extern void* __attribute__((__stdcall__)) expLocalAlloc(int flags, int size);
extern void* __attribute__((__stdcall__)) expLocalLock(void* z);
extern void* __attribute__((__stdcall__)) expGlobalAlloc(int flags, int size);
extern void* __attribute__((__stdcall__)) expGlobalLock(void* z);
extern int __attribute__((__stdcall__)) expLoadStringA(long instance, long id, void* buf, long size);
extern long __attribute__((__stdcall__)) expMultiByteToWideChar(long v1, long v2, char* s1, long siz1, short* s2, int siz2);
extern long __attribute__((__stdcall__)) expWideCharToMultiByte(long v1, long v2, short* s1, long siz1, char* s2, int siz2, char* c3, int* siz3);
extern long __attribute__((__stdcall__)) expGetVersionExA(OSVERSIONINFOA* c);
extern HANDLE __attribute__((__stdcall__)) expCreateSemaphoreA(char* v1, long init_count, long max_count, char* name);
extern long __attribute__((__stdcall__)) expReleaseSemaphore(long hsem, long increment, long* prev_count);
extern long __attribute__((__stdcall__)) expRegOpenKeyExA(long key, const char* subkey, long reserved, long access, int* newkey);
extern long __attribute__((__stdcall__)) expRegCloseKey(long key);

extern long __attribute__((__stdcall__)) expRegQueryValueExA(long key, const char* value, int* reserved, int* type, int* data, int* count);
extern long __attribute__((__stdcall__)) expRegCreateKeyExA(long key, const char* name, long reserved,
                                      void* classs, long options, long security,
                                      void* sec_attr, int* newkey, int* status);
extern long __attribute__((__stdcall__)) expRegSetValueExA(long key, const char* name, long v1, long v2, void* data, long size);
extern long __attribute__((__stdcall__)) expRegOpenKeyA (long hKey, LPCSTR lpSubKey, int* phkResult);
extern long __attribute__((__stdcall__)) expQueryPerformanceCounter(long long* z);
extern long __attribute__((__stdcall__)) expQueryPerformanceFrequency(long long* z);
extern long __attribute__((__stdcall__)) exptimeGetTime(void);
extern void* __attribute__((__stdcall__)) expLocalHandle(void* v);
extern void* __attribute__((__stdcall__)) expGlobalHandle(void* v);
extern int __attribute__((__stdcall__)) expGlobalUnlock(void* v);
extern void* __attribute__((__stdcall__)) expGlobalFree(void* v);
extern void* __attribute__((__stdcall__)) expGlobalReAlloc(void* v, int size, int flags);
extern int __attribute__((__stdcall__)) expLocalUnlock(void* v);
extern void* __attribute__((__stdcall__)) expLocalFree(void* v);
extern HRSRC __attribute__((__stdcall__)) expFindResourceA(HMODULE module, char* name, char* type);
extern HGLOBAL __attribute__((__stdcall__)) expLoadResource(HMODULE module, HRSRC res);
extern void* __attribute__((__stdcall__)) expLockResource(long res);
extern int __attribute__((__stdcall__)) expFreeResource(long res);
extern int __attribute__((__stdcall__)) expCloseHandle(long v1);
extern const char* __attribute__((__stdcall__)) expGetCommandLineA(void);
extern LPWSTR __attribute__((__stdcall__)) expGetEnvironmentStringsW(void);
extern void * __attribute__((__stdcall__)) expRtlZeroMemory(void *p, size_t len);
extern void * __attribute__((__stdcall__)) expRtlMoveMemory(void *dst, void *src, size_t len);
extern void * __attribute__((__stdcall__)) expRtlFillMemory(void *p, int ch, size_t len);
extern int __attribute__((__stdcall__)) expFreeEnvironmentStringsW(short* strings);
extern int __attribute__((__stdcall__)) expFreeEnvironmentStringsA(char* strings);
extern LPWSTR __attribute__((__stdcall__)) expGetEnvironmentStringsW(void);
LPCSTR __attribute__((__stdcall__)) expGetEnvironmentStrings(void);
extern int __attribute__((__stdcall__)) expGetStartupInfoA(STARTUPINFOA *s);
extern int __attribute__((__stdcall__)) expGetStdHandle(int z);
extern int __attribute__((__stdcall__)) expGetFileType(int handle);
extern int __attribute__((__stdcall__)) expSetHandleCount(int count);
extern int __attribute__((__stdcall__)) expGetACP(void);
extern int __attribute__((__stdcall__)) expGetModuleFileNameA(int module, char* s, int len);
extern int __attribute__((__stdcall__)) expSetUnhandledExceptionFilter(void* filter);
extern int __attribute__((__stdcall__)) expLoadLibraryA(char* name);
extern int __attribute__((__stdcall__)) expFreeLibrary(int module);
extern void* __attribute__((__stdcall__)) expGetProcAddress(HMODULE mod, char* name);
extern long __attribute__((__stdcall__)) expCreateFileMappingA(int hFile, void* lpAttr,
                                         long flProtect, long dwMaxHigh, long dwMaxLow, const char* name);
extern long __attribute__((__stdcall__)) expOpenFileMappingA(long hFile, long hz, const char* name);
extern void* __attribute__((__stdcall__)) expMapViewOfFile(HANDLE file, DWORD mode, DWORD offHigh, DWORD offLow, DWORD size);
extern void* __attribute__((__stdcall__)) expUnmapViewOfFile(void* view);
extern void* __attribute__((__stdcall__)) expSleep(int time);
extern void* __attribute__((__stdcall__)) expCreateCompatibleDC(int hdc);
extern int __attribute__((__stdcall__)) expGetDeviceCaps(int hdc, int unk);
extern WIN_BOOL __attribute__((__stdcall__)) expDeleteDC(int hdc);
extern int __attribute__((__stdcall__)) expGetPrivateProfileIntA(const char* appname, const char* keyname, int default_value, const char* filename);
extern int __attribute__((__stdcall__)) expGetProfileIntA(const char* appname, const char* keyname, int default_value);
extern int __attribute__((__stdcall__)) expGetPrivateProfileStringA(const char* appname, const char* keyname,
                                              const char* def_val, char* dest, unsigned int len, const char* filename);
extern int __attribute__((__stdcall__)) expWritePrivateProfileStringA(const char* appname, const char* keyname,
                                                const char* string, const char* filename);
extern int __attribute__((__stdcall__)) expDefDriverProc(int _private, int id, int msg, int arg1, int arg2);
extern int __attribute__((__stdcall__)) expSizeofResource(int v1, int v2);
extern int __attribute__((__stdcall__)) expGetLastError(void);
extern void __attribute__((__stdcall__)) expSetLastError(int error);
extern long __attribute__((__stdcall__)) exptimeGetTime(void);
extern int __attribute__((__stdcall__)) expStringFromGUID2(GUID* guid, char* str, int cbMax);
extern int __attribute__((__stdcall__)) expGetFileVersionInfoSizeA(const char* name, int* lpHandle);
extern int __attribute__((__stdcall__)) expIsBadStringPtrW(const short* string, int nchars);
extern int __attribute__((__stdcall__)) expIsBadStringPtrA(const char* string, int nchars);
extern long __attribute__((__stdcall__)) expInterlockedIncrement( long* dest );
extern long __attribute__((__stdcall__)) expInterlockedDecrement( long* dest );
extern void __attribute__((__stdcall__)) expOutputDebugStringA( const char* string );
extern int __attribute__((__stdcall__)) expGetDC(int hwnd);
extern int __attribute__((__stdcall__)) expGetDesktopWindow(void);
extern int __attribute__((__stdcall__)) expReleaseDC(int hwnd, int hdc);
extern int __attribute__((__stdcall__)) expLoadCursorA(int handle,LPCSTR name);
extern int __attribute__((__stdcall__)) expSetCursor(void *cursor);
extern int __attribute__((__stdcall__)) expGetSystemPaletteEntries(int hdc, int iStartIndex, int nEntries, void* lppe);
extern int __attribute__((__stdcall__)) expGetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation);
extern void __attribute__((__stdcall__)) expGetLocalTime(SYSTEMTIME* systime);
extern int __attribute__((__stdcall__)) expGetSystemTime(SYSTEMTIME* systime);
extern int __attribute__((__stdcall__)) expGetEnvironmentVariableA(const char* name, char* field, int size);
extern void* __attribute__((__stdcall__)) expCoTaskMemAlloc(ULONG cb);
extern void __attribute__((__stdcall__)) expCoTaskMemFree(void* cb);
extern long __attribute__((__stdcall__)) expCoCreateInstance(GUID* rclsid, struct IUnknown* pUnkOuter,
                                       long dwClsContext, GUID* riid, void** ppv);
extern int __attribute__((__stdcall__)) expIsRectEmpty(const RECT *lprc);
extern unsigned int __attribute__((__stdcall__)) expGetTempPathA(unsigned int len, char* path);
extern HANDLE __attribute__((__stdcall__)) expFindFirstFileA(LPCSTR s, LPWIN32_FIND_DATAA lpfd);
extern WIN_BOOL __attribute__((__stdcall__)) expFindNextFileA(HANDLE h,LPWIN32_FIND_DATAA p);
extern WIN_BOOL __attribute__((__stdcall__)) expFindClose(HANDLE h);
extern UINT __attribute__((__stdcall__)) expSetErrorMode(UINT i);
extern UINT __attribute__((__stdcall__)) expGetWindowsDirectoryA(LPSTR s,UINT c);
extern WIN_BOOL __attribute__((__stdcall__)) expDeleteFileA(LPCSTR s);
extern WIN_BOOL __attribute__((__stdcall__)) expFileTimeToLocalFileTime(const FILETIME* cpf, LPFILETIME pf);
extern UINT __attribute__((__stdcall__)) expGetTempFileNameA(LPCSTR cs1,LPCSTR cs2,UINT i,LPSTR ps);
extern HANDLE __attribute__((__stdcall__)) expCreateFileA(LPCSTR cs1,DWORD i1,DWORD i2,
                                    LPSECURITY_ATTRIBUTES p1, DWORD i3,DWORD i4,HANDLE i5);
extern LPCSTR __attribute__((__stdcall__)) expGetSystemDirectoryA(void);
extern WIN_BOOL __attribute__((__stdcall__)) expReadFile(HANDLE h,LPVOID pv,DWORD size,LPDWORD rd,LPOVERLAPPED unused);
extern WIN_BOOL __attribute__((__stdcall__)) expWriteFile(HANDLE h,LPCVOID pv,DWORD size,LPDWORD wr,LPOVERLAPPED unused);
extern DWORD __attribute__((__stdcall__)) expSetFilePointer(HANDLE h, LONG val, LPLONG ext, DWORD whence);
extern HDRVR __attribute__((__stdcall__)) expOpenDriverA(LPCSTR szDriverName, LPCSTR szSectionName,
                                   LPARAM lParam2);
HDRVR __attribute__((__stdcall__)) expOpenDriver(LPCSTR szDriverName, LPCSTR szSectionName,
                           LPARAM lParam2) ;
extern WIN_BOOL __attribute__((__stdcall__)) expGetProcessAffinityMask(HANDLE hProcess,
                                                 LPDWORD lpProcessAffinityMask,
                                                 LPDWORD lpSystemAffinityMask);
extern DWORD __attribute__((__stdcall__)) expRegEnumValueA( HKEY hkey, DWORD index, LPSTR value, LPDWORD val_count,
                                       LPDWORD reserved, LPDWORD type, LPBYTE data, LPDWORD count );
extern INT __attribute__((__stdcall__)) expMulDiv(int nNumber,int nNumerator,int nDenominator);
extern LONG __attribute__((__stdcall__)) explstrcmpiA(const char* str1, const char* str2);
extern LONG __attribute__((__stdcall__)) explstrlenA(const char* str1);
extern LONG __attribute__((__stdcall__)) explstrcpyA(char* str1, const char* str2);
extern LONG __attribute__((__stdcall__)) expInterlockedExchange(long *dest, long l);

extern void* __attribute__((__cdecl__)) expmalloc(int size);
extern void __attribute__((__cdecl__)) expfree(void* mem);
extern void* __attribute__((__cdecl__)) expnew(int size);
extern int __attribute__((__cdecl__)) expdelete(void* memory);
extern int __attribute__((__cdecl__)) exp_initterm(int v1, int v2);

extern int expwsprintfA(char* string, char* format, ...);
extern char* expstrrchr(char* string, int value);
extern char* expstrchr(char* string, int value);
extern int expstrlen(char* str);
extern int expstrcpy(char* str1, const char* str2);
extern int expstrcmp(const char* str1, const char* str2);
extern int expstrcat(char* str1, const char* str2);
extern int expisalnum(int c);
extern int expmemmove(void* dest, void* src, int n);
extern int expmemcmp(void* dest, void* src, int n);
extern void *expmemcpy(void* dest, void* src, int n) ;
extern time_t exptime(time_t* t);
extern void* LookupExternal(const char* library, int ordinal);





typedef __gnuc_va_list va_list;






typedef struct tagHIGHCONTRASTA
{
    UINT cbSize;
    DWORD dwFlags;
    LPSTR lpszDefaultScheme;
} HIGHCONTRASTA, *LPHIGHCONTRASTA;

typedef struct tagHIGHCONTRASTW
{
    UINT cbSize;
    DWORD dwFlags;
    LPWSTR lpszDefaultScheme;
} HIGHCONTRASTW, *LPHIGHCONTRASTW;

typedef HIGHCONTRASTA HIGHCONTRAST;
typedef LPHIGHCONTRASTA LPHIGHCONTRAST;

typedef struct
{
    UINT message;
    UINT paramL;
    UINT paramH;
    DWORD time;
    HWND hwnd;
} EVENTMSG, *LPEVENTMSG;




typedef struct
{
    POINT pt;
    HWND hwnd;
    UINT wHitTestCode;
    DWORD dwExtraInfo;
} MOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT, *LPMOUSEHOOKSTRUCT;




typedef struct
{
    HWND hWnd;
    UINT wMessage;
    WPARAM wParam;
    LPARAM lParam;
} HARDWAREHOOKSTRUCT, *LPHARDWAREHOOKSTRUCT;




typedef struct
{
    DWORD idThread;
    DWORD idThreadInstaller;
    LPARAM lParam;
    WPARAM wParam;
    INT code;
} DEBUGHOOKINFO, *LPDEBUGHOOKINFO;
typedef struct tagANIMATIONINFO
{
       UINT cbSize;
       INT iMinAnimate;
} ANIMATIONINFO, *LPANIMATIONINFO;

typedef struct tagNMHDR
{
    HWND hwndFrom;
    UINT idFrom;
    UINT code;
} NMHDR, *LPNMHDR;

typedef struct
{
        UINT cbSize;
        INT iTabLength;
        INT iLeftMargin;
        INT iRightMargin;
        UINT uiLengthDrawn;
} DRAWTEXTPARAMS,*LPDRAWTEXTPARAMS;
typedef struct
{
   LPARAM lParam;
   WPARAM16 wParam;
   UINT16 message;
   HWND16 hwnd;
} CWPSTRUCT16, *LPCWPSTRUCT16;

typedef struct
{
  LPARAM lParam;
  WPARAM wParam;
  UINT message;
  HWND hwnd;
} CWPSTRUCT, *LPCWPSTRUCT;



typedef struct
{
  LRESULT lResult;
  LPARAM lParam;
  WPARAM16 wParam;
  DWORD message;
  HWND16 hwnd;
} CWPRETSTRUCT16, *LPCWPRETSTRUCT16;

typedef struct
{
  LRESULT lResult;
  LPARAM lParam;
  WPARAM wParam;
  DWORD message;
  HWND hwnd;
} CWPRETSTRUCT, *LPCWPRETSTRUCT;

typedef struct
{
    UINT length;
    UINT flags;
    UINT showCmd;
    POINT ptMinPosition __attribute__((packed));
    POINT ptMaxPosition __attribute__((packed));
    RECT rcNormalPosition __attribute__((packed));
} WINDOWPLACEMENT, *LPWINDOWPLACEMENT;
typedef struct tagCREATESTRUCTA
{
    LPVOID lpCreateParams;
    HINSTANCE hInstance;
    HMENU hMenu;
    HWND hwndParent;
    INT cy;
    INT cx;
    INT y;
    INT x;
    LONG style;
    LPCSTR lpszName;
    LPCSTR lpszClass;
    DWORD dwExStyle;
} CREATESTRUCTA, *LPCREATESTRUCTA;

typedef struct
{
    LPVOID lpCreateParams;
    HINSTANCE hInstance;
    HMENU hMenu;
    HWND hwndParent;
    INT cy;
    INT cx;
    INT y;
    INT x;
    LONG style;
    LPCWSTR lpszName;
    LPCWSTR lpszClass;
    DWORD dwExStyle;
} CREATESTRUCTW, *LPCREATESTRUCTW;

typedef CREATESTRUCTA CREATESTRUCT;
typedef LPCREATESTRUCTA LPCREATESTRUCT;

typedef struct
{
    HDC hdc;
    WIN_BOOL fErase;
    RECT rcPaint;
    WIN_BOOL fRestore;
    WIN_BOOL fIncUpdate;
    BYTE rgbReserved[32];
} PAINTSTRUCT, *PPAINTSTRUCT, *LPPAINTSTRUCT;

typedef struct
{
    HMENU hWindowMenu;
    UINT idFirstChild;
} CLIENTCREATESTRUCT, *LPCLIENTCREATESTRUCT;


typedef struct
{
    LPCSTR szClass;
    LPCSTR szTitle;
    HINSTANCE hOwner;
    INT x;
    INT y;
    INT cx;
    INT cy;
    DWORD style;
    LPARAM lParam;
} MDICREATESTRUCTA, *LPMDICREATESTRUCTA;

typedef struct
{
    LPCWSTR szClass;
    LPCWSTR szTitle;
    HINSTANCE hOwner;
    INT x;
    INT y;
    INT cx;
    INT cy;
    DWORD style;
    LPARAM lParam;
} MDICREATESTRUCTW, *LPMDICREATESTRUCTW;

typedef MDICREATESTRUCTA MDICREATESTRUCT;
typedef LPMDICREATESTRUCTA LPMDICREATESTRUCT;







typedef struct {
    DWORD styleOld;
    DWORD styleNew;
} STYLESTRUCT, *LPSTYLESTRUCT;
typedef struct
{
    POINT ptReserved;
    POINT ptMaxSize;
    POINT ptMaxPosition;
    POINT ptMinTrackSize;
    POINT ptMaxTrackSize;
} MINMAXINFO, *PMINMAXINFO, *LPMINMAXINFO;
typedef struct tagWINDOWPOS
{
    HWND hwnd;
    HWND hwndInsertAfter;
    INT x;
    INT y;
    INT cx;
    INT cy;
    UINT flags;
} WINDOWPOS, *PWINDOWPOS, *LPWINDOWPOS;
typedef struct
{
    RECT rgrc[3];
    WINDOWPOS *lppos;
} NCCALCSIZE_PARAMS, *LPNCCALCSIZE_PARAMS;
typedef struct
{
    UINT style;
    WNDPROC lpfnWndProc;
    INT cbClsExtra;
    INT cbWndExtra;
    HINSTANCE hInstance;
    HICON hIcon;
    HCURSOR hCursor;
    HBRUSH hbrBackground;
    LPCSTR lpszMenuName;
    LPCSTR lpszClassName;
} WNDCLASSA, *LPWNDCLASSA;

typedef struct
{
    UINT style;
    WNDPROC lpfnWndProc;
    INT cbClsExtra;
    INT cbWndExtra;
    HINSTANCE hInstance;
    HICON hIcon;
    HCURSOR hCursor;
    HBRUSH hbrBackground;
    LPCWSTR lpszMenuName;
    LPCWSTR lpszClassName;
} WNDCLASSW, *LPWNDCLASSW;

typedef WNDCLASSA WNDCLASS;
typedef LPWNDCLASSA LPWNDCLASS;

typedef struct {
    DWORD dwData;
    DWORD cbData;
    LPVOID lpData;
} COPYDATASTRUCT, *PCOPYDATASTRUCT, *LPCOPYDATASTRUCT;

typedef struct {
    HMENU hmenuIn;
    HMENU hmenuNext;
    HWND hwndNext;
} MDINEXTMENU, *PMDINEXTMENU, *LPMDINEXTMENU;


typedef struct {
        WORD size;
        WORD command;
        LONG data;
        LONG reserved;
        WORD ofsFilename;
        WORD ofsData;
} WINHELP,*LPWINHELP;

typedef struct
{
    UINT16 mkSize;
    BYTE mkKeyList;
    BYTE szKeyphrase[1];
} MULTIKEYHELP, *LPMULTIKEYHELP;

typedef struct {
        WORD wStructSize;
        WORD x;
        WORD y;
        WORD dx;
        WORD dy;
        WORD wMax;
        char rgchMember[2];
} HELPWININFO, *LPHELPWININFO;
typedef struct
{
    UINT cbSize;
    UINT style;
    WNDPROC lpfnWndProc;
    INT cbClsExtra;
    INT cbWndExtra;
    HINSTANCE hInstance;
    HICON hIcon;
    HCURSOR hCursor;
    HBRUSH hbrBackground;
    LPCSTR lpszMenuName;
    LPCSTR lpszClassName;
    HICON hIconSm;
} WNDCLASSEXA, *LPWNDCLASSEXA;

typedef struct
{
    UINT cbSize;
    UINT style;
    WNDPROC lpfnWndProc;
    INT cbClsExtra;
    INT cbWndExtra;
    HINSTANCE hInstance;
    HICON hIcon;
    HCURSOR hCursor;
    HBRUSH hbrBackground;
    LPCWSTR lpszMenuName;
    LPCWSTR lpszClassName;
    HICON hIconSm;
} WNDCLASSEXW, *LPWNDCLASSEXW;

typedef WNDCLASSEXA WNDCLASSEX;
typedef LPWNDCLASSEXA LPWNDCLASSEX;

typedef struct tagMSG
{
    HWND hwnd;
    UINT message;
    WPARAM wParam;
    LPARAM lParam;
    DWORD time;
    POINT pt;
} MSG, *LPMSG;
typedef struct {
        WIN_BOOL fIcon;
        DWORD xHotspot;
        DWORD yHotspot;
        HBITMAP hbmMask;
        HBITMAP hbmColor;
} ICONINFO,*LPICONINFO;



typedef struct
{
    BYTE fVirt;
    BYTE pad0;
    WORD key;
    WORD cmd;
} ACCEL, *LPACCEL;


typedef struct
{
    BYTE fVirt;
    BYTE pad0;
    WORD key;
    WORD cmd;
    WORD pad1;
} PE_ACCEL, *LPPE_ACCEL;
typedef struct
{
    UINT cbSize;
    RECT rcExclude;
} TPMPARAMS, *LPTPMPARAMS;


typedef struct {
  UINT cbSize;
  UINT fMask;
  UINT fType;
  UINT fState;
  UINT wID;
  HMENU hSubMenu;
  HBITMAP hbmpChecked;
  HBITMAP hbmpUnchecked;
  DWORD dwItemData;
  LPSTR dwTypeData;
  UINT cch;
  HBITMAP hbmpItem;
} MENUITEMINFOA, *LPMENUITEMINFOA;

typedef struct {
  UINT cbSize;
  UINT fMask;
  UINT fType;
  UINT fState;
  UINT wID;
  HMENU hSubMenu;
  HBITMAP hbmpChecked;
  HBITMAP hbmpUnchecked;
  DWORD dwItemData;
  LPWSTR dwTypeData;
  UINT cch;
  HBITMAP hbmpItem;
} MENUITEMINFOW, *LPMENUITEMINFOW;

typedef MENUITEMINFOA MENUITEMINFO;
typedef LPMENUITEMINFOA LPMENUITEMINFO;

typedef struct {
  DWORD cbSize;
  DWORD fMask;
  DWORD dwStyle;
  UINT cyMax;
  HBRUSH hbrBack;
  DWORD dwContextHelpID;
  DWORD dwMenuData;
} MENUINFO, *LPMENUINFO;

typedef MENUINFO const * LPCMENUINFO;
typedef struct {
  WORD versionNumber;
  WORD offset;
} MENUITEMTEMPLATEHEADER, *PMENUITEMTEMPLATEHEADER;


typedef struct {
  WORD mtOption;
  WORD mtID;
  WCHAR mtString[1];
} MENUITEMTEMPLATE, *PMENUITEMTEMPLATE;


typedef VOID MENUTEMPLATE;
typedef PVOID *LPMENUTEMPLATE;
typedef WIN_BOOL __attribute__((__stdcall__)) (*DRAWSTATEPROC)(HDC,LPARAM,WPARAM,INT,INT);
typedef struct
{
    UINT cbSize;
    UINT fMask;
    INT nMin;
    INT nMax;
    UINT nPage;
    INT nPos;
    INT nTrackPos;
} SCROLLINFO, *LPSCROLLINFO;
typedef struct
{
    UINT cbSize;
    INT iContextType;
    INT iCtrlId;
    HANDLE hItemHandle;
    DWORD dwContextId;
    POINT MousePos;
} HELPINFO,*LPHELPINFO;

typedef void __attribute__((__stdcall__)) (*MSGBOXCALLBACK)(LPHELPINFO lpHelpInfo);

typedef struct
{
    UINT cbSize;
    HWND hwndOwner;
    HINSTANCE hInstance;
    LPCSTR lpszText;
    LPCSTR lpszCaption;
    DWORD dwStyle;
    LPCSTR lpszIcon;
    DWORD dwContextHelpId;
    MSGBOXCALLBACK lpfnMsgBoxCallback;
    DWORD dwLanguageId;
} MSGBOXPARAMSA,*LPMSGBOXPARAMSA;

typedef struct
{
    UINT cbSize;
    HWND hwndOwner;
    HINSTANCE hInstance;
    LPCWSTR lpszText;
    LPCWSTR lpszCaption;
    DWORD dwStyle;
    LPCWSTR lpszIcon;
    DWORD dwContextHelpId;
    MSGBOXCALLBACK lpfnMsgBoxCallback;
    DWORD dwLanguageId;
} MSGBOXPARAMSW,*LPMSGBOXPARAMSW;

typedef MSGBOXPARAMSA MSGBOXPARAMS;
typedef LPMSGBOXPARAMSA LPMSGBOXPARAMS;

typedef struct _numberfmt32a {
    UINT NumDigits;
    UINT LeadingZero;
    UINT Grouping;
    LPCSTR lpDecimalSep;
    LPCSTR lpThousandSep;
    UINT NegativeOrder;
} NUMBERFMTA;

typedef struct _numberfmt32w {
    UINT NumDigits;
    UINT LeadingZero;
    UINT Grouping;
    LPCWSTR lpDecimalSep;
    LPCWSTR lpThousandSep;
    UINT NegativeOrder;
} NUMBERFMTW;

typedef struct _currencyfmt32a
{
        UINT NumDigits;
        UINT LeadingZero;
        UINT Grouping;
        LPCSTR lpDecimalSep;
        LPCSTR lpThousandSep;
        UINT NegativeOrder;
        UINT PositiveOrder;
        LPCSTR lpCurrencySymbol;
} CURRENCYFMTA;

typedef struct _currencyfmt32w
{
        UINT NumDigits;
        UINT LeadingZero;
        UINT Grouping;
        LPCWSTR lpDecimalSep;
        LPCWSTR lpThousandSep;
        UINT NegativeOrder;
        UINT PositiveOrder;
        LPCWSTR lpCurrencySymbol;
} CURRENCYFMTW;







typedef struct tagMONITORINFO
{
    DWORD cbSize;
    RECT rcMonitor;
    RECT rcWork;
    DWORD dwFlags;
} MONITORINFO, *LPMONITORINFO;


typedef WIN_BOOL __attribute__((__stdcall__)) (*MONITORENUMPROC)(HMONITOR,HDC,LPRECT,LPARAM);



typedef struct tagDLGTEMPLATE
{
    DWORD style;
    DWORD dwExtendedStyle;
    WORD cdit;
    short x;
    short y;
    short cx;
    short cy;
} DLGTEMPLATE;

typedef DLGTEMPLATE *LPDLGTEMPLATEA;
typedef DLGTEMPLATE *LPDLGTEMPLATEW;

typedef const DLGTEMPLATE *LPCDLGTEMPLATEA;
typedef const DLGTEMPLATE *LPCDLGTEMPLATEW;


typedef struct tagDLGITEMTEMPLATE
{
    DWORD style;
    DWORD dwExtendedStyle;
    short x;
    short y;
    short cx;
    short cy;
    WORD id;
} DLGITEMTEMPLATE;

typedef DLGITEMTEMPLATE *LPDLGITEMTEMPLATEA;
typedef DLGITEMTEMPLATE *LPDLGITEMTEMPLATEW;

typedef const DLGITEMTEMPLATE *LPCDLGITEMTEMPLATEA;
typedef const DLGITEMTEMPLATE *LPCDLGITEMTEMPLATEW;
typedef struct
{
    CREATESTRUCTA *lpcs;
    HWND hwndInsertAfter;
} CBT_CREATEWNDA, *LPCBT_CREATEWNDA;

typedef struct
{
    CREATESTRUCTW *lpcs;
    HWND hwndInsertAfter;
} CBT_CREATEWNDW, *LPCBT_CREATEWNDW;

typedef CBT_CREATEWNDA CBT_CREATEWND;
typedef LPCBT_CREATEWNDA LPCBT_CREATEWND;

typedef struct
{
    WIN_BOOL fMouse;
    HWND hWndActive;
} CBTACTIVATESTRUCT, *LPCBTACTIVATESTRUCT;
typedef struct
{
    UINT CtlType;
    UINT CtlID;
    UINT itemID;
    UINT itemAction;
    UINT itemState;
    HWND hwndItem;
    HDC hDC;
    RECT rcItem __attribute__((packed));
    DWORD itemData __attribute__((packed));
} DRAWITEMSTRUCT, *PDRAWITEMSTRUCT, *LPDRAWITEMSTRUCT;


typedef struct
{
    UINT CtlType;
    UINT CtlID;
    UINT itemID;
    UINT itemWidth;
    UINT itemHeight;
    DWORD itemData;
} MEASUREITEMSTRUCT, *PMEASUREITEMSTRUCT, *LPMEASUREITEMSTRUCT;


typedef struct
{
    UINT CtlType;
    UINT CtlID;
    UINT itemID;
    HWND hwndItem;
    DWORD itemData;
} DELETEITEMSTRUCT, *LPDELETEITEMSTRUCT;


typedef struct
{
    UINT CtlType;
    UINT CtlID;
    HWND hwndItem;
    UINT itemID1;
    DWORD itemData1;
    UINT itemID2;
    DWORD itemData2;
    DWORD dwLocaleId;
} COMPAREITEMSTRUCT, *PCOMPAREITEMSTRUCT, *LPCOMPAREITEMSTRUCT;
typedef struct
{
    HWND16 hWnd;
    HANDLE16 hScope;
    WORD wFlags;
    HANDLE16 hList;
    HANDLE16 hOfStruct;
    POINT16 pt __attribute__((packed));
    LONG l __attribute__((packed));
} DRAGINFO, *LPDRAGINFO;




#pragma pack()
WORD __attribute__((__stdcall__)) SYSTEM_KillSystemTimer( WORD );



HPEN __attribute__((__stdcall__)) GetSysColorPen(INT);
INT __attribute__((__stdcall__)) LoadMessageA(HMODULE,UINT,WORD,LPSTR,INT);
INT __attribute__((__stdcall__)) LoadMessageW(HMODULE,UINT,WORD,LPWSTR,INT);

VOID __attribute__((__stdcall__)) ScreenSwitchEnable16(WORD);
typedef struct
{
    short bfType;
    long bfSize;
    short bfReserved1;
    short bfReserved2;
    long bfOffBits;
} BITMAPFILEHEADER;



typedef struct
{
    long biSize;
    long biWidth;
    long biHeight;
    short biPlanes;
    short biBitCount;
    long biCompression;
    long biSizeImage;
    long biXPelsPerMeter;
    long biYPelsPerMeter;
    long biClrUsed;
    long biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER, *LPBITMAPINFOHEADER;
typedef struct {
        BITMAPINFOHEADER bmiHeader;
        int bmiColors[1];
} BITMAPINFO, *LPBITMAPINFO;
typedef struct tagWINE_HIC {
        long magic;
        HANDLE curthread;
        long type;
        long handler;
        HDRVR hdrv;

        long private;



        DRIVERPROC driverproc;
        long x1;
        short x2;
        long x3;

} WINE_HIC;
typedef struct {
        long dwSize;
        long fccType;
        long fccHandler;
        long dwVersion;
        long dwFlags;
        LRESULT dwError;
        void* pV1Reserved;
        void* pV2Reserved;
        long dnDevNode;

} ICOPEN,*LPICOPEN;



typedef struct {
    long dwFlags;
    LPBITMAPINFOHEADER lpbiOutput;
    void* lpOutput;
    LPBITMAPINFOHEADER lpbiInput;
    void* lpInput;
    long* lpckid;
    long* lpdwFlags;
    long lFrameNum;
    long dwFrameSize;
    long dwQuality;
    LPBITMAPINFOHEADER lpbiPrev;
    void* lpPrev;
} ICCOMPRESS;

long ICCompress(
        HIC hic,long dwFlags,LPBITMAPINFOHEADER lpbiOutput,void* lpData,
        LPBITMAPINFOHEADER lpbiInput,void* lpBits,long* lpckid,
        long* lpdwFlags,long lFrameNum,long dwFrameSize,long dwQuality,
        LPBITMAPINFOHEADER lpbiPrev,void* lpPrev
);
typedef struct {
    long dwFlags;
    LPBITMAPINFOHEADER lpbiOutput;
    LPARAM lOutput;
    LPBITMAPINFOHEADER lpbiInput;
    LPARAM lInput;
    long lStartFrame;
    long lFrameCount;
    long lQuality;
    long lDataRate;
    long lKeyRate;
    long dwRate;
    long dwScale;
    long dwOverheadPerFrame;
    long dwReserved2;
    long __attribute__((__stdcall__)) (*GetData)(LPARAM lInput,long lFrame,void* lpBits,long len);
    long __attribute__((__stdcall__)) (*PutData)(LPARAM lOutput,long lFrame,void* lpBits,long len);
} ICCOMPRESSFRAMES;
typedef struct {
        long dwSize;
        long fccType;
        long fccHandler;
        long dwFlags;
        long dwVersion;
        long dwVersionICM;



        WCHAR szName[16];
        WCHAR szDescription[128];
        WCHAR szDriver[128];

} ICINFO;
typedef struct {
    long dwFlags;
    LPBITMAPINFOHEADER lpbiInput;
    void* lpInput;
    LPBITMAPINFOHEADER lpbiOutput;
    void* lpOutput;
    long ckid;
} ICDECOMPRESS;

typedef struct {
    long dwFlags;
    LPBITMAPINFOHEADER lpbiSrc;
    void* lpSrc;
    LPBITMAPINFOHEADER lpbiDst;
    void* lpDst;


    INT xDst;
    INT yDst;
    INT dxDst;
    INT dyDst;

    INT xSrc;
    INT ySrc;
    INT dxSrc;
    INT dySrc;
} ICDECOMPRESSEX;


long ICDecompress(HIC hic,long dwFlags,LPBITMAPINFOHEADER lpbiFormat,void* lpData,LPBITMAPINFOHEADER lpbi,void* lpBits);
WIN_BOOL ICInfo(long fccType, long fccHandler, ICINFO * lpicinfo);
LRESULT ICGetInfo(HIC hic,ICINFO *picinfo, long cb);
HIC ICOpen(long fccType, long fccHandler, UINT wMode);
HIC ICOpenFunction(long fccType, long fccHandler, unsigned int wMode, void* lpfnHandler);

LRESULT ICClose(HIC hic);
LRESULT ICSendMessage(HIC hic, unsigned int msg, long dw1, long dw2);
HIC ICLocate(long fccType, long fccHandler, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut, short wFlags);

int ICDoSomething(void);

long ICDrawBegin(
        HIC hic,
        long dwFlags,
        HPALETTE hpal,
        HWND hwnd,
        HDC hdc,
        INT xDst,
        INT yDst,
        INT dxDst,
        INT dyDst,
        LPBITMAPINFOHEADER lpbi,
        INT xSrc,
        INT ySrc,
        INT dxSrc,
        INT dySrc,
        long dwRate,
        long dwScale
);


typedef struct {
        long dwFlags;
        HPALETTE hpal;
        HWND hwnd;
        HDC hdc;
        INT xDst;
        INT yDst;
        INT dxDst;
        INT dyDst;
        LPBITMAPINFOHEADER lpbi;
        INT xSrc;
        INT ySrc;
        INT dxSrc;
        INT dySrc;
        long dwRate;
        long dwScale;
} ICDRAWBEGIN;







typedef struct {
        long dwFlags;
        void* lpFormat;
        void* lpData;
        long cbData;
        long lTime;
} ICDRAW;

long ICDraw(HIC hic,long dwFlags,void* lpFormat,void* lpData,long cbData,long lTime);




typedef struct _AVISTREAMINFOA {
    long fccType;
    long fccHandler;
    long dwFlags;
    long dwCaps;
    short wPriority;
    short wLanguage;
    long dwScale;
    long dwRate;
    long dwStart;
    long dwLength;
    long dwInitialFrames;
    long dwSuggestedBufferSize;
    long dwQuality;
    long dwSampleSize;
    RECT rcFrame;
    long dwEditCount;
    long dwFormatChangeCount;
    char szName[64];
} AVISTREAMINFOA, * LPAVISTREAMINFOA, *PAVISTREAMINFOA;

typedef struct _AVISTREAMINFOW {
    long fccType;
    long fccHandler;
    long dwFlags;
    long dwCaps;
    short wPriority;
    short wLanguage;
    long dwScale;
    long dwRate;
    long dwStart;
    long dwLength;
    long dwInitialFrames;
    long dwSuggestedBufferSize;
    long dwQuality;
    long dwSampleSize;
    RECT rcFrame;
    long dwEditCount;
    long dwFormatChangeCount;
    short szName[64];
} AVISTREAMINFOW, * LPAVISTREAMINFOW, *PAVISTREAMINFOW;
typedef AVISTREAMINFOA AVISTREAMINFO;
typedef LPAVISTREAMINFOA LPAVISTREAMINFO;
typedef PAVISTREAMINFOA PAVISTREAMINFO;
typedef struct _AVIFILEINFOW {
    long dwMaxBytesPerSec;
    long dwFlags;
    long dwCaps;
    long dwStreams;
    long dwSuggestedBufferSize;
    long dwWidth;
    long dwHeight;
    long dwScale;
    long dwRate;
    long dwLength;
    long dwEditCount;
    short szFileType[64];
} AVIFILEINFOW, * LPAVIFILEINFOW, *PAVIFILEINFOW;

typedef struct _AVIFILEINFOA {
    long dwMaxBytesPerSec;
    long dwFlags;
    long dwCaps;
    long dwStreams;
    long dwSuggestedBufferSize;
    long dwWidth;
    long dwHeight;
    long dwScale;
    long dwRate;
    long dwLength;
    long dwEditCount;
    char szFileType[64];
} AVIFILEINFOA, * LPAVIFILEINFOA, *PAVIFILEINFOA;

typedef AVIFILEINFOA AVIFILEINFO;
typedef PAVIFILEINFOA PAVIFILEINFO;
typedef LPAVIFILEINFOA LPAVIFILEINFO;







typedef struct {
    long fccType;
    long fccHandler;
    long dwKeyFrameEvery;
    long dwQuality;
    long dwBytesPerSecond;
    long dwFlags;
    void* lpFormat;
    long cbFormat;
    void* lpParms;
    long cbParms;
    long dwInterleaveEvery;
} AVICOMPRESSOPTIONS, *LPAVICOMPRESSOPTIONS,*PAVICOMPRESSOPTIONS;



typedef struct {
    long cbSize;

    long dwFlags;
    HIC hic;
    long fccType;
    long fccHandler;

    LPBITMAPINFO lpbiIn;
    LPBITMAPINFO lpbiOut;
    void* lpBitsOut;
    void* lpBitsPrev;
    long lFrame;
    long lKey;
    long lDataRate;
    long lQ;
    long lKeyCount;
    void* lpState;
    long cbState;
} COMPVARS, *PCOMPVARS;







typedef struct {
    DWORD dwDCISize;
    LPCSTR lpszDCISectionName;
    LPCSTR lpszDCIAliasName;
} DRVCONFIGINFO16, *LPDRVCONFIGINFO16;

typedef struct {
    DWORD dwDCISize;
    LPCWSTR lpszDCISectionName;
    LPCWSTR lpszDCIAliasName;
} DRVCONFIGINFO, *LPDRVCONFIGINFO;






typedef struct
{
    UINT16 length;
    HDRVR16 hDriver;
    HINSTANCE16 hModule;
    CHAR szAliasName[128];
} DRIVERINFOSTRUCT16, *LPDRIVERINFOSTRUCT16;

LRESULT __attribute__((__stdcall__)) DefDriverProc16(DWORD dwDevID, HDRVR16 hDriv, UINT16 wMsg,
                               LPARAM dwParam1, LPARAM dwParam2);
LRESULT __attribute__((__stdcall__)) DefDriverProc(DWORD dwDriverIdentifier, HDRVR hdrvr,
                               UINT Msg, LPARAM lParam1, LPARAM lParam2);
HDRVR16 __attribute__((__stdcall__)) OpenDriver16(LPCSTR szDriverName, LPCSTR szSectionName,
                            LPARAM lParam2);
HDRVR __attribute__((__stdcall__)) OpenDriverA(LPCSTR szDriverName, LPCSTR szSectionName,
                             LPARAM lParam2);
HDRVR __attribute__((__stdcall__)) OpenDriverW(LPCWSTR szDriverName, LPCWSTR szSectionName,
                             LPARAM lParam2);

LRESULT __attribute__((__stdcall__)) CloseDriver16(HDRVR16 hDriver, LPARAM lParam1, LPARAM lParam2);
LRESULT __attribute__((__stdcall__)) CloseDriver(HDRVR hDriver, LPARAM lParam1, LPARAM lParam2);
LRESULT __attribute__((__stdcall__)) SendDriverMessage16( HDRVR16 hDriver, UINT16 message,
                                    LPARAM lParam1, LPARAM lParam2 );
LRESULT __attribute__((__stdcall__)) SendDriverMessage( HDRVR hDriver, UINT message,
                                    LPARAM lParam1, LPARAM lParam2 );
HMODULE16 __attribute__((__stdcall__)) GetDriverModuleHandle16(HDRVR16 hDriver);
HMODULE __attribute__((__stdcall__)) GetDriverModuleHandle(HDRVR hDriver);

DWORD __attribute__((__stdcall__)) GetDriverFlags( HDRVR hDriver );




extern int WIN32_LastError;











typedef struct _WAVEFILTER {
  DWORD cbStruct;
  DWORD dwFilterTag;
  DWORD fdwFilter;
  DWORD dwReserved[5];
} WAVEFILTER, *PWAVEFILTER, *NPWAVEFILTER, *LPWAVEFILTER;





typedef struct _WAVEFILTER_VOLUME {
   WAVEFILTER wfltr;
   DWORD dwVolume;
} VOLUMEWAVEFILTER, *PVOLUMEWAVEFILTER, *NPVOLUMEWAVEFILTER, *LPVOLUMEWAVEFILTER;





typedef struct WAVEFILTER_ECHO {
   WAVEFILTER wfltr;
   DWORD dwVolume;
   DWORD dwDelay;
} ECHOWAVEFILTER, *PECHOWAVEFILTER, *NPECHOWAVEFILTER, *LPECHOWAVEFILTER;




typedef struct _WAVEFORMATEX {
  WORD wFormatTag;
  WORD nChannels;
  DWORD nSamplesPerSec;
  DWORD nAvgBytesPerSec;
  WORD nBlockAlign;
  WORD wBitsPerSample;
  WORD cbSize;
} WAVEFORMATEX, *PWAVEFORMATEX, *NPWAVEFORMATEX, *LPWAVEFORMATEX;







typedef UINT16 MMVERSION16;
typedef UINT MMVERSION;
typedef UINT16 MCIDEVICEID16;
typedef UINT MCIDEVICEID;
typedef UINT16 MMRESULT16;
typedef UINT MMRESULT;
typedef DWORD FOURCC;
typedef WIN_BOOL __attribute__((__stdcall__)) ( *ACMDRIVERENUMCB)(
  HACMDRIVERID hadid, DWORD dwInstance, DWORD fdwSupport
);

typedef WIN_BOOL16 __attribute__((__stdcall__)) ( *ACMDRIVERENUMCB16)(
  HACMDRIVERID16 hadid, DWORD dwInstance, DWORD fdwSupport
);

typedef UINT __attribute__((__stdcall__)) ( *ACMFILTERCHOOSEHOOKPROCA)(
  HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam
);

typedef UINT __attribute__((__stdcall__)) ( *ACMFILTERCHOOSEHOOKPROCW)(
  HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam
);

typedef UINT __attribute__((__stdcall__)) ( *ACMFILTERCHOOSEHOOKPROC16)(
  HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam
);

typedef UINT __attribute__((__stdcall__)) ( *ACMFORMATCHOOSEHOOKPROCA)(
  HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam
);

typedef UINT __attribute__((__stdcall__)) ( *ACMFORMATCHOOSEHOOKPROCW)(
  HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam
);

typedef UINT16 __attribute__((__stdcall__)) ( *ACMFORMATCHOOSEHOOKPROC16)(
  HWND16 hwnd, UINT16 uMsg, WPARAM16 wParam, LPARAM lParam
);





typedef struct _ACMDRIVERDETAILSA
{
  DWORD cbStruct;

  FOURCC fccType;
  FOURCC fccComp;

  WORD wMid;
  WORD wPid;

  DWORD vdwACM;
  DWORD vdwDriver;

  DWORD fdwSupport;
  DWORD cFormatTags;
  DWORD cFilterTags;

  HICON hicon;

  CHAR szShortName[32];
  CHAR szLongName[128];
  CHAR szCopyright[80];
  CHAR szLicensing[128];
  CHAR szFeatures[512];
} ACMDRIVERDETAILSA, *PACMDRIVERDETAILSA;

typedef struct _ACMDRIVERDETAILSW
{
  DWORD cbStruct;

  FOURCC fccType;
  FOURCC fccComp;

  WORD wMid;
  WORD wPid;

  DWORD vdwACM;
  DWORD vdwDriver;

  DWORD fdwSupport;
  DWORD cFormatTags;
  DWORD cFilterTags;

  HICON hicon;

  WCHAR szShortName[32];
  WCHAR szLongName[128];
  WCHAR szCopyright[80];
  WCHAR szLicensing[128];
  WCHAR szFeatures[512];
} ACMDRIVERDETAILSW, *PACMDRIVERDETAILSW;

typedef struct _ACMDRIVERDETAILS16
{
  DWORD cbStruct;

  FOURCC fccType;
  FOURCC fccComp;

  WORD wMid;
  WORD wPid;

  DWORD vdwACM;
  DWORD vdwDriver;

  DWORD fdwSupport;
  DWORD cFormatTags;
  DWORD cFilterTags;

  HICON16 hicon;

  CHAR szShortName[32];
  CHAR szLongName[128];
  CHAR szCopyright[80];
  CHAR szLicensing[128];
  CHAR szFeatures[512];
} ACMDRIVERDETAILS16, *NPACMDRIVERDETAILS16, *LPACMDRIVERDETAILS16;

typedef struct _ACMFILTERCHOOSEA
{
  DWORD cbStruct;
  DWORD fdwStyle;

  HWND hwndOwner;

  PWAVEFILTER pwfltr;
  DWORD cbwfltr;

  LPCSTR pszTitle;

  CHAR szFilterTag[48];
  CHAR szFilter[128];
  LPSTR pszName;
  DWORD cchName;

  DWORD fdwEnum;
  PWAVEFILTER pwfltrEnum;

  HINSTANCE hInstance;
  LPCSTR pszTemplateName;
  LPARAM lCustData;
  ACMFILTERCHOOSEHOOKPROCA pfnHook;
} ACMFILTERCHOOSEA, *PACMFILTERCHOOSEA;

typedef struct _ACMFILTERCHOOSEW
{
  DWORD cbStruct;
  DWORD fdwStyle;

  HWND hwndOwner;

  PWAVEFILTER pwfltr;
  DWORD cbwfltr;

  LPCWSTR pszTitle;

  WCHAR szFilterTag[48];
  WCHAR szFilter[128];
  LPWSTR pszName;
  DWORD cchName;

  DWORD fdwEnum;
  PWAVEFILTER pwfltrEnum;

  HINSTANCE hInstance;
  LPCWSTR pszTemplateName;
  LPARAM lCustData;
  ACMFILTERCHOOSEHOOKPROCW pfnHook;
} ACMFILTERCHOOSEW, *PACMFILTERCHOOSEW;

typedef struct _ACMFILTERCHOOSE16
{
  DWORD cbStruct;
  DWORD fdwStyle;

  HWND16 hwndOwner;

  LPWAVEFILTER pwfltr;
  DWORD cbwfltr;

  LPCSTR pszTitle;

  char szFilterTag[48];
  char szFilter[128];
  LPSTR pszName;
  DWORD cchName;

  DWORD fdwEnum;
  LPWAVEFILTER pwfltrEnum;

  HINSTANCE16 hInstance;
  LPCSTR pszTemplateName;
  LPARAM lCustData;
  ACMFILTERCHOOSEHOOKPROC16 pfnHook;
} ACMFILTERCHOOSE16, *NPACMFILTERCHOOSE16, *LPACMFILTERCHOOSE16;

typedef struct _ACMFILTERDETAILSA
{
  DWORD cbStruct;
  DWORD dwFilterIndex;
  DWORD dwFilterTag;
  DWORD fdwSupport;
  PWAVEFILTER pwfltr;
  DWORD cbwfltr;
  CHAR szFilter[128];
} ACMFILTERDETAILSA, *PACMFILTERDETAILSA;

typedef struct _ACMFILTERDETAILSW
{
  DWORD cbStruct;
  DWORD dwFilterIndex;
  DWORD dwFilterTag;
  DWORD fdwSupport;
  PWAVEFILTER pwfltr;
  DWORD cbwfltr;
  WCHAR szFilter[128];
} ACMFILTERDETAILSW, *PACMFILTERDETAILSW;

typedef struct _ACMFILTERDETAILS16
{
  DWORD cbStruct;
  DWORD dwFilterIndex;
  DWORD dwFilterTag;
  DWORD fdwSupport;
  LPWAVEFILTER pwfltr;
  DWORD cbwfltr;
  CHAR szFilter[128];
} ACMFILTERDETAILS16, *NPACMFILTERDETAILS16, *LPACMFILTERDETAILS16;

typedef struct _ACMFILTERTAGDETAILSA
{
  DWORD cbStruct;
  DWORD dwFilterTagIndex;
  DWORD dwFilterTag;
  DWORD cbFilterSize;
  DWORD fdwSupport;
  DWORD cStandardFilters;
  CHAR szFilterTag[48];
} ACMFILTERTAGDETAILSA, *PACMFILTERTAGDETAILSA;

typedef struct _ACMFILTERTAGDETAILSW
{
  DWORD cbStruct;
  DWORD dwFilterTagIndex;
  DWORD dwFilterTag;
  DWORD cbFilterSize;
  DWORD fdwSupport;
  DWORD cStandardFilters;
  WCHAR szFilterTag[48];
} ACMFILTERTAGDETAILSW, *PACMFILTERTAGDETAILSW;

typedef struct _ACMFILTERTAGDETAILS16
{
  DWORD cbStruct;
  DWORD dwFilterTagIndex;
  DWORD dwFilterTag;
  DWORD cbFilterSize;
  DWORD fdwSupport;
  DWORD cStandardFilters;
  CHAR szFilterTag[48];
} ACMFILTERTAGDETAILS16, *NPACMFILTERTAGDETAILS16, *LPACMFILTERTAGDETAILS16;

typedef struct _ACMFORMATCHOOSEA
{
  DWORD cbStruct;
  DWORD fdwStyle;

  HWND hwndOwner;

  PWAVEFORMATEX pwfx;
  DWORD cbwfx;
  LPCSTR pszTitle;

  CHAR szFormatTag[48];
  CHAR szFormat[128];

  LPSTR pszName;
  DWORD cchName;

  DWORD fdwEnum;
  PWAVEFORMATEX pwfxEnum;

  HINSTANCE hInstance;
  LPCSTR pszTemplateName;
  LPARAM lCustData;
  ACMFORMATCHOOSEHOOKPROCA pfnHook;
} ACMFORMATCHOOSEA, *PACMFORMATCHOOSEA;

typedef struct _ACMFORMATCHOOSEW
{
  DWORD cbStruct;
  DWORD fdwStyle;

  HWND hwndOwner;

  PWAVEFORMATEX pwfx;
  DWORD cbwfx;
  LPCWSTR pszTitle;

  WCHAR szFormatTag[48];
  WCHAR szFormat[128];

  LPWSTR pszName;
  DWORD cchName;

  DWORD fdwEnum;
  LPWAVEFORMATEX pwfxEnum;

  HINSTANCE hInstance;
  LPCWSTR pszTemplateName;
  LPARAM lCustData;
  ACMFORMATCHOOSEHOOKPROCW pfnHook;
} ACMFORMATCHOOSEW, *PACMFORMATCHOOSEW;

typedef struct _ACMFORMATCHOOSE16
{
  DWORD cbStruct;
  DWORD fdwStyle;

  HWND16 hwndOwner;

  LPWAVEFORMATEX pwfx;
  DWORD cbwfx;
  LPCSTR pszTitle;

  CHAR szFormatTag[48];
  CHAR szFormat[128];

  LPSTR pszName;
  DWORD cchName;

  DWORD fdwEnum;
  LPWAVEFORMATEX pwfxEnum;

  HINSTANCE16 hInstance;
  LPCSTR pszTemplateName;
  LPARAM lCustData;
  ACMFORMATCHOOSEHOOKPROC16 pfnHook;
} ACMFORMATCHOOSE16, *NPACMFORMATCHOOSE16, *LPACMFORMATCHOOSE16;

typedef struct _ACMFORMATDETAILSA
{
  DWORD cbStruct;
  DWORD dwFormatIndex;
  DWORD dwFormatTag;
  DWORD fdwSupport;
  PWAVEFORMATEX pwfx;
  DWORD cbwfx;
  CHAR szFormat[128];
} ACMFORMATDETAILSA, *PACMFORMATDETAILSA;

typedef struct _ACMFORMATDETAILSW
{
    DWORD cbStruct;
    DWORD dwFormatIndex;
    DWORD dwFormatTag;
    DWORD fdwSupport;
    PWAVEFORMATEX pwfx;
    DWORD cbwfx;
    WCHAR szFormat[128];
} ACMFORMATDETAILSW, *PACMFORMATDETAILSW;

typedef struct _ACMFORMATDETAILS16
{
    DWORD cbStruct;
    DWORD dwFormatIndex;
    DWORD dwFormatTag;
    DWORD fdwSupport;
    LPWAVEFORMATEX pwfx;
    DWORD cbwfx;
    CHAR szFormat[128];
} ACMFORMATDETAILS16, *NPACMFORMATDETAILS16, *LPACMFORMATDETAILS16;

typedef struct _ACMFORMATTAGDETAILSA
{
  DWORD cbStruct;
  DWORD dwFormatTagIndex;
  DWORD dwFormatTag;
  DWORD cbFormatSize;
  DWORD fdwSupport;
  DWORD cStandardFormats;
  CHAR szFormatTag[48];
} ACMFORMATTAGDETAILSA, *PACMFORMATTAGDETAILSA;

typedef struct _ACMFORMATTAGDETAILSW
{
  DWORD cbStruct;
  DWORD dwFormatTagIndex;
  DWORD dwFormatTag;
  DWORD cbFormatSize;
  DWORD fdwSupport;
  DWORD cStandardFormats;
  WCHAR szFormatTag[48];
} ACMFORMATTAGDETAILSW, *PACMFORMATTAGDETAILSW;

typedef struct _ACMFORMATTAGDETAILS16
{
  DWORD cbStruct;
  DWORD dwFormatTagIndex;
  DWORD dwFormatTag;
  DWORD cbFormatSize;
  DWORD fdwSupport;
  DWORD cStandardFormats;
  CHAR szFormatTag[48];
} ACMFORMATTAGDETAILS16, *NPACMFORMATTAGDETAILS16, *LPACMFORMATTAGDETAILS16;

typedef struct _ACMSTREAMHEADER
{
  DWORD cbStruct;
  DWORD fdwStatus;
  DWORD dwUser;
  LPBYTE pbSrc;
  DWORD cbSrcLength;
  DWORD cbSrcLengthUsed;
  DWORD dwSrcUser;
  LPBYTE pbDst;
  DWORD cbDstLength;
  DWORD cbDstLengthUsed;
  DWORD dwDstUser;
  DWORD dwReservedDriver[10];
} ACMSTREAMHEADER16, *NPACMSTREAMHEADER16, *LPACMSTREAMHEADER16,
  ACMSTREAMHEADER, *PACMSTREAMHEADER;





typedef WIN_BOOL __attribute__((__stdcall__)) ( *ACMFILTERENUMCBA)(
  HACMDRIVERID hadid, PACMFILTERDETAILSA pafd,
  DWORD dwInstance, DWORD fdwSupport
);

typedef WIN_BOOL __attribute__((__stdcall__)) ( *ACMFILTERENUMCBW)(
  HACMDRIVERID hadid, PACMFILTERDETAILSW pafd,
  DWORD dwInstance, DWORD fdwSupport
);

typedef WIN_BOOL16 __attribute__((__stdcall__)) ( *ACMFILTERENUMCB16)(
 HACMDRIVERID16 hadid, LPACMFILTERDETAILS16 pafd,
 DWORD dwInstance, DWORD fdwSupport
);

typedef WIN_BOOL __attribute__((__stdcall__)) ( *ACMFILTERTAGENUMCBA)(
  HACMDRIVERID hadid, PACMFILTERTAGDETAILSA paftd,
  DWORD dwInstance, DWORD fdwSupport
);

typedef WIN_BOOL __attribute__((__stdcall__)) ( *ACMFILTERTAGENUMCBW)(
  HACMDRIVERID hadid, PACMFILTERTAGDETAILSW paftd,
  DWORD dwInstance, DWORD fdwSupport
);

typedef WIN_BOOL16 __attribute__((__stdcall__)) ( *ACMFILTERTAGENUMCB16)(
  HACMDRIVERID16 hadid, LPACMFILTERTAGDETAILS16 paftd,
  DWORD dwInstance, DWORD fdwSupport
);

typedef WIN_BOOL __attribute__((__stdcall__)) ( *ACMFORMATENUMCBA)(
  HACMDRIVERID hadid, PACMFORMATDETAILSA pafd,
  DWORD dwInstance, DWORD fdwSupport
);

typedef WIN_BOOL __attribute__((__stdcall__)) ( *ACMFORMATENUMCBW)(
  HACMDRIVERID hadid, PACMFORMATDETAILSW pafd,
  DWORD dwInstance, DWORD fdwSupport
);

typedef WIN_BOOL16 __attribute__((__stdcall__)) ( *ACMFORMATENUMCB16)(
  HACMDRIVERID16 hadid, LPACMFORMATDETAILS16 pafd,
  DWORD dwInstance, DWORD fdwSupport
);

typedef WIN_BOOL __attribute__((__stdcall__)) ( *ACMFORMATTAGENUMCBA)(
  HACMDRIVERID hadid, PACMFORMATTAGDETAILSA paftd,
  DWORD dwInstance, DWORD fdwSupport
);

typedef WIN_BOOL __attribute__((__stdcall__)) ( *ACMFORMATTAGENUMCBW)(
  HACMDRIVERID hadid, PACMFORMATTAGDETAILSW paftd,
  DWORD dwInstance, DWORD fdwSupport
);

typedef WIN_BOOL16 __attribute__((__stdcall__)) ( *ACMFORMATTAGENUMCB16)(
  HACMDRIVERID16 hadid, LPACMFORMATTAGDETAILS16 paftd,
  DWORD dwInstance, DWORD fdwSupport
);





DWORD __attribute__((__stdcall__)) acmGetVersion16(
);
MMRESULT16 __attribute__((__stdcall__)) acmMetrics16(
  HACMOBJ16 hao, UINT16 uMetric, LPVOID pMetric
);
MMRESULT16 __attribute__((__stdcall__)) acmDriverEnum16(
  ACMDRIVERENUMCB16 fnCallback, DWORD dwInstance, DWORD fdwEnum
);
MMRESULT16 __attribute__((__stdcall__)) acmDriverDetails16(
  HACMDRIVERID16 hadid, LPACMDRIVERDETAILS16 padd, DWORD fdwDetails
);
MMRESULT16 __attribute__((__stdcall__)) acmDriverAdd16(
  LPHACMDRIVERID16 phadid, HINSTANCE16 hinstModule,
  LPARAM lParam, DWORD dwPriority, DWORD fdwAdd
);
MMRESULT16 __attribute__((__stdcall__)) acmDriverRemove16(
  HACMDRIVERID16 hadid, DWORD fdwRemove
);
MMRESULT16 __attribute__((__stdcall__)) acmDriverOpen16(
  LPHACMDRIVER16 phad, HACMDRIVERID16 hadid, DWORD fdwOpen
);
MMRESULT16 __attribute__((__stdcall__)) acmDriverClose16(
  HACMDRIVER16 had, DWORD fdwClose
);
LRESULT __attribute__((__stdcall__)) acmDriverMessage16(
  HACMDRIVER16 had, UINT16 uMsg, LPARAM lParam1, LPARAM lParam2
);
MMRESULT16 __attribute__((__stdcall__)) acmDriverID16(
  HACMOBJ16 hao, LPHACMDRIVERID16 phadid, DWORD fdwDriverID
);
MMRESULT16 __attribute__((__stdcall__)) acmDriverPriority16(
 HACMDRIVERID16 hadid, DWORD dwPriority, DWORD fdwPriority
);
MMRESULT16 __attribute__((__stdcall__)) acmFormatTagDetails16(
  HACMDRIVER16 had, LPACMFORMATTAGDETAILS16 paftd, DWORD fdwDetails
);
MMRESULT16 __attribute__((__stdcall__)) acmFormatTagEnum16(
  HACMDRIVER16 had, LPACMFORMATTAGDETAILS16 paftd,
  ACMFORMATTAGENUMCB16 fnCallback, DWORD dwInstance, DWORD fdwEnum
);
MMRESULT16 __attribute__((__stdcall__)) acmFormatChoose16(
  LPACMFORMATCHOOSE16 pafmtc
);
MMRESULT16 __attribute__((__stdcall__)) acmFormatDetails16(
  HACMDRIVER16 had, LPACMFORMATDETAILS16 pafd, DWORD fdwDetails
);
MMRESULT16 __attribute__((__stdcall__)) acmFormatEnum16(
  HACMDRIVER16 had, LPACMFORMATDETAILS16 pafd,
  ACMFORMATENUMCB16 fnCallback, DWORD dwInstance, DWORD fdwEnum
);
MMRESULT16 __attribute__((__stdcall__)) acmFormatSuggest16(
  HACMDRIVER16 had, LPWAVEFORMATEX pwfxSrc,
  LPWAVEFORMATEX pwfxDst, DWORD cbwfxDst, DWORD fdwSuggest
);
MMRESULT16 __attribute__((__stdcall__)) acmFilterTagDetails16(
  HACMDRIVER16 had, LPACMFILTERTAGDETAILS16 paftd, DWORD fdwDetails
);
MMRESULT16 __attribute__((__stdcall__)) acmFilterTagEnum16(
  HACMDRIVER16 had, LPACMFILTERTAGDETAILS16 paftd,
  ACMFILTERTAGENUMCB16 fnCallback, DWORD dwInstance, DWORD fdwEnum
);
MMRESULT16 __attribute__((__stdcall__)) acmFilterChoose16(
  LPACMFILTERCHOOSE16 pafltrc
);
MMRESULT16 __attribute__((__stdcall__)) acmFilterDetails16(
  HACMDRIVER16 had, LPACMFILTERDETAILS16 pafd, DWORD fdwDetails
);
MMRESULT16 __attribute__((__stdcall__)) acmFilterEnum16(
  HACMDRIVER16 had, LPACMFILTERDETAILS16 pafd,
  ACMFILTERENUMCB16 fnCallback, DWORD dwInstance, DWORD fdwEnum
);
MMRESULT16 __attribute__((__stdcall__)) acmStreamOpen16(
  LPHACMSTREAM16 phas, HACMDRIVER16 had,
  LPWAVEFORMATEX pwfxSrc, LPWAVEFORMATEX pwfxDst,
  LPWAVEFILTER pwfltr, DWORD dwCallback,
  DWORD dwInstance, DWORD fdwOpen
);
MMRESULT16 __attribute__((__stdcall__)) acmStreamClose16(
  HACMSTREAM16 has, DWORD fdwClose
);
MMRESULT16 __attribute__((__stdcall__)) acmStreamSize16(
  HACMSTREAM16 has, DWORD cbInput,
  LPDWORD pdwOutputBytes, DWORD fdwSize
);
MMRESULT16 __attribute__((__stdcall__)) acmStreamConvert16(
  HACMSTREAM16 has, LPACMSTREAMHEADER16 pash, DWORD fdwConvert
);
MMRESULT16 __attribute__((__stdcall__)) acmStreamReset16(
  HACMSTREAM16 has, DWORD fdwReset
);
MMRESULT16 __attribute__((__stdcall__)) acmStreamPrepareHeader16(
  HACMSTREAM16 has, LPACMSTREAMHEADER16 pash, DWORD fdwPrepare
);
MMRESULT16 __attribute__((__stdcall__)) acmStreamUnprepareHeader16(
  HACMSTREAM16 has, LPACMSTREAMHEADER16 pash, DWORD fdwUnprepare
);





MMRESULT __attribute__((__stdcall__)) acmDriverAddA(
  PHACMDRIVERID phadid, HINSTANCE hinstModule,
  LPARAM lParam, DWORD dwPriority, DWORD fdwAdd
);
MMRESULT __attribute__((__stdcall__)) acmDriverAddW(
  PHACMDRIVERID phadid, HINSTANCE hinstModule,
  LPARAM lParam, DWORD dwPriority, DWORD fdwAdd
);
MMRESULT __attribute__((__stdcall__)) acmDriverClose(
  HACMDRIVER had, DWORD fdwClose
);
MMRESULT __attribute__((__stdcall__)) acmDriverDetailsA(
  HACMDRIVERID hadid, PACMDRIVERDETAILSA padd, DWORD fdwDetails
);
MMRESULT __attribute__((__stdcall__)) acmDriverDetailsW(
  HACMDRIVERID hadid, PACMDRIVERDETAILSW padd, DWORD fdwDetails
);
MMRESULT __attribute__((__stdcall__)) acmDriverEnum(
  ACMDRIVERENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum
);
MMRESULT __attribute__((__stdcall__)) acmDriverID(
  HACMOBJ hao, PHACMDRIVERID phadid, DWORD fdwDriverID
);
LRESULT __attribute__((__stdcall__)) acmDriverMessage(
  HACMDRIVER had, UINT uMsg, LPARAM lParam1, LPARAM lParam2
);
MMRESULT __attribute__((__stdcall__)) acmDriverOpen(
  PHACMDRIVER phad, HACMDRIVERID hadid, DWORD fdwOpen
);
MMRESULT __attribute__((__stdcall__)) acmDriverPriority(
  HACMDRIVERID hadid, DWORD dwPriority, DWORD fdwPriority
);
MMRESULT __attribute__((__stdcall__)) acmDriverRemove(
  HACMDRIVERID hadid, DWORD fdwRemove
);
MMRESULT __attribute__((__stdcall__)) acmFilterChooseA(
  PACMFILTERCHOOSEA pafltrc
);
MMRESULT __attribute__((__stdcall__)) acmFilterChooseW(
  PACMFILTERCHOOSEW pafltrc
);
MMRESULT __attribute__((__stdcall__)) acmFilterDetailsA(
  HACMDRIVER had, PACMFILTERDETAILSA pafd, DWORD fdwDetails
);
MMRESULT __attribute__((__stdcall__)) acmFilterDetailsW(
  HACMDRIVER had, PACMFILTERDETAILSW pafd, DWORD fdwDetails
);
MMRESULT __attribute__((__stdcall__)) acmFilterEnumA(
  HACMDRIVER had, PACMFILTERDETAILSA pafd,
  ACMFILTERENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum
);
MMRESULT __attribute__((__stdcall__)) acmFilterEnumW(
  HACMDRIVER had, PACMFILTERDETAILSW pafd,
  ACMFILTERENUMCBW fnCallback, DWORD dwInstance, DWORD fdwEnum
);
MMRESULT __attribute__((__stdcall__)) acmFilterTagDetailsA(
  HACMDRIVER had, PACMFILTERTAGDETAILSA paftd, DWORD fdwDetails
);
MMRESULT __attribute__((__stdcall__)) acmFilterTagDetailsW(
  HACMDRIVER had, PACMFILTERTAGDETAILSW paftd, DWORD fdwDetails
);
MMRESULT __attribute__((__stdcall__)) acmFilterTagEnumA(
  HACMDRIVER had, PACMFILTERTAGDETAILSA paftd,
  ACMFILTERTAGENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum
);
MMRESULT __attribute__((__stdcall__)) acmFilterTagEnumW(
  HACMDRIVER had, PACMFILTERTAGDETAILSW paftd,
  ACMFILTERTAGENUMCBW fnCallback, DWORD dwInstance, DWORD fdwEnum
);
MMRESULT __attribute__((__stdcall__)) acmFormatChooseA(
  PACMFORMATCHOOSEA pafmtc
);
MMRESULT __attribute__((__stdcall__)) acmFormatChooseW(
  PACMFORMATCHOOSEW pafmtc
);
MMRESULT __attribute__((__stdcall__)) acmFormatDetailsA(
  HACMDRIVER had, PACMFORMATDETAILSA pafd, DWORD fdwDetails
);
MMRESULT __attribute__((__stdcall__)) acmFormatDetailsW(
  HACMDRIVER had, PACMFORMATDETAILSW pafd, DWORD fdwDetails
);
MMRESULT __attribute__((__stdcall__)) acmFormatEnumA(
  HACMDRIVER had, PACMFORMATDETAILSA pafd,
  ACMFORMATENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum
);
MMRESULT __attribute__((__stdcall__)) acmFormatEnumW(
  HACMDRIVER had, PACMFORMATDETAILSW pafd,
  ACMFORMATENUMCBW fnCallback, DWORD dwInstance, DWORD fdwEnum
);
MMRESULT __attribute__((__stdcall__)) acmFormatSuggest(
  HACMDRIVER had, PWAVEFORMATEX pwfxSrc, PWAVEFORMATEX pwfxDst,
  DWORD cbwfxDst, DWORD fdwSuggest
);
MMRESULT __attribute__((__stdcall__)) acmFormatTagDetailsA(
  HACMDRIVER had, PACMFORMATTAGDETAILSA paftd, DWORD fdwDetails
);
MMRESULT __attribute__((__stdcall__)) acmFormatTagDetailsW(
  HACMDRIVER had, PACMFORMATTAGDETAILSW paftd, DWORD fdwDetails
);
MMRESULT __attribute__((__stdcall__)) acmFormatTagEnumA(
  HACMDRIVER had, PACMFORMATTAGDETAILSA paftd,
  ACMFORMATTAGENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum
);
MMRESULT __attribute__((__stdcall__)) acmFormatTagEnumW(
  HACMDRIVER had, PACMFORMATTAGDETAILSW paftd,
  ACMFORMATTAGENUMCBW fnCallback, DWORD dwInstance, DWORD fdwEnum
);
DWORD __attribute__((__stdcall__)) acmGetVersion(
);
MMRESULT __attribute__((__stdcall__)) acmMetrics(
  HACMOBJ hao, UINT uMetric, LPVOID pMetric
);
MMRESULT __attribute__((__stdcall__)) acmStreamClose(
  HACMSTREAM has, DWORD fdwClose
);
MMRESULT __attribute__((__stdcall__)) acmStreamConvert(
  HACMSTREAM has, PACMSTREAMHEADER pash, DWORD fdwConvert
);
MMRESULT __attribute__((__stdcall__)) acmStreamMessage(
  HACMSTREAM has, UINT uMsg, LPARAM lParam1, LPARAM lParam2
);
MMRESULT __attribute__((__stdcall__)) acmStreamOpen(
  PHACMSTREAM phas, HACMDRIVER had, PWAVEFORMATEX pwfxSrc,
  PWAVEFORMATEX pwfxDst, PWAVEFILTER pwfltr, DWORD dwCallback,
  DWORD dwInstance, DWORD fdwOpen
);
MMRESULT __attribute__((__stdcall__)) acmStreamPrepareHeader(
  HACMSTREAM has, PACMSTREAMHEADER pash, DWORD fdwPrepare
);
MMRESULT __attribute__((__stdcall__)) acmStreamReset(
  HACMSTREAM has, DWORD fdwReset
);
MMRESULT __attribute__((__stdcall__)) acmStreamSize(
  HACMSTREAM has, DWORD cbInput,
  LPDWORD pdwOutputBytes, DWORD fdwSize
);
MMRESULT __attribute__((__stdcall__)) acmStreamUnprepareHeader(
  HACMSTREAM has, PACMSTREAMHEADER pash, DWORD fdwUnprepare
);
void MSACM_RegisterAllDrivers(void);







typedef struct _ACMDRVOPENDESCA
{
  DWORD cbStruct;
  FOURCC fccType;
  FOURCC fccComp;
  DWORD dwVersion;
  DWORD dwFlags;
  DWORD dwError;
  LPCSTR pszSectionName;
  LPCSTR pszAliasName;
  DWORD dnDevNode;
} ACMDRVOPENDESCA, *PACMDRVOPENDESCA;

typedef struct _ACMDRVOPENDESCW
{
  DWORD cbStruct;
  FOURCC fccType;
  FOURCC fccComp;
  DWORD dwVersion;
  DWORD dwFlags;
  DWORD dwError;
  LPCWSTR pszSectionName;
  LPCWSTR pszAliasName;
  DWORD dnDevNode;
} ACMDRVOPENDESCW, *PACMDRVOPENDESCW;

typedef struct _ACMDRVOPENDESC16
{
  DWORD cbStruct;
  FOURCC fccType;
  FOURCC fccComp;
  DWORD dwVersion;
  DWORD dwFlags;
  DWORD dwError;
  LPCSTR pszSectionName;
  LPCSTR pszAliasName;
  DWORD dnDevNode;
} ACMDRVOPENDESC16, *NPACMDRVOPENDESC16, *LPACMDRVOPENDESC16;

typedef struct _ACMDRVSTREAMINSTANCE16
{
  DWORD cbStruct;
  LPWAVEFORMATEX pwfxSrc;
  LPWAVEFORMATEX pwfxDst;
  LPWAVEFILTER pwfltr;
  DWORD dwCallback;
  DWORD dwInstance;
  DWORD fdwOpen;
  DWORD fdwDriver;
  DWORD dwDriver;
  HACMSTREAM16 has;
} ACMDRVSTREAMINSTANCE16, *NPACMDRVSTREAMINSTANCE16, *LPACMDRVSTREAMINSTANCE16;

typedef struct _ACMDRVSTREAMINSTANCE
{
  DWORD cbStruct;
  PWAVEFORMATEX pwfxSrc;
  PWAVEFORMATEX pwfxDst;
  PWAVEFILTER pwfltr;
  DWORD dwCallback;
  DWORD dwInstance;
  DWORD fdwOpen;
  DWORD fdwDriver;
  DWORD dwDriver;
  HACMSTREAM has;
} ACMDRVSTREAMINSTANCE, *PACMDRVSTREAMINSTANCE;


typedef struct _ACMDRVSTREAMHEADER16 *LPACMDRVSTREAMHEADER16;
typedef struct _ACMDRVSTREAMHEADER16 {
  DWORD cbStruct;
  DWORD fdwStatus;
  DWORD dwUser;
  LPBYTE pbSrc;
  DWORD cbSrcLength;
  DWORD cbSrcLengthUsed;
  DWORD dwSrcUser;
  LPBYTE pbDst;
  DWORD cbDstLength;
  DWORD cbDstLengthUsed;
  DWORD dwDstUser;

  DWORD fdwConvert;
  LPACMDRVSTREAMHEADER16 *padshNext;
  DWORD fdwDriver;
  DWORD dwDriver;


  DWORD fdwPrepared;
  DWORD dwPrepared;
  LPBYTE pbPreparedSrc;
  DWORD cbPreparedSrcLength;
  LPBYTE pbPreparedDst;
  DWORD cbPreparedDstLength;
} ACMDRVSTREAMHEADER16, *NPACMDRVSTREAMHEADER16;

typedef struct _ACMDRVSTREAMHEADER *PACMDRVSTREAMHEADER;
typedef struct _ACMDRVSTREAMHEADER {
  DWORD cbStruct;
  DWORD fdwStatus;
  DWORD dwUser;
  LPBYTE pbSrc;
  DWORD cbSrcLength;
  DWORD cbSrcLengthUsed;
  DWORD dwSrcUser;
  LPBYTE pbDst;
  DWORD cbDstLength;
  DWORD cbDstLengthUsed;
  DWORD dwDstUser;

  DWORD fdwConvert;
  PACMDRVSTREAMHEADER *padshNext;
  DWORD fdwDriver;
  DWORD dwDriver;


  DWORD fdwPrepared;
  DWORD dwPrepared;
  LPBYTE pbPreparedSrc;
  DWORD cbPreparedSrcLength;
  LPBYTE pbPreparedDst;
  DWORD cbPreparedDstLength;
} ACMDRVSTREAMHEADER;

typedef struct _ACMDRVSTREAMSIZE
{
  DWORD cbStruct;
  DWORD fdwSize;
  DWORD cbSrcLength;
  DWORD cbDstLength;
} ACMDRVSTREAMSIZE16, *NPACMDRVSTREAMSIZE16, *LPACMDRVSTREAMSIZE16,
  ACMDRVSTREAMSIZE, *PACMDRVSTREAMSIZE;

typedef struct _ACMDRVFORMATSUGGEST16
{
  DWORD cbStruct;
  DWORD fdwSuggest;
  LPWAVEFORMATEX pwfxSrc;
  DWORD cbwfxSrc;
  LPWAVEFORMATEX pwfxDst;
  DWORD cbwfxDst;
} ACMDRVFORMATSUGGEST16, *NPACMDRVFORMATSUGGEST, *LPACMDRVFORMATSUGGEST;

typedef struct _ACMDRVFORMATSUGGEST
{
  DWORD cbStruct;
  DWORD fdwSuggest;
  PWAVEFORMATEX pwfxSrc;
  DWORD cbwfxSrc;
  PWAVEFORMATEX pwfxDst;
  DWORD cbwfxDst;
} ACMDRVFORMATSUGGEST, *PACMDRVFORMATSUGGEST;





typedef struct _WINE_ACMDRIVERID *PWINE_ACMDRIVERID;
typedef struct _WINE_ACMDRIVER *PWINE_ACMDRIVER;

typedef struct _WINE_ACMOBJ
{
  PWINE_ACMDRIVERID pACMDriverID;
} WINE_ACMOBJ, *PWINE_ACMOBJ;

typedef struct _WINE_ACMDRIVER
{
    WINE_ACMOBJ obj;
    HDRVR hDrvr;
    DRIVERPROC pfnDriverProc;
    PWINE_ACMDRIVER pNextACMDriver;
} WINE_ACMDRIVER;

typedef struct _WINE_ACMSTREAM
{
    WINE_ACMOBJ obj;
    PWINE_ACMDRIVER pDrv;
    ACMDRVSTREAMINSTANCE drvInst;
    HACMDRIVER hAcmDriver;
} WINE_ACMSTREAM, *PWINE_ACMSTREAM;

typedef struct _WINE_ACMDRIVERID
{
    LPSTR pszDriverAlias;
    LPSTR pszFileName;
    HINSTANCE hInstModule;
    DWORD dwProcessID;
    WIN_BOOL bEnabled;
    PWINE_ACMDRIVER pACMDriverList;
    PWINE_ACMDRIVERID pNextACMDriverID;
    PWINE_ACMDRIVERID pPrevACMDriverID;
} WINE_ACMDRIVERID;


extern HANDLE MSACM_hHeap;
extern PWINE_ACMDRIVERID MSACM_pFirstACMDriverID;
extern PWINE_ACMDRIVERID MSACM_pLastACMDriverID;
PWINE_ACMDRIVERID MSACM_RegisterDriver(
  LPSTR pszDriverAlias, LPSTR pszFileName,
  HINSTANCE hinstModule);
void MSACM_RegisterAllDrivers(void);
PWINE_ACMDRIVERID MSACM_UnregisterDriver(PWINE_ACMDRIVERID p);
void MSACM_UnregisterAllDrivers(void);
PWINE_ACMDRIVERID MSACM_GetDriverID(HACMDRIVERID hDriverID);
PWINE_ACMDRIVER MSACM_GetDriver(HACMDRIVER hDriver);
PWINE_ACMOBJ MSACM_GetObj(HACMOBJ hObj);





extern LPVOID FILE_dommap( int unix_handle, LPVOID start,
                           DWORD size_high, DWORD size_low,
                           DWORD offset_high, DWORD offset_low,
                           int prot, int flags );
extern int FILE_munmap( LPVOID start, DWORD size_high, DWORD size_low );
extern int wcsnicmp(const unsigned short* s1, const unsigned short* s2, int n);
extern int __vprintf( const char *format, ... );





extern HDRVR DrvOpen(LPARAM lParam2);
extern void DrvClose(HDRVR hdrvr);




#pragma pack(1)

static PWINE_ACMSTREAM ACM_GetStream(HACMSTREAM has)
{
    return (PWINE_ACMSTREAM)has;
}




MMRESULT __attribute__((__stdcall__)) acmDriverAddA(PHACMDRIVERID phadid, HINSTANCE hinstModule,
                              LPARAM lParam, DWORD dwPriority, DWORD fdwAdd)
{
    if (!phadid)
        return (0 + 11);


    if (fdwAdd &
        ~(0x00000003L|0x00000004L|
          0x00000008L))
        return (0 + 10);


    if ((fdwAdd & 0x00000003L) &&
        (fdwAdd & 0x00000004L))
        return (0 + 10);





    *phadid = (HACMDRIVERID) MSACM_RegisterDriver(0, 0, hinstModule);



    return 0;
}




MMRESULT __attribute__((__stdcall__)) acmDriverClose(HACMDRIVER had, DWORD fdwClose)
{
    PWINE_ACMDRIVER p;
    PWINE_ACMDRIVER* tp;

    if (fdwClose)
        return (0 + 10);

    p = MSACM_GetDriver(had);
    if (!p)
        return (0 + 5);

    for (tp = &(p->obj.pACMDriverID->pACMDriverList); *tp; *tp = (*tp)->pNextACMDriver) {
        if (*tp == p) {
            *tp = (*tp)->pNextACMDriver;
            break;
        }
    }

    if (p->hDrvr && !p->obj.pACMDriverID->pACMDriverList)
        DrvClose(p->hDrvr);

    HeapFree(MSACM_hHeap, 0, p);

    return 0;
}




MMRESULT __attribute__((__stdcall__)) acmDriverEnum(ACMDRIVERENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum)
{
    PWINE_ACMDRIVERID p;
    DWORD fdwSupport;

    if (!fnCallback) {
        return (0 + 11);
    }

    if (fdwEnum && ~(0x40000000L|0x80000000L)) {
        return (0 + 10);
    }

    for (p = MSACM_pFirstACMDriverID; p; p = p->pNextACMDriverID) {
        fdwSupport = 0x00000001L;
        if (!p->bEnabled) {
            if (fdwEnum & 0x80000000L)
                fdwSupport |= 0x80000000L;
            else
                continue;
        }
        (*fnCallback)((HACMDRIVERID) p, dwInstance, fdwSupport);
    }

    return 0;
}




MMRESULT __attribute__((__stdcall__)) acmDriverID(HACMOBJ hao, PHACMDRIVERID phadid, DWORD fdwDriverID)
{
    PWINE_ACMOBJ pao;

    pao = MSACM_GetObj(hao);
    if (!pao)
        return (0 + 5);

    if (!phadid)
        return (0 + 11);

    if (fdwDriverID)
        return (0 + 10);

    *phadid = (HACMDRIVERID) pao->pACMDriverID;

    return 0;
}






LRESULT __attribute__((__stdcall__)) acmDriverMessage(HACMDRIVER had, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
{
    PWINE_ACMDRIVER pad = MSACM_GetDriver(had);
    if (!pad)
        return (0 + 11);



    if (!SendDriverMessage(pad->hDrvr, uMsg, lParam1, lParam2))
        return (0 + 8);

    return 0;
}





MMRESULT __attribute__((__stdcall__)) acmDriverOpen(PHACMDRIVER phad, HACMDRIVERID hadid, DWORD fdwOpen)
{
    PWINE_ACMDRIVERID padid;
    PWINE_ACMDRIVER pad;
    ICOPEN icopen;
    HDRVR hdrv;



    TRACE("(%p, %x, %08lu)\n", phad, hadid, fdwOpen);

    if (!phad)
        return (0 + 11);

    padid = MSACM_GetDriverID(hadid);
    if (!padid)
        return (0 + 5);

    if (fdwOpen)
        return (0 + 10);

    pad = HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVER));
    if (!pad) return (0 + 7);

    pad->obj.pACMDriverID = padid;
    icopen.fccType = ( (long)(unsigned char)('a') | ( (long)(unsigned char)('u') << 8 ) | ( (long)(unsigned char)('d') << 16 ) | ( (long)(unsigned char)('c') << 24 ) );
    icopen.fccHandler = (long)padid->pszFileName;
    icopen.dwSize = sizeof(ICOPEN);
    icopen.dwFlags = 0;

   if (!padid->hInstModule)
        pad->hDrvr = DrvOpen((long)&icopen);
    else
        pad->hDrvr = padid->hInstModule;

    if (!pad->hDrvr) {
        HeapFree(MSACM_hHeap, 0, pad);
        return (0 + 1);
    }

    pad->pfnDriverProc = GetProcAddress(pad->hDrvr, "DriverProc");


    pad->pNextACMDriver = padid->pACMDriverList;
    padid->pACMDriverList = pad;


    *phad = (HACMDRIVER)pad;

    return 0;
}




MMRESULT __attribute__((__stdcall__)) acmDriverRemove(HACMDRIVERID hadid, DWORD fdwRemove)
{
    PWINE_ACMDRIVERID padid;

    padid = MSACM_GetDriverID(hadid);
    if (!padid)
        return (0 + 5);

    if (fdwRemove)
        return (0 + 10);

    MSACM_UnregisterDriver(padid);

    return 0;
}





HANDLE MSACM_hHeap = (HANDLE) 0;
PWINE_ACMDRIVERID MSACM_pFirstACMDriverID = 0;
PWINE_ACMDRIVERID MSACM_pLastACMDriverID = 0;




PWINE_ACMDRIVERID MSACM_RegisterDriver(LPSTR pszDriverAlias, LPSTR pszFileName,
                                       HINSTANCE hinstModule)




{
    PWINE_ACMDRIVERID padid;

    TRACE("('%s', '%x', 0x%08x)\n", pszDriverAlias, pszFileName, hinstModule);

    padid = (PWINE_ACMDRIVERID) HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVERID));
    padid->pszDriverAlias = (char*)malloc(strlen(pszDriverAlias)+1);
    strcpy(padid->pszDriverAlias, pszDriverAlias);

    padid->pszFileName = pszFileName;
    padid->hInstModule = hinstModule;
    padid->bEnabled = 1;
    padid->pACMDriverList = 0;
    padid->pNextACMDriverID = 0;
    padid->pPrevACMDriverID = MSACM_pLastACMDriverID;
    if (MSACM_pLastACMDriverID)
        MSACM_pLastACMDriverID->pNextACMDriverID = padid;
    MSACM_pLastACMDriverID = padid;
    if (!MSACM_pFirstACMDriverID)
        MSACM_pFirstACMDriverID = padid;

    return padid;
}




void MSACM_RegisterAllDrivers(void)
{
    LPSTR pszBuffer;
    DWORD dwBufferLength;

    if (MSACM_pFirstACMDriverID)
        return;

    MSACM_RegisterDriver("divxa32", (LPSTR)0x161, 0);
    MSACM_RegisterDriver("msadp32", (LPSTR)0x2, 0);
    MSACM_RegisterDriver("l3codeca", (LPSTR)0x55, 0);


}




PWINE_ACMDRIVERID MSACM_UnregisterDriver(PWINE_ACMDRIVERID p)
{
    PWINE_ACMDRIVERID pNextACMDriverID;

    while (p->pACMDriverList)
        acmDriverClose((HACMDRIVER) p->pACMDriverList, 0);

    if (p->pszDriverAlias)
        HeapFree(MSACM_hHeap, 0, p->pszDriverAlias);



    if (p == MSACM_pFirstACMDriverID)
        MSACM_pFirstACMDriverID = p->pNextACMDriverID;
    if (p == MSACM_pLastACMDriverID)
        MSACM_pLastACMDriverID = p->pPrevACMDriverID;

    if (p->pPrevACMDriverID)
        p->pPrevACMDriverID->pNextACMDriverID = p->pNextACMDriverID;
    if (p->pNextACMDriverID)
        p->pNextACMDriverID->pPrevACMDriverID = p->pPrevACMDriverID;

    pNextACMDriverID = p->pNextACMDriverID;

    HeapFree(MSACM_hHeap, 0, p);

    return pNextACMDriverID;
}






void MSACM_UnregisterAllDrivers(void)
{
    PWINE_ACMDRIVERID p;

    for (p = MSACM_pFirstACMDriverID; p; p = MSACM_UnregisterDriver(p));
}




PWINE_ACMDRIVERID MSACM_GetDriverID(HACMDRIVERID hDriverID)
{
    return (PWINE_ACMDRIVERID)hDriverID;
}




PWINE_ACMDRIVER MSACM_GetDriver(HACMDRIVER hDriver)
{
    return (PWINE_ACMDRIVER)hDriver;
}




PWINE_ACMOBJ MSACM_GetObj(HACMOBJ hObj)
{
    return (PWINE_ACMOBJ)hObj;
}






MMRESULT __attribute__((__stdcall__)) acmStreamOpen(PHACMSTREAM phas, HACMDRIVER had, PWAVEFORMATEX pwfxSrc,
                              PWAVEFORMATEX pwfxDst, PWAVEFILTER pwfltr, DWORD dwCallback,
                              DWORD dwInstance, DWORD fdwOpen)
{
    PWINE_ACMSTREAM was;
    PWINE_ACMDRIVER wad;
    MMRESULT ret;
    int wfxSrcSize;
    int wfxDstSize;

    printf("gcc-3.0 bug, pwfxSrc=%p, pwfxSrc->cbSize=%d\n", pwfxSrc, pwfxSrc->cbSize);

    TRACE("(%p, 0x%08x, %p, %p, %p, %ld, %ld, %ld)\n",
          phas, had, pwfxSrc, pwfxDst, pwfltr, dwCallback, dwInstance, fdwOpen);

    TRACE("src [wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u, cbSize=%u]\n",
          pwfxSrc->wFormatTag, pwfxSrc->nChannels, pwfxSrc->nSamplesPerSec, pwfxSrc->nAvgBytesPerSec,
          pwfxSrc->nBlockAlign, pwfxSrc->wBitsPerSample, pwfxSrc->cbSize);

    TRACE("dst [wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u, cbSize=%u]\n",
          pwfxDst->wFormatTag, pwfxDst->nChannels, pwfxDst->nSamplesPerSec, pwfxDst->nAvgBytesPerSec,
          pwfxDst->nBlockAlign, pwfxDst->wBitsPerSample, pwfxDst->cbSize);


    wfxSrcSize = (sizeof(WAVEFORMATEX) + ((pwfxSrc->wFormatTag == 1) ? 0 : pwfxSrc->cbSize));
    wfxDstSize = (sizeof(WAVEFORMATEX) + ((pwfxDst->wFormatTag == 1) ? 0 : pwfxDst->cbSize));


    was = HeapAlloc(MSACM_hHeap, 0, sizeof(*was) + wfxSrcSize + wfxDstSize + ((pwfltr) ? sizeof(WAVEFILTER) : 0));
    if (was == 0)
        return (0 + 7);

    was->drvInst.cbStruct = sizeof(was->drvInst);
    was->drvInst.pwfxSrc = (PWAVEFORMATEX)((LPSTR)was + sizeof(*was));
    memcpy(was->drvInst.pwfxSrc, pwfxSrc, wfxSrcSize);
    was->drvInst.pwfxDst = (PWAVEFORMATEX)((LPSTR)was + sizeof(*was) + wfxSrcSize);
    memcpy(was->drvInst.pwfxDst, pwfxDst, wfxDstSize);
    if (pwfltr) {
        was->drvInst.pwfltr = (PWAVEFILTER)((LPSTR)was + sizeof(*was) + wfxSrcSize + wfxDstSize);
        memcpy(was->drvInst.pwfltr, pwfltr, sizeof(WAVEFILTER));
    } else {
        was->drvInst.pwfltr = 0;
    }
    was->drvInst.dwCallback = dwCallback;
    was->drvInst.dwInstance = dwInstance;
    was->drvInst.fdwOpen = fdwOpen;
    was->drvInst.fdwDriver = 0L;
    was->drvInst.dwDriver = 0L;
    was->drvInst.has = (HACMSTREAM)was;

    if (had) {
        if (!(wad = MSACM_GetDriver(had))) {
            ret = (0 + 11);
            goto errCleanUp;
        }

        was->obj.pACMDriverID = wad->obj.pACMDriverID;
        was->pDrv = wad;
        was->hAcmDriver = 0;

        ret = SendDriverMessage(wad->hDrvr, ((0x4000 + 0x2000) + 76), (DWORD)&was->drvInst, 0L);
        if (ret != 0)
            goto errCleanUp;
    } else {
        PWINE_ACMDRIVERID wadi;
        short drv_tag;
        ret = (512 + 0);
        if(MSACM_pFirstACMDriverID==0)
            MSACM_RegisterAllDrivers();

        for (wadi = MSACM_pFirstACMDriverID; wadi; wadi = wadi->pNextACMDriverID) {
            ret = acmDriverOpen(&had, (HACMDRIVERID)wadi, 0L);
            if (ret == 0) {
                if ((wad = MSACM_GetDriver(had)) != 0) {
                    was->obj.pACMDriverID = wad->obj.pACMDriverID;
                    was->pDrv = wad;
                    was->hAcmDriver = had;

                    ret = SendDriverMessage(wad->hDrvr, ((0x4000 + 0x2000) + 76), (DWORD)&was->drvInst, 0L);
                    if (ret == 0) {
                        if (fdwOpen & 0x00000001) {
                            acmDriverClose(had, 0L);
                        }
                        break;
                    }
                }

                acmDriverClose(had, 0L);
            }
        }
        if (ret != 0) {
            ret = (512 + 0);
            goto errCleanUp;
        }
    }
    ret = 0;
    if (!(fdwOpen & 0x00000001)) {
        if (phas)
            *phas = (HACMSTREAM)was;
        TRACE("=> (%d)\n", ret);
        return ret;
    }
errCleanUp:
    if (phas)
        *phas = (HACMSTREAM)0;
    HeapFree(MSACM_hHeap, 0, was);
    TRACE("=> (%d)\n", ret);
    return ret;
}
==============================================================================

>Fix:
	
Compile with "-O3 -fno-omit-framepointer"
>Release-Note:
>Audit-Trail:
>Unformatted:


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]