/******************************************************************************
 *
 *   (C) Copyright MICROSOFT Corp., 1988-1995
 *
 *   Title:	VMDAPRIV.H - Include file for VMDOSAPP/SHELL interaction
 *
 *   Version:	2.00
 *
 *   Date:	13-Aug-1994
 *
 *   Author:	rjc
 *
 *-----------------------------------------------------------------------------
 *
 *   Change log:
 *
 *      DATE	REV		    DESCRIPTION
 *   ----------- --- ----------------------------------------------------------
 *   05-May-1988 ARR Original
 *   15-Jul-1982 rjc Converted from vmda.inc to vmda.h
 *   13-Aug-1992 rjc Split private stuff into vmdapriv.h
 *   11-Nov-1994 rjc Moved inter-module msgsrv32 stuff here, too.
 *
 *****************************************************************************/

/******************************************************************************
 ******************************************************************************
 *
 *	MSGSRV32
 *
 ******************************************************************************
 *****************************************************************************/

/******************************************************************************
 *
 * SZMESSAGESERVERCLASS is the class name for the message server.
 * There is no title.
 *
 * To locate the message server, just do a
 *
 *	static char CODESEG szMessageServer[] = SZMESSAGESERVER;
 *	hwnd = FindWindow(szMessageServer, 0);
 *
 *****************************************************************************/

#define SZMESSAGESERVERCLASS	    "Windows 32-bit VxD Message Server"

/******************************************************************************
 *
 * INH_DEVICEBROADCAST -- Broadcast a message to VxDs.
 *
 *	wParam = not used
 *      lParam = far pointer to INTERNALBROADCASTSYSMSG
 *
 *****************************************************************************/

#if 0
    typedef WORD WPARAM;
    typedef LONG LPARAM;
#endif

/* H2INCSWITCHES -t */

typedef struct INTERNALBROADCASTSYSMSG {   /* bsm */
    WORD        uiMessage;
    WPARAM      wParam;
    LPARAM      lParam;
    DWORD       dwFlags;
} INTERNALBROADCASTSYSMSG, FAR *LPINTERNALBROADCASTSYSMSG;

/* H2INCSWITCHES -t- */

/*ASM
DBWF_LPARAMPOINTER	= 8000h
 */

#define INH_DEVICEBROADCAST	0x0500

/******************************************************************************
 *
 * INH_LOGONTONET -- Posted from user to msgsrvr to log onto net and run
 *                   the shell.  Also used to exec the shell if it faults.
 *	wParam = if 0, logon to net. if 1, just exec the shell.
 *      lParam = not used
 *
 *****************************************************************************/

#define INH_LOGONTONET		0x0501

/******************************************************************************
 *
 * INH_CHECKSYSTEMDLLS - Posted from user to msgsrvr to tell us to check
 *                       system dlls if they have been bogusly replaced
 *	wParam = not used
 *      lParam = not used
 *
 *****************************************************************************/

#define INH_CHECKSYSTEMDLLS	0x0502

/******************************************************************************
 *
 * INH_USEME503	-- Not used, please recycle
 * INH_USEME504 -- Not used, please recycle
 *
 *****************************************************************************/

#define INH_USEME503		0x0503
#define INH_USEME504		0x0504

/******************************************************************************
 *
 * INH_APPYTIME -- It is now 'Appy-time
 *
 *	wParam = not used
 *      lParam = not used
 *
 *****************************************************************************/

#define INH_APPYTIME     	0x0505

/******************************************************************************
 *
 * INH_FORWARDTOSHELL -- Forward a WM_SHELLNOTIFY to the current shell window
 *
 *	wParam = forwarded to GetShellWindow()
 *	lParam = forwarded to GetShellWindow()
 *
 *****************************************************************************/

#define INH_FORWARDTOSHELL	0x0506

/******************************************************************************
 *
 * INH_FREEDRIVERS - Message posted from user telling us to free installable
 *                   drivers for compatibility with Win3.1
 *	wParam = id code we pass back to user's UnloadInstallableDrivers
 *		 function
 *      lParam = not used
 *
 *****************************************************************************/

