Category : Files from Magazines
Archive   : BYTE0791.ZIP
Filename : DRVLIB.H

 
Output of file : DRVLIB.H contained in archive : BYTE0791.ZIP
/* file drvlib.h
This header file contains definitions intended to go along with
DRVLIB.LIB, a C-callable subroutine library.

*/
typedef unsigned char UCHAR;
typedef unsigned short USHORT;
typedef unsigned short BOOLEAN;
typedef unsigned long ULONG;
typedef UCHAR near *PUCHAR;
typedef UCHAR far *FPUCHAR;
typedef USHORT near *PUSHORT;
typedef ULONG near *PULONG;
typedef char near *PCHAR;
typedef short near *PSHORT;
typedef long near *PLONG;
typedef void near *POINTER;
typedef POINTER near *PPOINTER;
typedef void far *FARPOINTER;
typedef FARPOINTER near *PFARPOINTER;
typedef FARPOINTER far *FPFARPOINTER;

typedef USHORT ERRCODE; /* error code returned */
typedef ERRCODE far *PERRCODE; /* pointer to an error code */
typedef UCHAR FLAG; /* 8-bit flag */
typedef FLAG far *PFLAG; /* pointer to 8-bit flag */
typedef USHORT SEL; /* 16-bit selector */
typedef SEL near *PSEL; /* pointer to a selector */
typedef USHORT SEG; /* 16-bit segment */
typedef USHORT OFF; /* 16-bit offset */
typedef USHORT PID; /* Process ID */
typedef USHORT TID; /* Task ID */
typedef ULONG PHYSADDR; /* 32-bit physical address */
typedef PHYSADDR far *PPHYSADDR; /* pointer to 32-bit physical address */
typedef char near *PSTRING; /* pointer to character string */
typedef USHORT SHANDLE; /* short (16-bit) handle */
typedef SHANDLE far *PSHANDLE; /* pointer to a short handle */
typedef ULONG LHANDLE; /* long (32-bit) handle */
typedef LHANDLE far *PLHANDLE; /* pointer to a long handle */


/* pointers to functions */

typedef int (pascal near *PFUNCTION) ();
typedef int (pascal near * near *PPFUNCTION) ();
typedef int (pascal far *FPFUNCTION) ();
typedef int (pascal far * near *PFPFUNCTION) ();

/* macros */

#define FALSE 0
#define TRUE 1

#define NP near pascal

/* far pointer from selector-offset */

#define MAKEP(sel, off) ( (void far *) MAKEULONG(off, sel) )

/* get selector or offset from far pointer */

#define SELECTOROF(p) ( ((USHORT far *) &(p)) [1])
#define OFFSETOF(p) ( ((USHORT far *) &(p)) [0])

/* cast any variable to an instance of the specified type. */

#define MAKETYPE(v, type) (*((type far *)&v))

/* calc. the byte offset of a field in a structure of type type */

#define FIELDOFFSET(type, field) ((SHORT)&(((type *)0)->field))

/* Combine l(ow) & h(igh) to form a 32 bit quantity. */

#define MAKEULONG(l, h) ((ULONG)(((USHORT)(l)) | ((ULONG)((USHORT)(h))) << 16))
#define MAKELONG(l, h) ((LONG)MAKEULONG(l, h))

/* Combine l(ow) & h(igh) to form a 16 bit quantity. */

#define MAKEUSHORT(l, h) (((USHORT)(l)) | ((USHORT)(h)) << 8)
#define MAKESHORT(l, h) ((SHORT)MAKEUSHORT(l, h))

/* get high and low order parts of a 16 and 32 bit quantity */

#define LOBYTE(w) LOUCHAR(w)
#define HIBYTE(w) HIUCHAR(w)
#define LOUCHAR(w) ((UCHAR)(w))
#define HIUCHAR(w) (((USHORT)(w) >> 8) & 0xff)
#define LOUSHORT(l) ((USHORT)(l))
#define HIUSHORT(l) ((USHORT)(((ULONG)(l) >> 16) & 0xffff))

/* the driver device header */

