/*
 *      Microsoft Confidential
 *      Copyright (C) Microsoft Corporation 1992
 *      All Rights Reserved.
 *
 *
 *      This is intended to supercede MULT.H as the most complete
 *      reference we have on DOS INT 2Fh usage.  The header immediately
 *      below is an attempt to give an overview of all DOS and 3rd-party
 *      INT 2Fhs, but equates which follow are strictly for MS-DOS-specific
 *      functions.
 *
 *      Created 4/28/92 JTP
 */

/*
 * The current set of defined multiplex channels is (* means documented):
 *
 *  Channel(h)  Issuer          Receiver    Function
 *  ----------  ------          --------    --------
 *      00h     server          PSPRINT     print job control
 *     *01h     print/apps      PRINT       Queueing of files
 *      02h     BIOS            REDIR       signal open/close of printers
 *
 *      05h     command         REDIR       obtain text of net int 24 message
 *     *06h     server/assign   ASSIGN      Install check
 *
 *      08h     external driver DRIVER.SYS  interface to internal routines
 *
 *      10h     sharer/server   SHARE       install check
 *      11h     DOS/server      Redir       install check/redirection funcs
 *      12h     sharer/redir    DOS         dos functions and structure maint
 *      13h     MSNET           MSNET       movement of NCBs
 *      13h     external driver IBMBIO      Reset_Int_13, allows installation
 *                                          of alternative INT_13 drivers after
 *                                          boot_up
 *      14h(IBM)DOS             NLSFUNC     down load NLS country info,DOS 3.3
 *      14h(MS) APPS            POPUP       MSDOS 4 popup screen functions
 *
 *  ***> NOTE <***  Yes there are 2 users of 14h but since
 *                  DOS 4.XX doesn't use NLSFUNC, there is no conflict
 *
 *      15h     APPS            MSCDEX      CD-ROM extensions interface
 *      15h     GRAPHICS                    (conflicts)
 *      16h     WIN386          WIN386      Windows communications
 *      17h     Clipboard       WINDOWS     Clipboard interface
 *     *18h     Applications    MS-Manager  Toggle interface to manager
 *      19h     Shell                       DOS 4.x shell only (SHELLB.COM)
 *      1Ah     Ansi.sys
 *      1Bh     Fastopen,Vdisk  IBMBIO      EMS INT 67H stub handler
 *                                          (see IBM's XMA2EMS driver for DOS4)
 *
 *      23h           stolen by DR-DOS 5.0  GRAFTABL
 *      27h           stolen by DR-DOS 6.0  TaskMAX
 *      27h           stolen by Novell DOS7 EMM386
 *      2Ah           stolen by Gammafax    FaxBIOS
 *      2Eh           stolen by Novell DOS7 GRAFTABL
 *      39h           stolen by Kingswood   Some ISV TSR thingie
 *
 *      40h     OS/2
 *      41h     Lanman
 *      42h     Lanman
 *      43h     Himem
 *                                  00h     XMS installation check
 *                                  08h     return A20 handler number
 *                                  09h     return XMS handle table address
 *                                  10h     return XMS entry point address
 *                                  20h     reserved for Mach 20 Himem support
 *                                  30h     reserved for Himem external A20 code
 *                                  E0h-E4h stolen by Novell DPMS
 *      44h     Dosextender
 *      45H     Windows profiler
 *      46h     Windows/286 DOS extender
 *      47h     Basic Compiler Vn. 7.0
 *      48h     Doskey
 *                                  C0h-C5h stolen by PCED
 *      49h     DOS 5.x install             also used by original Compaq
 *                                          Restricted DOS (RDOS)
 *      4Ah     Multi-Purpose
 *               multMULTSWPDSK     00h     Swap Disk in drive A (BIOS)
 *               multMULTGETHMAPTR  01h     Get available HMA & ptr
 *               multMULTALLOCHMA   02h     Allocate HMA (bx == no of bytes)
 *               multMULTTASKSHELL  05h     Shell/switcher API
 *               multMULTRPLTOM     06h     Top Of Memory for RPL support
 *               multSmartdrv       10h
 *               multDblSpace       11h
 *               multMRCIDetect     12h
 *               multMRCIBackPatch  13h
 *               multOpenBootLog    14h
 *               multWriteBootLog   15h
 *               multCloseBootLog   16h
 *               multNWRedir        17h
 *
 *      4Bh     Task Switcher API
 *
 *      4Ch     APPS            APM         Advanced power management (obsolete)
 *
 *      4Dh     Kana Kanji Converter, MSKK
 *      4Eh     Kana Kanji Converter, MSKK
 *      4Fh     Multilingual DOS, MSKK
 *
 *      50h     SETNLS                      (new for DOS 7.00 (Jaguar))
 *
 *      51h     ODI real mode support driver (for Chicago)
 *
 *      52h     Reserved by MS for Stac Electronics
 *                    (but stolen by JAM Real-Time Data Compression)
 *
 *      53h     POWER(APM)                  For broadcasting APM events
 *      54h     APPS            POWER(APM)  To control POWER status from apps
 *                                  53h     (stolen by TesSeRact TSR library)
 *
 *      55h     COMMAND.COM
 *               multCOMFIRST       00h     API to determine whether 1st
 *                                          instance of command.com
 *      56h     INTERLINK
 *      57h     IOMEGA
 *
 *      58h     ChiNet          ChiNet      transition interface used in
 *                                          loading Chicago from a remote drive
 *
 *      5Dh     (stolen by Award PCDISK.EXE v1.02c PCMCIA/ATA driver)
 *      60h     (stolen by IPLAY by Prime and Excalibur)
 *      62h     (stolen by PC Tools virus protector)
 *
 *      70h     APPS            APPS        for software licensing
 *
 *      7Ah     Novell                      (hey, how'd they get in our range?)
 *
 *  End of Microsoft-reserved range
 *
 *      ABh     Unspecified IBM use
 *      ACh     Graphics
 *      ADh     NLS (toronto)               (DISPLAY.SYS and KEYB.COM)
 *      AEh     COMMAND.COM                 Installable command support
 *      AFh     Mode
 *      B0h     GRAFTABL        GRAFTABL
 *      B7h     APPEND
 *      B8h     Networks        Misc
 *      B9h     PC Network
 *      BCh     EGA.SYS
 *      BFh     PC LAN Program
 *
 *  End of IBM-reserved range (although it seems to have become a jointly
 *  reserved range....)
 *
 *      D7h     Banyan VINES
 *      D8h     Novell
 *
 *  Old guidelines governing use and future assignment of multiplex #'s
 *  (they must be old because no one seems to have paid them much attention)
 *
 *  MUX 00-3F reserved for IBM
 *  MUX 80-BF reserved for IBM
 *  MUX 40-7F reserved for Microsoft
 *  MUX C0-FF users
 *
 *  New guidelines governing use and future assignment of multiplex #'s
 *
 *    + Just keep new MS multiplex assignments below 80h, ok?
 */


