/******************************************************************************
 *
 *   (C) Copyright MICROSOFT Corp., 1989-1990
 *
 *   Title:	INT2FAPI.INC - Windows/386 V86 Application Program Interface
 *
 *   Version:	3.00
 *
 *   Date:	10-Mar-1989
 *
 *   Author:	RAL
 *
 *-----------------------------------------------------------------------------
 *
 *   Change log:
 *
 *      DATE	REV		    DESCRIPTION
 *   ----------- --- ----------------------------------------------------------
 *   10-Mar-1989 RAL Original for 3.0
 *   07-Apr-1989 RAL Added device broadcast equate
 *   19-Jun-1992 RJC Convert to H file
 *
 *=============================================================================
 *
 *   For information on these APIs please refer to the Windows/386 DDK
 *   appendix on the Int 2Fh Application Program Interface.
 *
 *****************************************************************************/

/*
 *   Interrupt 2Fh is used for Windows/386 API calls.
 */
#define	W386_API_Int		0x2F

/*
 *   All Windows/386 API Int 2Fh calls must be issued with AH = 16h
 */
#define	W386_Int_Multiplex	0x16

/*
 *   Values for AL for all Windows/386 API calls
 */
#define	W386_Get_Version	0x00	/* Install check/Get version */
#define	W386_Old_Get_VMID_API	0x02	/* Version 2.xx get VMID API call */
#define	W386_Startup		0x05	/* Broadcast when Win386 starting */
#define	W386_Exit		0x06	/* Broadcast when Win386 exited */
#define	W386_Device_Broadcast	0x07	/* Broadcast by virtual device */
#define	W386_Startup_Complete	0x08	/* Broadcast when Win386 start is complete */
#define	W386_Begin_Exit 	0x09	/* Broadcast when Win386 is starting */
					/* a NORMAL exit sequence */
#define	W386_Windows_ID 	0x0A	/* Identify windows ver/type */
#define	W386_TSR_Identify	0x0B	/* Identify TSRs */
#define	W386_ROM_Detect 	0x0C	/* Used by ROM win to detect ROMs */
#define W386_WDEB		0x0D	/* Used by wdeb386 */
#define W386_Logo               0x0E    /* IO.SYS service for logo management */
#define W386_INT10              0x0F    /* IO.SYS service to replace INT 10h hook */
#define W386_Get_Shell          0x11    /* IO.SYS service to return shell info */
#define W386_Get_BIOS_Data      0x12    /* IO.SYS service to return IO.SYS data */
#define W386_Get_SYSDAT_Path	0x13	/* IO.SYS service to return path to SYSTEM.DAT */
#define W386_Set_SYSDAT_Path	0x14	/* IO.SYS service to set path to SYSTEM.DAT */
#define SAVE32_ID               0x1615  /* TSR Id for SAVE32.COM to save 32bit registers */

#define W386_Sleep              0x7F    /* Call Time_Slice_Sleep (DX=#ms) */
#define	W386_Release_Time	0x80	/* Release cur VM's time-slice */
#define	W386_Begin_Critical	0x81	/* Begin critical section */
#define	W386_End_Critical	0x82	/* End critical section */
#define	W386_Get_Cur_VMID	0x83	/* Returns BX = ID of current VM */
#define	W386_Get_Device_API	0x84	/* Returns ES:DI -> Device API */
#define	W386_Switch_And_Call	0x85	/* Change VMs and call-back */
#define	W386_Test_Int31_Avail	0x86	/* Returns AX=0 if Int 31 avail */
#define	W386_Get_PM_Switch_Addr 0x87	/* Get call-back addr for PM */
#define	W386_Get_LDT_Base_Sel	0x88	/* Get selector to LDT */
#define	W386_Win_Kernel_Idle	0x89	/* Windows kernel idle call */
#define	W386_DPMI_Extension	0x8A	/* DPMI extension Int 2Fh */
#define	W386_Set_Focus		0x8B	/* Set focus to specified VM */
#define	W386_Restart_Cmd	0x8C	/* Win.Com execs specified app */
#define	W386_Get_Win32_API	0x8D	/* Get Win32 API callback */
#define W386_VM_Title		0x8E	/* Assorted VM title APIs */
#define W386_VM_Close		0x8F	/* Assorted VM close APIs */
#define W386_Return_RMD		0x90	/* return RMD list */

/*
 *   Structure for real mode device initialization API.
 */
struct Win386_Startup_Info_Struc {
        BYTE    SIS_Version[2];         /* AINIT <04h,01h> Structure version */
	DWORD	SIS_Next_Ptr;		/* Seg:Off of next dev in list */
	DWORD	SIS_Virt_Dev_File_Ptr;	/* INIT <0> PSZ of file name to load */
	DWORD	SIS_Reference_Data;	/* Data to be passed to device */
	DWORD	SIS_Instance_Data_Ptr;	/* INIT <0> Ptr to instance data list */
        DWORD   SIS_Opt_Instance_Data_Ptr;/* INIT <0> Ptr to opt. instance data list */
        DWORD   SIS_Reclaim_Data_Ptr;   /* INIT <0> Ptr to reclaimable data list */
};

/*
 *   Structure for instance data list.  (List terminated with 0 dword).
 */
struct Instance_Item_Struc {
	DWORD	IIS_Ptr;		/* Seg:Off of instance item */
	WORD	IIS_Size; 		/* Size of instance item in bytes */
};