#define INH_FREEDRIVERS  	0x0507

/******************************************************************************
 *
 * INH_PLAYEXITSOUND - Message posted from user telling us to play the exit 
 *                     Windows sound.
 *	wParam = not used
 *      lParam = not used
 *
 *****************************************************************************/

#define INH_PLAYEXITSOUND  	0x0508

/******************************************************************************
 *
 * INH_UNIDRVLOADED - Message posted from unidrv to us so that we can
 *			cache the printer driver after it loads.
 *            
 *	wParam = INH_UNIDRVLOADED_WPARAM (signature)
 *      lParam = INH_UNIDRVLOADED_LPARAM (signature)
 *
 *****************************************************************************/

#define INH_UNIDRVLOADED  	0x0509
#define INH_UNIDRVLOADED_WPARAM     0
#define INH_UNIDRVLOADED_LPARAM     0

/******************************************************************************
 *
 * INH_UNIDRVUNLOAD - Message sent from print installer to us so that we can
 *		      forceably tell msgsrvr to uncache this.
 *            
 *	wParam = INH_UNIDRVUNLOAD_WPARAM (signature)
 *      lParam = INH_UNIDRVUNLOAD_LPARAM (signature)
 *
 *****************************************************************************/

#define INH_UNIDRVUNLOAD  	0x050A
#define INH_UNIDRVUNLOAD_WPARAM     0
#define INH_UNIDRVUNLOAD_LPARAM     0


/******************************************************************************
 ******************************************************************************
 *
 *	VMDOSAPP / SHELL / USER
 *
 ******************************************************************************
 *****************************************************************************/


/*
 * This file contains manifest constants for VMDOSAPP/SHELL interaction
 * which are private to DOS386 and should not be exposed in the DDK.
 */

/*
 * EQUATES for VMDOSAPP device calls
 */
#define	SHELL_Call_Dev_VMD	0x0000C
#define	SHELL_Call_Dev_VKD	0x0000D
#define	SHELL_Call_Dev_SHELL	0x00017
#define	SHELL_Call_Dev_VCOND	0x00038
#ifdef FE_VIME
#define	SHELL_Call_Dev_VIME	0x00064
#endif

/*
 * SHELL VMDA interface services
 */
#define	SHELL_Get_Ver		   0
#define	SHELL_Get_Sys_VM_Info	   1	/* Used by 3.1 control panel (stub) */
#define	SHELL_Set_Sys_VM_Info	   2	/* Used by 3.1 control panel (stub) */
#define	SHELL_Create_VM		   3	/* Stupid C7 uses this; go figure */
					/* Brown has rev-engineered it, too */
#define	SHELL_Destroy_VM	   4
#define	SHELL_Set_Focus 	   5
#define	SHELL_Get_VM_State	   6
#define	SHELL_Set_VM_State	   7
/* #define SHELL_Debug_Out 	   8 */	/* Defined in vmda.h */
#define	SHELL_VMDA_Init 	   9
#define	SHELL_VMDA_Exit 	  10
#define	SHELL_Get_Message_Text	  11
#define	SHELL_Event_Complete	  12
#define	SHELL_Get_Contention_Info 13
#define	SHELL_Get_Clip_Info	  14
#define	SHELL_Set_Paste 	  15
#define	SHELL_Switcher_Assist	  16
#define	SHELL_Do_Not_Use 	  17	/* Do not recycle */
#define	SHELL_Query_Destroy	  18
/*
 * WARNING: The following two entries are used by Windows KERNEL/USER.
 *	   Do not change them without also changing KERNEL/USER.
 */
#define	SHELL_SetFocus_Cur_VM	  19
#define	SHELL_User_Busy		  20	 /* Old name (not used) */
#define SHELL_Set_Hotkey_Info	  20	 /* New name */