#define INT_MULT            0x2F


/* PRINT services
 */
#define I2F_PSPRINT         0x00
#define I2FPSPRINT_YIELD            0x80

#define I2F_PRINT           0x01
#define I2FPRINT_INSTALLCHECK       0x00
#define I2FPRINT_QUEUEFILE          0x01
#define I2FPRINT_REMOVEFILE         0x02
#define I2FPRINT_REMOVEALL          0x03
#define I2FPRINT_FREEZEQUEUE        0x04
#define I2FPRINT_THAWQUEUE          0x05
#define I2FPRINT_GETDEVICE          0x06

#define I2F_PCLAN_REDIR     0x02

#define I2F_HARDERR         0x05
#define I2FHARDERR_INSTALLCHECK     0x00
#define I2FHARDERR_EXPAND_EXTERR    0x01
#define I2FHARDERR_EXPAND_PARMERR   0x02

#define I2F_ASSIGN          0x06
#define I2FASSIGN_INSTALLCHECK      0x00
#define I2FASSIGN_GET_DRIVE_ASSIGNS 0x01

#define I2F_DRIVER          0x08
#define I2FDRIVER_INSTALLCHECK      0x00
#define I2FDRIVER_ADD_DEVICE        0x01
#define I2FDRIVER_EXEC_REQUEST      0x02
#define I2FDRIVER_GET_DRIVE_DATA    0x03

