/*
 * Callback functions
 *
 * Copyright 1995 Alexandre Julliard
 */

#ifndef __WINE_CALLBACK_H
#define __WINE_CALLBACK_H

#include "windef.h"
#include "winnt.h"
#include "wingdi.h"
#include "wine/winuser16.h"

extern void SYSDEPS_SwitchToThreadStack( void (*func)(void) ) WINE_NORETURN;
extern int SYSDEPS_CallOnLargeStack( int (*func)(void *), void *arg );

#define CALL_LARGE_STACK( func, arg ) \
        SYSDEPS_CallOnLargeStack( (int (*)(void *))(func), (void *)(arg) )

typedef void (*RELAY)();
extern FARPROC THUNK_Alloc( FARPROC16 func, RELAY relay );
extern void THUNK_Free( FARPROC thunk );
extern BOOL THUNK_Init(void);
extern void THUNK_InitCallout(void);


typedef struct
{
    BOOL WINAPI     (*PeekMessageA)( LPMSG, HWND, UINT, UINT, UINT );
    BOOL WINAPI     (*GetMessageA)( MSG*, HWND, UINT, UINT );
    LRESULT WINAPI  (*SendMessageA)( HWND, UINT, WPARAM, LPARAM );
    BOOL WINAPI     (*PostMessageA)( HWND, UINT, WPARAM, LPARAM );
    BOOL WINAPI     (*TranslateMessage)( const MSG *msg );
    LONG WINAPI     (*DispatchMessageA)( const MSG* msg );
    BOOL WINAPI     (*RedrawWindow)( HWND, const RECT *, HRGN, UINT );
    WORD WINAPI     (*UserSignalProc)( UINT, DWORD, DWORD, HMODULE16 );
    void WINAPI     (*FinalUserInit16)( void );
    HQUEUE16 WINAPI (*InitThreadInput16)( WORD, WORD );
    void WINAPI     (*UserYield16)( void );
    WORD WINAPI     (*DestroyIcon32)( HGLOBAL16, UINT16 );
    DWORD WINAPI    (*WaitForInputIdle)( HANDLE, DWORD );
    DWORD WINAPI    (*MsgWaitForMultipleObjects)( DWORD, HANDLE *, BOOL, DWORD, DWORD );
    HWND WINAPI     (*WindowFromDC)( HDC );
    INT WINAPI      (*MessageBoxA)( HWND, LPCSTR, LPCSTR, UINT );
    INT WINAPI      (*MessageBoxW)( HWND, LPCWSTR, LPCWSTR, UINT );
}  CALLOUT_TABLE;

extern CALLOUT_TABLE Callout;

#include "pshpack1.h"

typedef struct tagTHUNK
{
    BYTE             popl_eax;           /* 0x58  popl  %eax (return address)*/
    BYTE             pushl_func;         /* 0x68  pushl $proc */
    FARPROC16        proc WINE_PACKED;
    BYTE             pushl_eax;          /* 0x50  pushl %eax */
    BYTE             jmp;                /* 0xe9  jmp   relay (relative jump)*/
    RELAY            relay WINE_PACKED;
    struct tagTHUNK *next WINE_PACKED;
    DWORD            magic;
} THUNK;

#include "poppack.h"

#define CALLTO16_THUNK_MAGIC 0x54484e4b   /* "THNK" */

#define DECL_THUNK(aname,aproc,arelay) \
    THUNK aname; \
    aname.popl_eax = 0x58; \
    aname.pushl_func = 0x68; \
    aname.proc = (FARPROC) (aproc); \
    aname.pushl_eax = 0x50; \
    aname.jmp = 0xe9; \
    aname.relay = (RELAY)((char *)(arelay) - (char *)(&(aname).next)); \
    aname.next = NULL; \
    aname.magic = CALLTO16_THUNK_MAGIC;

#endif /* __WINE_CALLBACK_H */