#define	SHELL_Chng_Hot_Key	  21	 /* Old name (not used) */
#define	SHELL_Get_Hotkey_Info	  21	 /* New name */
#define	SHELL_Get_TermInfo	  22

#define SHELL_Check_Hotkey_Allowed 23	 /* See if a focus change is ok */
#define SHELL_UseMe24		  24	 /* Available for use */

/*
 * These are used by the WShell server during system startup
 * for various reasons...
 */
#define SHELL_AppyRegister	  25	/* 'Appy-time status report */
#define SHELL_Get_VM_Descriptor	  26
#define SHELL_DispatchAppyEvents  27	/* It is now 'Appy time */
#define SHELL_DispatchBroadcastHooks 28	/* Goofy broadcast received */

#define SHELL_GetServerHwnd	  29	/* Called by USER! */

#define SHELL_GetSet_VM_Title	  30
#define SHELL_Get_Close_Flags	  31
#define SHELL_Initiate_Close	  32
#define SHELL_Cancel_Close	  33

#define SHELL_Grab_Failed	  34

#define SHELL_Get_Protection_Info 35

#define SHELL_Freeze_VM		  36
#define SHELL_Thaw_VM		  37

#define SHELL_Set_Focus_Sys_VM	  38	/* Used by Win31.exe */

#define SHELL_Final_VM_Cleanup	  39

/*
 * NOTE!  When adding a new service code, add them here, *before* the
 * DOS7 ordinals.  (Renumber the DOS7 ordinals accordingly.)
 */

#ifdef	DOS7
#define SHELL_Get_New_VM_Handle   ??	/* VM enumeration for inheriting */
#define SHELL_Get_Next_VM_Handle  ??
#define SHELL_Get_Clipboard_Size  ??	/* Clipboard importation */
#define SHELL_Copy_Clipboard_Data ??
#endif

/******************************************************************************
 *
 * Window private bytes...
 *
 *  WindowLong(GWL_TTY_PID) =
 *	process ID for process currently running in DOS box
 *
 *  WindowLong(GWL_TTY_TID) =
 *	thread ID for process currently running in DOS box
 *
 *  Valid only if window class is the top-level unowned window for WinOldAp
 *  (classname = "tty").
 *
 *****************************************************************************/

#define GWL_TTY_PID	0
#define GWL_TTY_TID	4


/******************************************************************************
 *
 * Message numbers
 *
 *****************************************************************************/

#define	WMX_USER		  0x0400


/******************************************************************************
 *
 * Messages WMX_USER+0 through WMX_USER+19 are reserved for
 * internal use by WinOldAp.
 *
 *****************************************************************************/

/******************************************************************************
 *
 * Messages WMX_USER+20 through WMX_USER+255 are reserved for
 * WinOldAp / WShell interaction, with exceptions as noted below.
 *
 *****************************************************************************/

/*
 * Messages WMX_USER+20 through WMX_USER+255 are reserved
 *
 * Be extra careful not to change the meanings of any of the
 * messages from WMX_USER+20 through WMX_USER+20+13, because
 * those messages were used by Windows 3.1 and were documented
 * in the DDK (What were we thinking!?!!?), so some hosebags
 * might actually send them.
 *
 * VDA_Terminated is sent by the 3DPC screen saver.  What's more,
 * they send it incorrectly!  So watch out when you process it...
 */

#define VDA_First		(WMX_USER+20+0)

/******** BEGIN -- DO NOT CHANGE THESE -- BEGIN ********/