typedef struct DeviceHdr {
struct DeviceHdr far *DHnext; /* pointer to next header, or FFFF */
USHORT DHattribute; /* device attribute word */
OFF DHstrategy; /* offset of strategy routine */
OFF DHidc; /* offset of IDC routine */
UCHAR DHname[8]; /* dev name (char) or #units (blk) */
char reserved[8];
} DEVICEHDR;
typedef DEVICEHDR near *PDEVICEHDR;

/* driver device attributes word */

#define DAW_CHR 0x8000 /* 1=char, 0=block */
#define DAW_IDC 0x4000 /* 1=IDC available in this DD */
#define DAW_IBM 0x2000 /* 1=non-IBM block format */
#define DAW_SHR 0x1000 /* 1=supports shared device access */
#define DAW_OPN 0x0800 /* 1=open/close, or removable media */
#define DAW_LEVEL 0x0080 /* level; should be 001 for OS/2 */
#define DAW_GIO 0x0040 /* 1=generic IOCtl supported */
#define DAW_CLK 0x0008 /* 1=CLOCK device */
#define DAW_NUL 0x0004 /* 1=NUL device */
#define DAW_SCR 0x0002 /* 1=STDOUT (screen) */
#define DAW_KBD 0x0001 /* 1=STDIN (keyboard) */

/* OS/2 circular character queues */

#define QUEUE_SIZE 512 /* size of queues */
typedef struct CharQueue {
USHORT qsize; /* number of bytes in queue */
USHORT qchrout; /* index of next char to put out */
USHORT qcount; /* number of charactes in queue */
UCHAR qbuf[QUEUE_SIZE];
} CHARQUEUE;
typedef CHARQUEUE near *PCHARQUEUE;

/* AttachDD inter device driver communication data area */

typedef struct AttachArea {
OFF realOFF; /* real-mode offset of idc entry point */
SEG realCS; /* real-mode CS of IDC entry point */
SEG realDS; /* real-mode DS of IDC DD */
OFF protOFF; /* protect-mode offset of entry point */
SEL protCS; /* protect-mode CS of entry point */
SEL protDS; /* protect-mode DS of other DD */
} ATTACHAREA;
typedef ATTACHAREA near *PATTACHAREA;

/* driver request packet */

typedef struct ReqPacket {
UCHAR RPlength; /* request packet length */
UCHAR RPunit; /* unit code for block DD only */
UCHAR RPcommand; /* command code */
USHORT RPstatus; /* status word */
UCHAR RPreserved[4]; /* reserved bytes */
ULONG RPqlink; /* queue linkage */
union { /* command-specific data */
UCHAR avail[19]; /* available space, in 32-byte packet */
struct { /* INIT Packet (one entry, one exit) */
UCHAR units; /* number of units */
FPFUNCTION DevHlp; /* &DevHlp */
char far *args; /* &args */
UCHAR drive; /* drive # */
}Init; /* available: 9 bytes */
struct {
UCHAR units; /* same as input */
OFF finalCS; /* final code offset */
OFF finalDS; /* final data offset */
FARPOINTER BPBarray; /* &BPB */
} InitExit;

struct { /* READ, WRITE, WRITE_VERIFY */
UCHAR media; /* media descriptor */
PHYSADDR buffer; /* transfer address */
USHORT count; /* bytes/sectors */
ULONG startsector; /* starting sector# */
USHORT reserved;
} ReadWrite; /* available: 6 bytes */

struct { /* IOCTL */
UCHAR category; /* category code */
UCHAR function; /* function code */
FARPOINTER parameters; /* ¶meters */
FARPOINTER buffer; /* &buffer */
} IOCtl; /* available: 9 bytes */

struct { /* READ_NO_WAIT */
UCHAR char_returned; /* char to return */
} ReadNoWait; /* available: 18 bytes */

struct { /* MEDIA_CHECK */
UCHAR media; /* media descriptor */
UCHAR return_code; /* see #defines */
FARPOINTER prev_volume; /* &previous volume ID */
} MediaCheck; /* available: 13 bytes */

struct { /* BUILD_BPB */
UCHAR media; /* media descriptor */
FARPOINTER buffer; /* 1-sector buffer FAT */
FARPOINTER BPBarray; /* &BPB array */
UCHAR drive; /* drive # */
} BuildBPB; /* available: 9 bytes */

struct { /* query PARTITIONABLE fixed disks */
UCHAR count; /* 1-based # disks */
ULONG reserved;
} Partitionable; /* available: 14 bytes */

struct { /* Get Fixed Disk/Logical Unit Map */
ULONG units; /* units supported */
ULONG reserved;
} GetFixedMap; /* available: 11 bytes */
} s; /* command-Specific information */
} REQPACKET;

