/* Copyright (c) 1992 Colin Jensen.  All Rights Reserved. */

/**************************************************************************\
*                                                                         *
* Module Name: BSEDEV.H                                                   *
*                                                                         *
* OS/2 Structures and constants for use with DosDevIOCtl                  *
*                                                                         *
* Copyright (c) 1987-1992, IBM Corporation                                *
*                                                                         *
\**************************************************************************/

#ifndef __BSEDEV__
#define __BSEDEV__

#ifdef __IBMC__
#pragma checkout( suspend )
   #ifndef __CHKHDR__
      #pragma checkout( suspend )
   #endif
#pragma checkout( resume )
#endif

#define BSEDEV_INCLUDED

/* Input and Output Control Categories */

#define IOCTL_ASYNC                        0x0001
#define IOCTL_SCR_AND_PTRDRAW              0x0003
#define IOCTL_KEYBOARD                     0x0004
#define IOCTL_PRINTER                      0x0005
#define IOCTL_LIGHTPEN                     0x0006
#define IOCTL_POINTINGDEVICE               0x0007
#define IOCTL_DISK                         0x0008
#define IOCTL_PHYSICALDISK                 0x0009
#define IOCTL_MONITOR                      0x000A
#define IOCTL_GENERAL                      0x000B

/* Serial-Device Control */

#define ASYNC_SETBAUDRATE                  0x0041
#define ASYNC_SETLINECTRL                  0x0042
#define ASYNC_TRANSMITIMM                  0x0044
#define ASYNC_SETBREAKOFF                  0x0045
#define ASYNC_SETMODEMCTRL                 0x0046
#define ASYNC_SETBREAKON                   0x004B
#define ASYNC_STOPTRANSMIT                 0x0047
#define ASYNC_STARTTRANSMIT                0x0048
#define ASYNC_SETDCBINFO                   0x0053
#define ASYNC_GETBAUDRATE                  0x0061
#define ASYNC_GETLINECTRL                  0x0062
#define ASYNC_GETCOMMSTATUS                0x0064
#define ASYNC_GETLINESTATUS                0x0065
#define ASYNC_GETMODEMOUTPUT               0x0066
#define ASYNC_GETMODEMINPUT                0x0067
#define ASYNC_GETINQUECOUNT                0x0068
#define ASYNC_GETOUTQUECOUNT               0x0069
#define ASYNC_GETCOMMERROR                 0x006D
#define ASYNC_GETCOMMEVENT                 0x0072
#define ASYNC_GETDCBINFO                   0x0073

/* Screen/Pointer-Draw Control */

#define SCR_ALLOCLDT                       0x0070
#define SCR_DEALLOCLDT                     0x0071
#define PTR_GETPTRDRAWADDRESS              0x0072
#define SCR_ALLOCLDTOFF                    0x0075

/* Keyboard Control */

#define KBD_SETTRANSTABLE                  0x0050
#define KBD_SETINPUTMODE                   0x0051
#define KBD_SETINTERIMFLAG                 0x0052
#define KBD_SETSHIFTSTATE                  0x0053
#define KBD_SETTYPAMATICRATE               0x0054
#define KBD_SETFGNDSCREENGRP               0x0055
#define KBD_SETSESMGRHOTKEY                0x0056
#define KBD_SETFOCUS                       0x0057
#define KBD_SETKCB                         0x0058
#define KBD_SETNLS                         0x005C
#define KBD_CREATE                         0x005D
#define KBD_DESTROY                        0x005E
#define KBD_GETINPUTMODE                   0x0071
#define KBD_GETINTERIMFLAG                 0x0072
#define KBD_GETSHIFTSTATE                  0x0073
#define KBD_READCHAR                       0x0074
#define KBD_PEEKCHAR                       0x0075
#define KBD_GETSESMGRHOTKEY                0x0076
#define KBD_GETKEYBDTYPE                   0x0077
#define KBD_GETCODEPAGEID                  0x0078
#define KBD_XLATESCAN                      0x0079

/* Printer Control */

#define PRT_QUERYJOBHANDLE                 0x0021
#define PRT_SETFRAMECTL                    0x0042
#define PRT_SETINFINITERETRY               0x0044
#define PRT_INITPRINTER                    0x0046
#define PRT_ACTIVATEFONT                   0x0048
#define PRT_GETFRAMECTL                    0x0062
#define PRT_GETINFINITERETRY               0x0064
#define PRT_GETPRINTERSTATUS               0x0066
#define PRT_QUERYACTIVEFONT                0x0069
#define PRT_VERIFYFONT                     0x006A

