Writing OS/2 2.0 Device Drivers in C errata

The following is errata for Writing OS/2 2.0 Device Drivers in C as of 29 May, 1992.


 * Page 9, last paragraph, line 2, replace "Figure 3-2" with "Figure 2-3"


 * Page 16, first paragraph, replace entire paragraph with:

Processors are generally referred to by the size of the data which can be handled at any one given time. The 8088 is referred to as a 16-bit processor, although technically it can only handle 8 bits at a time (The 8088 performs 16-bit operations by transparently multiplexing two 8-bit operations). The 80286, for example, is called a 16-bit processor because it can handle data 16 bits at a time. The 80386 and 80486 are referred to as 32-bit processors because they can directly manipulate data 32 bits at a time."


 * Page 17, first paragraph, line 2, replace "eight-bit" with "16-bit"


 * Page 18, last paragraph, first sentence, replace "30" with "25".


 * Page 19, first paragraph, line 2, replace "25" with "33".


 * Page 19, last paragraph, third sentence which begins "The processor speed", delete entire sentence.


 * Page 49, last paragraph, second sentence, replace "Figure 5-3" with "Figure 5-5".


 * Page 308, Delete last paragraph, beginning with "Note", in its entirety.


 * Page 399, Listings, change "#define WRITE_POS_REG_CARD 0x0D" with "#define WRITE_POS_REG_CARD 0x0E"

Replace the listing for the standard driver include file in the LISTINGS section with the following listing:

 /* file drvlib.h    standard driver include file 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 */


 * 1) define FALSE  0
 * 2) define TRUE   1


 * 1) define NP near pascal

/* far pointer from selector-offset */


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

/* get selector or offset from far pointer */


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

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


 * 1) define MAKEULONG(l, h) ((ULONG)(((USHORT)(l)) | ((ULONG)((USHORT)(h))) << 16))
 * 2) define MAKELONG(l, h)  ((LONG)MAKEULONG(l, h))

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


 * 1) define MAKEUSHORT(l, h) (((USHORT)(l)) | ((USHORT)(h)) << 8)
 * 2) define MAKESHORT(l, h) ((SHORT)MAKEUSHORT(l, h))

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


 * 1) define LOBYTE(w)      LOUCHAR(w)
 * 2) define HIBYTE(w)      HIUCHAR(w)
 * 3) define LOUCHAR(w)     ((UCHAR)(w))
 * 4) define HIUCHAR(w)     (((USHORT)(w) >> 8) & 0xff)
 * 5) define LOUSHORT(l)    ((USHORT)(l))
 * 6) 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]; ULONG bit_strip;                /* bit 0 DevIOCtl2, bit 1 32 bit addr  */ } DEVICEHDR; typedef DEVICEHDR near *PDEVICEHDR;

/* driver device attributes word */


 * 1) define DAW_CHR   0x8000           /* 1=char, 0=block                     */
 * 2) define DAW_IDC   0x4000           /* 1=IDC available in this DD          */
 * 3) define DAW_IBM   0x2000           /* 1=non-IBM block format              */
 * 4) define DAW_SHR   0x1000           /* 1=supports shared device access     */
 * 5) define DAW_OPN   0x0800           /* 1=open/close, or removable media    */
 * 6) define DAW_LEVEL1 0x0080          /* level 1                             */
 * 7) define DAW_LEVEL2 0x0100          /* level 2 DosDevIOCtl2                */
 * 8) define DAW_LEVEL3 0x0180          /* level 3 bit strip                   */
 * 9) define DAW_GIO   0x0040           /* 1=generic IOCtl supported           */
 * 10) define DAW_CLK   0x0008           /* 1=CLOCK device                      */
 * 11) define DAW_NUL   0x0004           /* 1=NUL device                        */
 * 12) define DAW_SCR   0x0002           /* 1=STDOUT (screen)                   */
 * 13) define DAW_KBD   0x0001           /* 1=STDIN  (keyboard)                 */

/* capabilities bit strip */


 * 1) define CBS_SHD   0x0001           /* 1=shutdown/DevIOCtl2                */
 * 2) define CBS_HMEM  0x0002           /* hign memory map for adapters        */
 * 3) define CBS_PP    0x0004           /* supports parallel ports             */

/* DispMsg structure */

typedef struct MessageTable { USHORT     id; USHORT     fill_in_item; FARPOINTER item1; FARPOINTER item2; FARPOINTER item_last; } MESSAGETABLE;

/* OS/2 circular character 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;
 * 1) define QUEUE_SIZE 512             /*  size of queues                     */