typedef REQPACKET far *PREQPACKET;
typedef PREQPACKET far *PPREQPACKET;
typedef PREQPACKET QHEAD; /* Queue Head is &ReqPacket */
typedef QHEAD near *PQHEAD;

/***************************************************************************
* Global and Local Info Segment Definitions *
***************************************************************************/

/* Global Info Seg */

typedef struct _GINFOSEG {
ULONG time;
ULONG msecs;
UCHAR hour;
UCHAR minutes;
UCHAR seconds;
UCHAR hundredths;
USHORT timezone;
USHORT cusecTimerInterval;
UCHAR day;
UCHAR month;
USHORT year;
UCHAR weekday;
UCHAR uchMajorVersion;
UCHAR uchMinorVersion;
UCHAR chRevisionLetter;
UCHAR sgCurrent;
UCHAR sgMax;
UCHAR cHugeShift;
UCHAR fProtectModeOnly;
USHORT pidForeground;
UCHAR fDynamicSched;
UCHAR csecMaxWait;
USHORT cmsecMinSlice;
USHORT cmsecMaxSlice;
USHORT bootdrive;
UCHAR amecRAS[32];
UCHAR csgWindowableVioMax;
UCHAR csgPMMax;
} GINFOSEG;
typedef GINFOSEG far *PGINFOSEG;

/* local info seg */

typedef struct _LINFOSEG {
PID pidCurrent;
PID pidParent;
USHORT prtyCurrent;
TID tidCurrent;
USHORT sgCurrent;
UCHAR rfProcStatus;
UCHAR dummy1;
USHORT fForeground;
UCHAR typeProcess;
UCHAR dummy2;
SEL selEnvironment;
USHORT offCmdLine;
USHORT cbDataSegment;
USHORT cbStack;
USHORT cbHeap;
USHORT hmod;
SEL selDS;
} LINFOSEG;
typedef LINFOSEG far *PLINFOSEG;

/* mainifest constants */

/* RPstatus bit values */

#define RPERR 0x8000 /* error occurred, err in RPstatus */
#define RPDEV 0x4000 /* error code defined by driver */
#define RPBUSY 0x0200 /* device is busy */
#define RPDONE 0x0100 /* driver done with request packet */

/* error codes returned in RPstatus */

#define ERROR_WRITE_PROTECT 0x0000
#define ERROR_BAD_UNIT 0x0001
#define ERROR_NOT_READY 0x0002
#define ERROR_BAD_COMMAND 0x0003
#define ERROR_CRC 0x0004
#define ERROR_BAD_LENGTH 0x0005
#define ERROR_SEEK 0x0006
#define ERROR_NOT_DOS_DISK 0x0007
#define ERROR_SECTOR_NOT_FOUND 0x0008
#define ERROR_OUT_OF_PAPER 0x0009
#define ERROR_WRITE_FAULT 0x000A
#define ERROR_READ_FAULT 0x000B
#define ERROR_GEN_FAILURE 0x000C
#define ERROR_DISK_CHANGE 0x000D
#define ERROR_WRONG_DISK 0x000F
#define ERROR_UNCERTAIN_MEDIA 0x0010
#define ERROR_CHAR_CALL_INTERRUPTED 0x0011
#define ERROR_NO_MONITOR_SUPPORT 0x0012
#define ERROR_INVALID_PARAMETER 0x0013

/* driver request codes B=block, C=character */