/* Pointing-Device (Mouse) Control */

#define MOU_ALLOWPTRDRAW                   0x0050
#define MOU_UPDATEDISPLAYMODE              0x0051
#define MOU_SCREENSWITCH                   0x0052
#define MOU_SETSCALEFACTORS                0x0053
#define MOU_SETEVENTMASK                   0x0054
#define MOU_SETHOTKEYBUTTON                0x0055
#define MOU_SETPTRSHAPE                    0x0056
#define MOU_DRAWPTR                        0x0057
#define MOU_REMOVEPTR                      0x0058
#define MOU_SETPTRPOS                      0x0059
#define MOU_SETPROTDRAWADDRESS             0x005A
#define MOU_SETREALDRAWADDRESS             0x005B
#define MOU_SETMOUSTATUS                   0x005C
#define MOU_DISPLAYMODECHANGE              0x005D
#define MOU_GETBUTTONCOUNT                 0x0060
#define MOU_GETMICKEYCOUNT                 0x0061
#define MOU_GETMOUSTATUS                   0x0062
#define MOU_READEVENTQUE                   0x0063
#define MOU_GETQUESTATUS                   0x0064
#define MOU_GETEVENTMASK                   0x0065
#define MOU_GETSCALEFACTORS                0x0066
#define MOU_GETPTRPOS                      0x0067
#define MOU_GETPTRSHAPE                    0x0068
#define MOU_GETHOTKEYBUTTON                0x0069
#define MOU_VER                            0x006A

/* Disk/Diskette Control */

#define DSK_LOCKDRIVE                      0x0000
#define DSK_UNLOCKDRIVE                    0x0001
#define DSK_REDETERMINEMEDIA               0x0002
#define DSK_SETLOGICALMAP                  0x0003
#define DSK_BLOCKREMOVABLE                 0x0020
#define DSK_GETLOGICALMAP                  0x0021
#define DSK_SETDEVICEPARAMS                0x0043
#define DSK_WRITETRACK                     0x0044
#define DSK_FORMATVERIFY                   0x0045
#define DSK_GETDEVICEPARAMS                0x0063
#define DSK_READTRACK                      0x0064
#define DSK_VERIFYTRACK                    0x0065

/* Physical-Disk Control */

#define PDSK_LOCKPHYSDRIVE                 0x0000
#define PDSK_UNLOCKPHYSDRIVE               0x0001
#define PDSK_WRITEPHYSTRACK                0x0044
#define PDSK_GETPHYSDEVICEPARAMS           0x0063
#define PDSK_READPHYSTRACK                 0x0064
#define PDSK_VERIFYPHYSTRACK               0x0065

/* Character-Monitor Control */
#define MON_REGISTERMONITOR                0x0040

/* General Device Control */
#define DEV_FLUSHINPUT                     0x0001
#define DEV_FLUSHOUTPUT                    0x0002
#define DEV_QUERYMONSUPPORT                0x0060


/* ASYNC_GETCOMMERROR, ASYNC_SETBREAKOFF, ASYNC_SETBREAKON,
 * ASYNC_SETMODEMCTRL
 */

#define RX_QUE_OVERRUN                     0x0001
#define RX_HARDWARE_OVERRUN                0x0002
#define PARITY_ERROR                       0x0004
#define FRAMING_ERROR                      0x0008

/* ASYNC_GETCOMMEVENT */
#define CHAR_RECEIVED                      0x0001
#define LAST_CHAR_SENT                     0x0004
#define CTS_CHANGED                        0x0008
#define DSR_CHANGED                        0x0010
#define DCD_CHANGED                        0x0020
#define BREAK_DETECTED                     0x0040
#define ERROR_OCCURRED                     0x0080
#define RI_DETECTED                        0x0100

/* ASYNC_GETCOMMSTATUS */
#define TX_WAITING_FOR_CTS                 0x0001
#define TX_WAITING_FOR_DSR                 0x0002
#define TX_WAITING_FOR_DCD                 0x0004
#define TX_WAITING_FOR_XON                 0x0008
#define TX_WAITING_TO_SEND_XON             0x0010
#define TX_WAITING_WHILE_BREAK_ON          0x0020
#define TX_WAITING_TO_SEND_IMM             0x0040
#define RX_WAITING_FOR_DSR                 0x0080