#define MultSHARE           0x10            // old-style definition
#define I2F_SHARE           0x10
#define I2FSHARE_INSTALLCHECK       0x00    // gshare.asm:  MFT_Enter
#define I2FSHARE_MAKEENTRY          0x01    // gshare.asm:  MFT_Enter
#define I2FSHARE_CLOSE              0x02    // gshare.asm:  MFTClose
#define I2FSHARE_CLOSEBYUID         0x03    // gshare.asm:  MFTClu
#define I2FSHARE_CLOSEBYPID         0x04    // gshare.asm:  MFTCloseP
#define I2FSHARE_CLOSEBYNAME        0x05    // gshare.asm:  MFTCloN
#define I2FSHARE_SETBYTELOCK        0x06    // gshare.asm:  Set_Mult_Block
#define I2FSHARE_CLRBYTELOCK        0x07    // gshare.asm:  Clr_Mult_Block
#define I2FSHARE_CHKBYTELOCK        0x08    // gshare.asm:  Chk_Block
#define I2FSHARE_GETENTRY           0x09    // gshare2.asm: MFT_Get
#define I2FSHARE_SAVESFTTOFCB       0x0A    // gshare2.asm: ShSave
#define I2FSHARE_CHKFCB             0x0B    // gshare2.asm: ShChk
#define I2FSHARE_COLLAPSESFTS       0x0C    // gshare2.asm: ShCol
#define I2FSHARE_CLOSEFILE          0x0D    // gshare2.asm: ShCloseFile
#define I2FSHARE_UPDATESFTS         0x0E    // gshare2.asm: ShSU

#define MultNET             0x11            // old-style definitions
#define MultIFS             0x11
#define I2F_REDIR           0x11
#define I2FREDIR_INSTALLCHECK       0x00
#define I2FREDIR_RMDIR              0x01
#define I2FREDIR_SEQ_RMDIR          0x02
#define I2FREDIR_MKDIR              0x03
#define I2FREDIR_SEQ_MKDIR          0x04
#define I2FREDIR_CHDIR              0x05
#define I2FREDIR_CLOSE              0x06
#define I2FREDIR_COMMIT             0x07
#define I2FREDIR_READ               0x08
#define I2FREDIR_WRITE              0x09
#define I2FREDIR_LOCK               0x0A
#define I2FREDIR_UNLOCK             0x0B
#define I2FREDIR_DISK_INFO          0x0C
#define I2FREDIR_SET_FILE_ATTR      0x0D
#define I2FREDIR_SEQ_SET_FILE_ATTR  0x0E
#define I2FREDIR_GET_FILE_INFO      0x0F
#define I2FREDIR_SEQ_GET_FILE_INFO  0x10
#define I2FREDIR_RENAME             0x11
#define I2FREDIR_SEQ_RENAME         0x12
#define I2FREDIR_DELETE             0x13
#define I2FREDIR_SEQ_DELETE         0x14
#define I2FREDIR_OPEN               0x15
#define I2FREDIR_SEQ_OPEN           0x16
#define I2FREDIR_CREATE             0x17
#define I2FREDIR_SEQ_CREATE         0x18
#define I2FREDIR_SEQ_SEARCH_FIRST   0x19
#define I2FREDIR_SEQ_SEARCH_NEXT    0x1A
#define I2FREDIR_SEARCH_FIRST       0x1B
#define I2FREDIR_SEARCH_NEXT        0x1C
#define I2FREDIR_ABORT              0x1D
#define I2FREDIR_ASSOPER            0x1E
#define I2FREDIR_PRINTER_SET_STRING 0x1F
#define I2FREDIR_FLUSHBUF           0x20
#define I2FREDIR_BUFWRITE           0x21
#define I2FREDIR_RESETENVIRONMENT   0x22
#define I2FREDIR_SPOOLCHECK         0x23
#define I2FREDIR_SPOOLCLOSE         0x24
#define I2FREDIR_DEVICEOPER         0x25
#define I2FREDIR_SPOOLECHOCHECK     0x26
#define I2FREDIR_UNUSED1            0x27
#define I2FREDIR_UNUSED2            0x28
#define I2FREDIR_UNUSED3            0x29
#define I2FREDIR_CLOSEFILES_FOR_UID 0x2A
#define I2FREDIR_DEVICE_IOCTL       0x2B
#define I2FREDIR_UPDATE_CB          0x2C
#define I2FREDIR_FILE_XATTRIBUTES   0x2D
#define I2FREDIR_XOPEN              0x2E
#define I2FREDIR_DEPENDENT_IOCTL    0x2F
#define I2FREDIR_PIPE_PEEK	     0x31

