DriverGestalt.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:38k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /*
  2.      File:       DriverGestalt.h
  3.  
  4.      Contains:   Driver Gestalt interfaces
  5.  
  6.      Version:    Technology: System 7.5
  7.                  Release:    QuickTime 6.0.2
  8.  
  9.      Copyright:  (c) 1995-2001 by Apple Computer, Inc., all rights reserved
  10.  
  11.      Bugs?:      For bug reports, consult the following page on
  12.                  the World Wide Web:
  13.  
  14.                      http://developer.apple.com/bugreporter/
  15.  
  16. */
  17. #ifndef __DRIVERGESTALT__
  18. #define __DRIVERGESTALT__
  19. #ifndef __MACTYPES__
  20. #include "MacTypes.h"
  21. #endif
  22. #ifndef __OSUTILS__
  23. #include "OSUtils.h"
  24. #endif
  25. #ifndef __NAMEREGISTRY__
  26. #include "NameRegistry.h"
  27. #endif
  28. #ifndef __SCSI__
  29. #include "SCSI.h"
  30. #endif
  31. #ifndef __USB__
  32. #include "USB.h"
  33. #endif
  34. #if PRAGMA_ONCE
  35. #pragma once
  36. #endif
  37. #ifdef __cplusplus
  38. extern "C" {
  39. #endif
  40. #if PRAGMA_IMPORT
  41. #pragma import on
  42. #endif
  43. #if PRAGMA_STRUCT_ALIGN
  44.     #pragma options align=mac68k
  45. #elif PRAGMA_STRUCT_PACKPUSH
  46.     #pragma pack(push, 2)
  47. #elif PRAGMA_STRUCT_PACK
  48.     #pragma pack(2)
  49. #endif
  50. /*__________________________________________________________________________________*/
  51. /* The Driver Gestalt bit in the dCtlFlags */
  52. enum {
  53.     kbDriverGestaltEnable       = 2,
  54.     kmDriverGestaltEnableMask   = (1 << kbDriverGestaltEnable)
  55. };
  56. /*__________________________________________________________________________________*/
  57. /* Driver Gestalt related csCodes */
  58. enum {
  59.     kDriverGestaltCode          = 43,                           /* various uses */
  60.     kDriverConfigureCode        = 43,                           /* various uses */
  61.     kcsSetBootPartitionCode     = 44,                           /* Set Startup Partition Control Call */
  62.     kcsGetBootPartitionStatus   = 44,                           /* Get Startup Partition Status Call */
  63.     kdgLowPowerMode             = 70,                           /* Sets/Returns the current energy consumption level */
  64.     kdgReturnDeviceID           = 120,                          /* returns SCSI DevID in csParam[0] */
  65.     kdgGetCDDeviceInfo          = 121                           /* returns CDDeviceCharacteristics in csParam[0] */
  66. };
  67. /*__________________________________________________________________________________*/
  68. /* Driver Gestalt selectors */
  69. enum {
  70.     kdgVersion                  = FOUR_CHAR_CODE('vers'),       /* Version number of the driver in standard Apple format */
  71.     kdgDeviceType               = FOUR_CHAR_CODE('devt'),       /* The type of device the driver is driving. */
  72.     kdgInterface                = FOUR_CHAR_CODE('intf'),       /* The underlying interface that the driver is using (if any) */
  73.     kdgSync                     = FOUR_CHAR_CODE('sync'),       /* True if driver only behaves synchronously. */
  74.     kdgBoot                     = FOUR_CHAR_CODE('boot'),       /* value to place in PRAM for this drive (long) */
  75.     kdgWide                     = FOUR_CHAR_CODE('wide'),       /* True if driver supports ioWPosOffset */
  76.     kdgPurge                    = FOUR_CHAR_CODE('purg'),       /* Driver purge permission (True = purge; False = no purge) */
  77.     kdgSupportsSwitching        = FOUR_CHAR_CODE('lpwr'),       /* True if driver supports power switching */
  78.     kdgMin3VPower               = FOUR_CHAR_CODE('pmn3'),       /* Minimum 3.3V power consumption in microWatts */
  79.     kdgMin5VPower               = FOUR_CHAR_CODE('pmn5'),       /* Minimum 5V power consumption in microWatts */
  80.     kdgMax3VPower               = FOUR_CHAR_CODE('pmx3'),       /* Maximum 3.3V power consumption in microWatts */
  81.     kdgMax5VPower               = FOUR_CHAR_CODE('pmx5'),       /* Maximum 5V power consumption in microWatts */
  82.     kdgInHighPower              = FOUR_CHAR_CODE('psta'),       /* True if device is currently in high power mode */
  83.     kdgSupportsPowerCtl         = FOUR_CHAR_CODE('psup'),       /* True if driver supports following five calls */
  84.     kdgAPI                      = FOUR_CHAR_CODE('dAPI'),       /* API support for PC Exchange */
  85.     kdgEject                    = FOUR_CHAR_CODE('ejec'),       /* Eject options for shutdown/restart (Shutdown Mgr) */
  86.     kdgFlush                    = FOUR_CHAR_CODE('flus'),       /* Determine if disk driver supports flush and if it needs a flush */
  87.     kdgVMOptions                = FOUR_CHAR_CODE('vmop'),       /* Disk drive's Virtual Memory options */
  88.     kdgMediaInfo                = FOUR_CHAR_CODE('minf'),       /* return media specific information */
  89.     kdgPhysDriveIconSuite       = FOUR_CHAR_CODE('dics'),       /* Return a pointer to a IconFamily ('icns') data structure for */
  90.                                                                 /* Disk Driver physical drive (formerly in csCode 21) in driverGestaltResponse. */
  91.     kdgMediaIconSuite           = FOUR_CHAR_CODE('mics'),       /* Return a pointer to a IconFamily ('icns') data structure for */
  92.                                                                 /* Disk Driver media (formerly in csCode 22) in driverGestaltResponse. */
  93.                                                                 /* See IconServices.r for information detailing the 'icns' resource data format */
  94.     kdgMediaName                = FOUR_CHAR_CODE('mnam'),       /* Return a pointer to a pascal string describing the Disk Driver (formerly in csCode 21) in driverGestaltResponse. */
  95.                                                                 /* DriverGestalt selector for ATA drivers to signify that they are device 0/1 compliant. */
  96.                                                                 /* see http://developer.apple.com/techpubs/hardware/Developer_Notes/System_Software/ATA_Device_Zero_One.pdf */
  97.     kdgATADev1                  = FOUR_CHAR_CODE('dev1'),
  98.     kdgDeviceReference          = FOUR_CHAR_CODE('dvrf'),       /* Returns a 32-bit reference number for the device, format is interface specific */
  99.     kdgNameRegistryEntry        = FOUR_CHAR_CODE('nmrg'),       /* Returns a pointer to the Name Registry ID for the device */
  100.     kdgDeviceModelInfo          = FOUR_CHAR_CODE('info'),       /* Returns a pointer to a Device Model Info structure */
  101.     kdgSupportedMediaTypes      = FOUR_CHAR_CODE('mdty'),       /* Returns a count and a pointer to list of all media types supported by the device */
  102.     kdgOpenFirmwareBootSupport  = FOUR_CHAR_CODE('ofpt'),       /* Returns information that Open Firmware needs to support booting from the device */
  103.     kdgOpenFirmwareBootingSupport = FOUR_CHAR_CODE('ofbt')      /* Returns same information as kdgOpenFirmwareBootSupport, but is only used during booting*/
  104. };
  105. /*__________________________________________________________________________________*/
  106. /* Driver Configure selectors */
  107. enum {
  108.     kdcFlush                    = FOUR_CHAR_CODE('flus'),       /* Tell a disk driver to flush its cache and any hardware caches */
  109.     kdcVMOptions                = FOUR_CHAR_CODE('vmop')        /* Change the disk driver's Virtual Memory options */
  110. };
  111. /*__________________________________________________________________________________*/
  112. /* control parameter block for Driver Configure calls */
  113. struct DriverConfigParam {
  114.     QElemPtr                        qLink;
  115.     short                           qType;
  116.     short                           ioTrap;
  117.     Ptr                             ioCmdAddr;
  118.     ProcPtr                         ioCompletion;
  119.     OSErr                           ioResult;
  120.     StringPtr                       ioNamePtr;
  121.     short                           ioVRefNum;
  122.     short                           ioCRefNum;                  /* refNum for I/O operation */
  123.     short                           csCode;                     /* == kDriverConfigureCode */
  124.     OSType                          driverConfigureSelector;
  125.     UInt32                          driverConfigureParameter;
  126. };
  127. typedef struct DriverConfigParam        DriverConfigParam;
  128. /*__________________________________________________________________________________*/
  129. /* status parameter block for Driver Gestalt calls */
  130. struct DriverGestaltParam {
  131.     QElemPtr                        qLink;
  132.     short                           qType;
  133.     short                           ioTrap;
  134.     Ptr                             ioCmdAddr;
  135.     ProcPtr                         ioCompletion;
  136.     OSErr                           ioResult;
  137.     StringPtr                       ioNamePtr;
  138.     short                           ioVRefNum;
  139.     short                           ioCRefNum;                  /* refNum for I/O operation */
  140.     short                           csCode;                     /*    == kDriverGestaltCode */
  141.     OSType                          driverGestaltSelector;      /* 'sync', 'vers', etc. */
  142.     UInt32                          driverGestaltResponse;      /* Could be a pointer, bit field or other format */
  143.     UInt32                          driverGestaltResponse1;     /* Could be a pointer, bit field or other format */
  144.     UInt32                          driverGestaltResponse2;     /* Could be a pointer, bit field or other format */
  145.     UInt32                          driverGestaltResponse3;     /* Could be a pointer, bit field or other format */
  146.     UInt16                          driverGestaltfiller;        /* To pad out to the size of a controlPB */
  147. };
  148. typedef struct DriverGestaltParam       DriverGestaltParam;
  149. /* Note that the various response definitions are overlays of the response fields above.
  150.        For instance the deviceType response would be returned in driverGestaltResponse.
  151.        The DriverGestaltPurgeResponse would be in driverGestaltResponse and driverGestaltResponse1
  152.     */
  153. /* GetDriverGestaltDevTResponse(gestaltPtr)->deviceType */
  154. #define GetDriverGestaltDevTResponse(p) ((DriverGestaltDevTResponse *)(&((p)->driverGestaltResponse)))
  155. #define GetDriverGestaltIntfResponse(p) ((DriverGestaltIntfResponse *)(&((p)->driverGestaltResponse)))
  156. #define GetDriverGestaltPowerResponse(p) ((DriverGestaltPowerResponse *)(&((p)->driverGestaltResponse)))
  157. #define GetDriverGestaltSyncResponse(p) ((DriverGestaltSyncResponse *)(&((p)->driverGestaltResponse)))
  158. #define GetDriverGestaltBootResponse(p) ((DriverGestaltBootResponse *)(&((p)->driverGestaltResponse)))
  159. #define GetDriverGestaltBootResponse(p) ((DriverGestaltBootResponse *)(&((p)->driverGestaltResponse)))
  160. #define GetDriverGestaltPurgeResponse(p) ((DriverGestaltPurgeResponse *)(&((p)->driverGestaltResponse)))
  161. #define GetDriverGestaltEjectResponse(p) ((DriverGestaltEjectResponse *)(&((p)->driverGestaltResponse)))
  162. #define GetDriverGestaltVersionResponse(p) (((NumVersion*)(&((p)->driverGestaltResponse))))
  163. #define GetDriverGestaltAPIResponse(p) ((DriverGestaltAPIResponse *)(&((p)->driverGestaltResponse)))
  164. #define GetDriverGestaltBooleanResponse(p) ((Boolean *)(&((p)->driverGestaltResponse)))
  165. #define GetDriverGestaltFlushResponse(p) ((DriverGestaltFlushResponse *)(&((p)->driverGestaltResponse)))
  166. #define GetDriverGestaltVMOptionsResponse(p) ((DriverGestaltVMOptionsResponse *)(&((p)->driverGestaltResponse)))
  167. #define GetDriverGestaltMediaInfoResponse(p) ((DriverGestaltMediaInfoResponse *)(&((p)->driverGestaltResponse)))
  168. #define GetDriverGestaltDeviceReferenceResponse(p) ((DriverGestaltDeviceReferenceResponse *)(&((p)->driverGestaltResponse)))
  169. #define GetDriverGestaltNameRegistryResponse(p) ((DriverGestaltNameRegistryResponse *)(&((p)->driverGestaltResponse)))
  170. #define GetDriverGestaltDeviceModelInfoResponse(p) ((DriverGestaltDeviceModelInfoResponse **)(&((p)->driverGestaltResponse)))
  171. #define GetDriverGestaltSupportedMediaTypesResponse(p) ((DriverGestaltSupportedMediaTypesResponse **)(&((p)->driverGestaltResponse)))
  172. #define GetDriverGestaltOFBootSupportResponse(p) ((DriverGestaltOFBootSupportResponse *)(&((p)->driverGestaltResponse)))
  173. #define GetDriverGestaltATADev1Response(p)  ((DriverGestaltATADev1Response *) (&((p)->driverGestaltResponse)))
  174. /*__________________________________________________________________________________*/
  175. /* Device Types response */
  176. struct DriverGestaltDevTResponse {
  177.     OSType                          deviceType;
  178. };
  179. typedef struct DriverGestaltDevTResponse DriverGestaltDevTResponse;
  180. enum {
  181.     kdgDiskType                 = FOUR_CHAR_CODE('disk'),       /* standard r/w disk drive */
  182.     kdgTapeType                 = FOUR_CHAR_CODE('tape'),       /* tape drive */
  183.     kdgPrinterType              = FOUR_CHAR_CODE('prnt'),       /* printer */
  184.     kdgProcessorType            = FOUR_CHAR_CODE('proc'),       /* processor */
  185.     kdgWormType                 = FOUR_CHAR_CODE('worm'),       /* write-once */
  186.     kdgCDType                   = FOUR_CHAR_CODE('cdrm'),       /* cd-rom drive */
  187.     kdgFloppyType               = FOUR_CHAR_CODE('flop'),       /* floppy disk drive */
  188.     kdgScannerType              = FOUR_CHAR_CODE('scan'),       /* scanner */
  189.     kdgFileType                 = FOUR_CHAR_CODE('file'),       /* Logical Partition type based on a file (Drive Container) */
  190.     kdgRemovableType            = FOUR_CHAR_CODE('rdsk')        /* A removable media hard disk drive ie. Syquest, Bernioulli */
  191. };
  192. /*__________________________________________________________________________________*/
  193. /* Device Interfaces response */
  194. struct DriverGestaltIntfResponse {
  195.     OSType                          interfaceType;
  196. };
  197. typedef struct DriverGestaltIntfResponse DriverGestaltIntfResponse;
  198. enum {
  199.     kdgScsiIntf                 = FOUR_CHAR_CODE('scsi'),
  200.     kdgPcmciaIntf               = FOUR_CHAR_CODE('pcmc'),
  201.     kdgATAIntf                  = FOUR_CHAR_CODE('ata '),
  202.     kdgUSBIntf                  = FOUR_CHAR_CODE('usb '),
  203.     kdgFireWireIntf             = FOUR_CHAR_CODE('fire'),
  204.     kdgExtBus                   = FOUR_CHAR_CODE('card'),
  205.     kdgNetworkIntf              = FOUR_CHAR_CODE('net ')
  206. };
  207. /*__________________________________________________________________________________*/
  208. /* Power Saving */
  209. struct DriverGestaltPowerResponse {
  210.     unsigned long                   powerValue;                 /* Power consumed in .Watts */
  211. };
  212. typedef struct DriverGestaltPowerResponse DriverGestaltPowerResponse;
  213. /*__________________________________________________________________________________*/
  214. /* Disk Specific */
  215. struct DriverGestaltSyncResponse {
  216.     Boolean                         behavesSynchronously;
  217.     UInt8                           pad[3];
  218. };
  219. typedef struct DriverGestaltSyncResponse DriverGestaltSyncResponse;
  220. struct DriverGestaltBootResponse {
  221.     UInt8                           extDev;                     /*  Packed target (upper 5 bits) LUN (lower 3 bits) */
  222.     UInt8                           partition;                  /*  Unused */
  223.     UInt8                           SIMSlot;                    /*  Slot */
  224.     UInt8                           SIMsRSRC;                   /*  sRsrcID */
  225. };
  226. typedef struct DriverGestaltBootResponse DriverGestaltBootResponse;
  227. struct DriverGestaltAPIResponse {
  228.     short                           partitionCmds;              /* if bit 0 is nonzero, supports partition control and status calls */
  229.                                                                 /*       prohibitMounting (control, kProhibitMounting) */
  230.                                                                 /*      partitionToVRef (status, kGetPartitionStatus) */
  231.                                                                 /*      getPartitionInfo (status, kGetPartInfo) */
  232.     short                           unused1;                    /* all the unused fields should be zero */
  233.     short                           unused2;
  234.     short                           unused3;
  235.     short                           unused4;
  236.     short                           unused5;
  237.     short                           unused6;
  238.     short                           unused7;
  239.     short                           unused8;
  240.     short                           unused9;
  241.     short                           unused10;
  242. };
  243. typedef struct DriverGestaltAPIResponse DriverGestaltAPIResponse;
  244. struct DriverGestaltFlushResponse {
  245.     Boolean                         canFlush;                   /* Return true if driver supports the */
  246.                                                                 /* kdcFlush Driver Configure _Control call */
  247.     Boolean                         needsFlush;                 /* Return true if driver/device has data cached */
  248.                                                                 /* and needs to be flushed when the disk volume */
  249.                                                                 /* is flushed by the File Manager */
  250.     UInt8                           pad[2];
  251. };
  252. typedef struct DriverGestaltFlushResponse DriverGestaltFlushResponse;
  253. /* Flags for purge permissions */
  254. enum {
  255.     kbCloseOk                   = 0,                            /* Ok to call Close */
  256.     kbRemoveOk                  = 1,                            /* Ok to call RemoveDrvr */
  257.     kbPurgeOk                   = 2,                            /* Ok to call DisposePtr */
  258.     kmNoCloseNoPurge            = 0,
  259.     kmOkCloseNoPurge            = (1 << kbCloseOk) + (1 << kbRemoveOk),
  260.     kmOkCloseOkPurge            = (1 << kbCloseOk) + (1 << kbRemoveOk) + (1 << kbPurgeOk)
  261. };
  262. /* Driver purge permission structure */
  263. struct DriverGestaltPurgeResponse {
  264.     UInt16                          purgePermission;            /* 0 = Do not change the state of the driver */
  265.                                                                 /* 3 = Do Close() and DrvrRemove() this driver */
  266.                                                                 /* but don't deallocate driver code */
  267.                                                                 /* 7 = Do Close(), DrvrRemove(), and DisposePtr() */
  268.     UInt16                          purgeReserved;
  269.     Ptr                             purgeDriverPointer;         /* pointer to the start of the driver block (valid */
  270.                                                                 /* only of DisposePtr permission is given */
  271. };
  272. typedef struct DriverGestaltPurgeResponse DriverGestaltPurgeResponse;
  273. struct DriverGestaltEjectResponse {
  274.     UInt32                          ejectFeatures;              /*  */
  275. };
  276. typedef struct DriverGestaltEjectResponse DriverGestaltEjectResponse;
  277. /* Flags for Ejection Features field */
  278. enum {
  279.     kRestartDontEject           = 0,                            /* Dont Want eject during Restart */
  280.     kShutDownDontEject          = 1,                            /* Dont Want eject during Shutdown */
  281.     kRestartDontEject_Mask      = 1 << kRestartDontEject,
  282.     kShutDownDontEject_Mask     = 1 << kShutDownDontEject
  283. };
  284. /*
  285.     The DriverGestaltVMOptionsResponse is returned by a disk driver in response to a
  286.     kdgVMOptions Driver Gestalt request. This allows a disk driver to tell VM a few
  287.     things about a disk drive. For example:
  288.     
  289.     o A drive that should never be in the page fault path should return kAllowVMNoneMask.
  290.       Examples of this are drives that have manual eject buttons that are not disabled by
  291.       software, drives with very slow throughput, or drives that depend on
  292.       a network connection.
  293.     o A drive that should never be written to but is safe for read-only file mapping
  294.       should return kAllowVMReadOnlyMask. Examples of this are WORM drives where each write
  295.       eats write-once space on the disk and CD-ROM drives which are read-only media.
  296.     o A drive that should allow VM to create its main backing store file should return
  297.       kAllowVMReadWriteMask. Examples of this are fast read/write drives that don't allow
  298.       manual eject and don't use a network connection.
  299.     
  300.     A disk driver must look at the ioVRefNum field of the DriverGestaltParam to determine
  301.     what disk drive this call is for. This is a per-drive call, not a per-driver call.
  302.     
  303.     The only three valid responses to kdgVMOptions at this time are kAllowVMNoneMask,
  304.     kAllowVMReadOnlyMask, and kAllowVMReadWriteMask (i.e., setting only kAllowVMWriteBit
  305.     is not valid).
  306.     
  307.     Important: All bits not defined here are reserved and should be set to zero until
  308.     they are defined for a specific purpose.
  309.     
  310.     The kdcVMOptions Driver Configure _Control call provides the ability to change a driver's
  311.     response to kdgVMOptions Driver Gestalt requests. A driver should return controlErr if
  312.     it doesn't want to provide the ability to change the kdgVMOptions response. If a driver
  313.     supports the kdcVMOptions Driver Configure _Control call, but is asked to set an option bit
  314.     that it doesn't support (for example, if a read-only device is asked to set the kAllowVMWriteBit),
  315.     it should return paramErr.
  316. */
  317. struct DriverGestaltVMOptionsResponse {
  318.     UInt32                          vmOptions;
  319. };
  320. typedef struct DriverGestaltVMOptionsResponse DriverGestaltVMOptionsResponse;
  321. /* Bits and masks for DriverGestaltVMOptionsResponse.vmOptions field */
  322. enum {
  323.     kAllowVMReadBit             = 0,                            /* Allow VM to use this drive for read access */
  324.     kAllowVMWriteBit            = 1,                            /* Allow VM to use this drive for write access */
  325.     kAllowVMNoneMask            = 0,
  326.     kAllowVMReadOnlyMask        = 1 << kAllowVMReadBit,
  327.     kAllowVMReadWriteMask       = (1 << kAllowVMReadBit) + (1 << kAllowVMWriteBit)
  328. };
  329. /*
  330.     The DriverGestaltMediaInfoResponse is returned by a disk driver in response to a
  331.     kdgMediaInfo DriverGestalt request. This allows a disk driver to tell callers the
  332.     physical block size, the number of blocks that are of that size, and the media type
  333.     for a given device.
  334.     
  335.     A disk driver must look at the ioVRefNum field of the DriverGestaltParam to determine
  336.     what disk drive this call is for. This is a per-drive call, not a per-driver call.
  337.     
  338.     On drives that support ejectable media, the response can change depending on what
  339.     media is currently in the drive.
  340. */
  341. struct DriverGestaltMediaInfoResponse {
  342.     UInt32                          numberBlocks;               /* number of blocks */
  343.     UInt32                          blockSize;                  /* physical size of blocks */
  344.     SInt16                          mediaType;                  /* media type identifier */
  345. };
  346. typedef struct DriverGestaltMediaInfoResponse DriverGestaltMediaInfoResponse;
  347. /* DriverGestaltMediaInfoResponse.mediaType constants */
  348. enum {
  349.     kMediaTypeUnknown           = 128,                          /* media type is unknown */
  350.     kMediaTypeCDROM             = 129,                          /* media type is a CD-ROM */
  351.     kMediaTypeDVDROM            = 130,                          /* media type is a DVD-ROM */
  352.     kMediaTypeDVDRAM            = 131,                          /* media type is a DVD-RAM */
  353.     kMediaTypeDVDR              = 132,                          /* media type is a DVD-RW */
  354.     kMediaTypeReadOnly          = 133,                          /* basic read only type */
  355.     kMediaTypeWriteOnce         = 134,                          /* basic write once type */
  356.     kMediaTypeRewritable        = 135,                          /* rewritable media, i.e CD-RW */
  357.     kMediaTypeOverwritable      = 136,                          /* random access read write media */
  358.     kMediaTypeNoMedia           = -1                            /* no media is present */
  359. };
  360. struct DriverGestaltATADev1Response {
  361.     UInt32                          dev1Support;                /* 1 = supports devices 0 and 1*/
  362. };
  363. typedef struct DriverGestaltATADev1Response DriverGestaltATADev1Response;
  364. /*__________________________________________________________________________________*/
  365. /* Device Reference */
  366. /*
  367.     The driver will return a 32-bit device reference number in the driverGestaltResponse
  368.     field of the DriverGestaltParam structure. The device refernce number will be interpreted 
  369.     differently depending on the interface retrieved by using the 'intf' Driver Gestalt call.
  370. */
  371. /*The union for the kdgDeviceReference Gestalt */
  372. union DriverGestaltDeviceReferenceResponse {
  373.     UInt32                          devRef;                     /* Generic reference number for interfaces not specified */
  374.     DeviceIdent                     scsiID;                     /* kdgScsiIntf devices will return a DeviceIdent */
  375.     DeviceIdent                     ataID;                      /* kdgATAIntf devices will return a DeviceIdent */
  376.     USBDeviceRef                    usbRef;                     /* kdgUSBIntf devices will return a USBDeviceRef*/
  377. };
  378. typedef union DriverGestaltDeviceReferenceResponse DriverGestaltDeviceReferenceResponse;
  379. /*__________________________________________________________________________________*/
  380. /* Name Registry ID */
  381. /*
  382.     The driver will pass back in the driverGestaltResponse field of the DriverGestaltParam
  383.     a pointer to the Name Registry Entry ID for the device that it controls
  384. */
  385. /* The structure for the kdgNameRegistryEntry Gestalt */
  386. struct DriverGestaltNameRegistryResponse {
  387.     RegEntryIDPtr                   entryID;
  388. };
  389. typedef struct DriverGestaltNameRegistryResponse DriverGestaltNameRegistryResponse;
  390. /*__________________________________________________________________________________*/
  391. /* Device Model Information */
  392. /*
  393.     The driver will pass a pointer to the DriverGestaltDeviceModelInfoResponse in the
  394.     driverGestaltResponse field of the DriverGestaltParam structure
  395.     The structure for the kdgDeviceModelInfo Gestalt
  396.     If any of theses pointers are nil, that means that the device doesn't provide that information
  397. */
  398. struct DriverGestaltDeviceModelInfoResponse {
  399.     UInt32                          infoStructVersion;
  400.     StringPtr                       vendorName;
  401.     StringPtr                       productName;
  402.     StringPtr                       revisionNumber;
  403.     StringPtr                       subRevisionNumber;
  404.     StringPtr                       serialNumber;
  405. };
  406. typedef struct DriverGestaltDeviceModelInfoResponse DriverGestaltDeviceModelInfoResponse;
  407. /* infoStructVersion field values */
  408. /* NOTE: May need/want to add a UniCode version of the InfoStruct at some point */
  409. enum {
  410.     kInfoStructStringPtrsVers1  = 1
  411. };
  412. /*__________________________________________________________________________________*/
  413. /* Supported Media Types */
  414. /*
  415.     The driver will return the number of media types supported by the device in the 
  416.     driverGestaltResponse field of the DriverGestaltParam structure and an array of 
  417.     'devt' values for the supported media types will be returned in the driverGestaltResponse1
  418.     field of the DriverGestaltParam.
  419.     This call will return the number of media types supported by the device, and an array
  420.     of 'devt' values for the media types (i.e. if a device supports floppy disks
  421.     and large capacity removables, the driver would return that 2 media types are supported,
  422.     and the array would contain kdgFloppyType ('flop') and kdgRemovableType ('rdsk')).
  423. */
  424. /* The structure for the kdgSupportedMediaTypes Gestalt */
  425. struct DriverGestaltSupportedMediaTypesResponse {
  426.     UInt32                          supportTypesCount;          /* The number of Media Types in the array */
  427.     OSType                          supportedTypesArray[1];     /* Array of supported media types  */
  428. };
  429. typedef struct DriverGestaltSupportedMediaTypesResponse DriverGestaltSupportedMediaTypesResponse;
  430. /*__________________________________________________________________________________*/
  431. /* Open Firmware Boot support  and Open Firmware Booting support */
  432. /*
  433.     The kdgOpenFirmwareBootSupport selector is used to get information about boot support 
  434.     for the driver/device.  The kdgOpenFirmwareBootingSupport is used during the boot
  435.     process to allow booting from partitions that Open Firmware may not be able to read
  436.     directly (i.e. Disk Array partitions, encrypted partitions, compressed partitions, etc..)
  437.     
  438.     The driver will return the bootPartitionQualifier value in the driverGestaltResponse 
  439.     field of the DriverGestaltParam and will return the exact partition map entry for
  440.     the boot partition in the driverGestaltResponse1 field of the DriverGestaltParam if
  441.     kOFBootSpecifiedPartition is returned in the driverGestaltResponse.
  442.     The number that is returned for the bootPartitionMapEntry field if the kOFBootSpecifiedPartition 
  443.     is returned is the partition map entry number for the partition. (i.e. If the partition map entry
  444.     for the boot partition is the 2nd partition entry in the partition map, the bootPartitionMapEntry
  445.     field would be set to 2.  If the partition map entry for the boot partition is the 3rd partition 
  446.     map, the bootPartitionMapEntry field would be set to 3 and etc.)
  447. */
  448. struct DriverGestaltOFBootSupportResponse {
  449.     UInt32                          bootPartitionQualifier;     /*    The exact level of booting that the driver and device supports */
  450.     UInt32                          bootPartitionMapEntry;      /*    The Partition Map entry for the boot partition if applicable */
  451. };
  452. typedef struct DriverGestaltOFBootSupportResponse DriverGestaltOFBootSupportResponse;
  453. /* Levels of boot support that the driver/device supports */
  454. /* These values are used in the bootPartitionQualifier field of the DriverGestaltOFBootSupportResponse */
  455. enum {
  456.     kOFBootAnyPartition         = 1,
  457.     kOFBootSpecifiedPartition   = 2,
  458.     kOFBootNotBootable          = 3,
  459.     kOFBootNotPartitioned       = 4
  460. };
  461. /*__________________________________________________________________________________*/
  462. /* CD-ROM Specific */
  463. /* The CDDeviceCharacteristics result is returned in csParam[0] and csParam[1] of a 
  464.    standard CntrlParam parameter block called with csCode kdgGetCDDeviceInfo.
  465. */
  466. struct CDDeviceCharacteristics {
  467.     UInt8                           speedMajor;                 /* High byte of fixed point number containing drive speed */
  468.     UInt8                           speedMinor;                 /* Low byte of "" CD 300 == 2.2, CD_SC == 1.0 etc. */
  469.     UInt16                          cdFeatures;                 /* Flags field for features and transport type of this CD-ROM */
  470. };
  471. typedef struct CDDeviceCharacteristics  CDDeviceCharacteristics;
  472. enum {
  473.     cdFeatureFlagsMask          = 0xFFFC,                       /* The Flags are in the first 14 bits of the cdFeatures field */
  474.     cdTransportMask             = 0x0003                        /* The transport type is in the last 2 bits of the cdFeatures field */
  475. };
  476. /* Flags for CD Features field */
  477. enum {
  478.     cdPowerInject               = 0,                            /* device supports power inject of media*/
  479.     cdNotPowerEject             = 1,                            /* device does not support power eject of media*/
  480.     cdMute                      = 2,                            /* device supports audio channels muting*/
  481.     cdLeftToChannel             = 3,                            /* device supports left channel only mono audio*/
  482.     cdRightToChannel            = 4,                            /* device supports right channel only mono audio*/
  483.     cdLeftPlusRight             = 5,                            /* device supports left + right channels mono audio*/
  484.     cdSCSI_2                    = 10,                           /* device supports SCSI2 command set (SCSI only)*/
  485.     cdStereoVolume              = 11,                           /* device supports independent volume per channel*/
  486.     cdDisconnect                = 12,                           /* device supports disconnect / reconnect (SCSI only)*/
  487.     cdWriteOnce                 = 13,                           /* device is a write-once type of drive*/
  488.     cdPowerInject_Mask          = 1 << cdPowerInject,
  489.     cdNotPowerEject_Mask        = 1 << cdNotPowerEject,
  490.     cdMute_Mask                 = 1 << cdMute,
  491.     cdLeftToChannel_Mask        = 1 << cdLeftToChannel,
  492.     cdRightToChannel_Mask       = 1 << cdRightToChannel,
  493.     cdLeftPlusRight_Mask        = 1 << cdLeftPlusRight,
  494.     cdSCSI_2_Mask               = 1 << cdSCSI_2,
  495.     cdStereoVolume_Mask         = 1 << cdStereoVolume,
  496.     cdDisconnect_Mask           = 1 << cdDisconnect,
  497.     cdWriteOnce_Mask            = 1 << cdWriteOnce
  498. };
  499. /* Transport types */
  500. enum {
  501.     cdCaddy                     = 0,                            /* CD_SC,CD_SC_PLUS,CD-300 etc. - power eject only*/
  502.     cdTray                      = cdPowerInject_Mask,           /* CD_300_PLUS etc. - power inject only*/
  503.     cdLid                       = cdNotPowerEject_Mask          /* Power CD - no power inject/no power eject*/
  504. };
  505. /* the following are used by PC Exchange (and Apple DOS/PC Compatibility Card)*/
  506. /* Control Codes*/
  507. enum {
  508.     kRegisterPartition          = 50,                           /* PCX needs a new Drive (for a non-macintosh partition found on the disk)*/
  509.     OLD_REGISTER_PARTITION      = 301,                          /* left in for compatibility with shipping Apple DOS/PC Compatibility Card*/
  510.     THE_DRIVE                   = 0,                            /* DrvQElPtr for the partition to register*/
  511.     THE_PHYS_START              = 1,                            /* The start of the partition in logical blocks*/
  512.     THE_PHYS_SIZE               = 2,                            /* The size of the partition in logical blocks*/
  513.     kGetADrive                  = 51,                           /* control call to ask the driver to create a drive*/
  514.     OLD_GET_A_DRIVE             = 302,                          /* left in for compatibility with shipping Apple DOS/PC Compatibility Card*/
  515.     THE_VAR_QUEL                = 0,                            /* a VAR parameter for the returned DrvQElPtr*/
  516.     kProhibitMounting           = 52,                           /* Dont allow mounting of the following drives*/
  517.     kOldProhibitMounting        = 2100,                         /* left in for compatibility with shipping Apple DOS/PC Compatibility Card*/
  518.     kProhibitDevice             = 0,                            /* CS Param 0 and 1 (partInfoRecPtr)*/
  519.     kIsContainerMounted         = 53,
  520.     kOldIsContainerMounted      = 2201,                         /* left in for compatibility with shipping Apple DOS/PC Compatibility Card         */
  521.     kContainerVRef              = 0,                            /* CS Param 0 and 1 (VRefNum)*/
  522.     kContainerParID             = 1,                            /* CS Param 2 and 3 (Parent ID)*/
  523.     kContainerName              = 2,                            /* CS Param 4 and 5 (File Name)*/
  524.     kContainerResponse          = 3,                            /* CS Param 6 and 7 (VAR pointer to short result)*/
  525.     kMountVolumeImg             = 54,
  526.     OLD_MOUNT_VOLUME_IMG        = 2000,
  527.     MV_HOST_VREFNUM             = 0,
  528.     MV_HOST_PAR_ID              = 1,
  529.     MV_HOST_NAME                = 2,
  530.     MV_REQ_PERM                 = 3
  531. };
  532. /* Status Codes*/
  533. enum {
  534.     kGetPartitionStatus         = 50,                           /* what is the status of this partition?*/
  535.     kOldGetPartitionStatus      = 2200,                         /* left in for compatibility with shipping Apple DOS/PC Compatibility Card*/
  536.     kDeviceToQuery              = 0,                            /* CS Param 0 and 1 (partInfoRecPtr)*/
  537.     kDeviceResponse             = 1,                            /* CS Param 2 and 3 (VAR pointer to short result)*/
  538.     kGetPartInfo                = 51,                           /* Get a partition info record based on the provided vrefnum*/
  539.     kOldGetPartInfo             = 2300,                         /* left in for compatibility with shipping Apple DOS/PC Compatibility Card*/
  540.     kPartInfoResponse           = 0,                            /* var parameter (pointer to partInfoRec) CSParam [0-1]*/
  541.     kGetContainerAlias          = 52,                           /* Get the alias that describes the file this drive was mounted from.*/
  542.     kOldGetContainerAlias       = 2400,                         /* left in for compatibility with shipping Apple DOS/PC Compatibility Card*/
  543.     kGetAliasResponse           = 0                             /*    var parameter (pointer to a Handle) CSParam [0-1]*/
  544. };
  545. /* the result codes to come from the driver interface */
  546. enum {
  547.     DRIVER_NOT_INSTALLED        = -1,
  548.     DRIVER_BUSY                 = -2,
  549.     CANT_MOUNT_WITHIN_THIS_FS   = -3,                           /* can only mount container within residing on HFS volume*/
  550.     VOLUME_ALREADY_MOUNTED      = -4                            /* Already Mounted*/
  551. };
  552. /* requisite structures for PCX control and status calls*/
  553. enum {
  554.     kMaxProhibted               = 2                             /* the max number of volumes the PC can possibly have mounted*/
  555. };
  556. /* GestaltSelector for Finding Driver information*/
  557. enum {
  558.     kGetDriverInfo              = FOUR_CHAR_CODE('vdrc')
  559. };
  560. enum {
  561.     VerifyCmd                   = 5,
  562.     FormatCmd                   = 6,
  563.     EjectCmd                    = 7
  564. };
  565. /* Partition information passed back and forth between PCX and the driver*/
  566. struct partInfoRec {
  567.     DeviceIdent                     SCSIID;                     /* DeviceIdent for the device*/
  568.     UInt32                          physPartitionLoc;           /* physical block number of beginning of partition*/
  569.     UInt32                          partitionNumber;            /* the partition number of this partition*/
  570. };
  571. typedef struct partInfoRec              partInfoRec;
  572. typedef partInfoRec *                   partInfoRecPtr;
  573. struct vPartInfoRec {
  574.     UInt8                           VPRTVers;                   /* Virtual partition version number*/
  575.     UInt8                           VPRTType;                   /* virtual partition type (DOS, HFS, etc)*/
  576.     SInt16                          drvrRefNum;                 /* Driver Reference number of partition driver*/
  577. };
  578. typedef struct vPartInfoRec             vPartInfoRec;
  579. typedef vPartInfoRec *                  vPartInfoRecPtr;
  580. /* Information related to DOS partitions*/
  581. enum {
  582.     kDOSSigLow                  = 0x01FE,                       /* offset into boot block for DOS signature*/
  583.     kDOSSigHi                   = 0x01FF,                       /* offset into boot block for DOS signature*/
  584.     kDOSSigValLo                = 0x55,                         /* DOS signature value in low byte*/
  585.     kDOSSigValHi                = 0xAA                          /* DOS signature value in high byte*/
  586. };
  587. #if PRAGMA_STRUCT_ALIGN
  588.     #pragma options align=reset
  589. #elif PRAGMA_STRUCT_PACKPUSH
  590.     #pragma pack(pop)
  591. #elif PRAGMA_STRUCT_PACK
  592.     #pragma pack()
  593. #endif
  594. #ifdef PRAGMA_IMPORT_OFF
  595. #pragma import off
  596. #elif PRAGMA_IMPORT
  597. #pragma import reset
  598. #endif
  599. #ifdef __cplusplus
  600. }
  601. #endif
  602. #endif /* __DRIVERGESTALT__ */