/* ASYNC_GETLINESTATUS */
#define WRITE_REQUEST_QUEUED               0x0001
#define DATA_IN_TX_QUE                     0x0002
#define HARDWARE_TRANSMITTING              0x0004
#define CHAR_READY_TO_SEND_IMM             0x0008
#define WAITING_TO_SEND_XON                0x0010
#define WAITING_TO_SEND_XOFF               0x0020

/* ASYNC_GETMODEMINPUT */
#define CTS_ON                             0x10
#define DSR_ON                             0x20
#define RI_ON                              0x40
#define DCD_ON                             0x80

/* DSK_SETDEVICEPARAMS */
#define BUILD_BPB_FROM_MEDIUM              0x00
#define REPLACE_BPB_FOR_DEVICE             0x01
#define REPLACE_BPB_FOR_MEDIUM             0x02

/* KBD_GETINPUTMODE, KBD_PEEKCHAR, KBD_SETINPUTMODE*/
#define ASCII_MODE                         0x00
#define BINARY_MODE                        0x80

/* KBD_GETINTERIMFLAG */
#define CONVERSION_REQUEST                 0x20
#define INTERIM_CHAR                       0x80

/* KBD_GETSESMGRHOTKEY */
#define HOTKEY_MAX_COUNT                   0x0000
#define HOTKEY_CURRENT_COUNT               0x0001

/* KBD_PEEKCHAR */
#define KBD_DATA_RECEIVED                  0x0001
#define KBD_DATA_BINARY                    0x8000

/* KBD_READCHAR */
#define KBD_READ_WAIT                      0x0000
#define KBD_READ_NOWAIT                    0x8000

/* KBD_SETINPUTMODE */
#define SHIFT_REPORT_MODE                  0x01

#ifndef INCL_MOU

   #define MOUSE_MOTION                    0x0001
   #define MOUSE_MOTION_WITH_BN1_DOWN      0x0002
   #define MOUSE_BN1_DOWN                  0x0004
   #define MOUSE_MOTION_WITH_BN2_DOWN      0x0008
   #define MOUSE_BN2_DOWN                  0x0010
   #define MOUSE_MOTION_WITH_BN3_DOWN      0x0020
   #define MOUSE_BN3_DOWN                  0x0040

   #define MHK_BUTTON1                     0x0001
   #define MHK_BUTTON2                     0x0002
   #define MHK_BUTTON3                     0x0004

   #define MOU_NOWAIT                      0x0000
   #define MOU_WAIT                        0x0001

#endif /* #ifndef INCL_MOU */

/* MOU_GETHOTKEYBUTTON, MOU_SETHOTKEYBUTTON */
#define MHK_NO_HOTKEY                      0x0000

/* MOU_GETMOUSTATUS */
#define MOUSE_QUEUEBUSY                    0x0001
#define MOUSE_BLOCKREAD                    0x0002
#define MOUSE_FLUSH                        0x0004
#define MOUSE_UNSUPPORTED_MODE             0x0008
#define MOUSE_DISABLED                     0x0100
#define MOUSE_MICKEYS                      0x0200

/* PRT_GETPRINTERSTATUS */
#define PRINTER_TIMEOUT                    0x0001
#define PRINTER_IO_ERROR                   0x0008
#define PRINTER_SELECTED                   0x0010
#define PRINTER_OUT_OF_PAPER               0x0020
#define PRINTER_ACKNOWLEDGED               0x0040
#define PRINTER_NOT_BUSY                   0x0080

/* fbCtlHndShake */
#define MODE_DTR_CONTROL                   0x01
#define MODE_DTR_HANDSHAKE                 0x02
#define MODE_CTS_HANDSHAKE                 0x08
#define MODE_DSR_HANDSHAKE                 0x10
#define MODE_DCD_HANDSHAKE                 0x20
#define MODE_DSR_SENSITIVITY               0x40

/* fbFlowReplace */
#define MODE_AUTO_TRANSMIT                 0x01
#define MODE_AUTO_RECEIVE                  0x02
#define MODE_ERROR_CHAR                    0x04
#define MODE_NULL_STRIPPING                0x08
#define MODE_BREAK_CHAR                    0x10
#define MODE_RTS_CONTROL                   0x40
#define MODE_RTS_HANDSHAKE                 0x80
#define MODE_TRANSMIT_TOGGLE               0xC0