#define RPINIT 0x00 /* BC */
#define RPMEDIA_CHECK 0x01 /* B */
#define RPBUILD_BPB 0x02 /* B */
#define RPREAD 0x04 /* BC */
#define RPREAD_NO_WAIT 0x05 /* C */
#define RPINPUT_STATUS 0x06 /* C */
#define RPINPUT_FLUSH 0x07 /* C */
#define RPWRITE 0x08 /* BC */
#define RPWRITE_VERIFY 0x09 /* BC */
#define RPOUTPUT_STATUS 0x0a /* C */
#define RPOUTPUT_FLUSH 0x0b /* C */
#define RPOPEN 0x0d /* BC */
#define RPCLOSE 0x0e /* BC */
#define RPREMOVABLE 0x0f /* B */
#define RPIOCTL 0x10 /* BC */
#define RPRESET 0x11 /* B */
#define RPGET_DRIVE_MAP 0x12 /* B */
#define RPSET_DRIVE_MAP 0x13 /* B */
#define RPDEINSTALL 0x14 /* C */
#define RPPARTITIONABLE 0x16 /* B */
#define RPGET_FIXED_MAP 0x17 /* B */

/* media descriptor byte */

#define MDB_REMOVABLE 0x04 /* 1=removable */
#define MDB_EIGHT_SECTORS 0x02 /* 1=8 sectors per track */
#define MDB_DOUBLE_SIDED 0x01 /* 1=double-sided media */

/* return codes from MediaCheck */

#define MC_MEDIA_UNCHANGED 0x01
#define MC_MEDIA_CHANGED 0xFF
#define MC_MEDIA_UNSURE 0x01

/* event numbers for SendEvent */

#define EVENT_SM_MOUSE 0x00 /* session switch via mouse */
#define EVENT_CTRLBRK 0x01 /* control break */
#define EVENT_CTRLC 0x02 /* control C */
#define EVENT_CTRLNUMLK 0x03 /* control num lock */
#define EVENT_CTRLPRTSC 0x04 /* control printscreen */
#define EVENT_SHFTPRTSC 0x05 /* shift printscreen */
#define EVENT_SM_KBD 0x06 /* session switch hot key */

/* codes for the MoveData routine */

#define MOVE_PHYSTOPHYS 0 /* move bytes from phys to phys memory */
#define MOVE_PHYSTOVIRT 1 /* move bytes from phys to virt memory */
#define MOVE_VIRTTOPHYS 2 /* move bytes from virt to phys memory */
#define MOVE_VIRTTOVIRT 3 /* move bytes from virt to virt memory */

/* routine prototypes */

/* Micro Channel (tm) specific */

int NP GetLIDEntry (USHORT, USHORT, USHORT, FARPOINTER);
int NP FreeLIDEntry (USHORT);
int NP ABIOSCall (USHORT, USHORT, FARPOINTER);
int NP ABIOSComm (USHORT, FARPOINTER);

/* special routines */

void NP INT3 (void);
void NP Enable (void);
void NP Disable (void);
int NP MSW (void);
void NP Crash (void);
int NP SegLimit (SEL, OFF far *);
int NP MoveData (FARPOINTER, FARPOINTER, USHORT, char);

/* system services and misc. */

int NP GetDOSVar (UCHAR, FPFARPOINTER);
int NP SendEvent (UCHAR, USHORT);
void NP SchedClockAddr (PFARPOINTER);
int NP AttachDD (PSTRING, PATTACHAREA);
int NP MSW (void);

/* process mgmt */

void NP Yield (void);
void NP TCYield (void);
int NP Block (ULONG, ULONG, FLAG, PERRCODE);
void NP Run (ULONG);
void NP DevDone (ULONG);

/* memory management */

int NP RealToProt (void);
int NP ProtToReal (void);
int NP AllocPhys (ULONG, FLAG, PPHYSADDR);
int NP FreePhys (PHYSADDR);
int NP VerifyAccess (SEL, OFF, USHORT, FLAG);
int NP LockSeg (SEL, FLAG, FLAG, PLHANDLE);
int NP UnLockSeg (LHANDLE);

/* address conversion */

int NP AllocGDTSelector(USHORT, FARPOINTER);
int NP PhysToGDTSelector(PHYSADDR, USHORT, SEL, PERRCODE);
int NP VirtToPhys (FARPOINTER, PPHYSADDR);
int NP PhysToUVirt (PHYSADDR, USHORT, FLAG, FPFARPOINTER);
int NP PhysToVirt (PHYSADDR, USHORT, FLAG, PFLAG);
int NP UnPhysToVirt (void);

/* request packet queue stuff */