#define	VDA_Hot_Key		(WMX_USER+20+0)
#define	VDA_Switch_Context	(WMX_USER+20+1)
#ifndef VDA_Type_Chng
#define VDA_Type_Chng		(WMX_USER+20+2) /* Defined in VDDGRB.INC */
#endif
#define	VDA_ClipBrd_Event	(WMX_USER+20+3)
#define	VDA_Terminated		(WMX_USER+20+4)
#define	VDA_Display_Message	(WMX_USER+20+5)
#ifndef VDA_Display_Event
#define VDA_Display_Event	(WMX_USER+20+6) /* Defined in VDDGRB.INC */
#endif
#define	VDA_Crash_Event 	(WMX_USER+20+7) /* OBSOLETE!  DO NOT RECYCLE */
#define	VDA_Paste_Complete	(WMX_USER+20+8)
#define	VDA_Contention		(WMX_USER+20+9)
#define	VDA_Start_SwitchScn	(WMX_USER+20+10)
#define VDA_FileSysChange	(WMX_USER+20+11) /* OBSOLETE! DO NOT RECYCLE */
#define	VDA_CheckFocus		(WMX_USER+20+12)
#define	VDA_Switch_CntxtPanic	(WMX_USER+20+13)

/******** END -- DO NOT CHANGE THESE -- END ********/

#define	VDA_Simulate_Hotkey	(WMX_USER+20+14)
#define VDA_Set_VM_Title	(WMX_USER+20+15)
#define VDA_Cancel_Close	(WMX_USER+20+16)
#define VDA_Change_CodePage	(WMX_USER+20+17) /* Used by JAPAN */
#define VDA_VM_Started		(WMX_USER+20+18)
#define VDA_Protection_Event    (WMX_USER+20+19)
#define VDA_Close_Clipboard	(WMX_USER+20+20)
#define VDA_Flash_Icon		(WMX_USER+20+21)
#define VDA_Notify_Close_Change (WMX_USER+20+22)
#define VDA_DynaWindow		(WMX_USER+20+23)
#define VDA_Screensave 		(WMX_USER+20+24)
#define VDA_SystemSleep		(WMX_USER+20+25)
#define VDA_MonitorPower    (WMX_USER+20+26)

#ifdef	DOS7
#define	VDA_Inherit_New_VM	?
#endif

#define VDA_Last		VDA_MonitorPower


/******************************************************************************
 *
 * Messages WMX_USER+256 through WMX_USER+511 are reserved for
 * WinOldAp / VConD interaction.
 *
 *****************************************************************************/

#define VDA_Console_Spawn		(WMX_USER+256)
#define VDA_Console_Set_Title		(WMX_USER+257)
#define VDA_Console_State_Change	(WMX_USER+258)
#define VDA_Console_Update_Window	(WMX_USER+259)

/* flags for Update Console Window message sent by Console code to WinOldAp*/
#define UCW_HSCROLL	0x0001
#define UCW_VSCROLL 	0x0002
#define UCW_SIZE     	0x0004

/* messages for native grabber in WinOldAp */
#define GRABMSG_NOMSG		0x0000	// Nothing to do
#define GRABMSG_REPAINT		0x0001	// Repaint a rectangle
#define	GRABMSG_MOVERECT	0x0002	// Move a rectangle
#define	GRABMSG_SETSCREEN	0x0004	// Set virtual screen size
#define	GRABMSG_SETCURPOS	0x0008	// Set virtual screen position
#define	GRABMSG_SETCURINFO	0x0010	// Set cursor (caret) position/size
#define	GRABMSG_CURTRACK	0x0020	// Position cursor in window
#define	GRABMSG_TERMINATE	0x0040	// Screen buffer is terminating

/* Display event codes for notification of VCOND by WOA.*/
#define DE_ICONIZE		1	// iconized
#define DE_SIZECHANGE		2	// user changed window size
#define DE_WINDOW		3	// changed from fullscreen to window
#define DE_FULLSCREEN		4	// changed from window to fullscreen
#define DE_BEGINSELECT		5	// begin selection
#define DE_ENDSELECT		6	// end selection
#define DE_NATIVEMODE		7	// enter native mode
#define DE_PHYSICALMODE		8	// enter physical mode

#ifdef FE_VIME
/******************************************************************************
 *
 * Messages WMX_USER+512 through WMX_USER+767 are reserved for
 * WinOldAp / VIME interaction.
 *
 *****************************************************************************/