/* fbTimeout */
#define MODE_NO_WRITE_TIMEOUT              0x01
#define MODE_READ_TIMEOUT                  0x02
#define MODE_WAIT_READ_TIMEOUT             0x04
#define MODE_NOWAIT_READ_TIMEOUT           0x06

typedef struct _DCBINFO         /* dcbinf */
        {
        USHORT usWriteTimeout;
        USHORT usReadTimeout;
        BYTE   fbCtlHndShake;
        BYTE   fbFlowReplace;
        BYTE   fbTimeout;
        BYTE   bErrorReplacementChar;
        BYTE   bBreakReplacementChar;
        BYTE   bXONChar;
        BYTE   bXOFFChar;
        } DCBINFO, *PDCBINFO;

#pragma pack(1)

typedef struct _TRACKLAYOUT     /* trckl */
        {
        BYTE   bCommand;
        USHORT usHead;
        USHORT usCylinder;
        USHORT usFirstSector;
        USHORT cSectors;
        struct {
               USHORT usSectorNumber;
               USHORT usSectorSize;
               } TrackTable[1];
        } TRACKLAYOUT, *PTRACKLAYOUT;


#define DEVTYPE_48TPI                      0x0000
#define DEVTYPE_96TPI                      0x0001
#define DEVTYPE_35                         0x0002
#define DEVTYPE_8SD                        0x0003
#define DEVTYPE_8DD                        0x0004
#define DEVTYPE_FIXED                      0x0005
#define DEVTYPE_TAPE                       0x0006
#define DEVTYPE_UNKNOWN                    0x0007


#pragma pack(1)

typedef struct _BIOSPARAMETERBLOCK      /* bspblk */
        {
        USHORT usBytesPerSector;
        BYTE   bSectorsPerCluster;
        USHORT usReservedSectors;
        BYTE   cFATs;
        USHORT cRootEntries;
        USHORT cSectors;
        BYTE   bMedia;
        USHORT usSectorsPerFAT;
        USHORT usSectorsPerTrack;
        USHORT cHeads;
        ULONG  cHiddenSectors;
        ULONG  cLargeSectors;
        BYTE   abReserved[6];
        USHORT cCylinders;
        BYTE   bDeviceType;
        USHORT fsDeviceAttr;
        } BIOSPARAMETERBLOCK;
typedef BIOSPARAMETERBLOCK *PBIOSPARAMETERBLOCK;

typedef struct _SCREENGROUP     /* scrgrp */
        {
        USHORT idScreenGrp;
        USHORT fTerminate;
        } SCREENGROUP;
typedef  SCREENGROUP *PSCREENGROUP;

typedef struct _FRAME           /* frm */
        {
        BYTE bCharsPerLine;
        BYTE bLinesPerInch;
        } FRAME;
typedef FRAME *PFRAME;

typedef struct _KBDTYPE         /* kbdtyp */
        {
        USHORT usType;
        USHORT reserved1;
        USHORT reserved2;
        } KBDTYPE;
typedef KBDTYPE *PKBDTYPE;

typedef struct _LINECONTROL     /* lnctl */
        {
        BYTE bDataBits;
        BYTE bParity;
        BYTE bStopBits;
        BYTE fTransBreak;
        } LINECONTROL;
typedef LINECONTROL *PLINECONTROL;

/* MODEMSTATUS.fbModemOn, ASYNC_GETMODEMOUTPUT */
#define DTR_ON                             0x01
#define RTS_ON                             0x02

/* MODEMSTATUS.fbModemOff */
#define DTR_OFF                            0xFE
#define RTS_OFF                            0xFD

typedef struct _MODEMSTATUS     /* mdmst */
        {
        BYTE fbModemOn;
        BYTE fbModemOff;
        } MODEMSTATUS;
typedef MODEMSTATUS *PMODEMSTATUS;

#pragma pack(1)

typedef struct _TRACKFORMAT     /* trckfmt */
        {
        BYTE bCommand;
        USHORT usHead;
        USHORT usCylinder;
        USHORT usReserved;
        USHORT cSectors;
        struct {
               BYTE bCylinder;
               BYTE bHead;
               BYTE idSector;
               BYTE bBytesSector;
               } FormatTable[1];
        } TRACKFORMAT;