#define MultDOS             0x12            // old-style definition
#define I2F_DOS             0x12            // DOS call back
#define I2FDOS_INSTALLCHECK         0x00
#define I2FDOS_CLOSE                0x01
#define I2FDOS_RECSET               0x02
#define I2FDOS_GET_DOSGROUP         0x03
#define I2FDOS_PATHCHRCMP           0x04
#define I2FDOS_OUT                  0x05
#define I2FDOS_NET_I24_ENTRY        0x06
#define I2FDOS_PLACEBUF             0x07
#define I2FDOS_FREE_SFT             0x08
#define I2FDOS_BUFWRITE             0x09
#define I2FDOS_SHARE_VIOLATION      0x0A
#define I2FDOS_SHARE_ERROR          0x0B
#define I2FDOS_SET_SFT_MODE         0x0C
#define I2FDOS_DATE16               0x0D
#define I2FDOS_UNUSED1              0x0E    // (was SETVISIT)
#define I2FDOS_SCANPLACE            0x0F
#define I2FDOS_UNUSED2              0x10    // (was SKIPVISIT)
#define I2FDOS_STRCPY               0x11
#define I2FDOS_STRLEN               0x12
#define I2FDOS_UCASE                0x13
#define I2FDOS_POINTCOMP            0x14
#define I2FDOS_CHECKFLUSH           0x15
#define I2FDOS_SFFROMSFN            0x16
#define I2FDOS_GETCDSFROMDRV        0x17
#define I2FDOS_GET_USER_STACK       0x18
#define I2FDOS_GETTHISDRV           0x19
#define I2FDOS_DRIVEFROMTEXT        0x1A
#define I2FDOS_SETYEAR              0x1B
#define I2FDOS_DSUM                 0x1C
#define I2FDOS_DSLIDE               0x1D
#define I2FDOS_STRCMP               0x1E
#define I2FDOS_INITCDS              0x1F
#define I2FDOS_PJFNFROMHANDLE       0x20
#define I2FDOS__NAMETRANS           0x21
#define I2FDOS_CAL_LK               0x22
#define I2FDOS_DEVNAME              0x23
#define I2FDOS_IDLE                 0x24
#define I2FDOS_DSTRLEN              0x25
#define I2FDOS_NLS_OPEN             0x26    // DOS 3.3
#define I2FDOS__CLOSE               0x27    // DOS 3.3
#define I2FDOS_NLS_LSEEK            0x28    // DOS 3.3
#define I2FDOS__READ                0x29    // DOS 3.3
#define I2FDOS_FASTINIT             0x2A    // (for FASTOPEN; see fastopen.inc)
#define I2FDOS_NLS_IOCTL            0x2B    // DOS 3.3
#define I2FDOS_GETDEVLIST           0x2C    // DOS 3.3
#define I2FDOS_NLS_GETEXT           0x2D    // DOS 3.3
#define I2FDOS_MSG_RETRIEVAL        0x2E    // DOS 4.0
#define I2FDOS_FAKE_VERSION         0x2F    // DOS 4.0
#define I2FDOS_FndSFTPathInfo       0x30    // Return SFT path/cluster info
#define I2FDOS_SetFAT32Flgs         0x31    // Signal FAT32 win support and TSR flags