#define VDA_Process_Key_Event		(WMX_USER+512)
#define VDA_Control_IME			(WMX_USER+513)
#define VDA_Init_VIMEUI			(WMX_USER+514)
#define VDA_Get_Keyboard_Layout		(WMX_USER+515)

/* Functions for VDA_Control_IME */
#define	VIME_CIME_SetOpenStatus		1
#define	VIME_CIME_SetCandidatePageStart	2
#define	VIME_CIME_SetCandidatePageSize	3
#define	VIME_CIME_EnableIME		4

/* Protect Mode API */
#define VIME_CMD_GetOption	2
#define VIME_CMD_Composition	3
#define VIME_CMD_CandOpen	4
#define VIME_CMD_CandClose	10
#define VIME_CMD_Draw		5
#define VIME_CMD_Return		6
#define VIME_CMD_Char		7
#define VIME_CMD_StartComp	8
#define VIME_CMD_EndComp	9
#define	VIME_CMD_OpenStatus	11
#define	VIME_CMD_ConversionMode	12
#define	VIME_CMD_SentenceMode	13
#define VIME_CMD_WindowState	14
#define VIME_CMD_KeyDown	15
#define VIME_CMD_CandChange	16
#define VIME_CMD_Paste		17
#define VIME_CMD_ReqChangeKL	18
#define VIME_CMD_KeyboardLayout	19
#define VIME_CMD_InstallVIME	20
#define VIME_CMD_GetSync	21

/* detail info for VIME_CMD_ChangeIME */
#define VIME_CHG_NonIME		1
#define VIME_CHG_OldIME		2
#define VIME_CHG_NonNative	3

#endif // FE_VIME

/*
 * This is a special "VMDOSAPP message" which actually results in no
 *   message being sent to VMDOSAPP. It is used internally by the SHELL
 *   to give the SYS VM a Boost, just as it does for normal events, but
 *   without sending VMDOSAPP a message.
 */
#define VDA_Nul_Boost_Event	0x0FFFF

/*
 * lParam is ALWAYS the "Event ID". This is used on the VMDOSAPP call backs
 *  to the shell to identify the event which is being processed.
 */

/*
 * On VDA_Hot_Key event wParam is the Key identifier (See following EQUs)
 *   VMDOSAPP instance which gets the message is the "target" of the hot key
 */
#define	VDA_HK_ALTSPACE 	0
#define	VDA_HK_ALTENTER 	1
#define	VDA_HK_DIRVM		2

/*
 * On VDA_Terminated event wParam is 0 if this is a normal termination. If it is
 *   non-zero, use SHELL_Get_TermInfo to get error information.
 *   VMDOSAPP instance which gets the message has terminated.
 */

/*
 * NOTE that VDA_Crash_Event is very much like VDA_Terminated, the only
 *   real difference being the reason for the termination.
 *   Use SHELL_Get_TermInfo to get error information.
 *   wParam is not used
 *   VMDOSAPP instance which gets the message has crashed
 */

/*
 * On VDA_ClipBrd_Event, wParam is the Client_AX identifying the call.
 *   VMDOSAPP instance which gets the message had a clipboard event
 */

/* This next one is documented in vmda.h */
/*
 * On VDA_Display_Message event, wParam == 0 if normal message
 *				       != 0 if ASAP or SYSMODAL message
 *   VMDOSAPP instance which gets the message is messaging VM
 */

/*
 * On VDA_Paste_Complete event, wParam == 0 if normal completion
 *				      == 1 if paste canceled by user
 *				      == 2 if paste canceled for other reason
 *   VMDOSAPP instance which gets the message has completed paste
 */

/*
 * On VDA_Switch_Context event, wParam == 0 if context is switched to
 *   VMDOSAPP instance which gets the message (that VM now has focus)
 *   if wParam != 0, SYS VM now has the focus
 * VDA_Switch_CntxtPanic is an alternate form that should only occur with
 *   wParam != 0 and indicates that the Windows activation should be moved
 *   away from any VM (in other words, only a Windows app should be active
 *   now).
 */