typedef TRACKFORMAT *PTRACKFORMAT;

typedef struct _RXQUEUE         /* rxq */
        {
        USHORT cch;
        USHORT cb;
        } RXQUEUE;
typedef RXQUEUE *PRXQUEUE;

typedef struct _DEVICEPARAMETERBLOCK    /* dvpblck */
        {
        USHORT reserved1;
        USHORT cCylinders;
        USHORT cHeads;
        USHORT cSectorsPerTrack;
        USHORT reserved2;
        USHORT reserved3;
        USHORT reserved4;
        USHORT reserved5;
        } DEVICEPARAMETERBLOCK;

typedef DEVICEPARAMETERBLOCK     *PDEVICEPARAMETERBLOCK;

/* The following must be packed on 2 bytes boundary */
#pragma pack(2)

typedef struct _PTRDRAWFUNCTION         /* ptrdfnc */
        {
        USHORT usReturnCode;
        PFN pfnDraw;
        PCH pchDataSeg;
        } PTRDRAWFUNCTION;

typedef PTRDRAWFUNCTION *PPTRDRAWFUNCTION;

typedef struct _PTRDRAWADDRESS          /* ptrdaddr */
        {
        USHORT reserved;
        PTRDRAWFUNCTION ptrdfnc;
        } PTRDRAWADDRESS;

typedef PTRDRAWADDRESS  *PPTRDRAWADDRESS;

typedef struct _SHIFTSTATE      /* shftst */
        {
        USHORT fsState;
        BYTE   fNLS;
        } SHIFTSTATE;

typedef SHIFTSTATE  *PSHIFTSTATE;



/* HOTKEY.fsHotKey/SHIFTSTATE.fsState */
#define RIGHTSHIFT                         0x0001
#define LEFTSHIFT                          0x0002
#define CONTROL                            0x0004
#define ALT                                0x0008
#define SCROLLLOCK_ON                      0x0010
#define NUMLOCK_ON                         0x0020
#define CAPSLOCK_ON                        0x0040
#define INSERT_ON                          0x0080
#define LEFTCONTROL                        0x0100
#define LEFTALT                            0x0200
#define RIGHTCONTROL                       0x0400
#define RIGHTALT                           0x0800
#define SCROLLLOCK                         0x1000
#define NUMLOCK                            0x2000
#define CAPSLOCK                           0x4000
#define SYSREQ                             0x8000

typedef struct _HOTKEY          /* htky */
        {
        USHORT fsHotKey;
        UCHAR  uchScancodeMake;
        UCHAR  uchScancodeBreak;
        USHORT idHotKey;
        } HOTKEY;

typedef HOTKEY *PHOTKEY;

typedef struct _MONITORPOSITION         /* mnpos */
        {
        USHORT fPosition;
        USHORT index;
        ULONG  pbInBuf;
        USHORT offOutBuf;
        } MONITORPOSITION;

typedef MONITORPOSITION  *PMONITORPOSITION;

typedef struct _RATEDELAY       /* rtdly */
        {
        USHORT usDelay;
        USHORT usRate;
        } RATEDELAY;
typedef RATEDELAY  *PRATEDELAY;

typedef struct _CODEPAGEINFO    /* cpi */
        {
        PBYTE pbTransTable;
        USHORT idCodePage;
        USHORT idTable;
        } CODEPAGEINFO;
typedef *PCODEPAGEINFO;

typedef struct _CPID    /* cpid */
        {
        USHORT idCodePage;
        USHORT Reserved;
        } CPID;
typedef CPID *PCPID;

typedef struct _LDTADDRINFO     /* ldtaddr */
        {
        PULONG pulPhysAddr;
        USHORT cb;
        } LDTADDRINFO;

typedef LDTADDRINFO *PLDTADDRINFO;

typedef struct _PTRDRAWDATA     /* ptrdd */
        {
        USHORT cb;
        USHORT usConfig;
        USHORT usFlag;
        } PTRDRAWDATA;
#pragma pack()                           /*restore default packing */

typedef PTRDRAWDATA *PPTRDRAWDATA;

#ifdef __IBMC__
#pragma checkout( suspend )
   #ifndef __CHKHDR__
      #pragma checkout( resume )
   #endif
#pragma checkout( resume )
#endif

#endif /* __BSEDEV__ */
