Legacy Documentclose button

Important: The information in this document is obsolete and should not be used for new development.

Previous Book Contents Book Index Next

Inside Macintosh: Devices /
Chapter 1 - Device Manager


Summary of the Device Manager

C Summary

Constants

enum {
   /* request codes passed by the Device Manager to a driver's 
      prime routine */
   aRdCmd            = 2,     /* read operation requested */
   aWrCmd            = 3      /* write operation requested */
};
enum {
   /* flags used in the driver header and device control entry */
   dNeedLockMask    = 0x4000, /* set if driver must be locked in memory as
                                 soon as it is opened */ 
   dNeedTimeMask    = 0x2000, /* set if driver needs time for performing
                                 periodic tasks */ 
   dNeedGoodByeMask = 0x1000, /* set if driver needs to be called before the
                                 application heap is initialized */ 
   dStatEnableMask  = 0x0800, /* set if driver responds to status requests */ 
   dCtlEnableMask   = 0x0400, /* setifdriverrespondstocontrolrequests */ 
   dWritEnableMask  = 0x0200, /* set if driver responds to write requests */ 
   dReadEnableMask  = 0x0100, /* set if driver responds to read requests */ 

   /* run-time flags used in the device control entry */
   drvrActiveMask   = 0x0080, /* driver is currently processing a request */
   dRAMBasedMask    = 0x0040, /* dCtlDriver is a handle (1) or pointer (0) */ 
   dOpenedMask      = 0x0020  /* driver is open */ 
};
enum {
   /* access permissions */
   fsCurPerm         = 0,     /* retain current permission */
   fsRdPerm          = 1,     /* allow reads only */
   fsWrPerm          = 2,     /* allow writes only */
   fsRdWrPerm        = 3,     /* allow reads and writes */


   /* positioning modes */
   fsAtMark          = 0,     /* at current position */
   fsFromStart       = 1,     /* offset from beginning */
   fsFromMark        = 3,     /* offset from current position */

   /* read modes */
   rdVerify          = 64     /* read-verify mode */
};
enum {
   /* control codes */
   goodbye           = -1,    /* heap being reinitialized */
   killCode          =  1,    /* KillIO requested */
   accEvent          = 64,    /* handle an event */
   accRun            = 65,    /* time for periodic action */
   accCursor         = 66,    /* change cursor shape */
   accMenu           = 67,    /* handle menu item */
   accUndo           = 68,    /* handle undo command */
   accCut            = 70,    /* handle cut command */
   accCopy           = 71,    /* handle copy command */
   accPaste          = 72,    /* handle paste command */
   accClear          = 73     /* handle clear command */
};
enum {
   /* Chooser messages */
   chooserInitMsg    = 11,    /* the user selected this device package */
   newSelMsg         = 12,    /* the user made new device selections */
   fillListMsg       = 13,    /* fill the device list with choices */
   getSelMsg         = 14,    /* mark one or more choices as selected */
   selectMsg         = 15,    /* the user made a selection */
   deselectMsg       = 16,    /* the user canceled a selection */
   terminateMsg      = 17,    /* allows device package to clean up */
   buttonMsg         = 19     /* the user selected a button */
};

Data Types

typedef union ParamBlockRec {
   IOParam        ioParam;
   FileParam      fileParam;
   VolumeParam    volumeParam;
   CntrlParam     cntrlParam;
   SlotDevParam   slotDevParam;
   MultiDevParam  multiDevParam;
} ParamBlockRec;
typedef ParamBlockRec *ParmBlkPtr;
typedef struct IOParam {
   QElemPtr    qLink;         /* next queue entry */
   short       qType;         /* queue type */
   short       ioTrap;        /* routine trap */
   Ptr         ioCmdAddr;     /* routine address */
   ProcPtr     ioCompletion;  /* completion routine address */
   OSErr       ioResult;      /* result code */
   StringPtr   ioNamePtr;     /* pointer to driver name */
   short       ioVRefNum;     /* volume reference or drive number */
   short       ioRefNum;      /* driver reference number */
   char        ioVersNum;     /* not used by the Device Manager */
   char        ioPermssn;     /* read/write permission */
   Ptr         ioMisc;        /* not used by the Device Manager */
   Ptr         ioBuffer;      /* pointer to data buffer */
   long        ioReqCount;    /* requested number of bytes */
   long        ioActCount;    /* actual number of bytes completed */
   short       ioPosMode;     /* positioning mode */
   long        ioPosOffset;   /* positioning offset */
} IOParam;