/* This next one is documented in vmda.h */
/*
 * On VDA_Type_Chng event, wParam is not used
 *   VMDOSAPP instance which gets the message has had its type changed by
 *   protected mode code
 */

/*
 * On VDA_FileSysChange, SEE SHELLFSC.INC
 */

/*
 * VDA_CheckFocus This is sent as part of the Contention handling to deal with
 *   a case where the the Focus is manipulated and needs to get reset.
 *   wParam is not used.
 */

/* Reference data for VDA_Protection_Event
 */
#ifndef _WINNT_
typedef struct FAULTINFO {
        DWORD   FI_VM;
        DWORD   FI_CS;
        DWORD   FI_EIP;
        DWORD   FI_Addr;
} FAULTINFO;

typedef FAULTINFO *PFAULTINFO;
#endif

#ifdef _WSHIOCTL_H

/*****************************************************************************
 *
 * SHELL_Create_VM
 *
 * ES:EDI -> struct VM_Descriptor (see shellvm.h)
 * DS:SI -> struct VM_AppWizInfo
 *
 *  szProgram = program name, e.g., "C:\FOO.BAT" or "D:\BAR.EXE"
 *  szParams = command tail
 *  szDir = current directory at time of exec, e.g., C:\GAME
 *  szPifFile = PIF file that controls this app
 *		null string if PIF file belongs to command.com
 *		space if app didn't have a custom PIF (need to create one)
 *
 */

/* H2INCSWITCHES -t */

typedef struct VMAPPWIZINFO {		/* awi */
    char	szProgram[MAXVMPROGSIZE];
    char	szParams[MAXVMCMDSIZE];
    char	szDir[MAXVMDIRSIZE];
    char	szPifFile[MAXPIFPATHSIZE];
    BYTE	aAppFlags[4];		 /* 1 dword of flags */
} VMAPPWIZINFO, *PVMAPPWIZINFO;
/* H2INCSWITCHES -t- */

#endif /* _WSHIOCTL_H */

//
//  Flags for app hack bits
//
#define DAHF_SPECIALSETTINGS	    0x00000001	// App requires separate VM
#define DAHF_SPECIALSETTINGS_BIT    0		// (Winlie, SDAM, XMS cap...)
#define DAHF_NOPAGELOCKS	    0x00000002	// Ignore DPMI PageLocks
#define DAHF_NOPAGELOCKS_BIT	    1		// if not paging through DOS
#define DAHF_NOMSDOSWARN	    0x00000004	// Do not suggest SDAM
#define DAHF_NOMSDOSWARN_BIT	    2
#define DAHF_VALIDATELOCKS	    0x00000008	// Do not let DPMI app lock
#define DAHF_VALIDATELOCKS_BIT	    3		// memory it didn't allocate
#define DAHF_TRACESEGLOAD	    0x00000010	// Enable trace flag hack for
#define DAHF_TRACESEGLOAD_BIT	    4		// segment load faults
#ifdef	NEC_98
#define DAHF_MAXENVSIZE		    0x00000020	// Use maximize environment
#define DAHF_MAXENVSIZE_BIT	    5		// size(=0xffff) for apps like
						// Justsystem
#endif	//NEC_98


/*****************************************************************************
 *
 * SHELL_Get_TermInfo
 *
 * Private structure used to get detailed information when a VM crashed.
 *
 * If the VM terminated because the initial EXEC failed, the termination
 * error code will have high word zero and low byte equal to the DOS error
 * code.
 */

/* H2INCSWITCHES -t */

typedef struct VMFaultInfo2 {	/* VMFI2 */

    ULONG fl;			/* Flags (this lives in the same place
				 * as the TermVMHnd)
				 */

/* These fields form a TermStruc */

    ULONG TermErrCd;		/* Error code for termination */
    ULONG TermErrCdRef;		/* Reference data for termination */
    ULONG TermExitCode;		/* Application exit code */

/* These fields form a VMFaultInfo, meaningful only if we crashed. */
    ULONG EIP;			/* faulting EIP */
    WORD  CS;			/* faulting CS */
    WORD  Ints;			/* interrupts in service, if any */

/* These fields are valid only if the VM terminated by crashing */
    char  szCrashText[80];	/* Location of crash (if in a VxD) */
    char  VxdReported[9];	/* name of VxD who reported the crash */
} VMFAULTINFO2;