/*
 *   Structure for reclaim data list.  (List terminated with 0 Seg).
 */
struct Reclaim_Item_Struc {
        WORD    RIS_Seg;                /* Seg of reclaimable item */
        WORD    RIS_Paras;              /* Size of item, in paragraphs */
        DWORD   RIS_HookTable;          /* Seg:Off of Reclaim_Hook_Table (0 if none) */
        WORD    RIS_Flags;              /* See RIS_* equates (below) */
};

#define RIS_RECLAIM     0x0001  /* segment can be reclaimed during Init_Complete */
#define RIS_RESTORE     0x0002  /* segment contents must be restored prior to System_Exit */
#define RIS_DOSARENA    0x0004  /* segment is a DOS memory block, add to DOS memory pool */

/*
 *   NOTE: If RIS_HookTable is non-zero, then it is interpreted as a
 *   pointer to a Reclaim_Hook_Table, which provides a means
 *   for the system to automatically unhook a component in a reclaimable
 *   memory block from the rest of the system.  It is also IMPORTANT to note
 *   that if a Reclaim_Hook_Table is specified, then the memory block will
 *   not be reclaimed UNLESS the RHT_DISABLED bit is also set.  In other
 *   words, if the hooks associated with a block have not been disabled
 *   by the time the system attempts to reclaim the memory (Init_Complete),
 *   then the memory containing those hooks cannot be reclaimed.
 *
 *   RHT_Num_Hooks is the number of hooks to be unhooked/rehooked at
 *   reclaim/restore time, RHT_Low_Seg is the segment of "stub code"
 *   that is always resident, RHT_High_Seg is the segment of "driver code"
 *   that is contained within (or identical to) RIS_Seg, and the entire
 *   Reclaim_Hook_Table is followed by an array of Reclaim_Hook_Entry
 *   structures, which contain pairs of offsets to dword vector addresses
 *   that must be exchanged in order to disable or re-enable the hooks.
 *   For each pair of offsets, the first is relative to RHT_Low_Seg and the
 *   second is relative to RHT_High_Seg.  RHT_Num_Hooks is the number of
 *   Reclaim_Hook_Entry structures in the array.
 *
 *   The system will only unhook all the hooks in a Reclaim_Hook_Table if
 *   RHT_DISABLED bit is set and RHT_UNHOOKED is NOT set in RHT_Flags (meaning
 *   that a Vxd or other component has assumed responsibility for the code
 *   inside the hooks and has not unhooked them itself).
 *
 *   Since the Reclaim_Hook_Table must be inside the segment being reclaimed,
 *   it follows that unhooking will occur before memory reclamation, and that
 *   memory restoration will occur before re-hooking.
 *
 *   VxDs are free to perform their own real-mode vector hooking/unhooking
 *   on their own.  This mechanism is used by the DBLSPACE/DRVSPACE drivers,
 *   and is simply exported as a convenience for other drivers.
 */


/*
 *   Structure for reclaim hook table.
 */
struct Reclaim_Hook_Table {
        WORD    RHT_Num_Hooks;          /* number of RHE entries following */
        WORD    RHT_Low_Seg;            /* segment each RHE_Low_Off is relative to */
        WORD    RHT_High_Seg;           /* segment each RHE_High_Off is relative to */
        WORD    RHT_Flags;              /* see RHT_* equates (below) */
};

#define RHT_DISABLED    0x0001  /* hooks are disabled, can be unhooked now */
#define RHT_UNHOOKED    0x0002  /* hooks are currently unhooked */


/*
 *   Structure for reclaim hook entries.  There are RHT_Num_Hooks copies
 *   of this structure immediately following the Reclaim_Hook_Table.
 */
struct Reclaim_Hook_Entry {
        WORD    RHE_Low_Off;
        WORD    RHE_High_Off;
};


/*
 *   Structure for return RMD API.  See RMD.H for RMD definitions.
 */

struct Return_RMD_Struc {
        DWORD   RRS_RMD;                /* Seg:Off of rmd chain */
	DWORD	RRS_Next_Ptr;		/* Seg:Off of next RMD chain in list */
};

/*
 *   Flags passed to the Win_Kernel_Idle call to indicate state of Windows
 *   in the BX register.
 */
#define Win_Idle_Mouse_Busy	1
#define Win_Idle_Mouse_Busy_Bit 0

/*
 * Structure for TSR <-> Windows communication
 * (W386_TSR_Identify call, AL=0Bh)
 */
struct TSR_Info_Struc {
	DWORD	TSR_Next;
	WORD	TSR_PSP_Segment;
	WORD	TSR_API_Ver_ID;		/* INIT <100h> */
	WORD	TSR_Exec_Flags;		/* INIT <0> */
	WORD	TSR_Exec_Cmd_Show;	/* INIT <0> */
	DWORD	TSR_Exec_Cmd;		/* INIT <0> */
	BYTE	TSR_Reserved[4];	/* INIT <0> */
	DWORD	TSR_ID_Block;		/* INIT <0> */
	DWORD	TSR_Data_Block;		/* INIT <0> */
};

/*
 * TSR_Exec_Flags equates
 */
#define	TSR_WINEXEC	1
#define	TSR_LOADLIBRARY 2
#define	TSR_OPENDRIVER	4