/* 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]; struct {                       /* init                                */ UCHAR     units;             /* number of units                     */ FPFUNCTION DevHlp;           /* &DevHlp                             */ char far  *args;             /* &args                               */ UCHAR     drive;             /* drive #                             */ }Init; struct { UCHAR    units;              /* same as input                       */ OFF      finalCS;            /* final offset, 1st code segment      */ OFF      finalDS;            /* final offset, 1st data segment      */ FARPOINTER BPBarray;         /* &BPB                                */ } InitExit;

struct {                       /* read, write, write w/verify         */ UCHAR     media;             /* media descriptor                    */ PHYSADDR  buffer;            /* transfer address                    */ USHORT    count;             /* bytes/sectors                       */ ULONG     startsector;       /* starting sector#                    */ USHORT    reserved; } ReadWrite;

struct {                       /* cached read, write, write w/verify  */ UCHAR     media;             /* media descriptor                    */ PHYSADDR  buffer;            /* transfer address                    */ USHORT    count;             /* bytes/sectors                       */ ULONG     startsector;       /* starting sector#                    */ USHORT    reserved; } CReadWrite; struct {                       /* system shutdown                     */ UCHAR     subcode;           /* sub request code                    */ ULONG     reserved; } Shutdown;

struct {                       /* open/close                          */ USHORT    sysfilenum;        /* system file number                  */ } OpenClose;

struct {                       /* IOCtl                               */ UCHAR     category;          /* category code                       */ UCHAR     function;          /* function code                       */ FARPOINTER parameters;       /* &parameters                         */ FARPOINTER buffer;           /* &buffer                             */ } IOCtl;

struct {                       /* read, no wait                       */ UCHAR     char_returned;     /* char to return                      */ } ReadNoWait;

struct {                       /* media check                         */ UCHAR     media;             /* media descriptor                    */ UCHAR     return_code;       /* see #defines                        */ FARPOINTER prev_volume;      /* &previous volume ID                 */ } MediaCheck;

struct {                       /* build BPB                           */ UCHAR     media;             /* media descriptor                    */ FARPOINTER buffer;           /* 1-sector buffer FAT                 */ FARPOINTER BPBarray;         /* &BPB array                          */ UCHAR     drive;             /* drive #                             */ } BuildBPB; struct {                       /* query partitionalble fixed disks    */ UCHAR     count;             /* # disks                             */ ULONG     reserved; } Partitionable; struct {                       /* fixed disk LU map                   */ ULONG     units;             /* units supported                     */ ULONG     reserved; } GetFixedMap;

struct {                       /* get driver capabilities             */ UCHAR     reserved[3]; FARPOINTER capstruct;        /* 16:16 pointer to DCS                */ FARPOINTER volcharstruct;    /* 16:16 pointer to VCS                */ } GetDriverCaps; } s;                            /* command info                        */ } REQPACKET;

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

/* 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 */


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

/* error codes returned in RPstatus */


 * 1) define ERROR_WRITE_PROTECT        0x0000
 * 2) define ERROR_BAD_UNIT             0x0001
 * 3) define ERROR_NOT_READY            0x0002
 * 4) define ERROR_BAD_COMMAND          0x0003
 * 5) define ERROR_CRC                  0x0004
 * 6) define ERROR_BAD_LENGTH           0x0005
 * 7) define ERROR_SEEK                 0x0006
 * 8) define ERROR_NOT_DOS_DISK         0x0007
 * 9) define ERROR_SECTOR_NOT_FOUND     0x0008
 * 10) define ERROR_OUT_OF_PAPER         0x0009
 * 11) define ERROR_WRITE_FAULT          0x000A
 * 12) define ERROR_READ_FAULT           0x000B
 * 13) define ERROR_GEN_FAILURE          0x000C
 * 14) define ERROR_DISK_CHANGE          0x000D
 * 15) define ERROR_WRONG_DISK           0x000F
 * 16) define ERROR_UNCERTAIN_MEDIA      0x0010
 * 17) define ERROR_CHAR_CALL_INTERRUPTED 0x0011
 * 18) define ERROR_NO_MONITOR_SUPPORT   0x0012
 * 19) define ERROR_INVALID_PARAMETER    0x0013
 * 20) define ERROR_DEVICE_IN_USE        0x0014

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


 * 1) define RPINIT         0x00        /*  BC                                 */
 * 2) define RPMEDIA_CHECK  0x01        /*  B                                  */
 * 3) define RPBUILD_BPB    0x02        /*  B                                  */
 * 4) define RPREAD         0x04        /*  BC                                 */
 * 5) define RPREAD_NO_WAIT 0x05        /*   C                                 */
 * 6) define RPINPUT_STATUS 0x06        /*   C                                 */
 * 7) define RPINPUT_FLUSH  0x07        /*   C                                 */
 * 8) define RPWRITE        0x08        /*  BC                                 */
 * 9) define RPWRITE_VERIFY 0x09        /*  BC                                 */
 * 10) define RPOUTPUT_STATUS 0x0a       /*   C                                 */
 * 11) define RPOUTPUT_FLUSH 0x0b        /*   C                                 */
 * 12) define RPOPEN         0x0d        /*  BC                                 */
 * 13) define RPCLOSE        0x0e        /*  BC                                 */
 * 14) define RPREMOVABLE    0x0f        /*  B                                  */
 * 15) define RPIOCTL        0x10        /*  BC                                 */
 * 16) define RPRESET        0x11        /*  B                                  */
 * 17) define RPGET_DRIVE_MAP 0x12       /*  B                                  */
 * 18) define RPSET_DRIVE_MAP 0x13       /*  B                                  */
 * 19) define RPDEINSTALL    0x14        /*   C                                 */
 * 20) define RPPARTITIONABLE 0x16       /*  B                                  */
 * 21) define RPGET_FIXED_MAP 0x17       /*  B                                  */
 * 22) define RPSHUTDOWN     0x1c        /*  BC                                 */
 * 23) define RPGET_DRIVER_CAPS 0x1d     /*  B                                  */

