/*
 * Callback functions
 *
 * Copyright 1995 Alexandre Julliard
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#ifndef __WINE_CALLBACK_H
#define __WINE_CALLBACK_H

#include "windef.h"
#include "winnt.h"

typedef struct {
    void (WINAPI *LoadDosExe)( LPCSTR filename, HANDLE hFile );
    void (WINAPI *EmulateInterruptPM)( CONTEXT86 *context, BYTE intnum );

    /* DPMI functions */
    void (WINAPI *CallRMInt)( CONTEXT86 *context );
    void (WINAPI *CallRMProc)( CONTEXT86 *context, int iret );
    void (WINAPI *AllocRMCB)( CONTEXT86 *context );
    void (WINAPI *FreeRMCB)( CONTEXT86 *context );
    void (WINAPI *RawModeSwitch)( CONTEXT86 *context );

    /* I/O functions */
    void (WINAPI *SetTimer)( unsigned ticks );
    unsigned (WINAPI *GetTimer)( void );
    BOOL (WINAPI *inport)( int port, int size, DWORD *res );
    BOOL (WINAPI *outport)( int port, int size, DWORD val );
    void (WINAPI *ASPIHandler)( CONTEXT86 *context );
} DOSVM_TABLE;

extern DOSVM_TABLE Dosvm;

#endif /* __WINE_CALLBACK_H */