/*
 * Flags for vmfi2_fl.
 */
#define VMFI2FL_BLANKSCREEN	1	/* Screen is blank */
#define VMFI2FL_RING0CRASH	2	/* Crashed at ring 0 */

/* Error codes.
 *
 *  For VDAE_InsMemDev and VDAE_DevNuke the error ref data points to
 *	the 8 character device name.
 */
#define	VDAE_PrivInst		0x00010001	/* Privledged instruction */
#define	VDAE_InvalInst		0x00010002	/* Invalid instruction */
#define	VDAE_InvalPgFlt 	0x00010003	/* Invalid page fault */
#define	VDAE_InvalGpFlt 	0x00010004	/* Invalid GP fault */
#define	VDAE_InvalFlt		0x00010005	/* Invalid fault, not any of abv */
#define	VDAE_UserNuke		0x00010006	/* User requested NUKE of running */
						/*    VM */
#define	VDAE_DevNuke		0x00010007	/* Device specific problem */
#define	VDAE_DevNukeHdwr	0x00010008	/* Device specific prob, HW prgm */
#define	VDAE_NukeNoMsg		0x00010009	/* Supress WINOA message */
#define	VDAE_OkNukeMask 	0x80000000	/* "Good" nuke bit */


#define VDAE_InsMemGeneric	0x00020000	/* Unknown VxD failed create */
#define	VDAE_InsMemV86		0x00020001	/* base V86 mem	   - V86MMGR */
#define	VDAE_InsV86Space	0x00020002	/* Kb Req too large - V86MMGR */
#define	VDAE_InsMemXMS		0x00020003	/* XMS Kb Req	   - V86MMGR */
#define	VDAE_InsMemEMS		0x00020004	/* EMS Kb Req	   - V86MMGR */
#define	VDAE_InsMemV86Hi	0x00020005	/* Hi DOS V86 mem   - DOSMGR */
						/*		     V86MMGR */
#define	VDAE_InsMemVid		0x00020006	/* Base Video mem   - VDD */
#define	VDAE_InsMemVM		0x00020007	/* Base VM mem	   - VMM */
						/*    CB, Inst Buffer */
#define	VDAE_InsMemDev		0x00020008	/* Couldn't alloc base VM */
#define	VDAE_CrtNoMsg		0x00020009	/* Supress WINOA message */

/*****************************************************************************
 *
 * On SHELL_Set_Hotkey_Info, USER calls us with
 *
 *	DS:AX -> array of HOTKEYSTRUCT structures
 *         CX =  number of entries in array (possibly zero)
 *	DS:BX -> linked list of GLOBALHOTKEY structures
 *
 */

/* HOTKEYSTRUCT - Hotkeys of type 1
 *
 *	This structure is used with the WM_(SET/GET)HOTKEY messages
 *	and the SC_HOTKEY syscommand.
 *
 *	WARNING:  Both USER and WinOlDAp use this structure
 */

#define HKFL_SHIFT  1		/* Either shift key down */
#define HKFL_CTRL   2		/* Either Ctrl key down */
#define HKFL_ALT    4		/* Either Alt key down */
#define HKFL_EXT    8		/* This is an extended key */
#define HKFL_WIN    16		/* Either Nexus flappy-window down */

/* XLATOFF */
#ifdef	HOTKEYF_SHIFT
#if HKFL_SHIFT != HOTKEYF_SHIFT || \
    HKFL_CTRL  != HOTKEYF_CONTROL || \
    HKFL_ALT   != HOTKEYF_ALT || \
    HKFL_EXT   != HOTKEYF_EXT
#error "Hotkey state bits don't match!"
#endif
#endif
/* XLATON */