/* check for monitor call in DosOpen/DosClose */


 * 1) define MON_OPEN_STATUS  0x08      /* open from DosMonOpen                */
 * 2) define MON_CLOSE_STATUS 0x08      /* close from DosMonClose              */

/* media descriptor byte */


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

/* return codes from MediaCheck */


 * 1) define MC_MEDIA_UNCHANGED 0x01
 * 2) define MC_MEDIA_CHANGED  0xFF
 * 3) define MC_MEDIA_UNSURE   0x01

/* event numbers for SendEvent */


 * 1) define EVENT_SM_MOUSE  0x00       /* session switch via mouse            */
 * 2) define EVENT_CTRLBRK   0x01       /* control break                       */
 * 3) define EVENT_CTRLC     0x02       /* control C                           */
 * 4) define EVENT_CTRLNUMLK 0x03       /* control num lock                    */
 * 5) define EVENT_CTRLPRTSC 0x04       /* control printscreen                 */
 * 6) define EVENT_SHFTPRTSC 0x05       /* shift printscreen                   */
 * 7) define EVENT_SM_KBD    0x06       /* session switch hot key              */

/* MCA 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); void NP Abort (void); int NP SegLimit (SEL, OFF far *); int NP MoveBytes (FARPOINTER,FARPOINTER,USHORT);

/* system services and misc. */

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

/* 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 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, USHORT, FARPOINTER); 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);

/* 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);

/* 2.0 specfic */

int NP RegisterPDD(FPUCHAR,FPFUNCTION); int NP RegisterBeep(FPFUNCTION); int NP Beep(USHORT,USHORT); int NP FreeGDTSelector(USHORT); int NP PhysToGDTSel(PHYSADDR,USHORT,USHORT,PERRCODE); int NP VMLock(PHYSADDR,ULONG,FARPOINTER,PLHANDLE,ULONG,PULONG); int NP VMUnlock(LHANDLE); int NP VMAlloc(PHYSADDR,ULONG,ULONG,PFARPOINTER); int NP VMFree(PHYSADDR); int NP VMProcessToGlobal(PHYSADDR,ULONG,ULONG,PFARPOINTER); int NP VMGlobalToProcess(PHYSADDR,ULONG,ULONG,FPFARPOINTER); int NP VirtToLin(SEL,ULONG,PFARPOINTER); int NP LinToGDTSelector(SEL,PHYSADDR,ULONG); int NP GetDescInfo(SEL,PUSHORT,PULONG,PULONG); int NP LinToPageList(PHYSADDR,ULONG,FPFARPOINTER,PULONG); int NP PageListToLin(ULONG,FPFARPOINTER,PULONG); int NP PageListToGDTSelector(SEL,ULONG,FPFARPOINTER,USHORT,PSEL); int NP RegisterTmrDD(FARPOINTER,FARPOINTER,FARPOINTER); int NP AllocateCtxHook(OFF,ULONG,PULONG); int NP FreeCtxHook(LHANDLE); int NP ArmCtxHook(ULONG,LHANDLE,ULONG); int NP VMSetMem(PHYSADDR,ULONG,ULONG); int NP OpenEventSem(LHANDLE); int NP CloseEventSem(LHANDLE); int NP PostEventSem(LHANDLE); int NP ResetEventSem(LHANDLE,ULONG); int NP DynamicAPI(FARPOINTER,USHORT,USHORT);

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


 * 1) 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 */ 