#define I2F_DISK            0x13
#define I2FDISK_SET_INT_HDLR        0x1300

#define NLSFUNC             0x14            // old-style definition
#define I2F_NLSFUNC         0x14            // NLSFUNC CALLS, DOS 3.3
#define I2FNLSFUNC_INSTALLCHECK     0x00
#define I2FNLSFUNC_CHGCODEPAGE      0x01
#define I2FNLSFUNC_GETEXTINFO       0x02
#define I2FNLSFUNC_SETCODEPAGE      0x03
#define I2FNLSFUNC_GETCNTRY         0x04

#define I2F_MSCDEX          0x15

#define I2F_DOS386          0x16
#define I2FDOS386_Logo              0x0E    // IO.SYS service for logo management
#define I2FDOS386_INT10             0x0F    // IO.SYS service to replace INT 10h hook
#define I2FDOS386_Get_Shell         0x11    // IO.SYS service to return shell info

// Flags returned in BX by the I2FDOS386_Get_Shell call

#define SHELLFLAG_CLEAN                 0x01
#define SHELLFLAG_DOSCLEAN              0x02
#define SHELLFLAG_NETCLEAN              0x04
#define SHELLFLAG_INTERACTIVE           0x08
#define SHELLFLAG_NOAUTO                0x20
#define SHELLFLAG_DISABLELOADTOP        0x40
#define SHELLFLAG_MSDOSMODE             0x80

#define I2FDOS386_Get_BIOS_Data     0x12    // IO.SYS service to return IO.SYS data
#define I2FDOS386_Get_SYSDAT_Path   0x13    // IO.SYS service to return path to SYSTEM.DAT
#define I2FDOS386_Set_SYSDAT_Path   0x14    // IO.SYS service to set path to SYSTEM.DAT

#define I2F_CLIPBOARD       0x17

#define I2F_MSMANAGER       0x18            // used by old MS-DOS Manager program

#define I2F_DOS4SHELL       0x19

#define MultANSI            0x1A            // old-style definition
#define I2F_ANSI            0x1A            // ANSI.SYS multiplex #
#define I2FANSI_INSTALLCHECK        0x00    // install check for ANSI
#define I2FANSI_IOCTL               0x01    // INT 2Fh interface to IOCTL
#define I2FANSI_DA_INFO             0x02    // information passing to ANSI

#define I2F_XMA2EMS         0x1B            // is this no longer used???

#define I2F_OS2_3XBOX       0x40
#define I2F3XBOX_SWITCHBGND         0x01
#define I2F3XBOX_SWITCHFGND         0x02

#define I2F_LANMAN41        0x41
#define I2F_LANMAN42        0x42

#define I2F_XMS             0x43            // see HIMEM.SYS for details
#define I2FXMS_INSTALLCHECK         0x00
#define I2FXMS_GETADDRESS           0x10
                                            // private functions:
                                            //  08h - return A20 handler
                                            //  09h - return XMS handle table address
                                            //  20h - used for Mach20 version
                                            //  30h - check for external A20 handler

#define I2F_DOSX            0x44            // what is this exactly???

#define I2F_WINPROFILE      0x45            // what is this exactly???

#define I2F_WIN30           0x46
#define I2FWIN30_INSTALLCHECK       0x80

#define I2F_BASCOM7         0x47

#define I2F_DOSKEY          0x48
#define I2FDOSKEY_INSTALLCHECK      0x00    // AL == non-zero if installed
#define I2FDOSKEY_READLINE          0x10    // DS:DX -> line input buffer

#define I2F_DOSINSTALL      0x49

