/*
     File:       Devices.h
 
     Contains:   Device Manager Interfaces.
 
     Version:    Technology: Mac OS 8
                 Release:    QuickTime 6.0.2
 
     Copyright:  (c) 1985-2001 by Apple Computer, Inc., all rights reserved
 
     Bugs?:      For bug reports, consult the following page on
                 the World Wide Web:
 
                     http://developer.apple.com/bugreporter/
 
*/
#ifndef __DEVICES__
#define __DEVICES__

#ifndef __OSUTILS__
#include "OSUtils.h"
#endif

#ifndef __FILES__
#include "Files.h"
#endif

#ifndef __QUICKDRAW__
#include "Quickdraw.h"
#endif

#ifndef __NAMEREGISTRY__
#include "NameRegistry.h"
#endif

#ifndef __CODEFRAGMENTS__
#include "CodeFragments.h"
#endif

#ifndef __DRIVERFAMILYMATCHING__
#include "DriverFamilyMatching.h"
#endif




#if PRAGMA_ONCE
#pragma once
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if PRAGMA_IMPORT
#pragma import on
#endif

#if PRAGMA_STRUCT_ALIGN
    #pragma options align=mac68k
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(push, 2)
#elif PRAGMA_STRUCT_PACK
    #pragma pack(2)
#endif

/* Values of the 'message' parameter to a Chooser device package */
enum {
    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 */
};


/* Values of the 'caller' parameter to a Chooser device package */
enum {
    chooserID                   = 1
};


/* Values of the 'message' parameter to a Monitor 'mntr' */
enum {
    initMsg                     = 1,                            /*initialization*/
    okMsg                       = 2,                            /*user clicked OK button*/
    cancelMsg                   = 3,                            /*user clicked Cancel button*/
    hitMsg                      = 4,                            /*user clicked control in Options dialog*/
    nulMsg                      = 5,                            /*periodic event*/
    updateMsg                   = 6,                            /*update event*/
    activateMsg                 = 7,                            /*not used*/
    deactivateMsg               = 8,                            /*not used*/
    keyEvtMsg                   = 9,                            /*keyboard event*/
    superMsg                    = 10,                           /*show superuser controls*/
    normalMsg                   = 11,                           /*show only normal controls*/
    startupMsg                  = 12                            /*code has been loaded*/
};


/* control codes for DeskAccessories */
enum {
    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 */
};

/* Control/Status Call Codes */
enum {
    drvStsCode                  = 8,                            /* status call code for drive status */
    ejectCode                   = 7,                            /* control call eject code */
    tgBuffCode                  = 8                             /* set tag buffer code */
};

/* miscellaneous Device Manager constants */
enum {
    ioInProgress                = 1,                            /* predefined value of ioResult while I/O is pending */
    aRdCmd                      = 2,                            /* low byte of ioTrap for Read calls */
    aWrCmd                      = 3,                            /* low byte of ioTrap for Write calls */
    asyncTrpBit                 = 10,                           /* trap word modifier */
    noQueueBit                  = 9                             /* trap word modifier */
};

/* flags used in the driver header and device control entry */
enum {
    dReadEnable                 = 0,                            /* set if driver responds to read requests */
    dWritEnable                 = 1,                            /* set if driver responds to write requests */
    dCtlEnable                  = 2,                            /* set if driver responds to control requests */
    dStatEnable                 = 3,                            /* set if driver responds to status requests */
    dNeedGoodBye                = 4,                            /* set if driver needs time for performing periodic tasks */
    dNeedTime                   = 5,                            /* set if driver needs time for performing periodic tasks */
    dNeedLock                   = 6                             /* set if driver must be locked in memory as soon as it is opened */
};