int NP AllocReqPacket (FLAG, PPREQPACKET);
void NP FreeReqPacket (PREQPACKET);
void NP PushReqPacket (PQHEAD, PREQPACKET);
void NP SortReqPacket (PQHEAD, PREQPACKET);
int NP PullReqPacket (PQHEAD, PPREQPACKET);
int NP PullParticular (PQHEAD, PREQPACKET);

/* driver semaphores */

int NP SemHandle (LHANDLE, FLAG, PLHANDLE);
int NP SemRequest (LHANDLE, ULONG, PERRCODE);
void NP SemClear (LHANDLE);

/* circular character queues */

void NP QueueInit (PCHARQUEUE);
void NP QueueFlush (PCHARQUEUE);
int NP QueueWrite (PCHARQUEUE, UCHAR);
int NP QueueRead (PCHARQUEUE, FPUCHAR);

/* interrupt stuff */

int NP SetIRQ (UCHAR, PFUNCTION, FLAG);
int NP UnSetIRQ (UCHAR);
int NP EOI (UCHAR);

/* real (user) mode */

int NP SetROMVector (UCHAR, PFUNCTION, OFF, FPFARPOINTER);
void NP ROMCritSection (FLAG);

/* timer stuff */

int NP SetTimer (PFUNCTION);
int NP ResetTimer (PFUNCTION);
int NP TickCount (PFUNCTION, USHORT);

/* device monitors */

int NP MonCreate (PSHANDLE, FARPOINTER, FARPOINTER, PERRCODE);
int NP Register (SHANDLE, FLAG, PID, FARPOINTER, OFF, PERRCODE);
int NP MonWrite (SHANDLE, POINTER, USHORT, FLAG, PERRCODE);
int NP MonFlush (SHANDLE, PERRCODE);
int NP DeRegister (SHANDLE, PID, PERRCODE);

/* these are the only API's available to the driver at Init time */

#define APIENTRY far pascal

USHORT APIENTRY DosBeep(USHORT, USHORT);
USHORT APIENTRY DosCaseMap(USHORT, FARPOINTER, FARPOINTER);
USHORT APIENTRY DosChgFilePtr(SHANDLE, long, USHORT, FARPOINTER);
USHORT APIENTRY DosClose(SHANDLE);
USHORT APIENTRY DosDelete(FARPOINTER, ULONG);
USHORT APIENTRY DosDevConfig(FARPOINTER, USHORT, USHORT);
USHORT APIENTRY DosDevIOCtl(FARPOINTER, FARPOINTER, USHORT, USHORT, USHORT);
USHORT APIENTRY DosFindClose(SHANDLE);
USHORT APIENTRY DosFindFirst(FARPOINTER, FARPOINTER, USHORT, FARPOINTER,
USHORT, FARPOINTER, ULONG);
USHORT APIENTRY DosFindNext(SHANDLE, FARPOINTER, USHORT, FARPOINTER);
USHORT APIENTRY DosGetEnv(FARPOINTER, FARPOINTER);
USHORT APIENTRY DosGetMessage(FARPOINTER, USHORT, FARPOINTER, USHORT,
USHORT, FARPOINTER, FARPOINTER);
USHORT APIENTRY DosOpen(FARPOINTER, FARPOINTER, FARPOINTER, ULONG,
USHORT, USHORT, USHORT, ULONG);
USHORT APIENTRY DosPutMessage(SHANDLE, USHORT, FARPOINTER);
USHORT APIENTRY DosQCurDir(USHORT, FARPOINTER, FARPOINTER);
USHORT APIENTRY DosQCurDisk(FARPOINTER, FARPOINTER);
USHORT APIENTRY DosQFileInfo(SHANDLE, USHORT, FARPOINTER, USHORT);
USHORT APIENTRY DosQFileMode(FARPOINTER, FARPOINTER, ULONG);
USHORT APIENTRY DosRead(SHANDLE, FARPOINTER, USHORT, FARPOINTER);
USHORT APIENTRY DosWrite(SHANDLE, FARPOINTER, USHORT, FARPOINTER);

/* end of DRVLIB.H */


  3 Responses to “Category : Files from Magazines
Archive   : BYTE0791.ZIP
Filename : DRVLIB.H

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/