typedef struct HOTKEYSTRUCT {	/* hk */
#ifdef USER_IS_INCLUDING_VMDA
    HWND_16    hwnd16;		/* window that owns the hotkey */
#else   
    WORD    hwnd16;		/* window that owns the hotkey */
#endif          
    WORD    key;		/* LOBYTE = Window virtual key */
				/* HIBYTE = Keystate modifieds (HKFL_*) */
    WORD    scan;		/* OEM scan code for key (used by Shell.VxD) */
} HOTKEYSTRUCT;
typedef HOTKEYSTRUCT NEAR *PHOTKEYSTRUCT;

/* GLOBALHOTKEY - Hotkeys of type 2
 *
 *	This structure is used with the (Un)RegisterHotkey functions
 *	and the WM_HOTKEY message.
 *
 *	WARNING:  USER has its own definition for this structure.
 *
 *	DOUBLE WARNING:  The modifier states are *different* from those
 *	for hotkeys of type 1!  Aigh!
 */

#define GHKFL_ALT    1		/* Either Alt key down */
#define GHKFL_CTRL   2		/* Either Ctrl key down */
#define GHKFL_SHIFT  4		/* Either shift key down */
#define GHKFL_WIN    8		/* Either Nexus flappy-window down */

/* XLATOFF */
#ifdef	MOD_WIN
#if GHKFL_SHIFT != MOD_SHIFT || \
    GHKFL_CTRL  != MOD_CONTROL || \
    GHKFL_ALT   != MOD_ALT || \
    GHKFL_WIN   != MOD_WIN
#error "Global hotkey state bits don't match!"
#endif
#endif
/* XLATON */

typedef struct GLOBALHOTKEY	{ /* ghk */
#ifdef USER_IS_INCLUDING_VMDA
    struct GLOBALHOTKEY NEAR *phkNext;
#else
    WORD    phkNext;
#endif
    WORD    hq;
    DWORD   id;
    WORD    hwnd16;
    WORD    fsModifiers;
    WORD    vk;
    WORD    scan;
} GLOBALHOTKEY, NEAR *PGLOBALHOTKEY;

/*****************************************************************************/


/* H2INCSWITCHES -t- */

#ifdef	VK_NUMPAD0
#if (VK_NUMPAD0 != 0x60) || (VK_NUMPAD9 != 0x69)
#error "VK_ codes don't match!"
#endif
#else
#define VK_NUMPAD0      0x60
#define VK_NUMPAD9      0x69
#endif

/*****************************************************************************
 *
 * Undocumented flag bits for SHELL_Event.
 *
 */

#if 0                                           // Historical purposes

#define SE_WP_SetFocusBoost     0x00010000      // Boost the SYS VM till a
#define SE_WP_SetFocusBoostBit  16              //  Set_Focus call
                                                //
#define SE_WP_SwitcherBoost     0x00020000      // Leftover from 3.1
#define SE_WP_SwitcherBoostBit  17              //
                                                //
#define SE_WP_FilSysChgBoost    0x00040000      // Leftover from 3.1
#define SE_WP_FilSysChgBoostBit 18              //
                                                //
#define SE_WP_ClipAPIBoost      0x00080000      // Boost the SYS VM during clipbrd
#define SE_WP_ClipAPIBoostBit   19              //  API

#else                                           // There is only one type of
                                                // boost, so everybody shares.
#define SE_WP_SetFocusBoost     SE_WP_PrtScBoost
#define SE_WP_SetFocusBoostBit  SE_WP_PrtScBoostBit

#define SE_WP_ClipAPIBoost      SE_WP_PrtScBoost
#define SE_WP_ClipAPIBoostBit   SE_WP_PrtScBoostBit

#define SE_WP_Zombie		0x80000000	// Dead event but must linger
#define SE_WP_ZombieBit		31		// for buggy 3.1 VDDs

#endif


/* SE_WP_PrtScBoost is defined in shell.h */
/* SE_WP_DispUpdBoost is defined in shell.h */