enum {
    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,                       /* set if driver responds to control requests */
    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 */
enum {
    dVMImmuneBit                = 0,                            /* driver does not need VM protection */
    dOpened                     = 5,                            /* driver is open */
    dRAMBased                   = 6,                            /* dCtlDriver is a handle (1) or pointer (0) */
    drvrActive                  = 7                             /* driver is currently processing a request */
};

enum {
    dVMImmuneMask               = 0x0001,                       /* driver does not need VM protection */
    dOpenedMask                 = 0x0020,                       /* driver is open */
    dRAMBasedMask               = 0x0040,                       /* dCtlDriver is a handle (1) or pointer (0) */
    drvrActiveMask              = 0x0080                        /* driver is currently processing a request */
};



struct DRVRHeader {
    short                           drvrFlags;
    short                           drvrDelay;
    short                           drvrEMask;
    short                           drvrMenu;
    short                           drvrOpen;
    short                           drvrPrime;
    short                           drvrCtl;
    short                           drvrStatus;
    short                           drvrClose;
    unsigned char                   drvrName[1];
};
typedef struct DRVRHeader               DRVRHeader;
typedef DRVRHeader *                    DRVRHeaderPtr;
typedef DRVRHeaderPtr *                 DRVRHeaderHandle;

struct DCtlEntry {
    Ptr                             dCtlDriver;
    volatile short                  dCtlFlags;
    QHdr                            dCtlQHdr;
    volatile long                   dCtlPosition;
    Handle                          dCtlStorage;
    short                           dCtlRefNum;
    long                            dCtlCurTicks;
    GrafPtr                         dCtlWindow;
    short                           dCtlDelay;
    short                           dCtlEMask;
    short                           dCtlMenu;
};
typedef struct DCtlEntry                DCtlEntry;

typedef DCtlEntry *                     DCtlPtr;
typedef DCtlPtr *                       DCtlHandle;

struct AuxDCE {
    Ptr                             dCtlDriver;
    volatile short                  dCtlFlags;
    QHdr                            dCtlQHdr;
    long                            dCtlPosition;
    Handle                          dCtlStorage;
    short                           dCtlRefNum;
    long                            dCtlCurTicks;
    GrafPtr                         dCtlWindow;
    short                           dCtlDelay;
    short                           dCtlEMask;
    short                           dCtlMenu;
    SInt8                           dCtlSlot;
    SInt8                           dCtlSlotId;
    long                            dCtlDevBase;
    Ptr                             dCtlOwner;
    SInt8                           dCtlExtDev;
    SInt8                           fillByte;
    UInt32                          dCtlNodeID;
};
typedef struct AuxDCE                   AuxDCE;
typedef AuxDCE *                        AuxDCEPtr;
typedef AuxDCEPtr *                     AuxDCEHandle;
/*  The NDRV Driver IO Entry Point and Commands */

typedef UInt16                          UnitNumber;
typedef UInt32                          DriverOpenCount;
typedef SInt16                          DriverRefNum;
typedef SInt16                          DriverFlags;
typedef UInt32                          IOCommandCode;
enum {
    kOpenCommand                = 0,
    kCloseCommand               = 1,
    kReadCommand                = 2,
    kWriteCommand               = 3,
    kControlCommand             = 4,
    kStatusCommand              = 5,
    kKillIOCommand              = 6,
    kInitializeCommand          = 7,                            /* init driver and device*/
    kFinalizeCommand            = 8,                            /* shutdown driver and device*/
    kReplaceCommand             = 9,                            /* replace an old driver*/
    kSupersededCommand          = 10,                           /* prepare to be replaced by a new driver*/
    kSuspendCommand             = 11,                           /* prepare driver to go to sleep*/
    kResumeCommand              = 12                            /* wake up sleeping driver*/
};

typedef struct OpaqueAddressSpaceID*    AddressSpaceID;
typedef struct OpaqueIOCommandID*       IOCommandID;
typedef UInt32                          IOCommandKind;
enum {
    kSynchronousIOCommandKind   = 0x00000001,
    kAsynchronousIOCommandKind  = 0x00000002,
    kImmediateIOCommandKind     = 0x00000004
};


struct DriverInitInfo {
    DriverRefNum                    refNum;
    RegEntryID                      deviceEntry;
};
typedef struct DriverInitInfo           DriverInitInfo;
typedef DriverInitInfo *                DriverInitInfoPtr;

typedef DriverInitInfo                  DriverReplaceInfo;
typedef DriverInitInfo *                DriverReplaceInfoPtr;

struct DriverFinalInfo {
    DriverRefNum                    refNum;
    RegEntryID                      deviceEntry;
};
typedef struct DriverFinalInfo          DriverFinalInfo;
typedef DriverFinalInfo *               DriverFinalInfoPtr;

typedef DriverFinalInfo                 DriverSupersededInfo;
typedef DriverFinalInfo *               DriverSupersededInfoPtr;

/* Contents are command specific*/


union IOCommandContents {
    ParmBlkPtr                      pb;
    DriverInitInfoPtr               initialInfo;
    DriverFinalInfoPtr              finalInfo;
    DriverReplaceInfoPtr            replaceInfo;
    DriverSupersededInfoPtr         supersededInfo;
};
typedef union IOCommandContents         IOCommandContents;
typedef CALLBACK_API_C( OSErr , DriverEntryPointPtr )(AddressSpaceID SpaceID, IOCommandID CommandID, IOCommandContents Contents, IOCommandCode Code, IOCommandKind Kind);
/* Record to describe a file-based driver candidate */

struct FileBasedDriverRecord {
    FSSpec                          theSpec;                    /* file specification*/
    MacDriverType                   theType;                    /* nameInfoStr + version number*/
    Boolean                         compatibleProp;             /* true if matched using a compatible name*/
    UInt8                           pad[3];                     /* alignment*/
};
typedef struct FileBasedDriverRecord    FileBasedDriverRecord;
typedef FileBasedDriverRecord *         FileBasedDriverRecordPtr;
/* Detailed Record to describe a file-based driver candidate. Includes fragment name */

struct FileBasedDriverDetailed {
    FileBasedDriverRecord           fileBasedDriver;
    Str63                           fragName;
};
typedef struct FileBasedDriverDetailed  FileBasedDriverDetailed;
typedef FileBasedDriverDetailed *       FileBasedDriverDetailedPtr;
/* Driver Loader API */
#define DECLARE_DRIVERDESCRIPTION(N_ADDITIONAL_SERVICES)\
        struct {\
            DriverDescription   fixed;\
            DriverServiceInfo   additional_service[N_ADDITIONAL_SERVICES-1];\
        };


#if CALL_NOT_IN_CARBON
EXTERN_API_C( SInt16 )
HigherDriverVersion             (const NumVersion *     driverVersion1,
                                 const NumVersion *     driverVersion2);

EXTERN_API_C( OSErr )
VerifyFragmentAsDriver          (CFragConnectionID      fragmentConnID,
                                 DriverEntryPointPtr *  fragmentMain,
                                 DriverDescriptionPtr * driverDesc);

EXTERN_API_C( OSErr )
GetDriverMemoryFragment         (Ptr                    memAddr,
                                 long                   length,
                                 ConstStr63Param        fragName,
                                 CFragConnectionID *    fragmentConnID,
                                 DriverEntryPointPtr *  fragmentMain,
                                 DriverDescriptionPtr * driverDesc);

EXTERN_API_C( OSErr )
GetDriverDiskFragment           (FSSpecPtr              fragmentSpec,
                                 CFragConnectionID *    fragmentConnID,
                                 DriverEntryPointPtr *  fragmentMain,
                                 DriverDescriptionPtr * driverDesc);

EXTERN_API_C( OSErr )
GetNamedDriverDiskFragment      (FSSpecPtr              fragmentSpec,
                                 ConstStr63Param        fragName,
                                 CFragConnectionID *    fragmentConnID,
                                 DriverEntryPointPtr *  fragmentMain,
                                 DriverDescriptionPtr * driverDesc);

EXTERN_API_C( OSErr )
InstallDriverFromFragment       (CFragConnectionID      fragmentConnID,
                                 RegEntryID *           device,
                                 UnitNumber             beginningUnit,
                                 UnitNumber             endingUnit,
                                 DriverRefNum *         refNum);

EXTERN_API_C( OSErr )
InstallDriverFromFile           (FSSpecPtr              fragmentSpec,
                                 RegEntryID *           device,
                                 UnitNumber             beginningUnit,
                                 UnitNumber             endingUnit,
                                 DriverRefNum *         refNum);

EXTERN_API_C( OSErr )
InstallDriverFromMemory         (Ptr                    memory,
                                 long                   length,
                                 ConstStr63Param        fragName,
                                 RegEntryID *           device,
                                 UnitNumber             beginningUnit,
                                 UnitNumber             endingUnit,
                                 DriverRefNum *         refNum);

EXTERN_API_C( OSErr )
InstallDriverFromResource       (SInt16                 theRsrcID,
                                 ConstStr255Param       theRsrcName,
                                 RegEntryIDPtr          theDevice,
                                 UnitNumber             theBeginningUnit,
                                 UnitNumber             theEndingUnit,
                                 DriverRefNum *         theRefNum);

EXTERN_API_C( OSErr )
InstallDriverFromDisk           (Ptr                    theDriverName,
                                 RegEntryID *           theDevice,
                                 UnitNumber             theBeginningUnit,
                                 UnitNumber             theEndingUnit,
                                 DriverRefNum *         theRefNum);

EXTERN_API_C( OSErr )
FindDriversForDevice            (RegEntryID *           device,
                                 FSSpec *               fragmentSpec,
                                 DriverDescription *    fileDriverDesc,
                                 Ptr *                  memAddr,
                                 long *                 length,
                                 StringPtr              fragName,
                                 DriverDescription *    memDriverDesc);

EXTERN_API_C( OSErr )
FindDriverForDeviceFromFile     (RegEntryID *           device,
                                 FSSpec *               fragmentSpec,
                                 DriverDescription *    driverDesc,
                                 StringPtr              fragName);

EXTERN_API_C( OSErr )
FindDriverCandidates            (RegEntryID *           deviceID,
                                 Ptr *                  propBasedDriver,
                                 RegPropertyValueSize * propBasedDriverSize,
                                 StringPtr              deviceName,
                                 MacDriverType *        propBasedDriverType,
                                 Boolean *              gotPropBasedDriver,
                                 FileBasedDriverRecordPtr  fileBasedDrivers,
                                 ItemCount *            nFileBasedDrivers);

EXTERN_API_C( OSErr )
FindDriverCandidatesDetailed    (RegEntryIDPtr          deviceID,
                                 Ptr *                  propBasedDriver,
                                 RegPropertyValueSize * propBasedDriverSize,
                                 StringPtr              deviceName,
                                 MacDriverType *        propBasedDriverType,
                                 Boolean *              gotPropBasedDriver,
                                 FileBasedDriverDetailedPtr  fileBasedDrivers,
                                 ItemCount *            nFileBasedDrivers);

EXTERN_API_C( OSErr )
ScanDriverCandidates            (RegEntryID *           deviceID,
                                 FileBasedDriverRecordPtr  fileBasedDrivers,
                                 ItemCount              nFileBasedDrivers,
                                 FileBasedDriverRecordPtr  matchingDrivers,
                                 ItemCount *            nMatchingDrivers);

EXTERN_API_C( OSErr )
ScanDriverCandidatesDetailed    (RegEntryID *           deviceID,
                                 FileBasedDriverDetailedPtr  fileBasedDrivers,
                                 ItemCount              nFileBasedDrivers,
                                 FileBasedDriverDetailedPtr  matchingDrivers,
                                 ItemCount *            nMatchingDrivers);

EXTERN_API_C( SInt16 )
CompareFileCandToPropCand       (RegEntryID *           device,
                                 StringPtr              deviceName,
                                 DriverTypePtr          propBasedCandidate,
                                 FileBasedDriverRecordPtr  fileBasedCandidate);

EXTERN_API_C( void )
GetCompatibleProperty           (RegEntryID *           device,
                                 StringPtr *            compatibleNames,
                                 ItemCount *            nCompatibleNames);

EXTERN_API_C( Boolean )
CompatibleDriverNames           (StringPtr              nameInfoStr,
                                 StringPtr              compatibleNames,
                                 ItemCount              nCompatibleNames,
                                 long *                 nameCount);

EXTERN_API_C( OSErr )
GetDriverForDevice              (RegEntryID *           device,
                                 CFragConnectionID *    fragmentConnID,
                                 DriverEntryPointPtr *  fragmentMain,
                                 DriverDescriptionPtr * driverDesc);

EXTERN_API_C( OSErr )
InstallDriverForDevice          (RegEntryID *           device,
                                 UnitNumber             beginningUnit,
                                 UnitNumber             endingUnit,
                                 DriverRefNum *         refNum);

EXTERN_API_C( OSErr )
GetDriverInformation            (DriverRefNum           refNum,
                                 UnitNumber *           unitNum,
                                 DriverFlags *          flags,
                                 DriverOpenCount *      count,
                                 StringPtr              name,
                                 RegEntryID *           device,
                                 CFragSystem7Locator *  driverLoadLocation,
                                 CFragConnectionID *    fragmentConnID,
                                 DriverEntryPointPtr *  fragmentMain,
                                 DriverDescription *    driverDesc);

EXTERN_API_C( OSErr )
GetDriverDescription            (LogicalAddress         fragmentPtr,
                                 DriverDescriptionPtr * theDriverDesc);

EXTERN_API_C( OSStatus )
GetNamedDriverDescFromFSSpec    (FSSpecPtr              fragmentSpec,
                                 StringPtr              fragName,
                                 DriverDescriptionPtr * driverDesc);

EXTERN_API_C( OSErr )
SetDriverClosureMemory          (CFragConnectionID      fragmentConnID,
                                 Boolean                holdDriverMemory);

EXTERN_API_C( OSErr )
ReplaceDriverWithFragment       (DriverRefNum           theRefNum,
                                 CFragConnectionID      fragmentConnID);

EXTERN_API_C( OSErr )
OpenInstalledDriver             (DriverRefNum           refNum,
                                 SInt8                  ioPermission);

EXTERN_API_C( OSErr )
RenameDriver                    (DriverRefNum           refNum,
                                 StringPtr              newDriverName);

EXTERN_API_C( OSErr )
RemoveDriver                    (DriverRefNum           refNum,
                                 Boolean                immediate);

EXTERN_API_C( OSErr )
LookupDrivers                   (UnitNumber             beginningUnit,
                                 UnitNumber             endingUnit,
                                 Boolean                emptyUnits,
                                 ItemCount *            returnedRefNums,
                                 DriverRefNum *         refNums);

EXTERN_API_C( UnitNumber )
HighestUnitNumber               (void);

EXTERN_API_C( OSErr )
DriverGestaltOn                 (DriverRefNum           refNum);

EXTERN_API_C( OSErr )
DriverGestaltOff                (DriverRefNum           refNum);

EXTERN_API_C( Boolean )
DriverGestaltIsOn               (DriverFlags            flags);


                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 PBOpenSync(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
PBOpenSync                      (ParmBlkPtr             paramBlock)                         ONEWORDINLINE(0xA000);

                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 PBOpenAsync(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
PBOpenAsync                     (ParmBlkPtr             paramBlock)                         ONEWORDINLINE(0xA400);

                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 PBOpenImmed(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
PBOpenImmed                     (ParmBlkPtr             paramBlock)                         ONEWORDINLINE(0xA200);

#endif  /* CALL_NOT_IN_CARBON */

                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 PBCloseSync(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
PBCloseSync                     (ParmBlkPtr             paramBlock)                         ONEWORDINLINE(0xA001);

                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 PBCloseAsync(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
PBCloseAsync                    (ParmBlkPtr             paramBlock)                         ONEWORDINLINE(0xA401);

#if CALL_NOT_IN_CARBON
                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 PBCloseImmed(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
PBCloseImmed                    (ParmBlkPtr             paramBlock)                         ONEWORDINLINE(0xA201);

#endif  /* CALL_NOT_IN_CARBON */

                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 PBReadSync(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
PBReadSync                      (ParmBlkPtr             paramBlock)                         ONEWORDINLINE(0xA002);

                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 PBReadAsync(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
PBReadAsync                     (ParmBlkPtr             paramBlock)                         ONEWORDINLINE(0xA402);

#if CALL_NOT_IN_CARBON
                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 PBReadImmed(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
PBReadImmed                     (ParmBlkPtr             paramBlock)                         ONEWORDINLINE(0xA202);

#endif  /* CALL_NOT_IN_CARBON */

                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 PBWriteSync(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
PBWriteSync                     (ParmBlkPtr             paramBlock)                         ONEWORDINLINE(0xA003);

                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 PBWriteAsync(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
PBWriteAsync                    (ParmBlkPtr             paramBlock)                         ONEWORDINLINE(0xA403);

#if CALL_NOT_IN_CARBON
                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 PBWriteImmed(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
PBWriteImmed                    (ParmBlkPtr             paramBlock)                         ONEWORDINLINE(0xA203);

/*
    PBWaitIOComplete is a friendly way for applications to monitor
    a pending asynchronous I/O operation in power-managed and
    preemptive multitasking systems.
 */
#endif  /* CALL_NOT_IN_CARBON */

EXTERN_API( OSErr )
PBWaitIOComplete                (ParmBlkPtr             paramBlock,
                                 Duration               timeout);


#if CALL_NOT_IN_CARBON
EXTERN_API( void )
AddDrive                        (short                  drvrRefNum,
                                 short                  drvNum,
                                 DrvQElPtr              qEl);

#endif  /* CALL_NOT_IN_CARBON */

#if CALL_NOT_IN_CARBON
#if CALL_NOT_IN_CARBON
EXTERN_API( QHdrPtr )
GetDrvQHdr                      (void)                                                      THREEWORDINLINE(0x2EBC, 0x0000, 0x0308);


EXTERN_API( DCtlHandle )
GetDCtlEntry                    (short                  refNum);

#endif  /* CALL_NOT_IN_CARBON */

#endif  /* CALL_NOT_IN_CARBON */

/*
    SetChooserAlert used to simply set a bit in a low-mem global
    to tell the Chooser not to display its warning message when
    the printer is changed. However, under MultiFinder and System 7,
    this low-mem is swapped out when a layer change occurs, and the
    Chooser never sees the change. It is obsolete, and completely
    unsupported on the PowerPC. 68K apps can still call it if they
    wish.
    
    pascal Boolean SetChooserAlert(Boolean f);

*/
#if CALL_NOT_IN_CARBON
                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 DriverInstall(__A0, __D0)
                                                                                            #endif
EXTERN_API( OSErr )
DriverInstall                   (DRVRHeaderPtr          drvrPtr,
                                 short                  refNum)                             ONEWORDINLINE(0xA03D);

                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 DriverInstallReserveMem(__A0, __D0)
                                                                                            #endif
EXTERN_API( OSErr )
DriverInstallReserveMem         (DRVRHeaderPtr          drvrPtr,
                                 short                  refNum)                             ONEWORDINLINE(0xA43D);

/*
  Note: DrvrInstall() is no longer supported, becuase it never really worked anyways.
        There will soon be a DriverInstall() which does the right thing.

        DrvrRemove has been renamed to DriverRemove.  But, InterfaceLib for PowerPC
        still exports DrvrRemove, so a macro is used to map the new name to old.

*/
                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 DrvrRemove(__D0)
                                                                                            #endif
EXTERN_API( OSErr )
DrvrRemove                      (short                  refNum)                             ONEWORDINLINE(0xA03E);

#endif  /* CALL_NOT_IN_CARBON */

#define DriverRemove(refNum) DrvrRemove(refNum)

#if CALL_NOT_IN_CARBON
#if TARGET_OS_MAC
    #define MacOpenDriver OpenDriver
#endif
EXTERN_API( OSErr )
MacOpenDriver                   (ConstStr255Param       name,
                                 short *                drvrRefNum);

#if TARGET_OS_MAC
    #define MacCloseDriver CloseDriver
#endif
EXTERN_API( OSErr )
MacCloseDriver                  (short                  refNum);

EXTERN_API( OSErr )
Control                         (short                  refNum,
                                 short                  csCode,
                                 const void *           csParamPtr);

EXTERN_API( OSErr )
Status                          (short                  refNum,
                                 short                  csCode,
                                 void *                 csParamPtr);

EXTERN_API( OSErr )
KillIO                          (short                  refNum);

                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 Fetch(__A1)
                                                                                            #endif
EXTERN_API( long )
Fetch                           (DCtlPtr                dce)                                THREEWORDINLINE(0x2078, 0x08F4, 0x4E90);

                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 Stash(__A1, __D0)
                                                                                            #endif
EXTERN_API( long )
Stash                           (DCtlPtr                dce,
                                 char                   data)                               THREEWORDINLINE(0x2078, 0x08F8, 0x4E90);

                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter IODone(__A1, __D0)
                                                                                            #endif
EXTERN_API( void )
IODone                          (DCtlPtr                dce,
                                 OSErr                  ioResult)                           THREEWORDINLINE(0x2078, 0x08FC, 0x4E90);

#endif  /* CALL_NOT_IN_CARBON */

#if CALL_NOT_IN_CARBON
                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 PBControlSync(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
PBControlSync                   (ParmBlkPtr             paramBlock)                         ONEWORDINLINE(0xA004);

                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 PBControlAsync(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
PBControlAsync                  (ParmBlkPtr             paramBlock)                         ONEWORDINLINE(0xA404);

                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 PBControlImmed(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
PBControlImmed                  (ParmBlkPtr             paramBlock)                         ONEWORDINLINE(0xA204);

#endif  /* CALL_NOT_IN_CARBON */

#if CALL_NOT_IN_CARBON
#if CALL_NOT_IN_CARBON
                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 PBStatusSync(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
PBStatusSync                    (ParmBlkPtr             paramBlock)                         ONEWORDINLINE(0xA005);

#endif  /* CALL_NOT_IN_CARBON */

#endif  /* CALL_NOT_IN_CARBON */

#if CALL_NOT_IN_CARBON
                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 PBStatusAsync(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
PBStatusAsync                   (ParmBlkPtr             paramBlock)                         ONEWORDINLINE(0xA405);

                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 PBStatusImmed(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
PBStatusImmed                   (ParmBlkPtr             paramBlock)                         ONEWORDINLINE(0xA205);

                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 PBKillIOSync(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
PBKillIOSync                    (ParmBlkPtr             paramBlock)                         ONEWORDINLINE(0xA006);

                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 PBKillIOAsync(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
PBKillIOAsync                   (ParmBlkPtr             paramBlock)                         ONEWORDINLINE(0xA406);

                                                                                            #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
                                                                                            #pragma parameter __D0 PBKillIOImmed(__A0)
                                                                                            #endif
EXTERN_API( OSErr )
PBKillIOImmed                   (ParmBlkPtr             paramBlock)                         ONEWORDINLINE(0xA206);

EXTERN_API( short )
OpenDeskAcc                     (ConstStr255Param       deskAccName)                        ONEWORDINLINE(0xA9B6);

EXTERN_API( void )
CloseDeskAcc                    (short                  refNum)                             ONEWORDINLINE(0xA9B7);

#endif  /* CALL_NOT_IN_CARBON */

#if CALL_NOT_IN_CARBON
EXTERN_API_C( short )
opendeskacc                     (const char *           deskAccName);

EXTERN_API_C( OSErr )
opendriver                      (const char *           driverName,
                                 short *                refNum);

#endif  /* CALL_NOT_IN_CARBON */

/*
    The PBxxx() routines are obsolete.  
    
    Use the PBxxxSync(), PBxxxAsync(), or PBxxxImmed version instead.
*/
#define PBControl(pb, async) ((async) ? PBControlAsync(pb) : PBControlSync(pb))
#define PBStatus(pb, async) ((async) ? PBStatusAsync(pb) : PBStatusSync(pb))
#define PBKillIO(pb, async) ((async) ? PBKillIOAsync(pb) : PBKillIOSync(pb))

#define PBOpen(pb, async) ((async) ? PBOpenAsync(pb) : PBOpenSync(pb))
#define PBClose(pb, async) ((async) ? PBCloseAsync(pb) : PBCloseSync(pb))
#define PBRead(pb, async) ((async) ? PBReadAsync(pb) : PBReadSync(pb))
#define PBWrite(pb, async) ((async) ? PBWriteAsync(pb) : PBWriteSync(pb))






#if PRAGMA_STRUCT_ALIGN
    #pragma options align=reset
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(pop)
#elif PRAGMA_STRUCT_PACK
    #pragma pack()
#endif

#ifdef PRAGMA_IMPORT_OFF
#pragma import off
#elif PRAGMA_IMPORT
#pragma import reset
#endif

#ifdef __cplusplus
}
#endif

#endif /* __DEVICES__ */

