ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

scsi.h
Go to the documentation of this file.
00001 /*++
00002 
00003 Copyright (c) 2002-2005 Alexandr A. Telyatnikov (Alter)
00004 
00005 Module Name:
00006     scsi.h
00007 
00008 Abstract:
00009     This file contains SCSI protocol definitions
00010 
00011 Author:
00012     Alexander A. Telyatnikov (Alter)
00013 
00014 Environment:
00015     kernel mode only
00016 
00017 Notes:
00018 
00019     THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
00020     IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00021     OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
00022     IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
00023     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
00024     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00025     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00026     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00027     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
00028     THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00029 
00030 Revision History:
00031 
00032 --*/
00033 #ifndef __CDRW_DEVICE_H__
00034 #define __CDRW_DEVICE_H__
00035 
00036 #include "srb.h"
00037 
00038 #pragma pack(push, 1)
00039 
00040 // Command Descriptor Block. Passed by SCSI controller chip over the SCSI bus
00041 
00042 typedef union _CDB {
00043 
00044     // Generic 6-Byte CDB
00045     struct _CDB6 {
00046        UCHAR  OperationCode;
00047        UCHAR  Immediate : 1;
00048        UCHAR  CommandUniqueBits : 4;
00049        UCHAR  Lun : 3;
00050        UCHAR  CommandUniqueBytes[3];
00051        UCHAR  Link : 1;
00052        UCHAR  Flag : 1;
00053        UCHAR  Reserved : 4;
00054        UCHAR  VendorUnique : 2;
00055     } CDB6, *PCDB6;
00056 
00057     struct _REQUEST_SENSE {
00058         UCHAR OperationCode;
00059         UCHAR Reserved0 : 5;
00060         UCHAR Lun : 3;
00061         UCHAR Reserved1[2];
00062         UCHAR AllocationLength;
00063         UCHAR Link : 1;
00064         UCHAR Flag : 1;
00065         UCHAR Reserved2 : 6;
00066     } REQUEST_SENSE, *PREQUEST_SENSE;
00067 
00068     // Standard 6-byte CDB
00069     struct _CDB6READWRITE {
00070         UCHAR OperationCode;
00071         UCHAR LBA2 : 5;
00072         UCHAR Lun : 3;
00073         UCHAR LBA0[2];
00074         UCHAR NumOfBlocks;
00075         UCHAR Control;
00076     } CDB6READWRITE, *PCDB6READWRITE;
00077 
00078     // SCSI Inquiry CDB
00079     struct _CDB6INQUIRY {
00080         UCHAR OperationCode;
00081         UCHAR Reserved1 : 5;
00082         UCHAR Lun : 3;
00083         UCHAR PageCode;
00084         UCHAR IReserved;
00085         UCHAR AllocationLength;
00086         UCHAR Control;
00087     } CDB6INQUIRY, *PCDB6INQUIRY;
00088 
00089     // SCSI Format CDB
00090 
00091     struct _ERASE {
00092         UCHAR OperationCode;
00093         UCHAR Long : 1;
00094         UCHAR Immediate : 1;
00095         UCHAR Reserved1 : 3;
00096         UCHAR Lun : 3;
00097         UCHAR Reserved2[3];
00098         UCHAR Control;
00099     } ERASE, *PERASE;
00100 
00101 #define FormatUnit_Code_Mask    0x07
00102 #define FormatUnit_Cmp          0x08
00103 #define FormatUnit_Fmt          0x10
00104 
00105     struct _CDB6FORMAT {
00106         UCHAR OperationCode;
00107         union {
00108             UCHAR Flags;
00109             struct {
00110                 UCHAR FormatCode : 3;
00111                 UCHAR Cmp:1;
00112                 UCHAR Fmt:1;
00113                 UCHAR Lun : 3;
00114             } Fields;
00115         } Byte1;
00116         UCHAR FReserved1;
00117         UCHAR Interleave[2];
00118         UCHAR FReserved2;
00119     } CDB6FORMAT, *PCDB6FORMAT;
00120 
00121     // Standard 10-byte CDB
00122     struct _CDB10 {
00123         UCHAR OperationCode;
00124         UCHAR RelativeAddress : 1;
00125         UCHAR Reserved1 : 2;
00126         UCHAR ForceUnitAccess : 1;
00127         UCHAR DisablePageOut : 1;
00128         UCHAR Lun : 3;
00129         UCHAR LBA[4];
00130         UCHAR Reserved2;
00131         UCHAR TransferBlocks[2];
00132         UCHAR Control;
00133     } CDB10, *PCDB10;
00134 
00135     // CD Rom Audio CDBs
00136 
00137 #define PauseResume_Pause   0x00
00138 #define PauseResume_Resume  0x01
00139 
00140     struct _PAUSE_RESUME {
00141         UCHAR OperationCode;
00142         UCHAR Reserved1 : 5;
00143         UCHAR Lun : 3;
00144         UCHAR Reserved2[6];
00145         UCHAR Action;
00146         UCHAR Control;
00147     } PAUSE_RESUME, *PPAUSE_RESUME;
00148 
00149     // Read Table of Contents (TOC)
00150 
00151 #define ReadTOC_Format_Mask     0x0f
00152 #define ReadTOC_Format_TOC      0x00
00153 #define ReadTOC_Format_SesInfo  0x01
00154 #define ReadTOC_Format_FullTOC  0x02
00155 #define ReadTOC_Format_PMA      0x03
00156 #define ReadTOC_Format_ATIP     0x04
00157 #define ReadTOC_Format_CdText   0x05
00158 
00159     struct _READ_TOC {
00160         UCHAR OperationCode;
00161         UCHAR Reserved0 : 1;
00162         UCHAR Msf : 1;  // HMSF MMC-3
00163         UCHAR Reserved1 : 3;
00164         UCHAR Lun : 3;
00165 
00166         union {
00167             UCHAR Flags;
00168             struct {
00169                 UCHAR Format : 4;
00170                 UCHAR Reserved : 4;
00171             } Fields;
00172         } Byte2;
00173          
00174         UCHAR Reserved2[3];
00175         UCHAR Start_TrackSes;;
00176         UCHAR AllocationLength[2];
00177         UCHAR Control : 6;
00178         UCHAR Format : 2;
00179     } READ_TOC, *PREAD_TOC;
00180 
00181     // Play Audio MSF
00182     struct _PLAY_AUDIO_MSF {
00183         UCHAR OperationCode;
00184         UCHAR Reserved1 : 5;
00185         UCHAR Lun : 3;
00186         UCHAR Reserved2;
00187         UCHAR StartingMSF[3];
00188         UCHAR EndingMSF[3];
00189         UCHAR Control;
00190     } PLAY_AUDIO_MSF, *PPLAY_AUDIO_MSF;
00191 
00192     // Read SubChannel Data
00193 
00194 #define SubChannel_SubQ_Header      0x00
00195 #define SubChannel_SubQ_Block       0x01
00196 
00197     struct _SUBCHANNEL {
00198         UCHAR OperationCode;
00199         UCHAR Reserved0 : 1;
00200         UCHAR Msf : 1;
00201         UCHAR Reserved1 : 3;
00202         UCHAR Lun : 3;
00203         UCHAR Reserved2 : 6;
00204         UCHAR SubQ : 1;
00205         UCHAR Reserved3 : 1;
00206         UCHAR Format;
00207         UCHAR Reserved4[2];
00208         UCHAR TrackNumber;
00209         UCHAR AllocationLength[2];
00210         UCHAR Control;
00211     } SUBCHANNEL, *PSUBCHANNEL;
00212 
00213     // Read CD (by LBA/MSF). Used by Atapi for raw sector reads.
00214 
00215 #define ReadCD_SecType_Mask    0x1c
00216 #define ReadCD_SecType_Any     0x00
00217 #define ReadCD_SecType_CDDA    0x04
00218 #define ReadCD_SecType_M1      0x08
00219 #define ReadCD_SecType_M2      0x0c
00220 #define ReadCD_SecType_M2F1    0x10
00221 #define ReadCD_SecType_M2F2    0x14
00222 
00223     struct _READ_CD_MSF {
00224         UCHAR OperationCode;
00225 
00226         UCHAR Reserved0 : 2;
00227         UCHAR ExpectedSectorType : 3;
00228         UCHAR Reserved1 : 3;
00229 
00230         UCHAR Reserved2;
00231         UCHAR Starting_MSF[3];
00232         UCHAR Ending_MSF[3];
00233 
00234         UCHAR Reserved3 : 1;
00235         UCHAR ErrorFlags : 2;
00236         UCHAR IncludeEDC : 1;
00237         UCHAR IncludeUserData : 1;
00238         UCHAR HeaderCode : 2;
00239         UCHAR IncludeSyncData : 1;
00240 
00241         UCHAR SubChannelSelection : 3;
00242         UCHAR Reserved4 : 5;
00243 
00244         UCHAR Control;
00245     } READ_CD_MSF, *PREAD_CD_MSF;
00246 
00247     struct _READ_CD {
00248         UCHAR OperationCode;
00249 
00250         UCHAR Reserved0 : 2;
00251         UCHAR ExpectedSectorType : 3;
00252         UCHAR Reserved1 : 3;
00253 
00254         UCHAR LBA[4];
00255         UCHAR NumOfBlocks[3];
00256 
00257         UCHAR Reserved3 : 1;
00258         UCHAR ErrorFlags : 2;
00259         UCHAR IncludeEDC : 1;
00260         UCHAR IncludeUserData : 1;
00261         UCHAR HeaderCode : 2;
00262         UCHAR IncludeSyncData : 1;
00263 
00264         UCHAR SubChannelSelection : 3;
00265         UCHAR Reserved4 : 5;
00266 
00267         UCHAR Control;
00268     } READ_CD, *PREAD_CD;
00269 
00270 #define WriteCd_RELADR  0x01
00271 #define WriteCd_FUA     0x08
00272 #define WriteCd_DPO     0x10
00273 
00274     struct _WRITE_CD {
00275         UCHAR OperationCode;
00276         union {
00277             UCHAR Flags;
00278             struct {
00279                 UCHAR RELADR    : 1;
00280                 UCHAR Reserved0 : 2;
00281                 UCHAR FUA       : 1;
00282                 UCHAR DPO       : 1;
00283                 UCHAR Reserved1 : 3;
00284             } Fields;
00285         } Byte1;
00286         UCHAR LBA [4];
00287         UCHAR Reserved1;
00288         UCHAR NumOfBlocks [2];
00289         UCHAR Reserved2 [3];
00290     } WRITE_CD, *PWRITE_CD;
00291 
00292     // Mode sense
00293     struct _MODE_SENSE {
00294         UCHAR OperationCode;
00295         UCHAR Reserved1 : 3;
00296         UCHAR Dbd : 1;
00297         UCHAR Reserved2 : 1;
00298         UCHAR Lun : 3;
00299         UCHAR PageCode : 6;
00300         UCHAR Pc : 2;
00301         UCHAR Reserved3;
00302         UCHAR AllocationLength;
00303         UCHAR Control;
00304     } MODE_SENSE, *PMODE_SENSE;
00305 
00306     struct _MODE_SENSE10 {
00307         UCHAR OperationCode;
00308         UCHAR Reserved1 : 3;
00309         UCHAR Dbd : 1;
00310         UCHAR Reserved2 : 1;
00311         UCHAR Lun : 3;
00312         UCHAR PageCode : 6;
00313         UCHAR Pc : 2;
00314         UCHAR Reserved3[4];
00315         UCHAR AllocationLength[2];
00316         UCHAR Control;
00317     } MODE_SENSE10, *PMODE_SENSE10;
00318 
00319     // Mode select
00320     struct _MODE_SELECT {
00321         UCHAR OperationCode;
00322         UCHAR SPBit : 1;
00323         UCHAR Reserved1 : 3;
00324         UCHAR PFBit : 1;
00325         UCHAR Lun : 3;
00326         UCHAR Reserved2[2];
00327         UCHAR ParameterListLength;
00328         UCHAR Control;
00329     } MODE_SELECT, *PMODE_SELECT;
00330 
00331     struct _MODE_SELECT10 {
00332         UCHAR OperationCode;
00333         UCHAR SPBit : 1;
00334         UCHAR Reserved1 : 3;
00335         UCHAR PFBit : 1;
00336         UCHAR Lun : 3;
00337         UCHAR Reserved2[5];
00338         UCHAR ParameterListLength[2];
00339         UCHAR Control;
00340     } MODE_SELECT10, *PMODE_SELECT10;
00341 
00342     struct _LOGSENSE {
00343         UCHAR OperationCode;
00344         UCHAR SPBit : 1;
00345         UCHAR PPCBit : 1;
00346         UCHAR Reserved1 : 3;
00347         UCHAR Lun : 3;
00348         UCHAR PageCode : 6;
00349         UCHAR PCBit : 2;
00350         UCHAR Reserved2;
00351         UCHAR Reserved3;
00352         UCHAR ParameterPointer[2];  // [0]=MSB, [1]=LSB
00353         UCHAR AllocationLength[2];  // [0]=MSB, [1]=LSB
00354         UCHAR Control;
00355     } LOGSENSE, *PLOGSENSE;
00356 
00357     struct _SEEK {
00358         UCHAR OperationCode;
00359         UCHAR Reserved1 : 5;
00360         UCHAR Lun : 3;
00361         UCHAR LBA[4];
00362         UCHAR Reserved2[3];
00363         UCHAR Control;
00364     } SEEK, *PSEEK;
00365 
00366 #define StartStop_Start     0x01
00367 #define StartStop_Load      0x02
00368 
00369     struct _START_STOP {
00370         UCHAR OperationCode;
00371         UCHAR Immediate: 1;
00372         UCHAR Reserved1 : 4;
00373         UCHAR Lun : 3;
00374         UCHAR Reserved2[2];
00375         UCHAR Start : 1;
00376         UCHAR LoadEject : 1;
00377         UCHAR Reserved3 : 6;
00378         UCHAR Control;
00379     } START_STOP, *PSTART_STOP;
00380 
00381     struct _MEDIA_REMOVAL {
00382         UCHAR OperationCode;
00383         UCHAR Reserved1 : 5;
00384         UCHAR Lun : 3;
00385         UCHAR Reserved2[2];
00386         UCHAR Prevent;
00387         UCHAR Control;
00388     } MEDIA_REMOVAL, *PMEDIA_REMOVAL;
00389 
00390     struct _READ_FORMAT_CAPACITIES {
00391         UCHAR OperationCode;
00392         union {
00393             UCHAR Flags;
00394             struct {
00395                 UCHAR Reserved0 : 5;
00396                 UCHAR Reserved1 : 3;
00397             } Fields;
00398         } Byte1;
00399         UCHAR Reserved0[5];
00400         UCHAR AllocationLength[2];
00401         UCHAR Control;
00402     } READ_FORMAT_CAPACITIES, *PREAD_FORMAT_CAPACITIES;
00403 
00404     // Atapi 2.5 Changer 12-byte CDBs
00405 #define LoadUnload_Start    0x01
00406 #define LoadUnload_Load     0x02
00407 
00408     struct _LOAD_UNLOAD {
00409         UCHAR OperationCode;
00410         UCHAR Immediate : 1;
00411         UCHAR Reserved1 : 7;
00412         UCHAR Reserved2[2];
00413         UCHAR Start : 1;
00414         UCHAR LoadEject : 1;
00415         UCHAR Reserved3: 6;
00416         UCHAR Reserved4[3];
00417         UCHAR Slot;
00418         UCHAR Reserved5[3];
00419     } LOAD_UNLOAD, *PLOAD_UNLOAD;
00420 
00421     struct _MECH_STATUS {
00422         UCHAR OperationCode;
00423         UCHAR Reserved0[7];
00424         UCHAR AllocationLength[2];
00425         UCHAR Reserved2[2];
00426     } MECH_STATUS, *PMECH_STATUS;
00427 
00428     struct _LOCK_DOOR {
00429         UCHAR OperationCode;
00430         UCHAR Reserved0[9];
00431     } LOCK_DOOR, *PLOCK_DOOR;
00432 
00433 #define EventStat_Immed             0x01
00434 
00435 #define EventStat_Class_OpChange    0x02
00436 #define EventStat_Class_PM          0x04
00437 #define EventStat_Class_ExternalReq 0x08
00438 #define EventStat_Class_Media       0x10
00439 #define EventStat_Class_MultiInit   0x20
00440 #define EventStat_Class_DevBusy     0x40
00441 
00442     struct _GET_EVENT_STATUS {
00443         UCHAR OperationCode;
00444         union {
00445             UCHAR Flags;
00446             struct {
00447                 UCHAR Immed     : 1;
00448                 UCHAR Reserved0 : 7;
00449             } Fields;
00450         } Byte1;
00451         UCHAR Reserved0[2];
00452         UCHAR NotificationClass;
00453         UCHAR Reserved1[2];
00454         UCHAR AllocationLength[2];
00455         UCHAR Control;
00456     } GET_EVENT_STATUS, *PGET_EVENT_STATUS;
00457 
00458     struct _READ_DISC_INFO {
00459         UCHAR OperationCode;
00460         UCHAR Reserved0[6];
00461         UCHAR AllocationLength[2];
00462         UCHAR Reserved2[3];
00463     } READ_DISC_INFO, *PREAD_DISC_INFO;
00464 
00465 #define ReadTrackInfo_Type_Mask    0x01
00466 #define ReadTrackInfo_Type_LBA     0x00
00467 #define ReadTrackInfo_Type_Track   0x01
00468 
00469 #define ReadTrackInfo_LastTrk      0xff
00470 
00471     struct _READ_TRACK_INFO {
00472         UCHAR OperationCode;
00473         UCHAR Track     : 1;
00474         UCHAR Reserved0 : 7;
00475         UCHAR LBA_TrkNum [4];
00476         UCHAR Reserved1;
00477         UCHAR AllocationLength[2];
00478         UCHAR Reserved2[3];
00479     } READ_TRACK_INFO, *PREAD_TRACK_INFO;
00480 
00481 #define ReadTrackInfo3_Type_Mask    0x03
00482 #define ReadTrackInfo3_Type_LBA     ReadTrackInfo_Type_LBA
00483 #define ReadTrackInfo3_Type_Track   ReadTrackInfo_Type_Track
00484 #define ReadTrackInfo3_Type_Ses     0x02
00485 
00486 #define ReadTrackInfo3_LastTrk      ReadTrackInfo_LastTrk
00487 #define ReadTrackInfo3_DiscLeadIn   0x00  // for Track type
00488 
00489     struct _READ_TRACK_INFO_3 {
00490         UCHAR OperationCode;
00491         UCHAR DataType     : 2;
00492         UCHAR Reserved0 : 6;
00493         UCHAR LBA_TrkNum [4];
00494         UCHAR Reserved1;
00495         UCHAR AllocationLength[2];
00496         UCHAR Reserved2[3];
00497     } READ_TRACK_INFO_3, *PREAD_TRACK_INFO_3;
00498 
00499     struct _RESERVE_TRACK {
00500         UCHAR OperationCode;
00501         UCHAR Reserved0[4];
00502         UCHAR Size[4];
00503         UCHAR Reserved2[3];
00504     } RESERVE_TRACK, *PRESERVE_TRACK;
00505 
00506 #define CloseTrkSes_Immed   0x01
00507 
00508 #define CloseTrkSes_Trk   0x01
00509 #define CloseTrkSes_Ses   0x02
00510 
00511 #define CloseTrkSes_LastTrkSes  0xff
00512 
00513 #define CloseTrkSes_Delay   DEF_I64(3100000000)        //  310 s
00514 
00515     struct _CLOSE_TRACK_SESSION {
00516         UCHAR OperationCode;
00517         union {
00518             UCHAR Flags;
00519             struct {
00520                 UCHAR Immed     : 1;
00521                 UCHAR Reserved0 : 7;
00522             } Fields;
00523         } Byte1;
00524         union {
00525             UCHAR Flags;
00526             struct {
00527                 UCHAR Track     : 1;
00528                 UCHAR Session   : 1;
00529                 UCHAR Reserved0 : 6;
00530             } Fields;
00531         } Byte2;
00532         UCHAR Reserved1 [2];
00533         UCHAR TrackNum;
00534         UCHAR Reserved2 [6];  
00535 
00536     } CLOSE_TRACK_SESSION, *PCLOSE_TRACK_SESSION;
00537 
00538     struct _SET_CD_SPEED {
00539         UCHAR OperationCode;
00540         UCHAR Reserved0;
00541         UCHAR ReadSpeed [2];        // Kbyte/sec
00542         UCHAR WriteSpeed [2];        // Kbyte/sec
00543         UCHAR Reserved1[6];
00544     } SET_CD_SPEED, *PSET_CD_SPEED;
00545 
00546 #define SyncCache_RELADR        0x01
00547 #define SyncCache_Immed         0x02
00548 
00549     struct _SYNCHRONIZE_CACHE {
00550         UCHAR OperationCode;
00551         union {
00552             UCHAR Flags;
00553             struct {
00554                 UCHAR RELADR    : 1;
00555                 UCHAR Immed     : 1;
00556                 UCHAR Reserved0 : 6;            // All these are unused by drive
00557             } Fields;
00558         } Byte1;
00559         UCHAR LBA [4];
00560         UCHAR Reserved1;
00561         UCHAR NumOfBlocks [2];
00562         UCHAR Reserved2 [3];
00563 /*
00564         UCHAR Unused [11];*/
00565     } SYNCHRONIZE_CACHE, *PSYNCHRONIZE_CACHE;
00566 
00567 #define BlankMedia_Mask             0x07
00568 #define BlankMedia_Complete         0x00
00569 #define BlankMedia_Minimal          0x01
00570 #define BlankMedia_Track            0x02
00571 #define BlankMedia_UnreserveTrack   0x03
00572 #define BlankMedia_TrackTail        0x04
00573 #define BlankMedia_UncloseLastSes   0x05
00574 #define BlankMedia_EraseSes         0x06
00575 #define BlankMedia_Immed            0x10
00576 
00577     struct _BLANK_MEDIA {
00578         UCHAR OperationCode;
00579         union {
00580             UCHAR Flags;
00581             struct {
00582                 UCHAR BlankType : 3;
00583                 UCHAR Reserved0 : 1;
00584                 UCHAR Immed     : 1;
00585                 UCHAR Reserved1 : 3;
00586             } Fields;
00587         } Byte1;
00588         UCHAR StartAddr_TrkNum [4];
00589         UCHAR Reserved2 [6];
00590     } BLANK_MEDIA, *PBLANK_MEDIA;
00591 
00592 #define SendKey_ReportAGID            0x00
00593 #define SendKey_ChallengeKey          0x01
00594 #define SendKey_Key1                  0x02
00595 #define SendKey_Key2                  0x03
00596 #define SendKey_TitleKey              0x04
00597 #define SendKey_ReportASF             0x05
00598 #define SendKey_InvalidateAGID        0x3F
00599 
00600     struct _SEND_KEY {
00601         UCHAR OperationCode;
00602         UCHAR Reserved1 : 5;
00603         UCHAR Lun : 3;
00604         UCHAR Reserved2[6];
00605         UCHAR ParameterListLength[2];
00606         UCHAR KeyFormat : 6;
00607         UCHAR AGID : 2;
00608         UCHAR Control;
00609     } SEND_KEY, *PSEND_KEY;
00610 
00611     struct _REPORT_KEY {
00612         UCHAR OperationCode;    // 0xA4
00613         UCHAR Reserved1 : 5;
00614         UCHAR Lun : 3;
00615         UCHAR LBA[4];           // for title key
00616         UCHAR Reserved2[2];
00617         UCHAR AllocationLength[2];
00618         UCHAR KeyFormat : 6;
00619         UCHAR AGID : 2;
00620         UCHAR Control;
00621     } REPORT_KEY, *PREPORT_KEY;
00622 
00623     struct _READ_DVD_STRUCTURE {
00624         UCHAR OperationCode;    // 0xAD
00625         UCHAR Reserved1 : 5;
00626         UCHAR Lun : 3;
00627         UCHAR RMDBlockNumber[4];
00628         UCHAR LayerNumber;
00629         UCHAR Format;
00630         UCHAR AllocationLength[2];  // [0]=MSB, [1]=LSB
00631         UCHAR Reserved3 : 6;
00632         UCHAR AGID : 2;
00633         UCHAR Control;
00634     } READ_DVD_STRUCTURE, *PREAD_DVD_STRUCTURE;
00635 
00636     struct _READ_BUFFER_CAPACITY {
00637         UCHAR OperationCode;
00638         UCHAR Reserved0 [6];
00639         UCHAR AllocationLength[2];
00640         UCHAR Reserved1 [3];
00641     } READ_BUFFER_CAPACITY, *PREAD_BUFFER_CAPACITY;
00642 
00643     struct _GET_CONFIGURATION {
00644         UCHAR OperationCode;
00645         union {
00646             UCHAR Flags;
00647             struct {
00648                 UCHAR RT        : 2;
00649                 UCHAR Reserved0 : 6;
00650             } Fields;
00651         } Byte1;
00652         UCHAR StartFeatureNum [2];
00653         UCHAR Reserved0 [3];
00654         UCHAR AllocationLength[2];
00655         UCHAR Control;
00656     } GET_CONFIGURATION, *PGET_CONFIGURATION;
00657 
00658     struct _SET_READ_AHEAD {
00659         UCHAR OperationCode;
00660         UCHAR Reserved0;
00661         UCHAR TriggerLBA[4];
00662         UCHAR ReadAheadLBA[4];
00663         UCHAR Reserved1;
00664         UCHAR Control;
00665     } SET_READ_AHEAD, *PSET_READ_AHEAD;
00666 
00667 #define SendOpc_DoOpc   0x01
00668 
00669     struct _SEND_OPC_INFO {
00670         UCHAR OperationCode;
00671         union {
00672             UCHAR Flags;
00673             struct {
00674                 UCHAR DoOpc     : 1;
00675                 UCHAR Reserved0 : 4;
00676                 UCHAR Reserved1 : 3;
00677             } Fields;
00678         } Byte1;
00679         UCHAR Reserved0 [5];
00680         UCHAR AllocationLength[2];
00681         UCHAR Control;
00682     } SEND_OPC_INFO, *PSEND_OPC_INFO;
00683 
00684     struct _SEND_CUE_SHEET {
00685         UCHAR OperationCode;
00686         UCHAR Reserved0 [5];
00687         UCHAR AllocationLength[3];
00688         UCHAR Control;
00689     } SEND_CUE_SHEET, *PSEND_CUE_SHEET;
00690 
00691     struct _CDB12 {
00692         UCHAR OperationCode;
00693         UCHAR Params[11];
00694     } CDB12, *PCDB12;
00695 
00696     struct _CDB12READWRITE {
00697         UCHAR OperationCode;
00698         union {
00699             UCHAR Flags;
00700             struct {
00701                 UCHAR RELADR    : 1;
00702                 UCHAR Reserved0 : 2;
00703                 UCHAR FUA       : 1;
00704                 UCHAR DPO       : 1;
00705                 UCHAR Reserved1 : 3;
00706             } Fields;
00707         } Byte1;
00708         UCHAR LBA [4];
00709         UCHAR NumOfBlocks [4];
00710         UCHAR Reserved1[2];
00711     } CDB12READWRITE, *PCDB12READWRITE;
00712 
00713     // Plextor Read CD-DA
00714     struct _PLXTR_READ_CDDA {
00715         UCHAR OperationCode;
00716         UCHAR Reserved0 : 5;
00717         UCHAR Lun :3;
00718         UCHAR LBA[4];
00719         UCHAR TransferBlock[4];
00720         UCHAR SubCode;
00721         UCHAR Control;
00722     } PLXTR_READ_CDDA, *PPLXTR_READ_CDDA;
00723 
00724     // NEC Read CD-DA
00725     struct _NEC_READ_CDDA {
00726         UCHAR OperationCode;
00727         UCHAR Reserved0;
00728         UCHAR LBA[4];
00729         UCHAR Reserved1;
00730         UCHAR TransferBlock[2];
00731         UCHAR Control;
00732     } NEC_READ_CDDA, *PNEC_READ_CDDA;
00733 
00734 } CDB, *PCDB;
00735 
00736 // Command Descriptor Block constants.
00737 
00738 #define CDB6GENERIC_LENGTH                  6
00739 #define CDB10GENERIC_LENGTH                 10
00740 #define CDB12GENERIC_LENGTH                 12
00741 
00742 #define MAXIMUM_NUMBER_OF_TRACKS            100
00743 #define MAXIMUM_NUMBER_OF_SESSIONS          1024    //maximal number of entries in Read Full TOC
00744 
00745 #define SETBITON                            1
00746 #define SETBITOFF                           0
00747 
00748 // Mode Sense/Select page constants.
00749 
00750 #define MODE_PAGE_ERROR_RECOVERY        0x01
00751 #define MODE_PAGE_WRITE_PARAMS          0x05
00752 #define MODE_PAGE_VERIFY_ERROR          0x07        // shall not be used
00753 #define MODE_PAGE_CACHING               0x08        // undocumented, but used by DirectCd
00754 #define MODE_PAGE_MEDIUM_TYPES          0x0B        // shall not be used
00755 #define MODE_PAGE_CD_DEVICE_PARAMS      0x0D
00756 #define MODE_PAGE_CD_AUDIO_CONTROL      0x0E
00757 #define MODE_PAGE_POWER_CONDITION       0x1A
00758 #define MODE_PAGE_FAIL_REPORT           0x1C
00759 #define MODE_PAGE_TIMEOUT_AND_PROTECT   0x1D
00760 #define MODE_PAGE_PHILIPS_SECTOR_TYPE   0x21
00761 #define MODE_PAGE_CAPABILITIES          0x2A
00762 
00763 #define MODE_SENSE_RETURN_ALL           0x3f
00764 
00765 #define MODE_SENSE_CURRENT_VALUES       0x00
00766 #define MODE_SENSE_CHANGEABLE_VALUES    0x40
00767 #define MODE_SENSE_DEFAULT_VAULES       0x80
00768 #define MODE_SENSE_SAVED_VALUES         0xc0
00769 
00770 // SCSI CDB operation codes
00771 
00772 #define SCSIOP_TEST_UNIT_READY      0x00
00773 #define SCSIOP_REZERO_UNIT          0x01
00774 #define SCSIOP_REWIND               0x01
00775 #define SCSIOP_REQUEST_BLOCK_ADDR   0x02
00776 #define SCSIOP_REQUEST_SENSE        0x03
00777 #define SCSIOP_FORMAT_UNIT          0x04
00778 #define SCSIOP_READ_BLOCK_LIMITS    0x05
00779 #define SCSIOP_REASSIGN_BLOCKS      0x07
00780 #define SCSIOP_READ6                0x08
00781 #define SCSIOP_RECEIVE              0x08
00782 #define SCSIOP_WRITE6               0x0A
00783 #define SCSIOP_PRINT                0x0A
00784 #define SCSIOP_SEND                 0x0A
00785 #define SCSIOP_SEEK6                0x0B
00786 #define SCSIOP_TRACK_SELECT         0x0B
00787 #define SCSIOP_SLEW_PRINT           0x0B
00788 #define SCSIOP_SEEK_BLOCK           0x0C
00789 #define SCSIOP_PARTITION            0x0D
00790 #define SCSIOP_READ_REVERSE         0x0F
00791 #define SCSIOP_WRITE_FILEMARKS      0x10
00792 #define SCSIOP_FLUSH_BUFFER         0x10
00793 #define SCSIOP_SPACE                0x11
00794 #define SCSIOP_INQUIRY              0x12
00795 #define SCSIOP_VERIFY6              0x13
00796 #define SCSIOP_RECOVER_BUF_DATA     0x14
00797 #define SCSIOP_MODE_SELECT          0x15
00798 #define SCSIOP_RESERVE_UNIT         0x16
00799 #define SCSIOP_RELEASE_UNIT         0x17
00800 #define SCSIOP_COPY                 0x18
00801 #define SCSIOP_ERASE                0x19
00802 #define SCSIOP_MODE_SENSE           0x1A
00803 #define SCSIOP_START_STOP_UNIT      0x1B
00804 #define SCSIOP_STOP_PRINT           0x1B
00805 #define SCSIOP_LOAD_UNLOAD          0x1B
00806 #define SCSIOP_RECEIVE_DIAGNOSTIC   0x1C
00807 #define SCSIOP_SEND_DIAGNOSTIC      0x1D
00808 #define SCSIOP_MEDIUM_REMOVAL       0x1E
00809 #define SCSIOP_READ_FORMAT_CAPACITY 0x23
00810 #define SCSIOP_READ_CAPACITY        0x25
00811 #define SCSIOP_READ                 0x28
00812 #define SCSIOP_WRITE                0x2A
00813 #define SCSIOP_WRITE_CD             0x2A
00814 #define SCSIOP_SEEK                 0x2B
00815 #define SCSIOP_LOCATE               0x2B
00816 #define SCSIOP_ERASE10              0x2C
00817 #define SCSIOP_WRITE_VERIFY         0x2E
00818 #define SCSIOP_VERIFY               0x2F
00819 #define SCSIOP_SEARCH_DATA_HIGH     0x30
00820 #define SCSIOP_SEARCH_DATA_EQUAL    0x31
00821 #define SCSIOP_SEARCH_DATA_LOW      0x32
00822 #define SCSIOP_SET_LIMITS           0x33
00823 #define SCSIOP_READ_POSITION        0x34
00824 #define SCSIOP_SYNCHRONIZE_CACHE    0x35
00825 #define SCSIOP_COMPARE              0x39
00826 #define SCSIOP_COPY_COMPARE         0x3A
00827 #define SCSIOP_COPY_VERIFY          0x3A
00828 #define SCSIOP_WRITE_DATA_BUFF      0x3B
00829 #define SCSIOP_READ_DATA_BUFF       0x3C
00830 #define SCSIOP_CHANGE_DEFINITION    0x40
00831 #define SCSIOP_PLAY_AUDIO10         0x41
00832 #define SCSIOP_READ_SUB_CHANNEL     0x42
00833 #define SCSIOP_READ_TOC             0x43
00834 #define SCSIOP_READ_HEADER          0x44
00835 #define SCSIOP_PLAY_AUDIO           0x45
00836 #define SCSIOP_GET_CONFIGURATION    0x46
00837 #define SCSIOP_PLAY_AUDIO_MSF       0x47
00838 #define SCSIOP_PLAY_TRACK_INDEX     0x48
00839 #define SCSIOP_PLAY_TRACK_RELATIVE  0x49
00840 #define SCSIOP_GET_EVENT_STATUS     0x4A
00841 #define SCSIOP_PAUSE_RESUME         0x4B
00842 #define SCSIOP_LOG_SELECT           0x4C
00843 #define SCSIOP_LOG_SENSE            0x4D
00844 #define SCSIOP_STOP_PLAY_SCAN       0x4E
00845 #define SCSIOP_READ_DISC_INFO       0x51
00846 #define SCSIOP_READ_TRACK_INFO      0x52
00847 #define SCSIOP_RESERVE_TRACK        0x53
00848 #define SCSIOP_SEND_OPC_INFO        0x54
00849 #define SCSIOP_MODE_SELECT10        0x55
00850 #define SCSIOP_REPAIR_TRACK         0x58    // obsolete
00851 #define SCSIOP_READ_MASTER_CUE      0x59
00852 #define SCSIOP_MODE_SENSE10         0x5A
00853 #define SCSIOP_CLOSE_TRACK_SESSION  0x5B
00854 #define SCSIOP_READ_BUFFER_CAPACITY 0x5C
00855 #define SCSIOP_SEND_CUE_SHEET       0x5D
00856 #define SCSIOP_BLANK                0xA1
00857 #define SCSIOP_SEND_KEY             0xA3
00858 #define SCSIOP_REPORT_KEY           0xA4
00859 #define SCSIOP_PLAY_AUDIO12         0xA5
00860 #define SCSIOP_LOAD_UNLOAD_SLOT     0xA6
00861 #define SCSIOP_SET_READ_AHEAD       0xA7
00862 #define SCSIOP_READ12               0xA8
00863 #define SCSIOP_WRITE12              0xAA
00864 #define SCSIOP_SEEK12               0xAB
00865 #define SCSIOP_GET_PERFORMANCE      0xAC
00866 #define SCSIOP_READ_DVD_STRUCTURE   0xAD
00867 #define SCSIOP_WRITE_VERIFY12       0xAE
00868 #define SCSIOP_VERIFY12             0xAF
00869 #define SCSIOP_SET_STREAMING        0xB6
00870 #define SCSIOP_READ_CD_MSF          0xB9
00871 #define SCSIOP_SET_CD_SPEED         0xBB
00872 #define SCSIOP_MECHANISM_STATUS     0xBD
00873 #define SCSIOP_READ_CD              0xBE
00874 #define SCSIOP_SEND_DVD_STRUCTURE   0xBF
00875 #define SCSIOP_DOORLOCK             0xDE    // lock door on removable drives
00876 #define SCSIOP_DOORUNLOCK           0xDF    // unlock door on removable drives
00877 
00878 // If the IMMED bit is 1, status is returned as soon
00879 // as the operation is initiated. If the IMMED bit
00880 // is 0, status is not returned until the operation
00881 // is completed.
00882 
00883 #define CDB_RETURN_ON_COMPLETION   0
00884 #define CDB_RETURN_IMMEDIATE       1
00885 
00886 // end_ntminitape
00887 
00888 // CDB Force media access used in extended read and write commands.
00889 
00890 #define CDB_FORCE_MEDIA_ACCESS 0x08
00891 
00892 // Denon CD ROM operation codes
00893 
00894 #define SCSIOP_DENON_EJECT_DISC    0xE6
00895 #define SCSIOP_DENON_STOP_AUDIO    0xE7
00896 #define SCSIOP_DENON_PLAY_AUDIO    0xE8
00897 #define SCSIOP_DENON_READ_TOC      0xE9
00898 #define SCSIOP_DENON_READ_SUBCODE  0xEB
00899 
00900 // Philips/Matshushita CD-R(W) operation codes
00901 
00902 #define SCSIOP_PHILIPS_GET_NWA                0xE2
00903 #define SCSIOP_PHILIPS_RESERVE_TRACK          0xE4
00904 #define SCSIOP_PHILIPS_WRITE_TRACK            0xE6
00905 #define SCSIOP_PHILIPS_LOAD_UNLOAD            0xE7
00906 #define SCSIOP_PHILIPS_CLOSE_TRACK_SESSION    0xE9
00907 #define SCSIOP_PHILIPS_RECOVER_BUF_DATA       0xEC
00908 #define SCSIOP_PHILIPS_READ_SESSION_INFO      0xEE
00909 
00910 // Plextor operation codes
00911 
00912 #define SCSIOP_PLEXTOR_READ_CDDA   0xD8
00913 
00914 // NEC operation codes
00915 
00916 #define SCSIOP_NEC_READ_CDDA       0xD4
00917 
00918 // SCSI Bus Messages
00919 
00920 #define SCSIMESS_ABORT                0x06
00921 #define SCSIMESS_ABORT_WITH_TAG       0x0D
00922 #define SCSIMESS_BUS_DEVICE_RESET     0X0C
00923 #define SCSIMESS_CLEAR_QUEUE          0X0E
00924 #define SCSIMESS_COMMAND_COMPLETE     0X00
00925 #define SCSIMESS_DISCONNECT           0X04
00926 #define SCSIMESS_EXTENDED_MESSAGE     0X01
00927 #define SCSIMESS_IDENTIFY             0X80
00928 #define SCSIMESS_IDENTIFY_WITH_DISCON 0XC0
00929 #define SCSIMESS_IGNORE_WIDE_RESIDUE  0X23
00930 #define SCSIMESS_INITIATE_RECOVERY    0X0F
00931 #define SCSIMESS_INIT_DETECTED_ERROR  0X05
00932 #define SCSIMESS_LINK_CMD_COMP        0X0A
00933 #define SCSIMESS_LINK_CMD_COMP_W_FLAG 0X0B
00934 #define SCSIMESS_MESS_PARITY_ERROR    0X09
00935 #define SCSIMESS_MESSAGE_REJECT       0X07
00936 #define SCSIMESS_NO_OPERATION         0X08
00937 #define SCSIMESS_HEAD_OF_QUEUE_TAG    0X21
00938 #define SCSIMESS_ORDERED_QUEUE_TAG    0X22
00939 #define SCSIMESS_SIMPLE_QUEUE_TAG     0X20
00940 #define SCSIMESS_RELEASE_RECOVERY     0X10
00941 #define SCSIMESS_RESTORE_POINTERS     0X03
00942 #define SCSIMESS_SAVE_DATA_POINTER    0X02
00943 #define SCSIMESS_TERMINATE_IO_PROCESS 0X11
00944 
00945 // SCSI Extended Message operation codes
00946 
00947 #define SCSIMESS_MODIFY_DATA_POINTER  0X00
00948 #define SCSIMESS_SYNCHRONOUS_DATA_REQ 0X01
00949 #define SCSIMESS_WIDE_DATA_REQUEST    0X03
00950 
00951 // SCSI Extended Message Lengths
00952 
00953 #define SCSIMESS_MODIFY_DATA_LENGTH   5
00954 #define SCSIMESS_SYNCH_DATA_LENGTH    3
00955 #define SCSIMESS_WIDE_DATA_LENGTH     2
00956 
00957 // SCSI extended message structure
00958 
00959 typedef struct _SCSI_EXTENDED_MESSAGE {
00960     UCHAR InitialMessageCode;
00961     UCHAR MessageLength;
00962     UCHAR MessageType;
00963     union _EXTENDED_ARGUMENTS {
00964 
00965         struct {
00966             UCHAR Modifier[4];
00967         } Modify;
00968 
00969         struct {
00970             UCHAR TransferPeriod;
00971             UCHAR ReqAckOffset;
00972         } Synchronous;
00973 
00974         struct{
00975             UCHAR Width;
00976         } Wide;
00977     }ExtendedArguments;
00978 }SCSI_EXTENDED_MESSAGE, *PSCSI_EXTENDED_MESSAGE;
00979 
00980 // SCSI bus status codes.
00981 
00982 #define SCSISTAT_GOOD                  0x00
00983 #define SCSISTAT_CHECK_CONDITION       0x02
00984 #define SCSISTAT_CONDITION_MET         0x04
00985 #define SCSISTAT_BUSY                  0x08
00986 #define SCSISTAT_INTERMEDIATE          0x10
00987 #define SCSISTAT_INTERMEDIATE_COND_MET 0x14
00988 #define SCSISTAT_RESERVATION_CONFLICT  0x18
00989 #define SCSISTAT_COMMAND_TERMINATED    0x22
00990 #define SCSISTAT_QUEUE_FULL            0x28
00991 
00992 // Enable Vital Product Data Flag (EVPD)
00993 // used with INQUIRY command.
00994 
00995 #define CDB_INQUIRY_EVPD           0x01
00996 
00997 // retry time (in deci-seconds)
00998 #define NOT_READY_RETRY_INTERVAL    20
00999 
01000 // Defines for format CDB
01001 #define LUN0_FORMAT_SAVING_DEFECT_LIST 0
01002 #define USE_DEFAULTMSB  0
01003 #define USE_DEFAULTLSB  0
01004 
01005 #define START_UNIT_CODE 0x01
01006 #define STOP_UNIT_CODE  0x00
01007 
01008 // Inquiry buffer structure. This is the data returned from the target
01009 // after it receives an inquiry.
01010 //
01011 // This structure may be extended by the number of bytes specified
01012 // in the field AdditionalLength. The defined size constant only
01013 // includes fields through ProductRevisionLevel.
01014 //
01015 // The NT SCSI drivers are only interested in the first 36 bytes of data.
01016 
01017 #define INQUIRYDATABUFFERSIZE 36
01018 
01019 typedef struct _INQUIRYDATA {
01020     UCHAR DeviceType : 5;
01021     UCHAR DeviceTypeQualifier : 3;
01022     UCHAR DeviceTypeModifier : 7;
01023     UCHAR RemovableMedia : 1;
01024     UCHAR Versions;
01025     UCHAR ResponseDataFormat;
01026     UCHAR AdditionalLength;
01027     UCHAR Reserved[2];
01028     UCHAR SoftReset : 1;
01029     UCHAR CommandQueue : 1;
01030     UCHAR Reserved2 : 1;
01031     UCHAR LinkedCommands : 1;
01032     UCHAR Synchronous : 1;
01033     UCHAR Wide16Bit : 1;
01034     UCHAR Wide32Bit : 1;
01035     UCHAR RelativeAddressing : 1;
01036     UCHAR VendorId[8];
01037     UCHAR ProductId[16];
01038     UCHAR ProductRevisionLevel[4];
01039     UCHAR VendorSpecific[20];
01040     UCHAR Reserved3[40];
01041 } INQUIRYDATA, *PINQUIRYDATA;
01042 
01043 // Inquiry defines. Used to interpret data returned from target as result
01044 // of inquiry command.
01045 
01046 // DeviceType field
01047 
01048 #define DIRECT_ACCESS_DEVICE            0x00    // disks
01049 #define SEQUENTIAL_ACCESS_DEVICE        0x01    // tapes
01050 #define PRINTER_DEVICE                  0x02    // printers
01051 #define PROCESSOR_DEVICE                0x03    // scanners, printers, etc
01052 #define WRITE_ONCE_READ_MULTIPLE_DEVICE 0x04    // worms
01053 #define READ_ONLY_DIRECT_ACCESS_DEVICE  0x05    // cdroms
01054 #define SCANNER_DEVICE                  0x06    // scanners
01055 #define OPTICAL_DEVICE                  0x07    // optical disks
01056 #define MEDIUM_CHANGER                  0x08    // jukebox
01057 #define COMMUNICATION_DEVICE            0x09    // network
01058 #define LOGICAL_UNIT_NOT_PRESENT_DEVICE 0x7F
01059 #define DEVICE_QUALIFIER_NOT_SUPPORTED  0x03
01060 
01061 // DeviceTypeQualifier field
01062 
01063 #define DEVICE_CONNECTED 0x00
01064 
01065 // Sense Data Format
01066 
01067 typedef struct _SENSE_DATA {
01068     UCHAR ErrorCode:7;
01069     UCHAR Valid:1;
01070     UCHAR SegmentNumber;
01071     UCHAR SenseKey:4;
01072     UCHAR Reserved:1;
01073     UCHAR IncorrectLength:1;
01074     UCHAR EndOfMedia:1;
01075     UCHAR FileMark:1;
01076     UCHAR Information[4];
01077     UCHAR AdditionalSenseLength;
01078     UCHAR CommandSpecificInformation[4];
01079     UCHAR AdditionalSenseCode;
01080     UCHAR AdditionalSenseCodeQualifier;
01081     UCHAR FieldReplaceableUnitCode;
01082     UCHAR SenseKeySpecific[3];
01083 } SENSE_DATA, *PSENSE_DATA;
01084 
01085 // Default request sense buffer size
01086 
01087 #define SENSE_BUFFER_SIZE 18
01088 
01089 // Sense keys
01090 
01091 #define SCSI_SENSE_NO_SENSE         0x00
01092 #define SCSI_SENSE_RECOVERED_ERROR  0x01
01093 #define SCSI_SENSE_NOT_READY        0x02
01094 #define SCSI_SENSE_MEDIUM_ERROR     0x03
01095 #define SCSI_SENSE_HARDWARE_ERROR   0x04
01096 #define SCSI_SENSE_ILLEGAL_REQUEST  0x05
01097 #define SCSI_SENSE_UNIT_ATTENTION   0x06
01098 #define SCSI_SENSE_DATA_PROTECT     0x07
01099 #define SCSI_SENSE_BLANK_CHECK      0x08
01100 #define SCSI_SENSE_UNIQUE           0x09
01101 #define SCSI_SENSE_COPY_ABORTED     0x0A
01102 #define SCSI_SENSE_ABORTED_COMMAND  0x0B
01103 #define SCSI_SENSE_EQUAL            0x0C
01104 #define SCSI_SENSE_VOL_OVERFLOW     0x0D
01105 #define SCSI_SENSE_MISCOMPARE       0x0E
01106 #define SCSI_SENSE_RESERVED         0x0F
01107 
01108 // Additional Sense codes
01109 
01110 // SK = 0x00
01111 #define SCSI_ADSENSE_NO_SENSE       0x00
01112 
01113 // SK = 0x01
01114 #define SCSI_ADSENSE_WARNING        0x0B
01115 #define SCSI_ADSENSE_REC_DATA_NOECC 0x17
01116 #define SCSI_ADSENSE_REC_DATA_ECC   0x18
01117 #define SCSI_ADSENSE_ROUNDED_PARAM  0x37
01118 #define SCSI_ADSENSE_FAILURE_PREDICTED 0x5D
01119 #define SCSI_ADSENSE_CD_CONTROL_ERR 0x73
01120 
01121 // SK = 0x02
01122 #define SCSI_ADSENSE_LUN_NOT_READY  0x04
01123 #define SCSI_ADSENSE_INCOMPATIBLE_MEDIA 0x30
01124 #define SCSI_ADSENSE_INVALID_MEDIA  SCSI_ADSENSE_INCOMPATIBLE_MEDIA // for w2k
01125 #define SCSI_ADSENSE_NO_MEDIA_IN_DEVICE 0x3A
01126 #define SCSI_ADSENSE_POSITION_ERROR 0x3B
01127 #define SCSI_ADSENSE_NOT_SELF_CONFIGURED 0x3E
01128 
01129 
01130 // SK = 0x03
01131 #define SCSI_ADSENSE_NO_SEEK        0x02
01132 #define SCSI_ADSENSE_NO_REFERENCE   0x06
01133 #define SCSI_ADSENSE_CD_WRITE_ERROR 0x0C
01134 #define SCSI_ADSENSE_CD_READ_ERROR  0x11
01135 #define SCSI_ADSENSE_TRACK_ERROR    0x14
01136 #define SCSI_ADSENSE_SEEK_ERROR     0x15
01137 #define SCSI_ADSENSE_FORMAT_CORRUPTED 0x31
01138 #define SCSI_ADSENSE_ENCLOSURE_FAILURE 0x34
01139 #define SCSI_ADSENSE_ENCLOSURE_SERVICE 0x35
01140 #define SCSI_ADSENSE_ERASE_ERROR    0x51
01141 #define SCSI_ADSENSE_UNRECOVERED_TOC 0x57
01142 #define SCSI_ADSENSE_SESSION_FIXATION 0x71
01143 //#define SCSI_ADSENSE_CD_CONTROL_ERR 0x73  // redefinition
01144 
01145 // SK = 0x04
01146 #define SCSI_ADSENSE_CLEAN_REQUEST  0x00
01147 #define SCSI_ADSENSE_SELECT         0x04
01148 #define SCSI_ADSENSE_COMMUNICATION  0x08
01149 #define SCSI_ADSENSE_LOST_STREAMING 0x09
01150 #define SCSI_ADSENSE_SYNC_ERROR     0x1B
01151 #define SCSI_ADSENSE_MECH_ERROR     0x3B
01152 #define SCSI_ADSENSE_LUN_ERROR      0x3E
01153 #define SCSI_ADSENSE_DIAGNOSTIC     0x40
01154 #define SCSI_ADSENSE_INTERNAL       0x44
01155 #define SCSI_ADSENSE_SOFT_RESET     0x46
01156 #define SCSI_ADSENSE_SCSI_PARITY    0x47
01157 #define SCSI_ADSENSE_CMD_PHASE      0x4A
01158 #define SCSI_ADSENSE_DATA_PHASE     0x4B
01159 #define SCSI_ADSENSE_SELF_CONFIG    0x4C
01160 #define SCSI_ADSENSE_MEDIUM_REMOVAL 0x53
01161 #define SCSI_ADSENSE_VOLTAGE        0x65
01162 
01163 // SK = 0x05
01164 #define SCSI_ADSENSE_AUDIO_PLAY     0x00
01165 #define SCSI_ADSENSE_MULTISELECT    0x07
01166 #define SCSI_ADSENSE_INVALID_PARAM_LENGTH 0x1A
01167 #define SCSI_ADSENSE_ILLEGAL_COMMAND 0x20
01168 #define SCSI_ADSENSE_ILLEGAL_BLOCK  0x21
01169 #define SCSI_ADSENSE_INVALID_CDB    0x24
01170 #define SCSI_ADSENSE_INVALID_LUN    0x25
01171 #define SCSI_ADSENSE_INVALID_VALUE  0x26
01172 #define SCSI_ADSENSE_WRITE_PROTECT  0x27
01173 #define SCSI_ADSENSE_CANT_DISCONNECT 0x2B
01174 #define SCSI_ADSENSE_INVALID_CMD_SEQUENCE 0x2C
01175 #define SCSI_ADSENSE_INVALID_SESSION_MODE 0x30
01176 #define SCSI_ADSENSE_SAVE_NOT_SUPPORTED 0x35
01177 #define SCSI_ADSENSE_INVALID_BITS_IN_IDENT_MSG 0x3D
01178 #define SCSI_ADSENSE_MSG_ERROR      0x43
01179 //#define SCSI_ADSENSE_MEDIUM_REMOVAL 0x53  // redefinition
01180 #define SCSI_ADSENSE_SYS_RESOURCE_FAILURE 0x55
01181 #define SCSI_ADSENSE_OUT_OF_SPACE   0x63
01182 #define SCSI_ADSENSE_ILLEGAL_MODE_FOR_THIS_TRACK 0x64
01183 #define SCSI_ADSENSE_CD_COPY_ERROR  0x6F
01184 #define SCSI_ADSENSE_INCOMPLETE_DATA 0x72
01185 #define SCSI_ADSENSE_VENDOR_UNIQUE  0x80
01186 #define SCSI_ADSENSE_MUSIC_AREA     0xA0
01187 #define SCSI_ADSENSE_DATA_AREA      0xA1
01188 #define SCSI_ADSENSE_VOLUME_OVERFLOW 0xA7
01189 
01190 // SK = 0x06
01191 #define SCSI_ADSENSE_LOG_OVERFLOW   0x0A
01192 #define SCSI_ADSENSE_MEDIUM_CHANGED 0x28
01193 #define SCSI_ADSENSE_BUS_RESET      0x29
01194 #define SCSI_ADSENSE_PARAM_CHANGE   0x2A
01195 #define SCSI_ADSENSE_CMD_CLEARED_BY_ANOTHER 0x2F
01196 #define SCSI_ADSENSE_MEDIA_STATE    0x3B
01197 #define SCSI_ADSENSE_FUNCTIONALTY_CHANGE 0x3F
01198 #define SCSI_ADSENSE_OPERATOR       0x5A
01199 #define SCSI_ADSENSE_MAX_LOG        0x5B
01200 #define SCSI_ADSENSE_POWER          0x5E
01201 
01202 // SK = 0x0B
01203 #define SCSI_ADSENSE_READ_LOST_STREAMING 0x11
01204 #define SCSI_ADSENSE_RESELECT_FAILURE 0x45
01205 #define SCSI_ADSENSE_ERR_MSG_DETECTED 0x48
01206 #define SCSI_ADSENSE_INVALID_ERR_MSG 0x49
01207 #define SCSI_ADSENSE_TEGGED_OVERLAPPED 0x4D
01208 #define SCSI_ADSENSE_OVERLAPPED_ATTEMPT 0x4E
01209 
01210 // Additional sense code qualifier
01211 
01212 #define SCSI_SENSEQ_NO_SENSE 0x00
01213 
01214 // SK:ASC = 02:04
01215 //#define SCSI_SENSEQ_NO_SENSE 0x00
01216 #define SCSI_SENSEQ_CAUSE_NOT_REPORTABLE    0x00
01217 #define SCSI_SENSEQ_BECOMING_READY          0x01
01218 #define SCSI_SENSEQ_INIT_COMMAND_REQUIRED   0x02
01219 #define SCSI_SENSEQ_MANUAL_INTERVENTION_REQUIRED 0x03
01220 #define SCSI_SENSEQ_FORMAT_IN_PROGRESS      0x04
01221 #define SCSI_SENSEQ_OPERATION_IN_PROGRESS   0x07
01222 #define SCSI_SENSEQ_LONG_WRITE_IN_PROGRESS  0x08
01223 
01224 // SK:ASC = 02:30
01225 #define SCSI_SENSEQ_INCOMPATIBLE_MEDIA_INSTALLED 0x00
01226 #define SCSI_SENSEQ_UNKNOWN_FORMAT      0x01
01227 #define SCSI_SENSEQ_INCOMPATIBLE_FORMAT 0x02
01228 #define SCSI_SENSEQ_CLEANING_CARTRIDGE_INSTALLED 0x03
01229 #define SCSI_SENSEQ_WRITE_UNKNOWN_FORMAT 0x04
01230 #define SCSI_SENSEQ_WRITE_INCOMPATIBLE_FORMAT 0x05
01231 #define SCSI_SENSEQ_FORMAT_INCOMPATIBLE_MEDIUM 0x06
01232 #define SCSI_SENSEQ_CLEANING_FAILURE    0x07
01233 
01234 // SK:ASC = 02:3A
01235 #define SCSI_SENSEQ_TRAY_CLOSED         0x01
01236 #define SCSI_SENSEQ_TRAY_OPEN           0x02
01237 
01238 // SK:ASC = 03:0C
01239 #define SENSEQ_W_RECOVERY_NEEDED        0x07
01240 #define SENSEQ_W_RECOVERY_FAILED        0x08
01241 #define SENSEQ_LOST_STREAMING           0x09
01242 #define SENSEQ_PADDING_BLOCKS_ADDED     0x0A
01243 
01244 // SK:ASC = 03:72
01245 //#define SCSI_SENSEQ_NO_SENSE 0x00
01246 #define SCSI_SENSEQ_LEAD_IN_ERROR       0x01
01247 #define SCSI_SENSEQ_LEAD_OUT_ERRROR     0x02
01248 #define SCSI_SENSEQ_INCOMPLETE_TRACK    0x03
01249 #define SCSI_SENSEQ_INCOMPLETE_RESERVED_TRACK 0x04
01250 #define SCSI_SENSEQ_NO_MORE_RESERVATION 0x05
01251 
01252 // SK:ASC = 05:26
01253 #define SCSI_SENSEQ_PARAM_NOT_SUPPORTED 0x01
01254 #define SCSI_SENSEQ_PARAM_INVALID_VALUE 0x02
01255 #define SCSI_SENSEQ_THRESHOLD_PARAM_NOT_SUPPORTED 0x03
01256 #define SCSI_SENSEQ_INVALID_RELEASE_OF_PERSISTENT_RESERVATION 0x04
01257 
01258 // SK:ASC = 05:27
01259 #define SCSI_SENSEQ_HW_PROTECTION       0x01
01260 #define SCSI_SENSEQ_LUN_SOFT_PROTECTION 0x02
01261 #define SCSI_SENSEQ_ASSOCIATED_PROTECTION 0x03
01262 #define SCSI_SENSEQ_PERSIST_PROTECTION  0x04
01263 #define SCSI_SENSEQ_PERMANENT_PROTECTION 0x05
01264 
01265 // SK:ASC = 05:2C
01266 #define SCSI_SENSEQ_PROGRAMM_AREA_NOT_EMPTY 0x03
01267 #define SCSI_SENSEQ_PROGRAMM_AREA_EMPTY 0x04
01268 
01269 // SK:ASC = 05:30
01270 #define SCSI_SENSEQ_APP_CODE_MISSMATCH  0x08
01271 #define SCSI_SENSEQ_NOT_FIXED_FOR_APPEND 0x09
01272 
01273 // SK:ASC = 05:6F
01274 #define SCSI_SENSEQ_AUTHENTICATION_FAILURE 0x00
01275 #define SCSI_SENSEQ_KEY_NOT_PRESENT        0x01
01276 #define SCSI_SENSEQ_KEY_NOT_ESTABLISHED    0x02
01277 #define SCSI_SENSEQ_READ_OF_SCRAMBLED_SECTOR_WITHOUT_AUTHENTICATION 0x03
01278 #define SCSI_SENSEQ_MEDIA_CODE_MISMATCHED_TO_LOGICAL_UNIT 0x04
01279 #define SCSI_SENSEQ_LOGICAL_UNIT_RESET_COUNT_ERROR 0x05
01280 
01281 // SK:ASC = 06:28
01282 #define SCSI_SENSEQ_IMPORT_OR_EXPERT_ELEMENT_ACCESS   0x01
01283 
01284 // SK:ASC = 06:29
01285 #define SCSI_SENSEQ_POWER_ON            0x01
01286 #define SCSI_SENSEQ_SCSI_BUS            0x02
01287 #define SCSI_SENSEQ_BUS_DEVICE_FUNCTION 0x03
01288 #define SCSI_SENSEQ_DEVICE_INTERNAL     0x04
01289 
01290 // SK:ASC = 06:2A
01291 #define SCSI_SENSEQ_MODE_PARAMETERS     0x01
01292 #define SCSI_SENSEQ_LOG_PARAMETERS      0x02
01293 #define SCSI_SENSEQ_RESERVATIONS_PREEMPTED 0x03
01294 
01295 // SK:ASC = 06:3B
01296 #define SCSI_SENSEQ_DESTINATION_ELEMENT_FULL 0x0D
01297 #define SCSI_SENSEQ_SOURCE_ELEMENT_EMPTY 0x0E
01298 #define SCSI_SENSEQ_END_OF_MEDIUM       0x0F
01299 #define SCSI_SENSEQ_MAGAZINE_NOT_ACCESSIBLE 0x11
01300 #define SCSI_SENSEQ_MAGAZINE_REMOVED    0x12
01301 #define SCSI_SENSEQ_MAGAZINE_INSERTED   0x13
01302 #define SCSI_SENSEQ_MAGAZINE_LOCKED     0x14
01303 #define SCSI_SENSEQ_MAGAZINE_UNLOCKED   0x15
01304 
01305 // SK:ASC = 06:3F
01306 #define SCSI_SENSEQ_MICROCODE           0x01
01307 #define SCSI_SENSEQ_OPERATION_DEFINITION 0x02
01308 #define SCSI_SENSEQ_INQUIRY_DATA        0x03
01309 
01310 // SK:ASC = 06:5A
01311 #define SCSI_SENSEQ_MEDIUM_CHANGE_REQ   0x01
01312 #define SCSI_SENSEQ_W_PROTECT_SELECTED  0x02
01313 #define SCSI_SENSEQ_W_PROTECT_PERMITED  0x03
01314 
01315 // SK:ASC = 06:5E
01316 #define SCSI_SENSEQ_LOW_POWER_COND      0x00
01317 #define SCSI_SENSEQ_IDLE_BY_TIMER       0x01
01318 #define SCSI_SENSEQ_STANDBY_BY_TIMER    0x02
01319 #define SCSI_SENSEQ_IDLE_BY_CMD         0x03
01320 #define SCSI_SENSEQ_STANDBY_BY_CMD      0x04
01321 
01322 #define SCSI_SENSEQ_FILEMARK_DETECTED 0x01
01323 #define SCSI_SENSEQ_SETMARK_DETECTED 0x03
01324 #define SCSI_SENSEQ_END_OF_MEDIA_DETECTED 0x02
01325 #define SCSI_SENSEQ_BEGINNING_OF_MEDIA_DETECTED 0x04
01326 
01327 // SCSI IO Device Control Codes
01328 
01329 #define FILE_DEVICE_SCSI 0x0000001b
01330 
01331 #define IOCTL_SCSI_EXECUTE_IN   ((FILE_DEVICE_SCSI << 16) + 0x0011)
01332 #define IOCTL_SCSI_EXECUTE_OUT  ((FILE_DEVICE_SCSI << 16) + 0x0012)
01333 #define IOCTL_SCSI_EXECUTE_NONE ((FILE_DEVICE_SCSI << 16) + 0x0013)
01334 
01335 // SMART support in atapi
01336 
01337 #define IOCTL_SCSI_MINIPORT_SMART_VERSION           ((FILE_DEVICE_SCSI << 16) + 0x0500)
01338 #define IOCTL_SCSI_MINIPORT_IDENTIFY                ((FILE_DEVICE_SCSI << 16) + 0x0501)
01339 #define IOCTL_SCSI_MINIPORT_READ_SMART_ATTRIBS      ((FILE_DEVICE_SCSI << 16) + 0x0502)
01340 #define IOCTL_SCSI_MINIPORT_READ_SMART_THRESHOLDS   ((FILE_DEVICE_SCSI << 16) + 0x0503)
01341 #define IOCTL_SCSI_MINIPORT_ENABLE_SMART            ((FILE_DEVICE_SCSI << 16) + 0x0504)
01342 #define IOCTL_SCSI_MINIPORT_DISABLE_SMART           ((FILE_DEVICE_SCSI << 16) + 0x0505)
01343 #define IOCTL_SCSI_MINIPORT_RETURN_STATUS           ((FILE_DEVICE_SCSI << 16) + 0x0506)
01344 #define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTOSAVE ((FILE_DEVICE_SCSI << 16) + 0x0507)
01345 #define IOCTL_SCSI_MINIPORT_SAVE_ATTRIBUTE_VALUES   ((FILE_DEVICE_SCSI << 16) + 0x0508)
01346 #define IOCTL_SCSI_MINIPORT_EXECUTE_OFFLINE_DIAGS   ((FILE_DEVICE_SCSI << 16) + 0x0509)
01347 
01348 // Read Capacity Data - returned in Big Endian format
01349 
01350 typedef struct _READ_CAPACITY_DATA {
01351     ULONG LogicalBlockAddress;
01352     ULONG BytesPerBlock;
01353 } READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA;
01354 
01355 // CD ROM Read Table Of Contents (TOC) structures
01356 // Format 0 - Get table of contents
01357 
01358 #define TocControl_TrkMode_Mask           WParam_TrkMode_Mask
01359 #define TocControl_TrkMode_Audio          WParam_TrkMode_Audio
01360 #define TocControl_TrkMode_Audio_PreEmph  WParam_TrkMode_Audio_PreEmph
01361 #define TocControl_TrkMode_Data           WParam_TrkMode_Data
01362 #define TocControl_TrkMode_IncrData       WParam_TrkMode_IncrData
01363 #define TocControl_TrkMode_QAudio_PreEmph WParam_TrkMode_QAudio_PreEmph
01364 #define TocControl_TrkMode_AllowCpy       WParam_TrkMode_AllowCpy
01365 
01366 typedef struct _TOC_TRACK_INFO {
01367     UCHAR Reserved;
01368     UCHAR Control : 4;
01369     UCHAR Adr : 4;
01370     UCHAR TrackNum;
01371     UCHAR Reserved1;
01372     UCHAR LBA[4];
01373 } TOC_TRACK_INFO, *PTOC_TRACK_INFO;
01374 
01375 typedef struct _READ_TOC_HEADER {
01376     UCHAR Length[2];
01377     UCHAR First_TrackSes;
01378     UCHAR Last_TrackSes;
01379 } READ_TOC_HEADER, *PREAD_TOC_HEADER;
01380 
01381 #define TOC_LastTrack_ID                    0xAA
01382 
01383 typedef struct _READ_TOC_TOC {
01384     READ_TOC_HEADER Tracks;
01385     TOC_TRACK_INFO TrackData[MAXIMUM_NUMBER_OF_TRACKS+1];
01386 } READ_TOC_TOC, *PREAD_TOC_TOC;
01387 
01388 // Format 1 - Session Info
01389 
01390 typedef struct _READ_TOC_SES {
01391     READ_TOC_HEADER Sessions;
01392     TOC_TRACK_INFO LastSes_1stTrack;            // First Track Number In Last Complete Session
01393 } READ_TOC_SES, *PREAD_TOC_SES;
01394 
01395 // Format 2,3 - Full TOC, PMA
01396 
01397 // ADR = 1
01398 #define POINT_StartPositionOfTrack_Min      0x01
01399 #define POINT_StartPositionOfTrack_Max      0x63
01400 #define POINT_FirstTrackNum                 0xA0
01401 #define POINT_LastTrackNum                  0xA1
01402 #define POINT_StartPositionOfLeadOut        0xA2
01403 // ADR = 5
01404 #define POINT_SkipInterval_Min              0x01
01405 #define POINT_SkipInterval_Max              0x40
01406 #define POINT_StartPositionOfNextProgramArea 0xB0
01407 #define POINT_NumOfSkips                    0xB1
01408 #define POINT_SkipTrackAssignmet_Min        0xB2
01409 #define POINT_SkipTrackAssignmet_Max        0xB4
01410 #define POINT_StartPositionOfFirstLeadIn    0xC0
01411 #define POINT_CopyOfAdditionalAreaInATIP    0xC1
01412 
01413 typedef struct _TOC_SES_INFO {
01414     UCHAR SesNumber;
01415     UCHAR Control : 4;
01416     UCHAR Adr : 4;
01417     UCHAR TNO;
01418     UCHAR POINT;
01419 
01420     union {
01421 
01422         struct {
01423             UCHAR MSF[3];
01424             UCHAR Reserved;
01425             UCHAR P_MSF[3];
01426         } GENERIC;
01427 
01428 // ADR = 1:
01429 
01430 //0x01 - 0x63
01431         struct {
01432             UCHAR ATIME[3];
01433             UCHAR Zero;
01434             UCHAR MSF[3];
01435         } StartPositionOfTrack;
01436 
01437 //0xA0
01438 #define FullTOC_DiscType_CDDA_or_M1  WParam_SesFmt_CdRom        // 0x00
01439 #define FullTOC_DiscType_CDI         WParam_SesFmt_CdI          // 0x10
01440 #define FullTOC_DiscType_CDXA_M2     WParam_SesFmt_CdRomXa      // 0x20
01441 
01442         struct {
01443             UCHAR ATIME[3];
01444             UCHAR Zero;
01445             UCHAR FirstTrackNum;
01446             UCHAR DiscType;
01447             UCHAR Zero1;
01448         } FirstTrackNum;
01449 
01450 //0xA1
01451         struct {
01452             UCHAR ATIME[3];
01453             UCHAR Zero;
01454             UCHAR LastTrackNum;
01455             UCHAR Zero1[2];
01456         } LastTrackNum;
01457 
01458 //0xA2
01459         struct {
01460             UCHAR ATIME[3];
01461             UCHAR Zero;
01462             UCHAR MSF[3];
01463         } StartPositionOfLeadOut;
01464 
01465 // ADR = 5:
01466 
01467 //0x01 - 0x40
01468         struct {
01469             UCHAR End_MSF[3];
01470             UCHAR Reserved;
01471             UCHAR Start_MSF[3];
01472         } SkipInterval;
01473 
01474 //0xB0
01475         struct {
01476             UCHAR Program_MSF[3];
01477             UCHAR NumOfPointers_M5;
01478             UCHAR MaxLeadOut_MSF[3];
01479         } StartPositionOfNextProgramArea;
01480 
01481 //0xB1
01482         struct {
01483             UCHAR Zero[4];
01484             UCHAR Intervals;
01485             UCHAR Tracks;
01486             UCHAR Zero1;
01487         } NumOfSkips;
01488 
01489 //0xB2 - 0xB4
01490         struct {
01491             UCHAR SkipNum[7];
01492         } SkipTrackAsignment;
01493 
01494 //0xC0
01495         struct {
01496             UCHAR OptimumRecordingPower;
01497             UCHAR SpecInfoATIP[3];
01498             UCHAR LeadIn_MSF[3];
01499         } StartPositionOfFirstLeadIn;
01500 
01501 //0xC1
01502         struct {
01503             UCHAR Bytes[7];
01504         } AdditionalAreaInATIP;
01505 
01506     } Params;
01507 } TOC_SES_INFO, *PTOC_SES_INFO;
01508 
01509 typedef struct _READ_TOC_FULL_TOC {
01510     READ_TOC_HEADER Sessions;
01511     TOC_SES_INFO SessionData[MAXIMUM_NUMBER_OF_SESSIONS];
01512 } READ_TOC_FULL_TOC, *PREAD_TOC_FULL_TOC;
01513 
01514 typedef READ_TOC_FULL_TOC   READ_TOC_PMA;
01515 typedef PREAD_TOC_FULL_TOC  PREAD_TOC_PMA;
01516 
01517 // Format 4 - ATIP
01518 
01519 typedef struct _READ_TOC_ATIP {
01520     UCHAR Length[2];
01521     UCHAR Reserved[2];
01522     
01523 #define ATIP_SpeedRef_Mask  0x07
01524 #define ATIP_SpeedRef_2X    0x01
01525 #define ATIP_WritingPower_Mask  0x07
01526 
01527     union {
01528         UCHAR Flags;
01529         struct {
01530             UCHAR SpeedRef: 3;
01531             UCHAR Reserved: 1;
01532             UCHAR WritingPower: 3;
01533             UCHAR One: 1;
01534         } Fields;
01535     } Flags1;
01536 
01537 #define ATIP_URU            0x40
01538 
01539     union {
01540         UCHAR Flags;
01541         struct {
01542             UCHAR Reserved: 6;
01543             UCHAR URU: 1;
01544             UCHAR Zero: 1;
01545         } Fields;
01546     } Flags2;
01547 
01548 #define ATIP_A1             0x01        // 16-18 are valid
01549 #define ATIP_A2             0x02        // 20-22 are valid
01550 #define ATIP_A3             0x04        // 24-26 are valid
01551 #define ATIP_SubType_Mask   0x38        // shall be set to zero
01552 #define ATIP_Type_Mask      0x40
01553 #define ATIP_Type_CDR       0x00
01554 #define ATIP_Type_CDRW      0x40
01555 
01556     union {
01557         UCHAR Flags;
01558         struct {
01559             UCHAR A1: 1;
01560             UCHAR A2: 1;
01561             UCHAR A3: 1;
01562             UCHAR SubType: 3;
01563             UCHAR Type: 1;
01564             UCHAR One: 1;
01565         } Fields;
01566     } DiscType;
01567 
01568     UCHAR Reserved0;
01569     UCHAR LeadIn_MSF[3];
01570     UCHAR Reserved1;
01571     UCHAR LeadOut_MSF[3];
01572     UCHAR Reserved2;
01573 
01574 #define ATIP_MinSpeedCVL_Mask   0x70
01575 #define ATIP_MinSpeedCVL_2X     0x10
01576 #define ATIP_MaxSpeedCVL_Mask   0x0f
01577 #define ATIP_MaxSpeedCVL_2X     0x01
01578 #define ATIP_MaxSpeedCVL_4X     0x02
01579 #define ATIP_MaxSpeedCVL_6X     0x03
01580 #define ATIP_MaxSpeedCVL_8X     0x04
01581 
01582     union {
01583         UCHAR Flags;
01584         struct {
01585             UCHAR MaxSpeedCVL: 4;
01586             UCHAR MinSpeedCVL: 3;
01587             UCHAR Zero: 1;
01588         } Fields;
01589     } Speed;
01590 
01591 #define ATIP_Power_Y_Mask       0x0e
01592 #define ATIP_Power_P_Mask       0x70
01593 
01594     union {
01595         UCHAR Flags;
01596         struct {
01597             UCHAR Reserved: 1;
01598             UCHAR Y_value: 3;
01599             UCHAR P_factor: 3;
01600             UCHAR Zero: 1;
01601         } Fields;
01602     } Power;
01603 
01604 #define ATIP_PW_ratio_Mask      0x70
01605 
01606     union {
01607         UCHAR Flags;
01608         struct {
01609             UCHAR Reserved: 4;
01610             UCHAR P_W_ratio: 3;
01611             UCHAR Zero: 1;
01612         } Fields;
01613     } ErasePower;
01614 
01615     UCHAR Reserved3;
01616     UCHAR A1_value[3];
01617     UCHAR Reserved4;
01618     UCHAR A2_value[3];
01619     UCHAR Reserved5;
01620     UCHAR A3_value[3];
01621 
01622 } READ_TOC_ATIP, *PREAD_TOC_ATIP;
01623 
01624 // Format 5 - CD-TEXT
01625 
01626 typedef struct _CD_TEXT_PACK_DATA {
01627 
01628 #define CdText_ID1_Title        0x80    // ID2 = 0 - Album, ID2 = 1-63 - Track
01629 #define CdText_ID1_Performer    0x81
01630 #define CdText_ID1_Songwriter   0x82
01631 #define CdText_ID1_Composer     0x83
01632 #define CdText_ID1_Arranger     0x84
01633 #define CdText_ID1_Message      0x85
01634 #define CdText_ID1_DiscID       0x86
01635 #define CdText_ID1_GenreInfo    0x87
01636 #define CdText_ID1_TOC          0x88
01637 #define CdText_ID1_TOC2         0x89
01638 #define CdText_ID1_Special      0x8D
01639 #define CdText_ID1_UPC_EAN_ISRC 0x8E
01640 #define CdText_ID1_BlockSizeInfo 0x8F
01641 
01642     UCHAR ID1;
01643     UCHAR ID2;
01644     UCHAR ID3;
01645 
01646 #define CdText_CharPos_Mask     0x0f
01647 #define CdText_BlkNum_Mask      0x70
01648 
01649     union {
01650         UCHAR Flags;
01651         struct {
01652             UCHAR CharPos: 4;
01653             UCHAR BlkNum: 3;
01654             UCHAR DBCC: 1;          // used to indicate Double Byte text encoding (Unicode ?)
01655         } Fields;
01656     } BlkNum_CharPos;
01657 
01658     UCHAR TextData[12];
01659     UCHAR CRC[2];
01660 } CD_TEXT_PACK_DATA, *PCD_TEXT_PACK_DATA;
01661 
01662 typedef struct _READ_TOC_CD_TEXT {
01663     UCHAR Length[2];
01664     UCHAR Reserved[2];
01665     CD_TEXT_PACK_DATA Chunk0;
01666 } READ_TOC_CD_TEXT, *PREAD_TOC_CD_TEXT;
01667 
01668 // OPC block
01669 
01670 typedef struct _OPC_INFO_BLOCK {
01671     UCHAR Speed[2];
01672     UCHAR OpcValue[6];
01673 } OPC_INFO_BLOCK, *POPC_INFO_BLOCK;
01674 
01675 // Buffer Capacity format
01676 
01677 typedef struct _BUFFER_CAPACITY_BLOCK {
01678     UCHAR DataLength[2];
01679     UCHAR Reserved0[2];
01680     UCHAR BufferLength[4];
01681     UCHAR BlankBufferLength[4];
01682 } BUFFER_CAPACITY_BLOCK, *PBUFFER_CAPACITY_BLOCK;
01683 
01684 // Format Unit structures
01685 
01686 typedef struct _FORMAT_LIST_HEADER {
01687     UCHAR Reserved0;
01688 
01689 #define FormatHeader_VS     0x01
01690 #define FormatHeader_Immed  0x02
01691 #define FormatHeader_DSP    0x04
01692 #define FormatHeader_IP     0x08
01693 #define FormatHeader_STPF   0x10
01694 #define FormatHeader_DCRT   0x20
01695 #define FormatHeader_DPRY   0x40
01696 #define FormatHeader_FOV    0x80
01697 
01698     union {
01699         UCHAR Flags;
01700         struct {
01701             UCHAR VS: 1;
01702             UCHAR Immed: 1;
01703             UCHAR DSP: 1;
01704             UCHAR IP: 1;
01705             UCHAR STPF: 1;
01706             UCHAR DCRT: 1;
01707             UCHAR DPRY: 1;
01708             UCHAR FOV: 1;
01709         } Fields;
01710     } Flags;
01711     UCHAR FormatDescriptorLength[2];            // =0x0008
01712 } FORMAT_LIST_HEADER, *PFORMAT_LIST_HEADER;
01713 
01714 typedef struct _CDRW_FORMAT_DESCRIPTOR {
01715 
01716 #define FormatDesc_Grow     0x40
01717 #define FormatDesc_Ses      0x80
01718 
01719     union {
01720         UCHAR Flags;
01721         struct {
01722             UCHAR Reserved0: 6;
01723             UCHAR Grow: 1;
01724             UCHAR Ses: 1;
01725         } Fields;
01726     } Flags;
01727     UCHAR Reserved1[3];
01728     UCHAR FormatSize[4];
01729 } CDRW_FORMAT_DESCRIPTOR, *PCDRW_FORMAT_DESCRIPTOR;
01730 
01731 typedef struct _FORMAT_UNIT_PARAMETER_LIST {
01732     FORMAT_LIST_HEADER Header;
01733     UCHAR InitPatternDescr[4];
01734     CDRW_FORMAT_DESCRIPTOR FormatDescr;
01735 } FORMAT_UNIT_PARAMETER_LIST, *PFORMAT_UNIT_PARAMETER_LIST;
01736 
01737 // define Read Format Capacities info blocks
01738 
01739 typedef struct _CAPACITY_LIST_HEADER {
01740     UCHAR Reserved[3];
01741     UCHAR Length;
01742 } CAPACITY_LIST_HEADER, *PCAPACITY_LIST_HEADER;
01743 
01744 typedef struct _FORMATTABLE_CAPACITY_DESCRIPTOR {
01745     UCHAR NumOfBlocks [4];
01746     union {
01747         UCHAR Flags;
01748         struct {
01749             UCHAR DescType: 2;
01750             UCHAR Reserved0: 6;
01751         } Fields;
01752     } Flags;
01753     UCHAR BlockSize [3];
01754 } FORMATTABLE_CAPACITY_DESCRIPTOR, *PFORMATTABLE_CAPACITY_DESCRIPTOR;
01755 
01756 typedef struct _FORMAT_CAPACITIES_DATA {
01757     CAPACITY_LIST_HEADER Header;
01758 } FORMAT_CAPACITIES_DATA, *PFORMAT_CAPACITIES_DATA;
01759 
01760 // Define Event Status info blocks
01761 
01762 typedef struct _EVENT_STAT_HEADER {
01763     UCHAR DataLength[2];
01764 
01765 #define EventRetStat_Class_Mask       0x07
01766 #define EventRetStat_Class_OpChange   0x01
01767 #define EventRetStat_Class_PM         0x02
01768 #define EventRetStat_Class_Media      0x04
01769 #define EventRetStat_Class_DevBusy    0x06
01770 #define EventRetStat_NEA              0x80
01771 
01772     union {
01773         UCHAR Flags;
01774         struct {
01775             UCHAR Class: 3;
01776             UCHAR Reserved0: 4;
01777             UCHAR NEA: 1;
01778         } Fields;
01779     } Flags;
01780 
01781     UCHAR SupportedClasses;  // see command format
01782 
01783 } EVENT_STAT_HEADER, *PEVENT_STAT_HEADER;
01784 
01785 typedef struct _EVENT_STAT_OPERATIONAL_BLOCK {
01786 
01787     EVENT_STAT_HEADER Header;
01788 
01789 #define EventStat_OpEvent_Mask      0x0f
01790 
01791     union {
01792         UCHAR Flags;
01793         struct {
01794             UCHAR OpEvent  : 4;
01795             UCHAR Reserved0: 4;
01796         } Fields;
01797     } Byte0;
01798 
01799 #define EventStat_OpStat_Mask       0x0f
01800 #define EventStat_OpStat_Ready      0x00
01801 #define EventStat_OpStat_TempBusy   0x01
01802 #define EventStat_OpStat_Busy       0x02
01803 
01804     union {
01805         UCHAR Flags;
01806         struct {
01807             UCHAR OpStatus  : 4;
01808             UCHAR Reserved0 : 3;
01809             UCHAR PersistentPrevent: 1;
01810         } Fields;
01811     } Byte1;
01812 
01813 #define EventStat_OpReport_NoChg        0x00
01814 #define EventStat_OpReport_Change       0x01
01815 #define EventStat_OpReport_AddChg       0x02
01816 #define EventStat_OpReport_Reset        0x03
01817 #define EventStat_OpReport_FirmwareChg  0x04 // microcode change
01818 #define EventStat_OpReport_InquaryChg   0x05
01819 #define EventStat_OpReport_CtrlReq      0x06
01820 #define EventStat_OpReport_CtrlRelease  0x07
01821 
01822     UCHAR OpReport[2];
01823 
01824 } EVENT_STAT_OPERATIONAL_BLOCK, *PEVENT_STAT_OPERATIONAL_BLOCK;
01825 
01826 typedef struct _EVENT_STAT_PM_BLOCK {
01827 
01828     EVENT_STAT_HEADER Header;
01829 
01830 #define EventStat_PowerEvent_Mask       0x0f
01831 #define EventStat_PowerEvent_NoChg      0x00
01832 #define EventStat_PowerEvent_ChgOK      0x01
01833 #define EventStat_PowerEvent_ChgFail    0x02
01834 
01835     union {
01836         UCHAR Flags;
01837         struct {
01838             UCHAR PowerEvent : 4;
01839             UCHAR Reserved0  : 4;
01840         } Fields;
01841     } Byte0;
01842 
01843 #define EventStat_PowerStat_Mask        0x0f
01844 #define EventStat_PowerStat_Active      0x01
01845 #define EventStat_PowerStat_Idle        0x02
01846 #define EventStat_PowerStat_Standby     0x03
01847 #define EventStat_PowerStat_Sleep       0x04
01848 
01849     union {
01850         UCHAR Flags;
01851         struct {
01852             UCHAR PowerStatus: 4;
01853             UCHAR Reserved0  : 4;
01854         } Fields;
01855     } Byte1;
01856 
01857     UCHAR Reserved0[2];
01858 
01859 } EVENT_STAT_PM_BLOCK, *PEVENT_STAT_PM_BLOCK;
01860 
01861 typedef struct _EVENT_STAT_MEDIA_BLOCK {
01862 
01863     EVENT_STAT_HEADER Header;
01864 
01865 #define EventStat_MediaEvent_Mask       0x0f
01866 #define EventStat_MediaEvent_None       0x00
01867 #define EventStat_MediaEvent_EjectReq   0x01
01868 #define EventStat_MediaEvent_New        0x02
01869 #define EventStat_MediaEvent_Removal    0x03
01870 #define EventStat_MediaEvent_Chg        0x04
01871 
01872     union {
01873         UCHAR Flags;
01874         struct {
01875             UCHAR MediaEvent : 4;
01876             UCHAR Reserved0  : 4;
01877         } Fields;
01878     } Byte0;
01879 
01880 #define EventStat_MediaStat_DoorOpen    0x01
01881 #define EventStat_MediaStat_Present     0x02
01882 
01883     union {
01884         UCHAR Flags;
01885         struct {
01886             UCHAR DoorOpen  : 1;
01887             UCHAR Present   : 1;
01888             UCHAR Reserved0 : 6;
01889         } Fields;
01890     } Byte1;
01891 
01892     UCHAR StartSlot;
01893     UCHAR EndSlot;
01894 
01895 } EVENT_STAT_MEDIA_BLOCK, *PEVENT_STAT_MEDIA_BLOCK;
01896 
01897 typedef struct _EVENT_STAT_DEV_BUSY_BLOCK {
01898 
01899     EVENT_STAT_HEADER Header;
01900 
01901 #define EventStat_BusyEvent_Mask       0x0f
01902 #define EventStat_BusyEvent_None       0x00
01903 #define EventStat_BusyEvent_Busy       0x01
01904 
01905     union {
01906         UCHAR Flags;
01907         struct {
01908             UCHAR BusyEvent : 4;
01909             UCHAR Reserved0 : 4;
01910         } Fields;
01911     } Byte0;
01912 
01913 #define EventStat_BusyStat_Mask        0x0f
01914 #define EventStat_BusyStat_NoEvent     0x00
01915 #define EventStat_BusyStat_Power       0x01
01916 #define EventStat_BusyStat_Immed       0x02
01917 #define EventStat_BusyStat_Deferred    0x03
01918 
01919     union {
01920         UCHAR Flags;
01921         struct {
01922             UCHAR BusyStatus: 4;
01923             UCHAR Reserved0 : 4;
01924         } Fields;
01925     } Byte1;
01926 
01927     UCHAR Time[2];
01928 
01929 } EVENT_STAT_DEV_BUSY_BLOCK, *PEVENT_STAT_DEV_BUSY_BLOCK;
01930 
01931 // Define mode disc info block.
01932 
01933 typedef struct _DISC_INFO_BLOCK {        // 
01934     UCHAR DataLength [2];        
01935 
01936 #define DiscInfo_Disk_Mask          0x03
01937 #define DiscInfo_Disk_Empty         0x00
01938 #define DiscInfo_Disk_Appendable    0x01
01939 #define DiscInfo_Disk_Complete      0x02
01940 
01941 #define DiscInfo_Ses_Mask       0x0C
01942 #define DiscInfo_Ses_Empty      0x00
01943 #define DiscInfo_Ses_Incomplete 0x04
01944 #define DiscInfo_Ses_Complete   0x0C
01945 
01946 #define DiscInfo_Disk_Erasable  0x10
01947 
01948     union {
01949         UCHAR Flags;
01950         struct {
01951             UCHAR DiscStat : 2;
01952             UCHAR LastSesStat : 2;
01953             UCHAR Erasable : 1;
01954             UCHAR Reserved0: 3;
01955         } Fields;
01956     } DiscStat;
01957 
01958     UCHAR FirstTrackNum;
01959     UCHAR NumOfSes;
01960     UCHAR FirstTrackNumLastSes;
01961     UCHAR LastTrackNumLastSes;
01962 
01963 #define DiscInfo_URU            0x20
01964 #define DiscInfo_DBC_V          0x40
01965 #define DiscInfo_DID_V          0x80
01966 
01967     union {
01968         UCHAR Flags;
01969         struct {
01970             UCHAR Reserved1: 5;
01971             UCHAR URU      : 1;
01972             UCHAR DBC_V    : 1; // 0
01973             UCHAR DID_V    : 1;
01974         } Fields;
01975     } Flags;
01976 
01977 #define DiscInfo_Type_cdrom     0x00    // CD-DA / CD-ROM
01978 #define DiscInfo_Type_cdi       0x10    // CD-I
01979 #define DiscInfo_Type_cdromxa   0x20    // CD-ROM XA
01980 #define DiscInfo_Type_unknown   0xFF    // HZ ;)
01981 
01982     UCHAR DiskType;
01983     UCHAR NumOfSes2;              // MSB MMC-3
01984     UCHAR FirstTrackNumLastSes2;  // MSB MMC-3
01985     UCHAR LastTrackNumLastSes2;   // MSB MMC-3
01986     UCHAR DiskId [4];
01987     UCHAR LastSesLeadInTime [4];  // MSF
01988     UCHAR LastSesLeadOutTime [4]; // MSF
01989     UCHAR DiskBarCode [8];
01990     UCHAR Reserved3;
01991     UCHAR OPCNum;
01992 } DISC_INFO_BLOCK, *PDISC_INFO_BLOCK;
01993 
01994 // Define track info block.
01995 
01996 typedef struct _TRACK_INFO_BLOCK {
01997     UCHAR DataLength [2];        
01998     UCHAR TrackNum;
01999     UCHAR SesNum;
02000     UCHAR Reserved0;
02001 
02002 #define TrkInfo_Trk_Mask    0x0F
02003 #define TrkInfo_Trk_Mode1   0x01
02004 #define TrkInfo_Trk_Mode2   0x02
02005 #define TrkInfo_Trk_XA      0x02
02006 #define TrkInfo_Trk_DDCD    0x04  // MMC-3
02007 #define TrkInfo_Trk_NonCD   0x04  // MMC-3
02008 #define TrkInfo_Trk_Inc     0x05  // MMC-3
02009 #define TrkInfo_Trk_unknown 0x0F
02010 #define TrkInfo_Copy        0x10
02011 #define TrkInfo_Damage      0x20
02012 
02013     UCHAR TrackParam;
02014 /*  UCHAR TrackMode : 4;
02015     UCHAR Copy      : 1;
02016     UCHAR Damage    : 1;
02017     UCHAR Reserved1 : 2; */
02018 
02019 #define TrkInfo_Dat_Mask    0x0F
02020 #define TrkInfo_Dat_Mode1   0x01
02021 #define TrkInfo_Dat_Mode2   0x02
02022 #define TrkInfo_Dat_XA      0x02
02023 #define TrkInfo_Dat_DDCD    0x02
02024 #define TrkInfo_Dat_unknown 0x0F
02025 #define TrkInfo_FP          0x10
02026 #define TrkInfo_Packet      0x20
02027 #define TrkInfo_Blank       0x40
02028 #define TrkInfo_RT          0x80
02029 
02030     UCHAR DataParam;
02031 /*  UCHAR DataMode  : 4;
02032     UCHAR FP        : 1;
02033     UCHAR Packet    : 1;
02034     UCHAR Blank     : 1;
02035     UCHAR RT        : 1; */
02036 
02037 #define TrkInfo_NWA_V       0x01
02038 #define TrkInfo_LRA_V       0x02  // MMC-3
02039 
02040     UCHAR NWA_V;
02041 /*  UCHAR NWA_V     : 1;
02042     UCHAR LRA_V     : 1;
02043     UCHAR Reserved  : 6; */
02044 
02045     UCHAR TrackStartAddr [4];
02046     UCHAR NextWriteAddr [4];
02047     UCHAR FreeBlocks [4];
02048     UCHAR FixPacketSize [4];
02049     UCHAR TrackLength [4];
02050 
02051 // MMC-3
02052 
02053     UCHAR LastRecordedAddr [4];
02054     UCHAR TrackNum2;  // MSB
02055     UCHAR SesNum2;    // MSB
02056     UCHAR Reserved2[2];
02057 
02058 }TRACK_INFO_BLOCK, *PTRACK_INFO_BLOCK;
02059 
02060 // Mode data structures.
02061 
02062 // Define Mode parameter header.
02063 
02064 #define MediaType_Unknown                        0x00
02065 #define MediaType_120mm_CDROM_DataOnly           0x01
02066 #define MediaType_120mm_CDROM_AudioOnly          0x02        //CDDA
02067 #define MediaType_120mm_CDROM_DataAudioCombined  0x03
02068 #define MediaType_120mm_CDROM_Hybrid_PhotoCD     0x04
02069 #define MediaType_80mm_CDROM_DataOnly            0x05
02070 #define MediaType_80mm_CDROM_AudioOnly           0x06        //CDDA
02071 #define MediaType_80mm_CDROM_DataAudioCombined   0x07
02072 #define MediaType_80mm_CDROM_Hybrid_PhotoCD      0x08
02073 
02074 #define MediaType_UnknownSize_CDR                0x10
02075 #define MediaType_120mm_CDR_DataOnly             0x11
02076 #define MediaType_120mm_CDR_AudioOnly            0x12        //CDDA
02077 #define MediaType_120mm_CDR_DataAudioCombined    0x13
02078 #define MediaType_120mm_CDR_Hybrid_PhotoCD       0x14
02079 #define MediaType_80mm_CDR_DataOnly              0x15
02080 #define MediaType_80mm_CDR_AudioOnly             0x16        //CDDA
02081 #define MediaType_80mm_CDR_DataAudioCombined     0x17
02082 #define MediaType_80mm_CDR_Hybrid_Photo_CD       0x18
02083 
02084 #define MediaType_UnknownSize_CDRW               0x20
02085 #define MediaType_120mm_CDRW_DataOnly            0x21
02086 #define MediaType_120mm_CDRW_AudioOnly           0x22        //CDDA
02087 #define MediaType_120mm_CDRW_DataAudioCombined   0x23
02088 #define MediaType_120mm_CDRW_Hybrid              0x24
02089 #define MediaType_80mm_CDRW_DataOnly             0x25
02090 #define MediaType_80mm_CDRW_AudioOnly            0x26        //CDDA
02091 #define MediaType_80mm_CDRW_DataAudioCombined    0x27
02092 #define MediaType_80mm_CDRW_Hybrid               0x28
02093 
02094 #define MediaType_NoDiscPresent                  0x70
02095 #define MediaType_DoorOpen                       0x71
02096 
02097 //*********************************************************************************************
02098 
02099 typedef struct _MODE_PARAMETER_HEADER {
02100     UCHAR ModeDataLength;
02101     UCHAR MediumType;
02102     UCHAR DeviceSpecificParameter;
02103     UCHAR BlockDescriptorLength;
02104 } MODE_PARAMETER_HEADER, *PMODE_PARAMETER_HEADER;
02105 
02106 typedef struct _MODE_PARAMETER_HEADER10 {
02107     UCHAR ModeDataLength[2];
02108     UCHAR MediumType;
02109     UCHAR DeviceSpecificParameter;
02110     UCHAR Reserved[2];
02111     UCHAR BlockDescriptorLength[2];
02112 } MODE_PARAMETER_HEADER10, *PMODE_PARAMETER_HEADER10;
02113 
02114 #define MODE_FD_SINGLE_SIDE     0x01
02115 #define MODE_FD_DOUBLE_SIDE     0x02
02116 #define MODE_FD_MAXIMUM_TYPE    0x1E
02117 #define MODE_DSP_FUA_SUPPORTED  0x10
02118 #define MODE_DSP_WRITE_PROTECT  0x80
02119 
02120 // Define the mode parameter block.
02121 
02122 typedef struct _MODE_PARAMETER_BLOCK {
02123     UCHAR DensityCode;
02124     UCHAR NumberOfBlocks[3];
02125     UCHAR Reserved;
02126     UCHAR BlockLength[3];
02127 } MODE_PARAMETER_BLOCK, *PMODE_PARAMETER_BLOCK;
02128 
02129 typedef struct _MODE_PARM_READ_WRITE {
02130 
02131    MODE_PARAMETER_HEADER  ParameterListHeader;  // List Header Format
02132    MODE_PARAMETER_BLOCK   ParameterListBlock;   // List Block Descriptor
02133 
02134 } MODE_PARM_READ_WRITE_DATA, *PMODE_PARM_READ_WRITE_DATA;
02135 
02136 //*********************************************************************************************
02137 // Define read write recovery page
02138 
02139 typedef struct _MODE_READ_WRITE_RECOVERY_PAGE {     // 0x01
02140 
02141     UCHAR PageCode : 6;
02142     UCHAR Reserved1 : 1;
02143     UCHAR PSBit : 1;
02144     UCHAR PageLength;
02145     union {
02146         UCHAR Flags;
02147         struct {
02148             UCHAR DCRBit : 1;
02149             UCHAR DTEBit : 1;
02150             UCHAR PERBit : 1;
02151             UCHAR EERBit : 1;
02152             UCHAR RCBit : 1;
02153             UCHAR TBBit : 1;
02154             UCHAR ARRE : 1;
02155             UCHAR AWRE : 1;
02156         } Fields;
02157     } ErrorRecoveryParam;
02158     UCHAR ReadRetryCount;
02159     UCHAR CorrectionSpan;           //SCSI CBS only
02160     UCHAR HeadOffsetCount;          //SCSI CBS only
02161     UCHAR DataStrobOffsetCount;     //SCSI CBS only
02162     UCHAR Reserved4;
02163     UCHAR WriteRetryCount;
02164     UCHAR Reserved5;
02165     UCHAR RecoveryTimeLimit[2];     // 0
02166 
02167 } MODE_READ_WRITE_RECOVERY_PAGE, *PMODE_READ_WRITE_RECOVERY_PAGE;
02168 
02169 // Define Read Recovery page - cdrom
02170 
02171 typedef struct _MODE_READ_RECOVERY_PAGE {       // 0x01
02172 
02173     UCHAR PageCode : 6;
02174     UCHAR Reserved1 : 1;
02175     UCHAR PSBit : 1;
02176     UCHAR PageLength;
02177     UCHAR DCRBit : 1;
02178     UCHAR DTEBit : 1;
02179     UCHAR PERBit : 1;
02180     UCHAR Reserved2 : 1;
02181     UCHAR RCBit : 1;
02182     UCHAR TBBit : 1;
02183     UCHAR Reserved3 : 2;
02184     UCHAR ReadRetryCount;
02185     UCHAR Reserved4[4];
02186 
02187 } MODE_READ_RECOVERY_PAGE, *PMODE_READ_RECOVERY_PAGE;
02188 
02189 //*********************************************************************************************
02190 // Define mode write parameters page.
02191 
02192 typedef struct _MODE_WRITE_PARAMS_PAGE {        // 0x05
02193     UCHAR PageCode : 6;
02194     UCHAR Reserved1: 1;
02195     UCHAR PageSavable : 1;
02196 
02197     UCHAR PageLength;               // 0x32
02198 
02199 #define WParam_WType_Mask   0x0f
02200 #define WParam_WType_Packet 0x00
02201 #define WParam_WType_TAO    0x01
02202 #define WParam_WType_Ses    0x02
02203 #define WParam_WType_Raw    0x03
02204 #define WParam_TestWrite    0x10
02205 #define WParam_LS_V         0x20
02206 #define WParam_BUFF         0x40
02207 
02208     union {
02209         UCHAR Flags;
02210         struct {
02211             UCHAR WriteType: 4;             // 1
02212             UCHAR TestWrite: 1;
02213             UCHAR LS_V: 1;
02214             UCHAR BUFF: 1;
02215             UCHAR Reserved1: 1;
02216         } Fields;
02217     } Byte2;
02218 
02219 #define WParam_TrkMode_Mask             0x0d // xx0x
02220 #define WParam_TrkMode_None             0x00
02221 #define WParam_TrkMode_Audio            0x00
02222 #define WParam_TrkMode_Audio_PreEmph    0x01
02223 #define WParam_TrkMode_Data             0x04
02224 #define WParam_TrkMode_IncrData         0x05
02225 #define WParam_TrkMode_QAudio_PreEmph   0x08
02226 #define WParam_TrkMode_AllowCpy         0x02
02227 #define WParam_Copy             0x10
02228 #define WParam_FP               0x20
02229 #define WParam_MultiSes_Mask    0xc0
02230 #define WParam_Multises_None    0x00
02231 #define WParam_Multises_Final   0x80
02232 #define WParam_Multises_Multi   0xc0
02233 
02234     union {
02235         UCHAR Flags;
02236         struct {
02237             UCHAR TrackMode: 4;             // 4
02238             UCHAR Copy     : 1;             // 0
02239             UCHAR FP       : 1;             // 0
02240             UCHAR Multisession: 2;          // 11
02241         } Fields;
02242     } Byte3;
02243 
02244 #define WParam_BlkType_Mask         0x0f
02245 #define WParam_BlkType_Raw_2352     0x00
02246 #define WParam_BlkType_RawPQ_2368   0x01
02247 #define WParam_BlkType_RawPW_2448   0x02
02248 #define WParam_BlkType_RawPW_R_2448 0x03
02249 #define WParam_BlkType_VendorSpec1  0x07
02250 #define WParam_BlkType_M1_2048      0x08
02251 #define WParam_BlkType_M2_2336      0x09
02252 #define WParam_BlkType_M2XAF1_2048  0x0a
02253 #define WParam_BlkType_M2XAF1SH_2056 0x0b
02254 #define WParam_BlkType_M2XAF2_2324  0x0c
02255 #define WParam_BlkType_M2XAFXSH_2332 0x0d
02256 #define WParam_BlkType_VendorSpec2  0x0f
02257 
02258     union {
02259         UCHAR Flags;
02260         struct {
02261             UCHAR DataBlockType: 4;         // 8
02262             UCHAR Reserved2: 4;
02263         } Fields;
02264     } Byte4;
02265 
02266     UCHAR LinkSize;
02267     UCHAR Reserved3;    
02268 
02269     union {
02270         UCHAR Flags;
02271         struct {
02272             UCHAR HostAppCode : 6;          // 0
02273             UCHAR Reserved4   : 2;
02274         } Fields;
02275     } Byte7;
02276 
02277 #define WParam_SesFmt_CdRom     0x00
02278 #define WParam_SesFmt_CdI       0x10
02279 #define WParam_SesFmt_CdRomXa   0x20
02280 
02281     UCHAR SesFmt;                   // 0
02282     UCHAR Reserved5;
02283     UCHAR PacketSize[4];            // 0
02284     UCHAR AudioPause[2];            // 150
02285 
02286     UCHAR Reserved6: 7;
02287     UCHAR MCVAL    : 1;
02288 
02289     UCHAR N[13];
02290     UCHAR Zero;
02291     UCHAR AFRAME;
02292 
02293     UCHAR Reserved7: 7;
02294     UCHAR TCVAL    : 1;
02295 
02296     UCHAR I[12];
02297     UCHAR Zero_2;
02298     UCHAR AFRAME_2;
02299     UCHAR Reserved8;
02300 
02301     struct {
02302         union {
02303             UCHAR MSF[3];
02304             struct _SubHdrParams1 {
02305                 UCHAR FileNum;
02306                 UCHAR ChannelNum;
02307 
02308 #define WParam_SubHdr_SubMode0          0x00
02309 #define WParam_SubHdr_SubMode1          0x08
02310 
02311                 UCHAR SubMode;
02312             } Params1;
02313         } Params;
02314 
02315 #define WParam_SubHdr_Mode_Mask         0x03
02316 #define WParam_SubHdr_Mode0             0x00
02317 #define WParam_SubHdr_Mode1             0x01
02318 #define WParam_SubHdr_Mode2             0x02
02319 #define WParam_SubHdr_Format_Mask       0xe0
02320 #define WParam_SubHdr_Format_UserData   0x00
02321 #define WParam_SubHdr_Format_RunIn4     0x20
02322 #define WParam_SubHdr_Format_RunIn3     0x40
02323 #define WParam_SubHdr_Format_RunIn2     0x60
02324 #define WParam_SubHdr_Format_RunIn1     0x80
02325 #define WParam_SubHdr_Format_Link       0xa0
02326 #define WParam_SubHdr_Format_RunOut2    0xc0
02327 #define WParam_SubHdr_Format_RunOut1    0xe0
02328 
02329         union {
02330             UCHAR Flags;
02331             struct {
02332                 UCHAR Mode      : 2;
02333                 UCHAR Reserved  : 3;
02334                 UCHAR Format    : 3;
02335             } Fields;
02336         } Mode;
02337     } SubHeader ;
02338 
02339 } MODE_WRITE_PARAMS_PAGE, *PMODE_WRITE_PARAMS_PAGE;
02340 
02341 typedef struct _MODE_WRITE_PARAMS_PAGE_3 {
02342     MODE_WRITE_PARAMS_PAGE Standard;
02343     UCHAR VendorSpec[4];
02344 } MODE_WRITE_PARAMS_PAGE_3, *PMODE_WRITE_PARAMS_PAGE_3;
02345 
02346 //*********************************************************************************************
02347 // Define Caching page.
02348 
02349 typedef struct _MODE_CACHING_PAGE {         // 0x08
02350     UCHAR PageCode : 6;
02351     UCHAR Reserved1: 1;
02352     UCHAR PageSavable : 1;
02353     UCHAR PageLength;
02354     UCHAR ReadDisableCache : 1;
02355     UCHAR MultiplicationFactor : 1;
02356     UCHAR WriteCacheEnable : 1;
02357     UCHAR Reserved2 : 5;
02358     UCHAR WriteRetensionPriority : 4;
02359     UCHAR ReadRetensionPriority : 4;
02360     UCHAR DisablePrefetchTransfer[2];
02361     UCHAR MinimumPrefetch[2];
02362     UCHAR MaximumPrefetch[2];
02363     UCHAR MaximumPrefetchCeiling[2];
02364 } MODE_CACHING_PAGE, *PMODE_CACHING_PAGE;
02365 
02366 //*********************************************************************************************
02367 // Define CD Parameters page.
02368 
02369 typedef struct _MODE_CD_PARAMS_PAGE {         // 0x0D
02370     UCHAR PageCode : 6;
02371     UCHAR Reserved : 1;
02372     UCHAR PageSavable : 1;
02373     
02374     UCHAR PageLength;                       // 0x06
02375     UCHAR Reserved1;
02376 
02377 #define CdParams_InactvityTime_Mask     0x0f
02378 
02379     union {
02380         UCHAR Flags;
02381         struct {
02382             UCHAR InactivityTime: 4;        // 1 - 125ms, 2 - 250ms... 9 - 32s, A - 1min...
02383             UCHAR Reserved0 : 4;
02384         } Fields;
02385     } Byte2;
02386 
02387     UCHAR SUnits_per_MUnit[2];
02388     UCHAR FUnits_per_SUnit[2];
02389 } MODE_CD_PARAMS_PAGE, *PMODE_CD_PARAMS_PAGE;
02390 
02391 //*********************************************************************************************
02392 // Define CD Audio Control Mode page.
02393 
02394 typedef struct _CDDA_PORT_CONTROL {
02395 
02396 #define CddaPort_Channel_Mask       0x0f
02397 #define CddaPort_Channel_Mute       0x00
02398 #define CddaPort_Channel_0          0x01
02399 #define CddaPort_Channel_1          0x02
02400 #define CddaPort_Channel_0_1        0x03
02401 #define CddaPort_Channel_2          0x04
02402 #define CddaPort_Channel_3          0x08
02403 
02404     UCHAR ChannelSelection;
02405     UCHAR Volume;
02406 } CDDA_PORT_CONTROL, *PCDDA_PORT_CONTROL;
02407 
02408 typedef struct _MODE_CD_AUDIO_CONTROL_PAGE {         // 0x0E
02409     UCHAR PageCode : 6;
02410     UCHAR Reserved1: 1;
02411     UCHAR PageSavable : 1;
02412     
02413     UCHAR PageLength;                       // 0x0E
02414 
02415 #define CdAudio_SOTC        0x02
02416 #define CdAudio_Immed       0x04
02417 
02418     union {
02419         UCHAR Flags;
02420         struct {
02421             UCHAR Reserved0 : 1;
02422             UCHAR SOTC      : 1;
02423             UCHAR Immed     : 1;
02424             UCHAR Reserved1 : 5;
02425         } Fields;
02426     } Byte2;
02427 
02428     UCHAR Reserved2[2];
02429     UCHAR LbaFormat;
02430     UCHAR LogicalBlocksPerSecond[2];
02431     CDDA_PORT_CONTROL Port[4];
02432 } MODE_CD_AUDIO_CONTROL_PAGE, *PMODE_CD_AUDIO_CONTROL_PAGE;
02433 
02434 //*********************************************************************************************
02435 // Define Power Condition Mode page.
02436 
02437 typedef struct _MODE_POWER_CONDITION_PAGE {         // 0x1A
02438     UCHAR PageCode : 6;
02439     UCHAR Reserved1: 1;
02440     UCHAR PageSavable : 1;
02441     
02442     UCHAR PageLength;                       // 0x0A
02443     UCHAR Reserved2;
02444 
02445 #define PowerCond_Standby       0x01
02446 #define PowerCond_Idle          0x02
02447 
02448     union {
02449         UCHAR Flags;
02450         struct {
02451             UCHAR Standby   : 1;
02452             UCHAR Idle      : 1;
02453             UCHAR Reserved1 : 6;
02454         } Fields;
02455     } Byte3;
02456 
02457     UCHAR IdleTimer[4];                 // 1unit = 100ms
02458     UCHAR StandbyTimer[4];              // 1unit = 100ms
02459 } MODE_POWER_CONDITION_PAGE, *PMODE_POWER_CONDITION_PAGE;
02460 
02461 //*********************************************************************************************
02462 // Define Fault/Failure Reporting Control page.
02463 
02464 typedef struct _MODE_FAIL_REPORT_PAGE {         // 0x1C
02465     UCHAR PageCode : 6;
02466     UCHAR Reserved1: 1;
02467     UCHAR PageSavable : 1;
02468     
02469     UCHAR PageLength;                       // 0x0A
02470 
02471 #define FailReport_LogErr       0x01
02472 #define FailReport_Test         0x04
02473 #define FailReport_DExcept      0x08
02474 #define FailReport_Perf         0x80
02475 
02476     union {
02477         UCHAR Flags;
02478         struct {
02479             UCHAR LogErr    : 1;
02480             UCHAR Reserved1 : 1;
02481             UCHAR Test      : 1;
02482             UCHAR DExcept   : 1;
02483             UCHAR Reserved2 : 3;
02484             UCHAR Perf      : 1;
02485         } Fields;
02486     } Byte2;
02487 
02488     union {
02489         UCHAR Flags;
02490         struct {
02491             UCHAR MRIE      : 4;
02492             UCHAR Reserved1 : 4;
02493         } Fields;
02494     } Byte3;
02495 
02496     UCHAR IntervalTimer[4];                 // 1unit = 100ms
02497     UCHAR ReportCount[4];
02498 } MODE_FAIL_REPORT_PAGE, *PMODE_FAIL_REPORT_PAGE;
02499 
02500 //*********************************************************************************************
02501 // Define Time-out and Protect page.
02502 
02503 typedef struct _MODE_TIMEOUT_AND_PROTECT_PAGE {         // 0x1D
02504     UCHAR PageCode : 6;
02505     UCHAR Reserved1: 1;
02506     UCHAR PageSavable : 1;
02507     
02508     UCHAR PageLength;                       // 0x08
02509 
02510     UCHAR Reserved2[2];
02511 
02512 #define Timeout_SW          0x01
02513 #define Timeout_DISP        0x02
02514 #define Timeout_TMOE        0x04
02515 
02516     union {
02517         UCHAR Flags;
02518         struct {
02519             UCHAR SW       : 1;
02520             UCHAR DISP     : 1;
02521             UCHAR TMOE     : 1;
02522             UCHAR Reserved : 5;
02523         } Fields;
02524     } Byte4;
02525 
02526     UCHAR Reserved3;
02527 
02528     UCHAR Group1_Timeout[2];                 // 1unit = 1s
02529     UCHAR Group2_Timeout[2];                 // 1unit = 1s
02530 } MODE_TIMEOUT_AND_PROTECT_PAGE, *PMODE_TIMEOUT_AND_PROTECT_PAGE;
02531 
02532 //*********************************************************************************************
02533 // Define Philips CD-R(W) Sector Mode page.
02534 
02535 typedef struct _MODE_PHILIPS_SECTOR_TYPE_PAGE {   // 0x21
02536     UCHAR PageCode : 6;
02537     UCHAR Reserved1 : 1;
02538     UCHAR PSBit : 1;
02539 
02540     UCHAR PageLength;
02541 
02542     UCHAR Reserved0[2];
02543 
02544     union {
02545         UCHAR Flags;
02546         struct {
02547             UCHAR DataBlockType: 4;         // 8
02548             UCHAR Reserved2: 4;
02549         } Fields;
02550     } Byte4;
02551 
02552 #define WParams_Philips_CreateNewTrack      0
02553 
02554     UCHAR Track;
02555     UCHAR ISRC[9];
02556 
02557     UCHAR Reserved3[2];
02558 } MODE_PHILIPS_SECTOR_TYPE_PAGE, *PMODE_PHILIPS_SECTOR_TYPE_PAGE;
02559 
02560 //*********************************************************************************************
02561 // Define CD-X Capabilities and Mechanical Status page.
02562 
02563 typedef struct _MODE_CAPABILITIES_PAGE2 {   // 0x2A
02564     UCHAR PageCode : 6;
02565     UCHAR Reserved1 : 1;
02566     UCHAR PSBit : 1;
02567 
02568     UCHAR PageLength;
02569 
02570 #define DevCap_read_cd_r          0x01 // reserved in 1.2 
02571 #define DevCap_read_cd_rw         0x02 // reserved in 1.2 
02572 #define DevCap_method2            0x04
02573 #define DevCap_read_dvd_rom       0x08
02574 #define DevCap_read_dvd_r         0x10
02575 #define DevCap_read_dvd_ram       0x20
02576 
02577     UCHAR ReadCap;            // DevCap_*_read
02578 /*    UCHAR cd_r_read         : 1; // reserved in 1.2 
02579     UCHAR cd_rw_read        : 1; // reserved in 1.2 
02580     UCHAR method2           : 1;
02581     UCHAR dvd_rom           : 1;
02582     UCHAR dvd_r_read        : 1;
02583     UCHAR dvd_ram_read      : 1;
02584     UCHAR Reserved2            : 2;*/
02585 
02586 #define DevCap_write_cd_r         0x01 // reserved in 1.2 
02587 #define DevCap_write_cd_rw        0x02 // reserved in 1.2 
02588 #define DevCap_test_write         0x04
02589 #define DevCap_write_dvd_r        0x10
02590 #define DevCap_write_dvd_ram      0x20
02591 
02592     UCHAR WriteCap;            // DevCap_*_write
02593 /*    UCHAR cd_r_write        : 1; // reserved in 1.2 
02594     UCHAR cd_rw_write        : 1; // reserved in 1.2 
02595     UCHAR test_write        : 1;
02596     UCHAR reserved3a        : 1;
02597     UCHAR dvd_r_write       : 1;
02598     UCHAR dvd_ram_write     : 1;
02599     UCHAR Reserved3         : 2;*/
02600 
02601 #define DevCap_audio_play          0x01
02602 #define DevCap_composite          0x02
02603 #define DevCap_digport1           0x04
02604 #define DevCap_digport2           0x08
02605 #define DevCap_mode2_form1        0x10
02606 #define DevCap_mode2_form2        0x20
02607 #define DevCap_multisession       0x40
02608 
02609     UCHAR Capabilities0;
02610 /*    UCHAR audio_play        : 1;
02611     UCHAR composite         : 1;
02612     UCHAR digport1          : 1;
02613     UCHAR digport2          : 1;
02614     UCHAR mode2_form1       : 1;
02615     UCHAR mode2_form2       : 1;
02616     UCHAR multisession      : 1;
02617     UCHAR Reserved4         : 1;*/
02618 
02619 #define DevCap_cdda               0x01
02620 #define DevCap_cdda_accurate      0x02
02621 #define DevCap_rw_supported       0x04
02622 #define DevCap_rw_corr            0x08
02623 #define DevCap_c2_pointers        0x10
02624 #define DevCap_isrc               0x20
02625 #define DevCap_upc                0x40
02626 #define DevCap_read_bar_code      0x80
02627 
02628     UCHAR Capabilities1;
02629 /*    UCHAR cdda              : 1;
02630     UCHAR cdda_accurate     : 1;
02631     UCHAR rw_supported      : 1;
02632     UCHAR rw_corr           : 1;
02633     UCHAR c2_pointers       : 1;
02634     UCHAR isrc              : 1;
02635     UCHAR upc               : 1;
02636     UCHAR Reserved5         : 1;*/
02637 
02638 #define DevCap_lock               0x01
02639 #define DevCap_lock_state         0x02
02640 #define DevCap_prevent_jumper     0x04
02641 #define DevCap_eject              0x08
02642 #define DevCap_mechtype_mask      0xE0
02643 #define DevCap_mechtype_caddy      0x00
02644 #define DevCap_mechtype_tray      (0x01<<5)
02645 #define DevCap_mechtype_popup      (0x02<<5)
02646 #define DevCap_mechtype_individual_changer      (0x04<<5)
02647 #define DevCap_mechtype_cartridge_changer      (0x05<<5)
02648 
02649     UCHAR Capabilities2;
02650 /*    UCHAR lock              : 1;
02651     UCHAR lock_state        : 1;
02652     UCHAR prevent_jumper    : 1;
02653     UCHAR eject             : 1;
02654     UCHAR Reserved6         : 1;
02655     UCHAR mechtype        : 3;*/
02656 
02657 #define DevCap_separate_volume    0x01
02658 #define DevCap_separate_mute      0x02
02659 #define DevCap_disc_present       0x04          // reserved in 1.2 
02660 #define DevCap_sw_slot_select     0x08          // reserved in 1.2 
02661 #define DevCap_change_side_cap    0x10 
02662 #define DevCap_rw_leadin_read     0x20
02663 
02664     UCHAR Capabilities3;
02665 /*    UCHAR separate_volume   : 1;
02666     UCHAR separate_mute     : 1;
02667     UCHAR disc_present      : 1;  // reserved in 1.2 
02668     UCHAR sss               : 1;  // reserved in 1.2 
02669     UCHAR Reserved7         : 4;*/
02670 
02671     UCHAR MaximumSpeedSupported[2];
02672     UCHAR NumberVolumeLevels[2];
02673     UCHAR BufferSize[2];
02674     UCHAR CurrentSpeed[2];
02675 
02676     UCHAR Reserved8;
02677 
02678     UCHAR SpecialParameters0;
02679 /*  UCHAR Reserved9        : 1;
02680     UCHAR BCK           : 1;
02681     UCHAR RCK           : 1;
02682     UCHAR LSBF          : 1;
02683     UCHAR Length        : 2;
02684     UCHAR Reserved10    : 2;*/
02685 
02686     UCHAR MaximumWriteSpeedSupported[2];
02687     UCHAR CurrentWriteSpeed[2];
02688     UCHAR CopyManagementRevision[2];
02689     UCHAR Reserved11[2];
02690 
02691 // MMC3
02692 
02693     UCHAR Reserved12;
02694 
02695     UCHAR SpecialParameters1;
02696 /*  UCHAR RCS           : 2; // rotation control selected
02697     UCHAR Reserved13    : 6; */
02698 
02699     UCHAR CurrentWriteSpeed3[2];
02700     UCHAR LunWPerfDescriptorCount[2];
02701 
02702 //    LUN_WRITE_PERF_DESC  LunWPerfDescriptor[0];
02703 
02704 } MODE_CAPABILITIES_PAGE2, *PMODE_CAPABILITIES_PAGE2;
02705 
02706 typedef struct _LUN_WRITE_PERF_DESC {
02707     UCHAR Reserved;
02708 
02709 #define LunWPerf_RotCtrl_Mask   0x07
02710 #define LunWPerf_RotCtrl_CLV    0x00
02711 #define LunWPerf_RotCtrl_CAV    0x01
02712 
02713     UCHAR RotationControl;
02714     UCHAR WriteSpeedSupported[2]; // kbps
02715 
02716 } LUN_WRITE_PERF_DESC, *PLUN_WRITE_PERF_DESC;
02717 
02718 // Mode parameter list block descriptor -
02719 // set the block length for reading/writing
02720 
02721 #define MODE_BLOCK_DESC_LENGTH               8
02722 #define MODE_HEADER_LENGTH                   4
02723 #define MODE_HEADER_LENGTH10                 8
02724 
02725 #define CDB_USE_MSF                0x01
02726 
02727 // Atapi 2.5 changer
02728 typedef struct _MECHANICAL_STATUS_INFORMATION_HEADER {
02729     UCHAR CurrentSlot : 5;
02730     UCHAR ChangerState : 2;
02731     UCHAR Fault : 1;
02732     UCHAR Reserved : 5;
02733     UCHAR MechanismState : 3;
02734     UCHAR CurrentLogicalBlockAddress[3];
02735     UCHAR NumberAvailableSlots;
02736     UCHAR SlotTableLength[2];
02737 } MECHANICAL_STATUS_INFORMATION_HEADER, *PMECHANICAL_STATUS_INFORMATION_HEADER;
02738 
02739 typedef struct _SLOT_TABLE_INFORMATION {
02740     UCHAR DiscChanged : 1;
02741     UCHAR Reserved : 6;
02742     UCHAR DiscPresent : 1;
02743     UCHAR Reserved2[3];
02744 } SLOT_TABLE_INFORMATION, *PSLOT_TABLE_INFORMATION;
02745 
02746 typedef struct _MECHANICAL_STATUS {
02747     MECHANICAL_STATUS_INFORMATION_HEADER MechanicalStatusHeader;
02748     SLOT_TABLE_INFORMATION SlotTableInfo[1];
02749 } MECHANICAL_STATUS, *PMECHANICAL_STATUS;
02750 
02751 // DVD structure blocks
02752 
02753 typedef struct _DVD_DESCRIPTOR_HEADER {
02754     UCHAR Length[2];
02755     UCHAR Reserved[2];
02756 } DVD_DESCRIPTOR_HEADER, *PDVD_DESCRIPTOR_HEADER;
02757 
02758 typedef struct _DVD_LAYER_DESCRIPTOR {
02759     DVD_DESCRIPTOR_HEADER Header;
02760     UCHAR Length[2];
02761     UCHAR BookVersion : 4;
02762     UCHAR BookType : 4;
02763     UCHAR MinimumRate : 4;
02764     UCHAR DiskSize : 4;
02765     UCHAR LayerType : 4;
02766     UCHAR TrackPath : 1;
02767     UCHAR NumberOfLayers : 2;
02768     UCHAR Reserved1 : 1;
02769     UCHAR TrackDensity : 4;
02770     UCHAR LinearDensity : 4;
02771     UCHAR StartingDataSector[4];
02772     UCHAR EndDataSector[4];
02773     UCHAR EndLayerZeroSector[4];
02774     UCHAR Reserved5 : 7;
02775     UCHAR BCAFlag : 1;
02776     UCHAR Reserved6;
02777 } DVD_LAYER_DESCRIPTOR, *PDVD_LAYER_DESCRIPTOR;
02778 
02779 typedef struct _DVD_COPYRIGHT_INFORMATION {
02780     UCHAR CopyrightProtectionSystemType;
02781     UCHAR RegionManagementInformation;
02782     UCHAR Reserved[2];
02783 } DVD_COPYRIGHT_INFORMATION, *PDVD_COPYRIGHT_INFORMATION;
02784 
02785 typedef struct _DVD_DISK_KEY_STRUCTURES {
02786     UCHAR DiskKeyData[2048];
02787 } DVD_DISK_KEY_STRUCTURES, *PDVD_DISK_KEY_STRUCTURES;
02788 
02789 typedef struct _CDVD_KEY_HEADER {
02790     UCHAR DataLength[2];
02791     UCHAR Reserved[2];
02792 } CDVD_KEY_HEADER, *PCDVD_KEY_HEADER;
02793 
02794 typedef struct _CDVD_REPORT_AGID_DATA {
02795     CDVD_KEY_HEADER Header;
02796     UCHAR Reserved1[3];
02797     UCHAR Reserved2 : 6;
02798     UCHAR AGID : 2;
02799 } CDVD_REPORT_AGID_DATA, *PCDVD_REPORT_AGID_DATA;
02800 
02801 typedef struct _CDVD_CHALLENGE_KEY_DATA {
02802     CDVD_KEY_HEADER Header;
02803     UCHAR ChallengeKeyValue[10];
02804     UCHAR Reserved[2];
02805 } CDVD_CHALLENGE_KEY_DATA, *PCDVD_CHALLENGE_KEY_DATA;
02806 
02807 typedef struct _CDVD_KEY_DATA {
02808     CDVD_KEY_HEADER Header;
02809     UCHAR Key[5];
02810     UCHAR Reserved[3];
02811 } CDVD_KEY_DATA, *PCDVD_KEY_DATA;
02812 
02813 typedef struct _CDVD_REPORT_ASF_DATA {
02814     CDVD_KEY_HEADER Header;
02815     UCHAR Reserved1[3];
02816     UCHAR Success : 1;
02817     UCHAR Reserved2 : 7;
02818 } CDVD_REPORT_ASF_DATA, *PCDVD_REPORT_ASF_DATA;
02819 
02820 typedef struct _CDVD_TITLE_KEY_HEADER {
02821     CDVD_KEY_HEADER Header;
02822     UCHAR DataLength[2];
02823     UCHAR Reserved1[1];
02824     UCHAR Reserved2 : 3;
02825     UCHAR CGMS : 2;
02826     UCHAR CP_SEC : 1;
02827     UCHAR CPM : 1;
02828     UCHAR Zero : 1;
02829     CDVD_KEY_DATA TitleKey;
02830 } CDVD_TITLE_KEY_HEADER, *PCDVD_TITLE_KEY_HEADER;
02831 
02832 typedef struct _DVD_COPYRIGHT_DESCRIPTOR {
02833     UCHAR CopyrightProtectionType;
02834     UCHAR RegionManagementInformation;
02835     UCHAR Reserved[2];
02836 } DVD_COPYRIGHT_DESCRIPTOR, *PDVD_COPYRIGHT_DESCRIPTOR;
02837 
02838 typedef struct _DVD_RPC_KEY {
02839     UCHAR UserResetsAvailable:3;
02840     UCHAR ManufacturerResetsAvailable:3;
02841     UCHAR TypeCode:2;
02842     UCHAR RegionMask;
02843     UCHAR RpcScheme;
02844     UCHAR Reserved2[1];
02845 } DVD_RPC_KEY, * PDVD_RPC_KEY;
02846 
02847 #pragma pack(pop)
02848 
02849 #endif //__CDRW_DEVICE_H__

Generated on Sat May 26 2012 04:26:59 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.