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

