/****************************************************************************** * * (C) Copyright MICROSOFT Corp., 1988-1990 * * Title: SHELL header file * * Version: 2.00 * * Date: 2-06-89 * * Author: ARR * ******************************************************************************* * * Change log: * * DATE REVISION DESCRIPTION * -------- -------- ------------------------------------------------------- * 06-Feb-1989 ARR Original * 28-Feb-1992 rjc Partially converted from inc to h file. * 25-Sep-1992 rjc Change old-style ULONG/USHORT into modern DWORD/WORD * *============================================================================== */ /* * All directed VM hot keys are PriorityNotify. This is the timeout for them. * If it takes longer than this many milliseconds, the key is discarded. * * 0 means no time out */ #define KEYTIMEOUT 4000 /* 4 sec, long enough for floppy operations */ /* * This is the structure of the PIF file hot key information. * * The bits of Val are as follows: * * bit 0 (value 1) = key is an extended key * * This tells us whether or not to look for an E0 prefix. * * bit 1 (value 2) = key requires NumLock down (new for 4.0) * * This tells us whether to treat scan code 047h as * VK_HOME or VK_NUMPAD7. */ #define MAXHKYINFOSIZE 16 /* H2INCSWITCHES -t */ typedef struct PIFKEY { /* PIF_Ky */ WORD Scan; /* Scan code in lower byte */ WORD ShVal; /* Shift state */ WORD ShMsk; /* Mask for shift states interested in */ BYTE Val; /* Enhanced key stuff */ BYTE Pad[9]; /* Pad PIF struc to MAXHKYINFOSIZE bytes */ } PIFKEY; typedef UNALIGNED PIFKEY *LPPIFKEY; typedef const UNALIGNED PIFKEY *LPCPIFKEY; /* ASM .errnz SIZE PIFKEY - MAXHKYINFOSIZE */ /* * PIF_Ky_Val * = 1, if extended code (key is an extended code only) * = 0FFh, if either (key is EITHER extended or not extended) * = 0 if not extended (key is not extended only) * * bit 15 - Ins depressed * bit 14 - Caps Lock depressed * bit 13 - Num Lock depressed * bit 12 - Scroll Lock depressed * bit 11 - hold state active(Ctrl-Num Lock) * bit 10 - 0 * bit 9 - 0 * bit 8 - 0 * bit 7 - Insert state active * bit 6 - Caps Lock state active * bit 5 - Num Lock state active * bit 4 - Scroll Lock state active * bit 3 - Alt shift depressed * bit 2 - Ctrl shift depressed * bit 1 - left shift depressed * bit 0 - right shift depressed */ #define fPIFSh_RShf 0x0001 /* Right shift key */ #define fPIFSh_RShfBit 0 #define fPIFSh_LShf 0x0002 /* Left shift key */ #define fPIFSh_LShfBit 1 #define fPIFSh_Ctrl 0x0004 /* Either Control shift key */ #define fPIFSh_CtrlBit 2 #define fPIFSh_Alt 0x0008 /* Either Alt shift key */ #define fPIFSh_AltBit 3 #define fPIFSh_ScLok 0x0010 /* Scroll lock active */ #define fPIFSh_ScLokBit 4 #define fPIFSh_NmLok 0x0020 /* Num lock active */ #define fPIFSh_NmLokBit 5 #define fPIFSh_CpLok 0x0040 /* Caps lock active */ #define fPIFSh_CpLokBit 6 #define fPIFSh_Insrt 0x0080 /* Insert active */ #define fPIFSh_InsrtBit 7 #define fPIFSh_Ext0 0x0400 /* Extended K/B shift */ #define fPIFSh_Ext0Bit 10 #define fPIFSh_Hold 0x0800 /* Ctrl-Num-Lock/Pause active */ #define fPIFSh_HoldBit 11 #define fPIFSh_LAlt 0x1000 /* Left Alt key is down */ #define fPIFSh_LAltBit 12 #define fPIFSh_RAlt 0x2000 /* Right Alt key is down */ #define fPIFSh_RAltBit 13 #define fPIFSh_LCtrl 0x4000 /* Left Ctrl key is down */ #define fPIFSh_LCtrlBit 14 #define fPIFSh_RCtrl 0x8000 /* Right Ctrl key is down */ #define fPIFSh_RCtrlBit 15 #define MAXVMTITLELENGTH 32 /* Size of name buffer */ #define PIFNAMESIZE 30 /* Amount of buffer actually used */ /* * VM descriptor structure used to create and modify VM attributes. * */ /* H2INCSWITCHES -t- */ struct VM_Descriptor { DWORD VD_Flags; /* Flags */ DWORD VD_Flags2; /* More Flags */ DWORD VD_ProgName; /* Pointer to program name */ WORD VD_ProgNameSeg; /* */ DWORD VD_CmdLine; /* Command line ptr */ WORD VD_CmdLineSeg; /* */ DWORD VD_DrivePath; /* Current drive and dir ptr */ WORD VD_DrivePathSeg;/* */ WORD VD_MaxMem; /* Maximum VM memory in Kb */ WORD VD_MinMem; /* Minimum VM memory in Kb */ WORD VD_FPriority; /* Priority of process when FOCUS */ WORD VD_BPriority; /* Priority of process when Not FOCUS */ WORD VD_MaxEMSMem; /* Maximum EMS memory in Kb */ WORD VD_MinEMSMem; /* Minimum EMS memory in Kb */ WORD VD_MaxXMSMem; /* Maximum XMS (extended) memory in Kb */ WORD VD_MinXMSMem; /* Minimum XMS (extended) memory in Kb */ WORD VD_WindHand; /* Window handle of VMDOSAPP instance */ WORD VD_InstHand; /* Instance handle of VMDOSAPP instance */ BYTE VD_Title[MAXVMTITLELENGTH]; /* Title of app */ PIFKEY VD_HotKeyBuf; /* Buffer for Hot key spec */ }; /* ASM ; ; Access the MaxMem and MinMem fields as a single DWORD. ; VD_VMSize equ DWORD PTR VD_MaxMem */ /* ASM ifndef MASM6 IF2 IFDEF VMStat_Exclusive_Bit .erre VD_F_ExclusiveBit EQ VMStat_Exclusive_Bit .erre VD_F_BackgroundBit EQ VMStat_Background_Bit ENDIF ENDIF else ; MASM6 IFDEF VMStat_Exclusive_Bit .erre VD_F_ExclusiveBit EQ VMStat_Exclusive_Bit .erre VD_F_BackgroundBit EQ VMStat_Background_Bit ENDIF endif ; MASM6 */ /* * Masks and bit numbers for VD_Flags * */ #define VD_F_ExclusiveBit 0 /* This bit indicates that when the VM * has the focus it has Exclusive use * of the CPU. */ #define VD_F_Exclusive (1L << VD_F_ExclusiveBit) #define VD_F_BackgroundBit 1 /* This bit indicates that when the VM * does not have the focus it continues * to get CPU time. If this bit is * clear the VM is effectively * suspended unless it has the * input focus. */ #define VD_F_Background (1L << VD_F_BackgroundBit) #define VD_F_WindowBit 2 /* This bit indicates that the VM * runs in a window. * If the bit is clear the VM is a * full screen VM. */ #define VD_F_Window (1L << VD_F_WindowBit) /* VD_F_Window2 is set if the VDD thinks that the VM is ;Internal * running in a window. This bit is only if... ;Internal * 1. The VM is running in a window. ;Internal * 2. The VM is not minimized. ;Internal * 3. The VM's client area is visible. ;Internal * This is different from VD_F_Window, which is set iff the ;Internal * VM is running in a window, possible minimized or obscured. ;Internal * We lie to the VDD so that it won't try to track the VM's ;Internal * display when there is no reason to do so. ;Internal */ /* ;Internal */ #define VD_F_Window2Bit 3 /* ;Internal */ #define VD_F_Window2 (1L << VD_F_Window2Bit) /* ;Internal */ /* ;Internal */ #define VD_F_SuspendedBit 4 /* Set if app suspended by VMDOSAPP */ #define VD_F_Suspended (1L << VD_F_SuspendedBit) #define VD_F_ALTTABdisBit 5 /* Set if the Standard * ALT-TAB Hot key is disabled for * this VM. */ #define VD_F_ALTTABdis (1L << VD_F_ALTTABdisBit) #define VD_F_ALTESCdisBit 6 /* Set if the Standard * ALT-ESC Hot key is disabled for * this VM. */ #define VD_F_ALTESCdis (1L << VD_F_ALTESCdisBit) #define VD_F_ALTSPACEdisBit 7 /* Set if the Standard * ALT-SPACE Hot key is disabled for * this VM. */ #define VD_F_ALTSPACEdis (1L << VD_F_ALTSPACEdisBit) #define VD_F_ALTENTERdisBit 8 /* Set if the Standard * ALT-ENTER Hot key is disabled for * this VM. */ #define VD_F_ALTENTERdis (1L << VD_F_ALTENTERdisBit) #define VD_F_ALTPRTSCdisBit 9 /* Set if the Standard * ALT-PRTSC Hot key is disabled for * this VM. */ #define VD_F_ALTPRTSCdis (1L << VD_F_ALTPRTSCdisBit) #define VD_F_PRTSCdisBit 10 /* Set if the Standard * PRTSC Hot key is disabled for * this VM. */ #define VD_F_PRTSCdis (1L << VD_F_PRTSCdisBit) #define VD_F_CTRLESCdisBit 11 /* Set if the Standard * CTRL-ESC Hot key is disabled for * this VM. */ #define VD_F_CTRLESCdis (1L << VD_F_CTRLESCdisBit) #define VD_F_PollingDetectBit 12 /* Set if the polling * detection is allowed for this VM */ #define VD_F_PollingDetect (1L << VD_F_PollingDetectBit) #define VD_F_NoHMABit 13 /* Set if access to * the XMS HMA is disallowed in * this VM. */ #define VD_F_NoHMA (1L << VD_F_NoHMABit) #define VD_F_HasHotKeyBit 14 /* Set if this app * has specified a hot key in * this VM. */ #define VD_F_HasHotKey (1L << VD_F_HasHotKeyBit) #define VD_F_EMS_Is_LockBit 15 /* Set if XMS memory * should be locked in this VM. */ #define VD_F_EMS_Is_Lock (1L << VD_F_EMS_Is_LockBit) #define VD_F_XMS_Is_LockBit 16 /* Set if EMS memory * should be locked in this VM. */ #define VD_F_XMS_Is_Lock (1L << VD_F_XMS_Is_LockBit) #define VD_F_INT16PasteBit 17 /* Paste via INT 16 is OK */ #define VD_F_INT16Paste (1L << VD_F_INT16PasteBit) #define VD_F_VMLockedBit 18 /* VM is to be Always LOCKED. */ #define VD_F_VMLocked (1L << VD_F_VMLockedBit) #define VD_F_IsBatchBit 19 /* VM is a .BAT file run */ #define VD_F_IsBatch (1L << VD_F_IsBatchBit) /* ;Internal */ #define VD_F_VolumeLockBit 27 /* Owns a level 3 volume lock *//* ;Internal */ #define VD_F_VolumeLock (1L << VD_F_VolumeLockBit) /* ;Internal */ /* ;Internal */ #define VD_F_IsTextBit 28 /* Am in a text mode */ /* ;Internal */ #define VD_F_IsText (1L << VD_F_IsTextBit) /* ;Internal */ /* ;Internal */ #define VD_F_DynaWindowBit 29 /* Auto switch when in graphics mode */ #define VD_F_DynaWindow (1L << VD_F_DynaWindowBit) #define VD_F_ExitCloseBit 30 /* VM is to be closed on exit */ #define VD_F_ExitClose (1L << VD_F_ExitCloseBit) #define VD_F_PastingBit 31 /* VM is pasting also used for hot key * flag */ #define VD_F_Pasting (1L << VD_F_PastingBit) /* * Following bits are bits for the VDD to interpret in VD_Flags2 */ #define VD_F2_VDDPrivMask 0x0000FFFF #define VD_F2_VDDPrivMinBit 0 #define VD_F2_VDDPrivMaxBit 15 /* Validate the above three defines */ #if ((1 << (1+VD_F2_VDDPrivMaxBit))-1) - ((1 << VD_F2_VDDPrivMinBit)-1) != VD_F2_VDDPrivMask /* XLATOFF */ #error VD_F2_VDDPrivMask conflicts with MaxBit and MinBit. /* XLATON */ /* ASM %OUT VD_F2_VDDPrivMask conflicts with MaxBit and MinBit. .err */ #endif #define VD_F2_DynaWindowingBit 16 /* Internal semaphore */ #define VD_F2_DynaWindowIng (1L << VD_F2_DynaWindowingBit) #define VD_F2_DynaWaitingBit 17 /* Internal semaphore */ #define VD_F2_DynaWaiting (1L << VD_F2_DynaWaitingBit) /* * These are the bits of VD_Flags which are "exported" to the outside world * via the SHELL_GetVMInfo service */ /* XLATOFF */ #define VD_Flags_Exported (VD_F_Window+VD_F_ALTTABdis+VD_F_ALTESCdis+\ VD_F_ALTSPACEdis+VD_F_ALTENTERdis+VD_F_ALTPRTSCdis+\ VD_F_PRTSCdis+VD_F_CTRLESCdis+VD_F_PollingDetect+\ VD_F_NoHMA+VD_F_HasHotKey+VD_F_EMS_Is_Lock+\ VD_F_XMS_Is_Lock+VD_F_INT16Paste+VD_F_VMLocked+\ VD_F_ExitClose) /* XLATON */ /* ASM VD_Flags_Exported equ (VD_F_Window+VD_F_ALTTABdis+VD_F_ALTESCdis+\ VD_F_ALTSPACEdis+VD_F_ALTENTERdis+VD_F_ALTPRTSCdis+\ VD_F_PRTSCdis+VD_F_CTRLESCdis+VD_F_PollingDetect+\ VD_F_NoHMA+VD_F_HasHotKey+VD_F_EMS_Is_Lock+\ VD_F_XMS_Is_Lock+VD_F_INT16Paste+VD_F_VMLocked+\ VD_F_ExitClose) */ #ifdef DOS7 /* ;Internal */ #define VD_Flags2_Exported VD_F2_CreateVisible /* ;Internal */ #else /* ;Internal */ #define VD_Flags2_Exported 0 #endif /* ;Internal */ /* * Special exit codes * * VMDA_EXIT_ExecFail can trigger for the following reasons: * * An ugly TSR is present in the system. * You are in clean-boot mode. * Administration restrictions forbid DOS boxes. * ;Internal * NOTE! If you add a new exit code, make sure to adjust the call ;Internal * to WOAAbort in ttywin.asm accordingly! ;Internal */ #define VMDA_EXIT_NoFile 0x81 /* File not found */ #define VMDA_EXIT_NoMem 0x82 /* Insufficient memory */ #define VMDA_EXIT_Crash 0x83 /* Application terminated abnormally */ #define VMDA_EXIT_BadVer 0x84 /* Mismatched system components */ #define VMDA_EXIT_ExecFail 0x85 /* Could not run due to incompatible * system configuration. */ /* * These are the ordinals for the Shell-exported V86-mode and protect-mode * services. * */ #define SHSV_Get_Version 0x0100 #define SHSV_Install_New_Task_Manager 0x0101 #define SHSV_ShellExecute 0x0102 #define SHSV_WinExecWait 0x0103 #define SHSV_Enumerate_Properties 0x0104 #define SHSV_Update_Properties 0x0105 #define SHSV_Set_ScreenSaver_Info 0x0106 #define SHSV_Get_VxD_Version 0x0107 #define NUMSHELLSERVICES 8 /* H2INCSWITCHES -t */ typedef struct TaskManagerDescriptorBlock { /* TMDB */ DWORD TaskManNameOffs; WORD TaskManNameSeg; DWORD ProgNameOffs; WORD ProgNameSeg; DWORD CmdLineOffs; WORD CmdLineSeg; DWORD DrivePathOffs; WORD DrivePathSeg; } TMDB; #define TMDBSTRINGCOUNT 4 #define MAXTMDBSTRINGLENGTH 128 /* 127 chars + terminating 0 */ /* * Error values for WinExecWait. */ #define ERR_WEW_FIRST 0x0100 #define ERR_WEW_INSMEM 0x0100 /* Insufficient memory */ #define ERR_WEW_NOTASK 0x0101 /* No such task, or task is Win32 */ #define ERR_WEW_TOOLHELP 0x0102 /* Could not load TOOLHELP */ #define ERR_WEW_LAST 0x0102 /* ;Internal */ /* * Definitions for the VM Close API. */ #define VMCLFL_ENABLECLOSE 1 #ifndef V86MODE #ifdef TASKMAN /* * Structure for installable task managers to notify the Shell VxD * which services they want to hook. */ typedef struct TMHandlers { /* TMH */ DWORD Len; PVOID Resolve_Contention_Pre; PVOID Resolve_Contention_Post; PVOID Event; PVOID Sysmodal_Message_Pre; PVOID Sysmodal_Message_Post; PVOID Message_Pre; PVOID Message_Post; PVOID Svc_Call; PVOID Clipboard; PVOID Not_Executeable; PVOID Set_Focus; PVOID HotKey; PVOID PostMessage; PVOID ShellExecute; PVOID CallDll; PVOID VmTitle; PVOID VmClose; PVOID QueryAppyTimeAvailable; PVOID CallAtAppyTime; PVOID CancelAppyTimeEvent; PVOID BroadcastSystemMessage; PVOID HookSystemBroadcast; PVOID UnhookSystemBroadcast; PVOID LocalAllocEx; PVOID LocalFree; PVOID LoadLibrary; PVOID FreeLibrary; PVOID GetProcAddress; PVOID DispatchRing0AppyEvents; } TMH; /* * This is the structure the SHELL_Install_TaskMan_Hooks returns a pointer to. * * It is an array of pointers to helper functions provided by the Shell VxD * to task managers. These helper functions are not exported as services * because they expose the sensitive innards of the Shell VxD. */ typedef struct SHHandlers { /* SHH */ PVOID GetVmDescriptor; PVOID RegisterVMHotKey; PVOID DisplayMessage; } SHH; #endif /* * When expanding this structure, make sure to PREPEND fields, so as to * retain backwards compatibility. */ typedef struct VM_Desc2 { /* VD2 */ DWORD phvmOwner; /* Back-pointer to owner */ BYTE Err_Code; /* Error code for Exec failure */ BYTE Exit_Code; /* Exit code */ } VM_Desc2; /* ASM ; ; Potentially handy abbreviation so you can say ; ; call [SHELL_GetVmDescriptor] ; mov eax, [eax.MVM_Desc2.VD2_HotKeyHandle] ; MVM_Desc2 = - SIZE VM_Desc2 */ #endif /* ifndef V86MODE */ #define MAX_DLL_NAME 80 #ifndef MAX_GROUP_NAME #define MAX_GROUP_NAME 16 #else #if MAX_GROUP_NAME != 16 #error Invalid definition of MAX_GROUP_NAME. #endif #endif /* H2INCSWITCHES -t- */ struct PropID { DWORD ordGroup; BYTE achGroup[MAX_GROUP_NAME]; BYTE achDLL[MAX_DLL_NAME]; };