#define MultMULT            0x4A            // old-style definition
#define I2F_MULTIPURPOSE    0x4A

    //  0h  Swap disk function for single floppy drive m/cs
    //      BIOS broadcasts with cx==0, and apps who handle
    //      swap disk messaging set cx == -1. BIOS sets dl == requested
    //      drive
    //
    //  1h  Get available HMA & pointer to it. Returns in BX & ES:DI
    //
    //  2h  Allocate HMA. BX == number of bytes in HMA to be allocated
    //      returns pointer in ES:DI
    //
    //  3h  Allocate HMA high. BX == number of bytes in HMA to be allocated
    //      returns pointer in ES:DI
    //
    //  4h  Query HMA arena header. ES:DI points to first HMA arena header.
    //
    //  5h  Switcher API
    //
    //  6h  Top of Memory for RPL
    //          BIOS issues INT 2Fh/AX=4A06 & DX=top of mem and any RPL
    //          code present in TOM should respond with a new TOM in DX
    //          to protect itself from MSLOAD & SYSINIT tromping over it.
    //          SYSINIT builds an arena with owner type 8 & name 'RPL' to
    //          protect the RPL code from COMMAND.COM transient protion.
    //          It is the responsibility of RPL program to release the mem.
    //
    //  7h  Reserved for PROTMAN support
    // 10h  smartdrv 4.0
    // 11h  dblspace api
    // 12h  MRCI     api
    // 13h  MRCI backpatch

#define MultMULTSWPDSK              0x00    // old-style definitions
#define MultMULTGETHMAPTR           0x01    //
#define MultMULTALLOCHMA            0x02    //
#define MultMULTALLOCHMAEXT         0x03    //
#define MultMULTGETHMAARENA         0x04    //
#define MultMULTRPLTOM              0x06    //

#define I2FMULT_SWPDSK              0x00    // swap Disk in drive A (BIOS)
#define I2FMULT_GETHMAPTR           0x01    // get available HMA & ptr
#define I2FMULT_SUBALLOCHMA         0x02    // allocate HMA (bx == # bytes)
#define I2FMULT_SHELL               0x05    // shell/switcher API
#define I2FMULT_RPLTOM              0x06    // top-of-memory for RPL support
#define I2FMULT_SMARTDRV            0x10    // interface to SmartDrv
    // Following values go in the BX register for I2FMULT_SMARTDRV
    #define MULT_SMARTDRV_GET_STATS                         0x0000
    #define MULT_SMARTDRV_COMMIT_ALL                        0x0001
    #define MULT_SMARTDRV_REINITIALIZE                      0x0002
    #define MULT_SMARTDRV_CACHE_DRIVE                       0x0003
        // These are the MULT_SMARTDRV_CACHE_DRIVE sub-sub-sub functions that go in DL
        #define MULT_SMARTDRVCACHE_DRIVE_GET                    0x00
        #define MULT_SMARTDRVCACHE_DRIVE_READ_ENABLE            0x01
        #define MULT_SMARTDRVCACHE_DRIVE_READ_DISABLE           0x02
        #define MULT_SMARTDRVCACHE_DRIVE_WRIT_ENABLE           0x03
        #define MULT_SMARTDRVCACHE_DRIVE_WRIT_DISABLE          0x04
    #define MULT_SMARTDRV_GET_INFO                          0x0004
    #define MULT_SMARTDRV_GET_ORIGINAL_DD_HEADER            0x0007
    #define MULT_SMARTDRV_SETGET_PROMPTFLUSH                0x0008
    #define MULT_SMARTDRV_UNHOOK                            0x0009
    #define MULT_SMARTDRV_SHOW_SDISKERR                     0x1234
#define I2FMULT_DBLSPACE            0x11    // interface to DblSpace
#define I2FMULT_MRCI                0x12    // interface to MRCI
#define I2FMULT_MRCIBackPatch       0x13    // interface to MRCI backpatch

#define I2FMULT_MULTEMM386       0x15    // Used by EMM386 for IOPORTTRAP

#define I2FMULT_OpenBootLog	0x16    // Open BootLog file
#define I2FMULT_WriteBootLog	0x17    // Write to BootLog File
#define I2FMULT_CloseBootLog	0x18    // Close BootLog File
#define I2FMULT_NWRedir		0x19    // NWRedir control
#define	I2FMULT_MRCIBroadcast	0x20	// MRCI detection broadcast
//#define I2FMULT_FlushBootLog	0x21	// Obsolete since no dblspace drive anymore

