SCSITypes.pas
上传用户:wanyu_2000
上传日期:2021-02-21
资源大小:527k
文件大小:32k
源码类别:

DVD

开发平台:

Delphi

  1. {-----------------------------------------------------------------------------
  2.  Unit Name: SCSITypes
  3.  Author:    Sergey Kabikov
  4.  Purpose:   SCSI Types
  5.  History:  Some Types by Sergey Kabikov based on his code ASPI/SCSI Library
  6.     Added to by Dancemammal
  7. -----------------------------------------------------------------------------}
  8. unit SCSITypes;
  9. interface
  10. uses Windows, Wnaspi32;
  11. const
  12.   ScsiModePageParamsLength = 255;
  13.   ScsiModeTemplateParamsLength = ScsiModePageParamsLength + 128;
  14.   CDSTATUS_READ_CD_R = 1; // Device is capable to read CD-R media
  15.   // as defined in Orange Book Part II
  16.   CDSTATUS_READ_CD_RW = 2; // Device is capable to read CD-RW media
  17.   // as defined in Orange Book Part III
  18.   CDSTATUS_READ_METHOD2 = 4; // Device is capable to read CD-R written
  19.   // using fixed packet tracks (Addressing Method 2)
  20.   CDSTATUS_READ_DVD_ROM = 8; // Device is capable to read DVD media
  21.   CDSTATUS_READ_DVD_R = $10; // Device is capable to read DVD-R media
  22.   CDSTATUS_READ_DVD_RAM = $20; // Device is capable to read DVD-RAM media
  23.   // ====== Bit constants for TScsiModePageCdStatus.Flags[1] ======
  24.   CDSTATUS_WRITE_CD_R = 1; // Device is capable to write CD-R media
  25.   CDSTATUS_WRITE_CD_RW = 2; // Device is capable to write CD-RW media
  26.   CDSTATUS_TEST_MODE = 4; // If this flag is set, device shall only
  27.   // accept data and not write to the media
  28.   CDSTATUS_WRITE_DVD_R = $10; // Device is capable to write DVD-R media
  29.   CDSTATUS_WRITE_DVD_RAM = $20; // Device is capable to write DVD-RAM media
  30.   // ====== Bit constants for TScsiModePageCdStatus.Flags[2] ======
  31.   CDSTATUS_AUDIO_PLAY = 1; // Device is capable to AUDIO PLAY
  32.   CDSTATUS_AUDIO_COMPOSITE = 2; // Device is capable of delivering a
  33.   // composite audio and video data stream
  34.   CDSTATUS_AUDIO_DIGIPORT1 = 4; // Device supports digital output
  35.   CDSTATUS_AUDIO_DIGIPORT2 = 8; //   (IEC958) on port 1/2
  36.   CDSTATUS_READ_MODE2_FORM1 = $10; // Device is capable to read Mode 2
  37.   // Form 1 fomat (eXtended Audio, CD-XA format)
  38.   CDSTATUS_READ_MODE2_FORM2 = $20; // Device is capable to read Mode 2
  39.   // Form 2 format
  40.   CDSTATUS_READ_MULTISESSION = $40; // Device is capable to read PhotoCD
  41.   // format with multiple sessions on disc
  42.   CDSTATUS_BURN_PROOF = $80; // DEVICE HAS BURN PROOF INSTALLED ??
  43.   // ====== Bit constants for TScsiModePageCdStatus.Flags[3] ======
  44.   CDSTATUS_CDDA_CAPABLE = 1; // Device supports an audio CD
  45.   // (Red Book) reading using READ CD command
  46.   CDSTATUS_CDDA_STREAM_ACCURATE = 2; // Device returns to an audio
  47.   // location without losing place to continue reading
  48.   CDSTATUS_CDDA_RW_SUPPORT = 4; // Device supports an audio CD
  49.   // subchannel combined R-W information reading
  50.   CDSTATUS_CDDA_RW_CORRECTED = 8; // The R-W subchannel data will
  51.   // be returned de-interleaved and error-corrected
  52.   CDSTATUS_CDDA_C2_POINTERS = $10; // Device is capable to return
  53.   // C2 Error Pointers and C2 Block Error Flags
  54.   CDSTATUS_CDDA_ISRC = $20; // Device can return the
  55.   // International Standard Recording Code information
  56.   CDSTATUS_CDDA_UPC = $40; // Device can return the
  57.   // Media Catalog Number (UPC) for an audio CD
  58.   CDSTATUS_CDDA_BARCODE = $80; // Device can read disc bar code
  59.   // ====== Bit constants for TScsiModePageCdStatus.Flags[4] ======
  60.   CDSTATUS_LOCK_CAPABLE = 1; // Device is capable to execute the
  61.   // PREVENT/ALLOW MEDIA REMOVAL command and performs
  62.   // an actually locking the media into drive
  63.   CDSTATUS_LOCK_STATE = 2; // Current state of device (1=locked)
  64.   CDSTATUS_PREVENT_JUMPER = 4; // Current state of the (optional)
  65.   // Prevent/Allow media removal jumper.
  66.   CDSTATUS_EJECT_CAPABLE = 8; // Device is capable to eject media
  67.   // via the START/STOP command with LoEj bit set.
  68. // ====== Bit constants for TScsiModePageCdStatus.Flags[5] ======
  69.   CDSTATUS_SEPARATE_VOLUME = 1; // Device supports the separate audio
  70.   // level control for each channel
  71.   CDSTATUS_SEPARATE_MUTE = 2; // Device supports the independent
  72.   // mute capability for each channel
  73.   CDSTATUS_REPORTS_HAVE_DISK = 4; // The response to the MECHANISM STATUS
  74.   // command will contain valid DiscPresent field.
  75.   CDSTATUS_SLOT_SELECTION = 8; // Controls the behavior of LOAD/UNLOAD
  76.   // command when trying to load a Slot with no disc
  77.   CDSTATUS_SIDE_CHANGE = $10; // Device is capable to select both
  78.   // sides of disc (for disc changers only)
  79.   CDSTATUS_CDDA_RW_LEAD_IN = $20; // Device supports an audio CD R-W
  80.   // subchannel information reading from the Lead-in
  81. // ====== Bit constants for TScsiModePageCdStatus.DigiPortFormat ======
  82.   CDSTATUS_DIGIPORT_BCKF = 2; // Port data valid on rising(0) or
  83.   // falling(1) edge of BCK signal.
  84.   CDSTATUS_DIGIPORT_RCK = 4; // HIGH on LRCK indicates right(0)
  85.   // or left(1) channel.
  86.   CDSTATUS_DIGIPORT_LSBF = 8; // Data are sent MSB(0) or LSB(1) first.
  87.   CDSTATUS_DIGIPORT_BCKLEN0 = $10; //  Two bits indicates length in BCKs :
  88.   CDSTATUS_DIGIPORT_BCKLEN1 = $20; //   00=32, 01=16, 10=24, 11=24(FS)
  89. type
  90.   TBurnerID = DWORD;
  91. type
  92.   TCDBurnerInfo = record
  93.     DriveIndex: Integer;
  94.     DriveLetter: Char;
  95.     DriveID: DWORD;
  96.     ProductID: string;
  97.     VendorID: string;
  98.     VendorName: string;
  99.     VendorSpec: string;
  100.     Revision: string;
  101.     SptiHandle: THandle;
  102.     HaId: Byte;
  103.     Target: Byte;
  104.     Lun: Byte;
  105.   end;
  106.   TCdRomModePageType = (MPTcurrent, MPTchangeable, MPTdefault, MPTsaved);
  107. type
  108.   TScsiError = {======== Errors from SRB_Status field ========}
  109.   (Err_None, Err_Aborted, Err_InvalidRequest,
  110.     Err_HAerror, Err_InvalidHostAdapter, Err_NoDevice,
  111.     Err_InvalidSrb, Err_BufferAlign, Err_AspiIsBusy,
  112.     Err_BufferTooBig, Err_Unknown,
  113.     {======== Errors from SRB_HaStat field ========}
  114.     Err_CommandTimeout,
  115.     Err_SrbTimeout,
  116.     Err_MessageReject,
  117.     Err_BusReset,
  118.     Err_ParityError,
  119.     Err_RequestSenseFailed,
  120.     Err_SelectionTimeout,
  121.     Err_DataOverrun, //... or underrun
  122.     Err_UnexpectedBusFree,
  123.     Err_BusPhaseSequence, //... failure
  124.     {======== Errors from SRB_TargStat field ========}
  125.     Err_CheckCondition,
  126.     Err_TargetBusy,
  127.     Err_TargetReservationConflict,
  128.     Err_TargetQueueFull,
  129.     {======== Errors of SendScsiCommand ========}
  130.     Err_InvalidDevice, // Trying to exec SCSI command for non-exist device
  131.     Err_NoEvent, // Unable to get event handle for notification
  132.     Err_NotifyTimeout, // WaitForSingleObject result was unacceptable
  133.     {======== Errors of SCSIxxxx() procedures =======}
  134.     Err_InvalidArgument,
  135.     {======== Errors from SRB_Sense area ========}
  136.     Err_SenseUnknown, // Unknown SRB_Sense.ErrorCode value
  137.     Err_SenseFileMark,
  138.     Err_SenseEndOfMedia,
  139.     Err_SenseIllegalLength,
  140.     Err_SenseIncorrectLength,
  141.     Err_SenseNoSense, // There is no sense key info to be reported
  142.     Err_SenseRecoveredError, // Last command completed successfully with
  143.     // some recovery action performed by the target.
  144.     Err_SenseNotReady, // Unit addressed cannot be accessed.
  145.     //  Operator intervention may be required.
  146.     Err_SenseMediumError, // Command terminated with a non-recovered
  147.     // error condition that was probably caused by a flaw
  148.     // in the medium or an error in the recorded data.
  149.     Err_SenseHardwareError, // Non-recoverable hardware failure detected
  150.     Err_SenseIllegalRequest, // Illegal parameter detected in the command
  151.     // descriptor block or in the additional parameters.
  152.     Err_SenseUnitAttention, // Removable medium may have been changed or
  153.     // the target has been reset.
  154.     Err_SenseDataProtect, // Read/Write Command was applied to the
  155.     // block that is protected from this operation.
  156.     Err_SenseBlankCheck, // Write-once device or a sequential-access
  157.     // device encountered blank medium or end-of-data
  158.     // indication while reading or a write-once device
  159.     // encountered a non-blank medium while writing.
  160.     Err_SenseVendorSpecific,
  161.     Err_SenseCopyAborted, // COPY, COMPARE, or COPY AND VERIFY command
  162.     // was aborted due to an error condition on the source
  163.     // device, the destination device, or both.
  164.     Err_SenseAbortedCommand, // Target aborted the command. Host may be
  165.     // able to recover by trying the command again.
  166.     Err_SenseEqual, // SEARCH DATA has satisfied an equal comparison.
  167.     Err_SenseVolumeOverflow, // Buffered peripheral device has reached
  168.     // the end-of-partition and data may remain in the
  169.     // buffer that has not been written to the medium.
  170.     // RECOVER BUFFERED DATA command may be issued to read
  171.     // the unwritten data from the buffer.
  172.     Err_SenseMiscompare, // Source data did not match the data read
  173.     // from the medium.
  174.     Err_SenseReserved
  175.     );
  176.   PScsiDefaults = ^TScsiDefaults;
  177.   TASPIcommandSendingEvent = procedure(
  178.     DeviceID: TCDBurnerInfo;
  179.     Pcdb: pointer;
  180.     CdbLen: DWORD;
  181.     Pbuf: pointer;
  182.     BufLen: DWORD;
  183.     Direction: DWORD;
  184.     pSDF: PScsiDefaults;
  185.     AspiResult: TScsiError) of object;
  186.   TScsiDefaults = record
  187.     Timeout: DWORD; // Timeout for all "fast" commands in milliseconds
  188.     ReadTimeout: DWORD; // Same for CD media reading commands
  189.     AudioTimeout: DWORD; // Same for audio CD commands
  190.     SpindleTimeout: DWORD; // Same for SCSIstartStopUnit()
  191.     fOnCommandSending, // ASPIsendScsiCommand() logging events
  192.     fOnCommandSent: TASPIcommandSendingEvent;
  193.     ModePageType: TCdRomModePageType; // For MODE SENSE/MODE SELECT cmds
  194.     Sense: TscsiSenseInfo; // Command resulting Sense info
  195.   end;
  196. type
  197.   TLogicalUnitWriteSpeedTable = packed record
  198.     Reserved: Byte;
  199.     RotationControl: Byte;
  200.     WriteSpeedSupported: Word;
  201.   end;
  202.   TModeParametersHeader = packed record
  203.     ModeDataLength: Word;
  204.     Reserved1: Byte;
  205.     Reserved2: Byte;
  206.     Reserved3: Byte;
  207.     Reserved4: Byte;
  208.     BlockDescriptorLength: Word;
  209.   end;
  210. type
  211.   TScsiModePageCdStatus = packed record
  212.     // ModeParametersHeader : TModeParametersHeader;  //8
  213.     PSPageCode: byte; {PS bit 7} {PageCode bits 0-6}
  214.     PageLength: byte; {=$32}
  215.     // Resv                 : array[0..6] of BYTE;
  216.     Flags: array[0..5] of BYTE; // BitSet - see above
  217.     MaxReadSpeed: WORD; // Obsolete
  218.     MaxVolumeLevels: WORD; // Number of discrete levels for audio volume.
  219.     // If the device only supports turning audio on
  220.     // and off, this field shall be set to 2.
  221.     MaxBufferSize: WORD; // Size of buffer dedicated to the data stream
  222.     // in kilobytes. Zero means device have no cache.
  223.     CurrentReadSpeed: WORD; // Obsolete
  224.     Reserved3: BYTE;
  225.     DigiPortFormat: BYTE; // BitSet - see above. Dexcribes the format
  226.     // of digital output (IEC958). Valid only if one
  227.     // of CDSTATUS_AUDIO_DIGIPORTn flags is set.
  228.     MaxWriteSpeed: WORD; // Obsolete
  229.     CurWriteSpeed_Res: WORD; // Obsolete
  230.     CopyMgRevision: WORD; // Copy Management Revision Version supported
  231.     // by device (DVD devices only, zero for all others)
  232.     Reserved6: BYTE;
  233.     Reserved7: BYTE;
  234.     RotationControlSpeed: Byte;
  235.     CurrentWriteSpeed: Word;
  236.     NoWriteSpeedDescTables: Word;
  237.     WriteSpeeds: array[0..99] of TLogicalUnitWriteSpeedTable;
  238.   end;
  239. type
  240.   PScsiModePageRecord = ^TScsiModePageRecord;
  241.   TScsiModePageRecord = packed record
  242.     PageCode: BYTE; // six LSBs of page code plus
  243.     //  MSbit is PSAV flag (MODE SENSE only)
  244.     ParamLength: BYTE;
  245.     Params: array[0..ScsiModePageParamsLength - 1] of BYTE;
  246.   end;
  247. type
  248.   TScsiModePageTemplate10 = packed record
  249.     ModeDataLength10: WORD; // full record length except itself
  250.     MediumType10: BYTE; // Reserved - OBSOLETE
  251.     DeviceSpecific10: BYTE; // Reserved - OBSOLETE
  252.     Reserved10: WORD;
  253.     DescriptorLength10: WORD; // equal to 8*Number of Block Descriptors
  254.     // must be zero when DBD = TRUE
  255.     Params10: array[0..ScsiModeTemplateParamsLength - 1] of BYTE;
  256.   end;
  257. type
  258.   TScsiModePageTemplate2 = packed record
  259.     ModeDataLength10: WORD; // full record length except itself
  260.     MediumType10: BYTE; // Reserved - OBSOLETE
  261.     DeviceSpecific10: BYTE; // Reserved - OBSOLETE
  262.     Reserved10: WORD;
  263.     DescriptorLength10: WORD; // equal to 8*Number of Block Descriptors
  264.     // must be zero when DBD = TRUE
  265.     Params10: array[0..51] of BYTE;
  266.   end;
  267. type
  268.   TScsiModePageTemplate6 = packed record
  269.     ModeDataLength6: BYTE; // full record length except itself
  270.     MediumType6: BYTE; // Reserved - OBSOLETE
  271.     DeviceSpecific6: BYTE; // Reserved - OBSOLETE
  272.     DescriptorLength6: BYTE; // equal to 8*Number of Block Descriptors
  273.     // must be zero when DBD=TRUE
  274.     Params6: array[0..ScsiModeTemplateParamsLength - 1] of BYTE;
  275.   end;
  276. type
  277.   TScsiModePageTemplate = packed record
  278.     case boolean of
  279.       True: (
  280.         ModeDataLength6: BYTE; // full record length except itself
  281.         MediumType6: BYTE; // Reserved - OBSOLETE
  282.         DeviceSpecific6: BYTE; // Reserved - OBSOLETE
  283.         DescriptorLength6: BYTE; // equal to 8*Number of Block Descriptors
  284.         // must be zero when DBD=TRUE
  285.         Params6: array[0..ScsiModeTemplateParamsLength - 1] of BYTE);
  286.       False: (
  287.         ModeDataLength10: WORD; // full record length except itself
  288.         MediumType10: BYTE; // Reserved - OBSOLETE
  289.         DeviceSpecific10: BYTE; // Reserved - OBSOLETE
  290.         Reserved10: WORD;
  291.         DescriptorLength10: WORD; // equal to 8*Number of Block Descriptors
  292.         // must be zero when DBD=TRUE
  293.         Params10: array[0..ScsiModeTemplateParamsLength - 1] of BYTE);
  294.   end;
  295. type
  296.   TScsiPeripheralQualifier = (
  297.     SPQconnected, // Peripheral device type is currently connected to this
  298.     // logical unit. Especially for hot-swap devices. All fixed
  299.     // devices shall also use this peripheral qualifier.
  300.     SPQavailable, // The target is capable of supporting the device;
  301.     // however, the physical device is not currently connected.
  302.     SPQreserved2, // Reserved.
  303.     SPQabsent, // The target is not capable of supporting a physical
  304.     // device on this LUN. It's illegal LUN for all commands.
  305.     SPQvendor4, SPQvendor5, SPQvendor6, SPQvendor7); // Vendor-specific codes.
  306.   TScsiAnsiCompliance = (
  307.     SANSInone, // The device does not claims compliance to any standard
  308.     SANSIversion1, // The device complies to ANSI SCSI-1
  309.     SANSIversion2, // The device complies to ANSI SCSI-2
  310.     SANSIversion3, // The device complies to ANSI SCSI-3
  311.     SANSIversion3a, // The device complies to ANSI SCSI-3 SPC-2/MMC-2
  312.     SANSIreserved5, SANSIreserved6, SANSIreserved7);
  313.   TScsiStandardCompliance = packed record
  314.     ANSI: TScsiAnsiCompliance; // ANSI SCSI standard compliance level
  315.     ECMA: BYTE; // 0=no compliance, 1=complies to ECMA-111
  316.     ISO: BYTE; // 0=no compliance, 1=complies to ISO 9316:1995
  317.   end;
  318.   TScsiCommandSupportLevel = (
  319.     SCSLunknown, // data about the command support is not available
  320.     SCSLnosupport, // The requested command code is NOT supported
  321.     SCSLreserved2,
  322.     SCSLstandard, // Device supports the command in a standard manner
  323.     SCSLreserved4,
  324.     SCSLvendor, // Device supports the command in a vendor-specific
  325.     // manner. All fields of TScsiCommandInfo are valid.
  326.     SCSLreserved6, SCSLreserved7);
  327. type
  328.   TScsiDeviceCapabilities = set of (
  329.     SDCremovableMedium, // Medium is removable
  330.     SDCasyncEvent, // Asynchronous event reporting support
  331.     SDCnormalACA, // Setting bit NACA in CDB to 1 support
  332.     SDChierarchical, // Hierarchical addressing model support
  333.     SDCsupportSCC, // Device contains an embedded storage array
  334.     // controller (see SCSI-3 SCC-2 for details)
  335.     SDCcommandQueuing, // tagged command queuing (all types) support
  336.     SDCbasicQueuing, // command queuing basic task set support
  337.     SDCenclosure, // Device contains an embedded enclosure services
  338.     // component (see SCSI-3 SES for details)
  339.     SDCmultiPort, // Device conforms to multi-port requirements
  340.     SDCmediumChanger, // Device contains a meduim transport element
  341.     SDCrelativeAddress, // Linked commands may use relative addressing
  342.     SDClinkedCommands, // Execution of linked commands support
  343.     SDCwideBus16, // 16-bit wide data transfers support (SPI-3 only)
  344.     SDCaddress16, // 16-bit SCSI addressing support (SPI-3 only)
  345.     SDCsynchTransfer, // Synchronous data transfers support (SPI-3 only)
  346.     SDCtransferDisable // CONTINUE TASK and TARGET TRANSFER DISABLE
  347.     ); // messages support (SPI-3 only)
  348. type
  349.   TScsiDeviceInfo = packed record
  350.     PeriphQualifier: TScsiPeripheralQualifier;
  351.     DeviceType: TScsiDeviceType;
  352.     Version: TScsiStandardCompliance;
  353.     Capabilities: TScsiDeviceCapabilities;
  354.     ResponseDataFormat: BYTE; // indicates the INQUIRY data format is:
  355.     // 0 = as specified in SCSI-1,
  356.     // 1 = products that were designed prior to the SCSI-2,
  357.     // 2 = as specified in SCSI-2 or SCSI-3,
  358.     // 3..0Fh = reserved.
  359.     VendorID: string[8];
  360.     ProductID: string[16];
  361.     ProductRev: string[4]; // Hardware/firmware revision code
  362.     VendorSpecific: string[20];
  363.     DriveLetter: Char;
  364.   end;
  365. type
  366.   TCdRomCapability =
  367.     (cdcReadCDR, // Device is capable to read CD-R media,
  368.     // see CDSTATUS_READ_CD_R constant
  369.     cdcReadCDRW, // --""-- CD-RW media, CDSTATUS_READ_CD_RW
  370.     cdcReadMethod2, // --""-- CD-R written using fixed packet
  371.     // tracks, CDSTATUS_READ_METHOD2
  372.     cdcReadDVD, // --""-- DVD media, CDSTATUS_READ_DVD_ROM
  373.     cdcReadDVDR, // --""-- DVD-R media, CDSTATUS_READ_DVD_R
  374.     cdcReadDVDRAM, // --""-- DVD-RAM media, CDSTATUS_READ_DVD_RAM
  375.     // ====== Bit constants for TScsiModePageCdStatus.Flags[1] ======
  376.     cdcWriteCDR, // Device is capable to write CD-R media,
  377.     // see CDSTATUS_WRITE_CD_R constant
  378.     cdcWriteCDRW, // --""-- CD-RW media, CDSTATUS_WRITE_CD_RW
  379.     cdcWriteDVDR, // --""-- DVD-R media, CDSTATUS_WRITE_DVD_R
  380.     cdcWriteDVDRAM, // --""-- DVD-RAM media, CDSTATUS_WRITE_DVD_RAM
  381.     cdcWriteTestMode, // Device is in test mode, CDSTATUS_TEST_MODE
  382.     cdcWriteBurnProof, // Device Has Burn Proof, CDSTATUS_BURN_PROOF
  383.     // ====== Bit constants for TScsiModePageCdStatus.Flags[2] ======
  384.     cdcAudioPlay, // Device is capable to audio media playback,
  385.     // see CDSTATUS_AUDIO_PLAY constant
  386.     cdcAudioComposite, // Device is capable of delivering a composite
  387.     // audio/video stream, CDSTATUS_AUDIO_COMPOSITE
  388.     cdcAudioDigiPort1, // Device supports digital output on port 1,
  389.     // CDSTATUS_AUDIO_DIGIPORT1
  390.     cdcAudioDigiPort2, // --""-- on port 2, CDSTATUS_AUDIO_DIGIPORT2
  391.     cdcReadMode2form1, // Device is capable to read Mode 2 Form 1
  392.     // (CD-XA format), CDSTATUS_READ_MODE2_FORM1
  393.     cdcReadMode2form2, // --""-- Form 2,  CDSTATUS_READ_MODE2_FORM2
  394.     cdcReadMultisession, // Device is capable to read PhotoCD format
  395.     // with multiple sessions on disc, CDSTATUS_READ_MULTISESSION
  396. // ====== Bit constants for TScsiModePageCdStatus.Flags[3] ======
  397.     cdcCDDAread, // Device supports an audio CD reading using
  398.     // READ CD command, CDSTATUS_CDDA_CAPABLE
  399.     cdcCDDAaccurate, // Device returns to an audio location without
  400.     // losing place, CDSTATUS_CDDA_STREAM_ACCURATE
  401.     cdcSubchannelRW, // Device supports an audio CD subchannel R-W
  402.     // data reading, CDSTATUS_CDDA_RW_SUPPORT
  403.     cdcSubchannelCorrect, // The subchannel data will be de-interleaved
  404.     // error-corrected, CDSTATUS_CDDA_RW_CORRECTED
  405.     cdcC2Pointers, // Device is capable to return C2 Error Pointers
  406.     // and C2 Block Error Flags, CDSTATUS_CDDA_C2_POINTERS
  407.     cdcCddaISRC, // Device can return ISRC, CDSTATUS_CDDA_ISRC
  408.     cdcCddaUPC, // --""-- UPC,  CDSTATUS_CDDA_UPC
  409.     cdcCddaBarCode, // --""-- disc bar code, CDSTATUS_CDDA_BARCODE
  410.     // ====== Bit constants for TScsiModePageCdStatus.Flags[4] ======
  411.     cdcLock, // Device is capable to locking the media into
  412.     // drive, CDSTATUS_LOCK_CAPABLE
  413.     cdcLocked, // Media is locked, CDSTATUS_LOCK_STATE
  414.     cdcLockJumper, // Current state of the (optional) lock jumper,
  415.     // CDSTATUS_PREVENT_JUMPER
  416.     cdcEject, // Device is capable to eject media,
  417.     // CDSTATUS_EJECT_CAPABLE
  418. // ====== Bit constants for TScsiModePageCdStatus.Flags[5] ======
  419.     cdcSeparateVolume, // Audio level control is separate for each
  420.     // channel, CDSTATUS_SEPARATE_VOLUME
  421.     cdcSeparateMute, // same for mute, CDSTATUS_SEPARATE_MUTE
  422.     cdcDiskSensor, // MECHANISM STATUS/DiscPresent field is valid,
  423.     // CDSTATUS_REPORTS_HAVE_DISK
  424.     cdcSlotSelect, // Behavior of LOAD/UNLOAD command control,
  425.     // CDSTATUS_SLOT_SELECTION
  426.     cdcSideChange, // disc changers only, CDSTATUS_SIDE_CHANGE
  427.     cdcCddaRwLeadIn); // Device supports an audio CD R-W subchannel
  428.   // from the Lead-in, CDSTATUS_CDDA_RW_LEAD_IN
  429. type
  430.   TCdRomCapabilities = set of TCdRomCapability;
  431. type
  432.   TCDReadWriteSpeeds = packed record
  433.     MaxReadSpeed: byte;
  434.     CurrentReadSpeed: byte;
  435.     MaxWriteSpeed: byte;
  436.     CurrentWriteSpeed: byte;
  437.     BufferSize: Byte;
  438.   end;
  439. type
  440.   TScsiSubQinfoFlags = set of
  441.     // ssqfADRxxx flags are mutually exclusive
  442.   (ssqfADRnone, // Q sub-channel mode information not supplied
  443.     ssqfADRposition, // --"-- encodes track, index, abs. & rel. addresses
  444.     ssqfADRcatalogue, // --"-- encodes Media catalogue number
  445.     ssqfADRISRC, // --"-- encodes ISRC
  446.     ssqfPreEmphasis, // Audio track - recorded w/pre-emphasis of 50/15 uS,
  447.     // Data track  - recorded incremental
  448.     ssqfCopyPermit, // Audio track Digital copy permitted
  449.     ssqfDataTrack, // Track is Data
  450.     ssqfAudioTrack, // Track is Audio
  451.     ssqfQuadAudio); // Track is 4-channel (? - reserved in CD-R/RW)
  452. type
  453.   TScsiTrackDescriptor = packed record
  454.     Flags: TScsiSubQinfoFlags;
  455.     TrackNumber: byte;
  456.     AbsAddress: DWORD;
  457.   end;
  458.   TScsiTOC = packed record
  459.     FirstTrack: integer;
  460.     LastTrack: integer;
  461.     TrackCount: integer; // Total tracks amount
  462.     Tracks: array[0..99] of TScsiTrackDescriptor;
  463.   end;
  464. type
  465.   TScsiSessionInfo = packed record
  466.     Flags: TScsiSubQinfoFlags; // of sector where this TOC entry was found
  467.     FirstSession, // 1st complete session number, should be =1
  468.     LastSession, // last complete session number
  469.     FirstTrack: BYTE; // 1st track in last complete session number
  470.     FirstTrackLBA: DWORD; // ---"--- starting LBA as read from the TOC
  471.   end;
  472. type
  473.   TScsiCDBufferInfo = packed record
  474.     DataLength: Word;
  475.     Reserved1: BYTE;
  476.     Reserved2: BYTE;
  477.     SizeOfBuffer: DWORD;
  478.     BlankLength: DWORD;
  479.   end;
  480. type
  481.   TScsiTrackDescriptorTemplate = packed record
  482.     Reserved1: byte;
  483.     ADR: byte;
  484.     TrackNumber: byte;
  485.     Reserved2: byte;
  486.     AbsAddress: DWORD;
  487.   end;
  488.   TScsiTOCtemplate = packed record
  489.     Length: WORD;
  490.     FirstTrack: byte;
  491.     LastTrack: byte;
  492.     Tracks: array[0..99] of TScsiTrackDescriptorTemplate;
  493.   end;
  494. type
  495.   TCDTextPacket = packed record
  496.     idType: Byte; // packet type
  497.     idTrk: Byte; // track number
  498.     idSeq: Byte; // sequence
  499.     idFlg: Byte; // flags
  500.     txt: array[0..11] of Byte; // Text data (ASCII)
  501.     CRC: array[0..1] of Byte; // CRC (Cyclic Redundancy Check)
  502.   end;
  503. type
  504.   TDiscTrack = record
  505.     StartAddress: DWord;
  506.     StartAddressStr: ShortString;
  507.     Length: DWord;
  508.     LengthStr: ShortString;
  509.     EndAddress: DWord;
  510.     EndAddressStr: ShortString;
  511.     fSizeMB: DWord;
  512.     fType: DWord;
  513.     fTypeStr: ShortString;
  514.   end;
  515. type
  516.   TDiscSession = record
  517.     fSize: DWord;
  518.     fSizeMB: DWord;
  519.     FirstTrack: Byte;
  520.     LastTrack: Byte;
  521.     Tracks: array[1..99] of TDiscTrack;
  522.   end;
  523. type
  524.   TDiscLayout = record
  525.     FirstSession: Byte;
  526.     LastSession: Byte;
  527.     Sessions: array of TDiscSession;
  528.   end;
  529. type
  530.   TCDText = packed record
  531.     dummy: array[0..3] of Byte; // Header
  532.     CDText: array[0..255] of TCDTextPacket; // CD-Text packets
  533.   end;
  534. type
  535.   TScsiReadCdSectorType =
  536.     (csfAnyType, // no checking of data type is performed by device
  537.     csfAudio, // only IEC 908:1987 (CD-DA) sectors
  538.     csfDataMode1, // only Yellow Book (user data of 2048 bytes)
  539.     csfDataMode2, // only Yellow Book (expanded user data of 2336 bytes)
  540.     csfXaForm1, // only CD-XA Mode 2 Form1 (user data of 2048 bytes)
  541.     csfXaForm2); // same, Form2 (user data of 2324 bytes + 4 spare bytes)
  542. type
  543.   TScsiReadCdFormatFlags = set of
  544.     //  Field size in bytes for various modes :
  545. //      Data      XA mode2      CD
  546. //  mode1 mode2  form1 form2  audio
  547.   (cffSync, //   12    12     12    12      --
  548.     cffHeader, //    4     4      4     4      --
  549.     cffSubheader, //   --    --      8     8      --
  550.     cffUserData, //  2048  2336   2048  2324+4  2352
  551.     cffEDCandECC, // 4+8+276 --   4+276   --      --
  552.     cffC2errorBits, //   294   294    294   294     294
  553.     cffBlockErrByte, //   1+1   1+1    1+1   1+1     1+1
  554.     // Subchannel is for all types; this flags are mutually exclusive.
  555.     cffSubchannelRaw, // Raw (not de-interleaved) P-W data
  556.     cffSubchannelQ, // Subchannel Q only
  557.     cffSubchannelPW); // de-interleaved and error-corrected P-W data
  558.   // Helper function. Return value is number of bytes per sector for ReadCD
  559.   //   command, or -1 if combination of arguments is illegal.
  560. type
  561.   TScsiAudioStatus =
  562.     (sasInvalid, // Audio status byte not supported or not valid
  563.     sasPlay, // Audio play operation in progress
  564.     sasPause, // Audio play operation paused
  565.     sasCompleted, // Audio play operation successfully completed
  566.     sasError, // Audio play operation stopped due to error
  567.     sasStop, // No current audio status to return
  568.     sasUnknown); // ASPI returns the 'reserved' code value
  569. type
  570.   TScsiISRC = packed record
  571.     Status: TScsiAudioStatus;
  572.     Flags: TScsiSubQinfoFlags;
  573.     IsrcNumber: string[12]; // ISRC (DIN-31-621) Number, or '' if fails
  574.     FrameNumber: byte; // Number (0..4Ad) of frame where MCN was found
  575.   end;
  576.   // new added dvd functions
  577. type
  578.   TScsiProfileDeviceDiscTypes = record
  579.     TypeNum: Integer;
  580.     DType,
  581.       SubType: string;
  582.   end;
  583. type
  584.   TScsiDVDLayerDescriptor = packed record
  585.     DataLength: Word;
  586.     Reserved1: Byte;
  587.     Reserved2: Byte;
  588.     BookType_PartVersion: Byte; // BookType Nibble
  589.     //    0000    = DVD-ROM = $00
  590.     //    0001    = DVD-RAM = $01
  591.     //    0010    = DVD-R   = $02
  592.     //    0011    = DVD-RW  = $03
  593.     //    1001    = DVD+RW  = $09
  594.     //    1010    = DVD+R   = $0A
  595.     //    Others  = Reserved
  596.     DiscSize_MaximumRate: Byte; // DiscSize Nibble
  597.     //    0000    = 120mm   = $00
  598.     //    0001    = 80mm    = $01
  599.     // MaximumRate Nibble
  600.     //    0000    = 2.52 Mbps     = $00
  601.     //    0001    = 5.04 Mbps     = $01
  602.     //    0010    = 10.08 Mbps    = $02
  603.     //    1111    = Not Specified = $0F
  604.     //    Others  = Reserved
  605.     NumberOfLayers_TrackPath_LayerType: Byte; // LayerType Bit
  606.     //    0 = Layer contains embossed data    = $01
  607.     //    1 = Layer contains recordable area  = $02
  608.     //    2 = Layer contains rewritable area  = $04
  609.     //    3 = Reserved                        = $08
  610.     LinearDensity_TrackDensity: Byte; // LinearDensity Nibble
  611.     //    0000    = 0.267 um/bit          = $00
  612.     //    0001    = 0.293 um/bit          = $01
  613.     //    0010    = 0.409 to 0.435 um/bit = $02
  614.     //    0100    = 0.280 to 0.291 um/bit = $04
  615.     //    1000    = 0.353 um/bit          = $08
  616.     //    Others  = Reserved
  617.     // TrackDensity Nibble
  618.     //    0000    = 0.74 um/track   = $00
  619.     //    0001    = 0.80 um/track   = $01
  620.     //    0010    = 0.615 um/track  = $02
  621.     //    Others  = Reserved
  622.     StartingPhysicalSector: DWORD;
  623.     EndPhysicalSector: DWORD;
  624.     EndPhysicalSectorInLayerZero: DWORD;
  625.     (*
  626.         Reserved3                           : Byte;
  627.         StartingPhysicalSector              : Array [0..2] of Byte;
  628.                                                     //    30000h DVD-ROM, DVD-R/-RW, DVD+RW
  629.                                                     //    31000h DVD-RAM
  630.                                                     //    Others Reserved
  631.         Reserved4                           : Byte;
  632.         EndPhysicalSector                   : Array [0..2] of Byte;
  633.         Reserved5                           : Byte;
  634.         EndPhysicalSectorInLayerZero        : Array [0..2] of Byte;
  635.     *)
  636.     BCA: Byte;
  637.   end;
  638. type
  639.   TScsiDeviceConfigHeader = packed record
  640.     // from ntddmmc.h - MMC 3 Feature structures
  641.     DataLength: Cardinal;
  642.     Reserved: Word;
  643.     CurrentProfile: Word; // further described with TScsiProfileDiscTypes below
  644.     FeatureCode: Word;
  645.     Version: Byte;
  646.     AdditionalLength: Byte;
  647.     OtherData: array[0..101] of Byte;
  648.   end;
  649.   TDiscInformation = packed record
  650.     DiscInformationLength: Word;
  651.     Status: Byte;
  652.     NumberOfFirstTrack: Byte;
  653.     NumberOfSessionsLSB: Byte;
  654.     FirstTrackInLastSessionLSB: Byte;
  655.     LastTrackInLastSessionLSB: Byte;
  656.     DiscInfo: Byte;
  657.     DiscType: Byte;
  658.     NumberOfSessionsMSB: Byte;
  659.     FirstTrackInLastSessionMSB: Byte;
  660.     LastTrackInLastSessionMSB: Byte;
  661.     DiscIdentification: Cardinal;
  662.     LastSessionLeadinStartAddress: Cardinal;
  663.     LastPossibleLeadoutStartAddress: Cardinal;
  664.     DiscBarCode: array[0..7] of Byte;
  665.     DiscApplicationCode: Byte;
  666.     NumberOfOPCTables: Byte;
  667.   end;
  668.   TScsiDVDLayerDescriptorInfo = record
  669.     BookType,
  670.       DiscSize,
  671.       MaximumRate,
  672.       LinearDensity,
  673.       TrackDensity,
  674.       LayerType,
  675.       NoLayer: string;
  676.     Sectors: Integer;
  677.     // total sectors - result of  (EndPhysicalSector minus StartingPhysicalSector)
  678.   end;
  679.   TCapacityListHeader = packed record
  680.     Reserved1: Byte;
  681.     Reserved2: Byte;
  682.     Reserved3: Byte;
  683.     CapacityListLength: Byte;
  684.   end;
  685.   TCurrentMaximumCapacityDescriptor = packed record
  686.     NumberOfBlocks: Cardinal;
  687.     DescriptorType: Byte;
  688.     BlockLength: array[0..2] of Byte;
  689.   end;
  690.   TFormattableCD = packed record
  691.     NumberOfBlocks: Cardinal;
  692.     FormatType: Byte;
  693.     TypeDependentParamter: array[0..2] of Byte;
  694.   end;
  695.   TFormatCapacity = packed record
  696.     CapacityListHeader: TCapacityListHeader;
  697.     CapacityDescriptor: TCurrentMaximumCapacityDescriptor;
  698.     FormattableCD: array[0..32] of TFormattableCD;
  699.     Unused: Byte;
  700.   end;
  701.   TTrackInformation = packed record
  702.     DataLength: Word;
  703.     TrackNumber: Byte;
  704.     SessionNumber: Byte;
  705.     Reserved: Byte;
  706.     TrackMode: Byte;
  707.     DataMode: Byte;
  708.     Reserved2: Byte;
  709.     TrackStartAddress: LongWord;
  710.     NextWritableAddress: LongWord;
  711.     FreeBlocks: LongWord;
  712.     FixedPacketSize: LongWord;
  713.     TrackSize: LongWord;
  714.     LastRecordedAddress: LongWord;
  715.     TrackNumber2: Byte;
  716.     SessionNumber2: Byte;
  717.     Reserved3: Byte;
  718.     Reserved4: Byte;
  719.     Reserved5: Byte;
  720.     Reserved6: Byte;
  721.   end; // this is for DVD minus RW & CD-RW discs - DVD plus RWs write-over previous session/track
  722. type
  723.   TScsiSessionInfoTemplate = packed record
  724.     Length: WORD;
  725.     FirstSession: byte;
  726.     LastSession: byte;
  727.     Reserved1: byte;
  728.     ADR: byte;
  729.     TrackNumber: byte;
  730.     Reserved2: byte;
  731.     AbsAddress: DWORD;
  732.   end;
  733. type
  734.   TScsiISRCTemplate = packed record
  735.     sitReserved,
  736.       sitStatus: BYTE;
  737.     sitLength: WORD;
  738.     sitFormat,
  739.       sitADR,
  740.       sitTrackNumber,
  741.       sitReserved2,
  742.       sitValid: BYTE;
  743.     sitNumber: array[0..11] of Char;
  744.     sitReserved3,
  745.       sitAFrame,
  746.       sitReserved4: BYTE;
  747.   end;
  748. type
  749.   TScsiWriteModePage = packed record
  750.     PSPageCode: byte; {8 PS bit 7} {PageCode bits 0-6}
  751.     PageLength: byte; {9 page length = $32}
  752.     TestFlagWriteType: byte; {10 Write type bits 0-3} {TestFlag bit 4}
  753.     {link size bit 5}{buffer free bit 6}
  754.     MSFPCopyTrackMode: byte; {11 MS (Multisession) bits 6-7} {FP bit 5}
  755.     {Copy bit 4}{Track mode bits 0-3}
  756.     DataBlockType: byte; {12 datablock type bits 0-3}
  757.     Reserved1: Byte; {13}
  758.     LinkSize: Byte; {14 link size = 7}
  759.     HostApplicationCode: byte; {15 bits 0-5}
  760.     SessionFormat: byte; {16}
  761.     Reserved2: byte; {17}
  762.     PacketSize: LongWord; {18 19 20 21}
  763.     AudioPauseLength: Word;
  764.     MediaCatalogNumber: array[1..16] of byte;
  765.     InternationalStandardRecordingCode: array[1..14] of Char;
  766.     SubHeader: array[1..4] of byte;
  767.     Vendor_uniq: array[1..4] of byte;
  768.   end;
  769. var
  770.   SCSI_DEF: TScsiDefaults =
  771.   (Timeout: 1000;
  772.     ReadTimeout: 10000;
  773.     AudioTimeout: 10000;
  774.     SpindleTimeout: 10000;
  775.     fOnCommandSending: nil;
  776.     fOnCommandSent: nil;
  777.     ModePageType: MPTcurrent;
  778.     Sense: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  779.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  780.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  781.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  782.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  783.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  784.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  785.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
  786. implementation
  787. end.