typedef struct CntrlParam {
   QElemPtr    qLink;         /* next queue entry */
   short       qType;         /* queue type */
   short       ioTrap;        /* routine trap */
   Ptr         ioCmdAddr;     /* routine address */
   ProcPtr     ioCompletion;  /* completion routine address */
   OSErr       ioResult;      /* result code */
   StringPtr   ioNamePtr;     /* pointer to driver name */
   short       ioVRefNum;     /* volume reference or drive number */
   short       ioCRefNum;     /* driver reference number */
   short       csCode;        /* type of control or status request */
   short       csParam[11];   /* control or status information */
} CntrlParam;
typedef struct AuxDCE {
   Ptr         dCtlDriver;    /* pointer or handle to driver */
   short       dCtlFlags;     /* flags */
   QHdr        dCtlQHdr;      /* I/O queue header */
   long        dCtlPosition;  /* current R/W byte position */
   Handle      dCtlStorage;   /* handle to private storage */
   short       dCtlRefNum;    /* driver reference number */
   long        dCtlCurTicks;  /* used internally */
   GrafPtr     dCtlWindow;    /* pointer to driver's window */
   short       dCtlDelay;     /* ticks between periodic actions */
   short       dCtlEMask;     /* desk accessory event mask */
   short       dCtlMenu;      /* desk accessory menu ID */
   char        dCtlSlot;      /* slot */
   char        dCtlSlotId;    /* sResource directory ID */
   long        dCtlDevBase;   /* slot device base address */
   Ptr         dCtlOwner;     /* reserved; must be 0 */
   char        dCtlExtDev;    /* external device ID */
   char        fillByte;      /* reserved */
} AuxDCE;
typedef AuxDCE *AuxDCEPtr, **AuxDCEHandle;

Functions

Opening and Closing Device Drivers

pascal OSErr OpenDriver   (ConstStr255Param name, short *drvrRefNum);
pascal OSErr PBOpen       (ParmBlkPtr paramBlock, Boolean async);
pascal OSErr PBOpenSync   (ParmBlkPtr paramBlock);
pascal OSErr OpenSlot     (ParmBlkPtr paramBlock, Boolean async);
pascal short OpenDeskAcc  (ConstStr255Param deskAccName);
pascal OSErr CloseDriver  (short refNum);
pascal OSErr PBClose      (ParmBlkPtr paramBlock, Boolean async);
pascal OSErr PBCloseSync  (ParmBlkPtr paramBlock);
pascal void  CloseDeskAcc (short refNum);

Communicating With Device Drivers

pascal OSErr FSRead        (short refNum, long *count, void *buffPtr);
pascal OSErr PBRead        (ParmBlkPtr paramBlock, Boolean async);
pascal OSErr PBReadSync    (ParmBlkPtr paramBlock);
pascal OSErr PBReadAsync   (ParmBlkPtr paramBlock);
pascal OSErr FSWrite       (short refNum,long *count,const void *buffPtr);
pascal OSErr PBWrite       (ParmBlkPtr paramBlock, Boolean async);
pascal OSErr PBWriteSync   (ParmBlkPtr paramBlock);
pascal OSErr PBWriteAsync  (ParmBlkPtr paramBlock);

Controlling and Monitoring Device Drivers

pascal OSErr Control          (short refNum, short csCode, const void 
                               *csParamPtr);