#define I2FMULT_EXECOVLY	0x30	// Overlay exec broadcast

#define I2FMULT_SetByte         0x31    // Set a byte in OS data area
#define I2FMULT_LogoServices    0x32    // Alias to logo services (AX=160Eh)
#define I2FMULT_ShellServices   0x33    // Alias to shell services (AX=1611h)

    // The following are subfunctions of I2FMULT_TASKSHELL (specified in SI)

#define I2FMULTSHELL_CINIT_PROGRAM_LIST         0x00
#define I2FMULTSHELL_CADD_PROGRAM_TO_LIST       0x01
#define I2FMULTSHELL_CGO_Z_NEXT                 0x02
#define I2FMULTSHELL_CGO_Z_PREV                 0x03
#define I2FMULTSHELL_CDELETE_PROGRAM_FROM_LIST  0x04
#define I2FMULTSHELL_CGO_NEXT                   0x05
#define I2FMULTSHELL_CGET_ITH_PROGRAM_STRING    0x06
#define I2FMULTSHELL_CGET_LIST_LENGTH           0x07
#define I2FMULTSHELL_CGET_GLOBAL_SWITCH_DATA    0x08
#define I2FMULTSHELL_CGET_ITH_ENTRY_DATA        0x09
#define I2FMULTSHELL_MAX_HANDLER_CALL           0x09
#define I2FMULTSHELL_CADD_PARAMS                0x0A
#define I2FMULTSHELL_CGET_EXITCODE              0x0B
#define I2FMULTSHELL_CTOTOP_ITH_LIST_PE         0x0C

#define I2FMULT_SystemBootTime	0x50	// System boot timestamp


#define I2F_TASKAPI         0x4B
#define I2FTASK_BUILD_CHAIN         0x01
#define I2FTASKBC_INIT_SWITCHER                 0x00
#define I2FTASKBC_QUERY_SUSPEND                 0x01
#define I2FTASKBC_SUSPEND                       0x02
#define I2FTASKBC_RESUME                        0x03
#define I2FTASKBC_SESSION_ACTIVE                0x04
#define I2FTASKBC_CREATE                        0x05
#define I2FTASKBC_DESTROY                       0X06
#define I2FTASKBC_SWITCHER_EXIT                 0x07
#define I2FTASK_DETECT_SWITCHER     0x02
#define I2FTASKDS_GETVERSION                    0x00
#define I2FTASKDS_TESTMEMORYREGION              0x01
#define I2FTASKDS_SUSPEND_SWITCHER              0x02
#define I2FTASKDS_RESUME_SWITCHER               0x03
#define I2FTASKDS_HOOK_CALLOUT                  0x04
#define I2FTASKDS_UNHOOK_CALLOUT                0x05
#define I2FTASKDS_QUERY_API_SUPPORT             0x06
#define I2FTASK_ALLOCATE_SW_ID      0x03
#define I2FTASK_FREE_SW_ID          0x04
#define I2FTASK_GET_INST_DATA       0x05
#define I2FTASK_RESTART_CMD         0x20
#define I2FTASK_GET_STARTTIME       0x22
#define I2FTASK_GET_REG_CODE_PAGE   0x28
#define I2FTASK_GET_REGISTRY_CACHE	0x29


/*
 * These are obselete functions for APM
 * See functions 0x53 & 0x54
 */
#define MultAPM             0x4C        // old-style definition
#define I2F_APM             0x4C
#define I2FAPM_VERCHK                   0x00
#define I2FAPM_SUSSYSREQ                0x01
#define I2FAPM_APM_SUS_RES_BATT_NOTIFY  0xFF


#define I2F_KKC4D           0x4D
#define I2F_KKC4E           0x4E
#define I2F_MULTILANGDOS    0x4F

#define I2F_SETNLS          0x50        // used by SETNLS

#define I2F_ODI             0x51

#define I2F_STAC            0x52        // reserved by MS for Stac Electronics


/*
 * 0x53 & 0x54 are used by POWER.EXE for broadcasting APM events
 * and to control POWER.EXE's status from application programs
 * For details about sub-function numbers refer to ROMDOS 5.0 Technical
 * Specification document
 */