pascal OSErr PBControl        (ParmBlkPtr paramBlock, Boolean async);
pascal OSErr PBControlSync    (ParmBlkPtr paramBlock);
pascal OSErr PBControlAsync   (ParmBlkPtr paramBlock);
pascal OSErr Status           (short refNum, short csCode, void *csParamPtr);
pascal OSErr PBStatus         (ParmBlkPtr paramBlock, Boolean async);
pascal OSErr PBStatusSync     (ParmBlkPtr paramBlock);
pascal OSErr PBStatusAsync    (ParmBlkPtr paramBlock);
pascal OSErr KillIO           (short refNum);
pascal OSErr PBKillIO         (ParmBlkPtr paramBlock, Boolean async);
pascal OSErr PBKillIOSync     (ParmBlkPtr paramBlock);
pascal OSErr PBKillIOAsync    (ParmBlkPtr paramBlock);

Driver Support Functions

pascal OSErr DriverInstall              (Ptr drvrPtr, short refNum);
pascal OSErr DriverInstallReserveMem    (Ptr drvrPtr, short refNum);
pascal OSErr DriverRemove               (short refNum);
pascal DCtlHandle GetDCtlEntry          (short refNum);

Pascal Summary

Constants

CONST
   {request codes passed by the Device Manager to a driver's prime routine}
   aRdCmd            = 2;        {read operation requested}
   aWrCmd            = 3;        {write operation requested}
   {flags used in the driver header and device control entry}
   dNeedLockMask     = $4000;    {set if driver must be locked in memory as }
                                 { soon as it is opened}
   dNeedTimeMask     = $2000;    {set if driver needs time for performing }
                                 { periodic tasks}
   dNeedGoodByeMask  = $1000;    {set if driver needs to be called before }
                                 { the application heap is initialized}
   dStatEnableMask   = $0800;    {set if driver responds to status requests}
   dCtlEnableMask    = $0400;    {set if driver responds to control requests}
   dWritEnableMask   = $0200;    {set if driver responds to write requests}
   dReadEnableMask   = $0100;    {set if driver responds to read requests}
   {run-time flags used in the device control entry}
   drvrActiveMask    = $0080;    {driver is currently processing a request}
   dRAMBasedMask     = $0040;    {dCtlDriver is a handle (1) or pointer (0)}
   dOpenedMask       = $0020;    {driver is open}
   {access permissions}
   fsCurPerm         = 0;        {retain current permission}
   fsRdPerm          = 1;        {allow reads only}
   fsWrPerm          = 2;        {allow writes only}
   fsRdWrPerm        = 3;        {allow reads and writes}

   {positioning modes}
   fsAtMark          = 0;        {at current position}
   fsFromStart       = 1;        {offset from beginning}
   fsFromMark        = 3;        {offset from current position}
   {read modes}
   rdVerify          = 64;       {read-verify mode}

   {control codes}
   goodbye           = -1;       {heap being reinitialized}
   killCode          =  1;       {KillIO requested}
   accEvent          = 64;       {handle an event}
   accRun            = 65;       {time for periodic action}
   accCursor         = 66;       {change cursor shape}
   accMenu           = 67;       {handle menu item}
   accUndo           = 68;       {handle undo command}
   accCut            = 70;       {handle cut command}
   accCopy           = 71;       {handle copy command}
   accPaste          = 72;       {handle paste command}
   accClear          = 73;       {handle clear command}
   {Chooser messages}
   chooserInitMsg    = 11;       {the user selected this device package}
   newSelMsg         = 12;       {the user made new device selections}
   fillListMsg       = 13;       {fill the device list with choices}
   getSelMsg         = 14;       {mark one or more choices as selected}
   selectMsg         = 15;       {the user made a selection}
   deselectMsg       = 16;       {the user canceled a selection}
   terminateMsg      = 17;       {allows device package to clean up}
   buttonMsg         = 19;       {the user selected a button}

Data Types

TYPE  ParamBlkType = (IOParam, FileParam, VolumeParam, CntrlParam,
                      SlotDevParam, MultiDevParam);

      ParamBlockRec =
      RECORD
         qLink:         QElemPtr;   {next queue entry}
         qType:         Integer;    {queue type}
         ioTrap:        Integer;    {routine trap}
         ioCmdAddr:     Ptr;        {routine address}
         ioCompletion:  ProcPtr;    {completion routine address}
         ioResult:      OSErr;      {result code}
         ioNamePtr:     StringPtr;  {pointer to driver name}
         ioVRefNum:     Integer;    {volume reference or drive number}
      CASE ParamBlkType OF
      IOParam:
         (ioRefNum:     Integer;    {driver reference number}
         ioVersNum:     SignedByte; {not used}
         ioPermssn:     SignedByte; {read/write permission}
         ioMisc:        Ptr;        {not used}
         ioBuffer:      Ptr;        {pointer to data buffer}
         ioReqCount:    LongInt;    {requested number of bytes}
         ioActCount:    LongInt;    {actual number of bytes}
         ioPosMode:     Integer;    {positioning mode}
         ioPosOffset:   LongInt);   {positioning offset}
      CntrlParam:
         (ioCRefNum:    Integer;    {driver reference number}
         csCode:        Integer;    {type of control or status request}
         csParam:       ARRAY[0..10] OF Integer);  {control or status info}
      END;
      ParmBlkPtr = ^ParamBlockRec;
      AuxDCE = 
      RECORD
         dCtlDriver:    Ptr;        {pointer or handle to driver}
         dCtlFlags:     Integer;    {flags}
         dCtlQHdr:      QHdr;       {driver I/O queue header}
         dCtlPosition:  LongInt;    {byte position}
         dCtlStorage:   Handle;     {handle to private storage}
         dCtlRefNum:    Integer;    {driver reference number}
         dCtlCurTicks:  LongInt;    {used internally}
         dCtlWindow:    GrafPtr;    {pointer to driver's window}
         dCtlDelay:     Integer;    {ticks between periodic actions}
         dCtlEMask:     Integer;    {event mask for desk accessories}
         dCtlMenu:      Integer;    {menu ID for desk accessories}
         dCtlSlot:      Byte;       {slot}
         dCtlSlotId:    Byte;       {sResource directory ID}
         dCtlDevBase:   LongInt;    {slot device base address}
         dCtlOwner:     Ptr;        {reserved; must be 0}
         dCtlExtDev:    Byte;       {external device ID}
         fillByte:      Byte;       {reserved}
      END;
      AuxDCEPtr         = ^AuxDCE;
      AuxDCEHandle      = ^AuxDCEPtr;

Routines

Opening and Closing Device Drivers

FUNCTION OpenDriver     (name: Str255; VAR refNum: Integer): OSErr;
FUNCTION PBOpen         (paramBlock: ParmBlkPtr; async: Boolean): OSErr;
FUNCTION PBOpenSync     (paramBlock: ParmBlkPtr): OSErr;
FUNCTION OpenSlot       (paramBlock: ParmBlkPtr; async: Boolean): OSErr;
FUNCTION OpenDeskAcc    (deskAccName: Str255): INTEGER;
FUNCTION CloseDriver    (refNum: Integer): OSErr;
FUNCTION PBClose        (paramBlock: ParmBlkPtr; async: Boolean): OSErr;
FUNCTION PBCloseSync    (paramBlock: ParmBlkPtr): OSErr;
PROCEDURE CloseDeskAcc  (refNum: INTEGER);

Communicating With Device Drivers

FUNCTION FSRead         (refNum: Integer; VAR count: LongInt; 
                         buffPtr: Ptr): OSErr;
FUNCTION PBRead         (paramBlock: ParmBlkPtr; async: Boolean): OSErr;
FUNCTION PBReadSync     (paramBlock: ParmBlkPtr): OSErr;
FUNCTION PBReadAsync    (paramBlock: ParmBlkPtr): OSErr;
FUNCTION FSWrite        (refNum: Integer: VAR count: LongInt;
                         buffPtr: Ptr): OSErr;
FUNCTION PBWrite        (paramBlock: ParmBlkPtr; async: Boolean): OSErr;
FUNCTION PBWriteSync    (paramBlock: ParmBlkPtr): OSErr;
FUNCTION PBWriteAsync   (paramBlock: ParmBlkPtr): OSErr;

Controlling and Monitoring Device Drivers

FUNCTION Control          (refNum: Integer; csCode: Integer; 
                           csParamPtr: Ptr): OSErr;
FUNCTION PBControl        (paramBlock: ParmBlkPtr; async: Boolean): OSErr;
FUNCTION PBControlSync    (paramBlock: ParmBlkPtr): OSErr;
FUNCTION PBControlAsync   (paramBlock: ParmBlkPtr): OSErr;
FUNCTION Status           (refNum: Integer; csCode: Integer; 
                           csParamPtr: Ptr): OSErr;
FUNCTION PBStatus         (paramBlock: ParmBlkPtr; async: Boolean): OSErr;
FUNCTION PBStatusSync     (paramBlock: ParmBlkPtr): OSErr;
FUNCTION PBStatusAsync    (paramBlock: ParmBlkPtr): OSErr;
FUNCTION KillIO           (refNum: Integer): OSErr;
FUNCTION PBKillIO         (paramBlock: ParmBlkPtr; async: Boolean): OSErr;
FUNCTION PBKillIOSync     (paramBlock: ParmBlkPtr): OSErr;
FUNCTION PBKillIOAsync    (paramBlock: ParmBlkPtr): OSErr;

Driver Support Routines

FUNCTION DriverInstall            (drvrPtr: Ptr; refNum: Integer): OSErr;
FUNCTION DriverInstallReserveMem  (drvrPtr: Ptr; refNum: Integer): OSErr;
FUNCTION DriverRemove             (refNum: Integer): OSErr;
FUNCTION GetDCtlEntry             (refNum: Integer): DCtlHandle;

Assembly-Language Summary

Data Structures

Device Manager Parameter Block Header
0qLinklongused internally by the Device Manager
4qTypewordused internally by the Device Manager
6ioTrapwordused internally by the Device Manager
8ioCmdAddrlongused internally by the Device Manager
12ioCompletionlongcompletion routine
16ioResultwordresult code
18ioNamePtrlongdriver name
22ioVRefNumworddrive number

I/O Parameter Structure
24ioRefNumworddriver reference number
26ioVersNumbytenot used
27ioPermssnbyteread/write permission
28ioMisclongnot used
32ioBufferlongpointer to data buffer
36ioReqCountlongrequested number of bytes
40ioActCountlongactual number of bytes
44ioPosModewordpositioning mode
46ioPosOffsetlongpositioning offset

Control Parameter Structure
24ioCRefNumworddriver reference number
26csCodewordtype of control or status request
28csParam22 bytescontrol or status information

Trap Macros

Trap Macro Names
C and Pascal nameTrap macro name
PBOpen_Open
OpenSlot_Open
PBClose_Close
PBRead_Read
PBWrite_Write
PBControl_Control
PBStatus_Status
PBKillIO_KillIO
DriverInstall_DrvrInstall
DriverRemove_DrvrRemove

Routines Requiring Jump Vectors
RoutineJump vector
FetchJFetch
StashJStash
IODoneJIODone

Result Codes
noErr0No error
controlErr-17Driver does not respond to this control request
statusErr-18Driver does not respond to this status request
readErr-19Driver does not respond to read requests
writErr-20Driver does not respond to write requests
badUnitErr-21Driver reference number does not match unit table
unitEmptyErr-22Driver reference number specifies a nil handle in unit table
openErr-23Requested read/write permission does not match driver's open permission
closErr-24Driver unable to complete close request
dRemovErr-25Attempt to remove an open driver
dInstErr-26Driver resource not found
abortErr-27Request aborted by KillIO
notOpenErr-28Driver not open
ioErr-36Data does not match in read-verify mode


Previous Book Contents Book Index Next

© Apple Computer, Inc.
3 JUL 1996