#define MultPwr_BRDCST      0x53        // old-style definitions
#define MultPwr_API         0x54        //
#define I2F_POWER_BRDCST    0x53        // used by POWER.EXE to broadcast APM events
#define I2F_POWER_API       0x54        // used for accessing POWER.EXE's API


#define I2F_COMMAND         0x55        // used by COMMAND.COM


/*
 * 0x56 - assigned to Sewell Development (InterLnk)
 * 0x57 - assigned to Iomega Corp.
 */
#define I2F_INTERLNK        0x56
#define I2F_IOMEGA          0x57


/*
 *
 * 0x58 - assigned to Chicago network transition interface
 *        This supports loading Chicago from a remote drive.
 */
#define I2F_NETLOAD         0x58

#define I2F_SWLICENSING     0x70


#define I2F_NOVELL          0x7A        // hey, how'd they get in our range?

/****************************************************************************/
/* End of MS-reserved range                                                 */
/****************************************************************************/


#define I2F_IBMRESERVED     0xAB


/* GRAPHICS services
 */
#define I2F_GRAPHICS        0xAC
#define I2F_INSTALLCHECK            0x00


/* NLS services
 */
#define I2F_NLS             0xAD
#define I2FNLS_INSTALLCHECK         0x00
#define I2FNLS_UNKNOWN1             0x01
#define I2FNLS_UNKNOWN2             0x02
#define I2FNLS_UNKNOWN3             0x03
#define I2FNLS_UNKNOWN4             0x04
#define I2FNLS_UNKNOWN5             0x10
#define I2FNLS_UNKNOWN6             0x40    // called by PRINT.COM (4.01)

#define I2FKEYB_INSTALLCHECK        0x80
#define I2FKEYB_SETKBCP             0x81
#define I2FKEYB_SETKBMAP            0x82
#define I2FKEYB_GETKBMAP            0x83


/* COMMAND call-outs
 *
 * Note: APPEND hooks this call to avoid execing the actual APPEND utility
 */

#define I2F_INSTCMD         0xAE            // (DX must be -1)
#define I2FINSTCMD_INSTALLCHECK     0x00    // AL == 0FFh if private command
#define I2FINSTCMD_EXECUTE          0x01    //


#define I2F_MODE            0xAF


/* GRAFTABL services
 */
#define I2F_GRAFTABL        0xB0
#define I2FGRAFTABL_INSTALLCHECK    0x00
#define I2FGRAFTABL_GETFONT         0x01


/* APPEND services
 */
#define I2F_APPEND          0xB7
#define I2FAPPEND_INSTALLCHECK      0x00    // AL == -1 if installed
#define I2FAPPEND_OLDDIRPTR         0x01    // (not supported anymore)
#define I2FAPPEND_APPVER            0x02    // AX == -1 ("not network version")
#define I2FAPPEND_DISABLE           0x03    // Disable APPEND (was for TopView)
#define I2FAPPEND_DIRPTR            0x04    // ES:DI -> directory list
#define I2FAPPEND_GETSTATE          0x06    // APPEND flags only (BX)
#define I2FAPPEND_SETSTATE          0x07    // APPEND flags only (BX)
#define I2FAPPEND_VERSION           0x10    // APPEND flags (AX) and version (DX)
#define I2FAPPEND_TRUENAME          0x11    // set one-shot true-name return

#define I2FAPPENDF_ENABLE           0x0001
#define I2FAPPENDF_DRIVEOVERRIDE    0x1000
#define I2FAPPENDF_PATHOVERRIDE     0x2000
#define I2FAPPENDF_APPENDENV        0x4000
#define I2FAPPENDF_SRCHEXECOVERRIDE 0x8000


/* EGA.SYS services (in DOS5, WINDOWS3)
 */
#define I2F_EGASYS          0xBC
#define I2FEGASYS_INSTALLCHECK      0x00
#define I2FEGASYS_GETVERSION        0x06


/****************************************************************************/
/* End of IBM-reserved range                                                */
/****************************************************************************/