ReactOS
0.4.16-dev-340-g0540c21
cdrw_hw.h
Go to the documentation of this file.
1
2
// Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
3
// All rights reserved
4
// This file was released under the GPLv2 on June 2015.
6
/*
7
8
Module Name:
9
10
cdrw_hw.h
11
12
Abstract:
13
14
Here are the structures and defines used for device low level control.
15
16
Environment:
17
18
kernel mode only
19
20
*/
21
#ifndef __CDRW_DEVICE_H__
22
#define __CDRW_DEVICE_H__
23
24
#pragma pack(push, 1)
25
26
// Command Descriptor Block. Passed by SCSI controller chip over the SCSI bus
27
28
typedef
union
_CDB
{
29
30
// Generic 6-Byte CDB
31
struct
_CDB6
{
32
UCHAR
OperationCode
;
33
UCHAR
Immediate
: 1;
34
UCHAR
CommandUniqueBits
: 4;
35
UCHAR
Lun
: 3;
36
UCHAR
CommandUniqueBytes
[3];
37
UCHAR
Link
: 1;
38
UCHAR
Flag
: 1;
39
UCHAR
Reserved
: 4;
40
UCHAR
VendorUnique
: 2;
41
}
CDB6
, *
PCDB6
;
42
43
struct
_REQUEST_SENSE
{
44
UCHAR
OperationCode
;
45
UCHAR
Reserved0
: 5;
46
UCHAR
Lun
: 3;
47
UCHAR
Reserved1
[2];
48
UCHAR
AllocationLength
;
49
UCHAR
Link
: 1;
50
UCHAR
Flag
: 1;
51
UCHAR
Reserved2
: 6;
52
}
REQUEST_SENSE
, *
PREQUEST_SENSE
;
53
54
// Standard 6-byte CDB
55
struct
_CDB6READWRITE
{
56
UCHAR
OperationCode
;
57
UCHAR
LBA2
: 5;
58
UCHAR
Lun
: 3;
59
UCHAR
LBA0
[2];
60
UCHAR
NumOfBlocks
;
61
UCHAR
Control
;
62
}
CDB6READWRITE
, *
PCDB6READWRITE
;
63
64
// SCSI Inquiry CDB
65
struct
_CDB6INQUIRY
{
66
UCHAR
OperationCode
;
67
UCHAR
Reserved1
: 5;
68
UCHAR
Lun
: 3;
69
UCHAR
PageCode
;
70
UCHAR
IReserved
;
71
UCHAR
AllocationLength
;
72
UCHAR
Control
;
73
}
CDB6INQUIRY
, *
PCDB6INQUIRY
;
74
75
// SCSI Format CDB
76
77
struct
_ERASE
{
78
UCHAR
OperationCode
;
79
UCHAR
Long
: 1;
80
UCHAR
Immediate
: 1;
81
UCHAR
Reserved1
: 3;
82
UCHAR
Lun
: 3;
83
UCHAR
Reserved2
[3];
84
UCHAR
Control
;
85
}
ERASE
, *
PERASE
;
86
87
#define FormatUnit_Code_Mask 0x07
88
#define FormatUnit_Cmp 0x08
89
#define FormatUnit_Fmt 0x10
90
91
#define FormatUnit_Code_oldCDRW 0x07
92
#define FormatUnit_Code_CD_DVD 0x01
93
94
struct
_CDB6FORMAT
{
95
UCHAR
OperationCode
;
96
union
{
97
UCHAR
Flags
;
98
struct
{
99
UCHAR
FormatCode
: 3;
100
UCHAR
Cmp
:1;
101
UCHAR
Fmt
:1;
102
UCHAR
Lun
: 3;
103
}
Fields
;
104
}
Byte1
;
105
UCHAR
FReserved1
;
106
UCHAR
Interleave
[2];
107
UCHAR
FReserved2
;
108
}
CDB6FORMAT
, *
PCDB6FORMAT
;
109
110
// Standard 10-byte CDB
111
struct
_CDB10
{
112
UCHAR
OperationCode
;
113
UCHAR
RelativeAddress
: 1;
114
UCHAR
Reserved1
: 2;
115
UCHAR
ForceUnitAccess
: 1;
116
UCHAR
DisablePageOut
: 1;
117
UCHAR
Lun
: 3;
118
UCHAR
LBA
[4];
119
UCHAR
Reserved2
;
120
UCHAR
TransferBlocks
[2];
121
UCHAR
Control
;
122
}
CDB10
, *
PCDB10
;
123
124
// CD Rom Audio CDBs
125
126
#define PauseResume_Pause 0x00
127
#define PauseResume_Resume 0x01
128
129
struct
_PAUSE_RESUME
{
130
UCHAR
OperationCode
;
131
UCHAR
Reserved1
: 5;
132
UCHAR
Lun
: 3;
133
UCHAR
Reserved2
[6];
134
UCHAR
Action
;
135
UCHAR
Control
;
136
}
PAUSE_RESUME
, *
PPAUSE_RESUME
;
137
138
// Read Table of Contents (TOC)
139
140
#define ReadTOC_Format_Mask 0x0f
141
#define ReadTOC_Format_TOC 0x00
142
#define ReadTOC_Format_SesInfo 0x01
143
#define ReadTOC_Format_FullTOC 0x02
144
#define ReadTOC_Format_PMA 0x03
145
#define ReadTOC_Format_ATIP 0x04
146
#define ReadTOC_Format_CdText 0x05
147
148
struct
_READ_TOC
{
149
UCHAR
OperationCode
;
150
UCHAR
Reserved0
: 1;
151
UCHAR
Msf
: 1;
// HMSF MMC-3
152
UCHAR
Reserved1
: 3;
153
UCHAR
Lun
: 3;
154
155
union
{
156
UCHAR
Flags
;
157
struct
{
158
UCHAR
Format
: 4;
159
UCHAR
Reserved
: 4;
160
}
Fields
;
161
}
Byte2
;
162
163
UCHAR
Reserved2
[3];
164
UCHAR
Start_TrackSes
;
165
UCHAR
AllocationLength
[2];
166
UCHAR
Control
: 6;
167
UCHAR
Format
: 2;
168
}
READ_TOC
, *
PREAD_TOC
;
169
170
// Read Header
171
struct
_READ_HEADER
{
172
UCHAR
OperationCode
;
173
UCHAR
Reserved0
: 1;
174
UCHAR
Msf
: 1;
// HMSF MMC-3
175
UCHAR
Reserved1
: 3;
176
UCHAR
Lun
: 3;
177
178
UCHAR
LBA
[4];
179
UCHAR
Reserved2
;
180
UCHAR
AllocationLength
[2];
181
UCHAR
Control
;
182
}
READ_HEADER
, *
PREAD_HEADER
;
183
184
// Play Audio MSF
185
struct
_PLAY_AUDIO_MSF
{
186
UCHAR
OperationCode
;
187
UCHAR
Reserved1
: 5;
188
UCHAR
Lun
: 3;
189
UCHAR
Reserved2
;
190
UCHAR
StartingMSF
[3];
191
UCHAR
EndingMSF
[3];
192
UCHAR
Control
;
193
}
PLAY_AUDIO_MSF
, *
PPLAY_AUDIO_MSF
;
194
195
// Read SubChannel Data
196
197
#define SubChannel_SubQ_Header 0x00
198
#define SubChannel_SubQ_Block 0x01
199
200
struct
_SUBCHANNEL
{
201
UCHAR
OperationCode
;
202
UCHAR
Reserved0
: 1;
203
UCHAR
Msf
: 1;
204
UCHAR
Reserved1
: 3;
205
UCHAR
Lun
: 3;
206
UCHAR
Reserved2
: 6;
207
UCHAR
SubQ
: 1;
208
UCHAR
Reserved3
: 1;
209
UCHAR
Format
;
210
UCHAR
Reserved4
[2];
211
UCHAR
TrackNumber
;
212
UCHAR
AllocationLength
[2];
213
UCHAR
Control
;
214
}
SUBCHANNEL
, *
PSUBCHANNEL
;
215
216
#define SetStreaming_Type_Performance 0x00
217
#define SetStreaming_Type_DBICacheZone 0x05
218
219
struct
_SET_STREAMING
{
220
UCHAR
OperationCode
;
221
222
UCHAR
Reserved0
[7];
223
UCHAR
Type
;
224
UCHAR
AllocationLength
[2];
225
226
UCHAR
Control
;
227
}
SET_STREAMING
, *
PSET_STREAMING
;
228
229
// Read CD (by LBA/MSF). Used by Atapi for raw sector reads.
230
231
#define ReadCD_SecType_Mask 0x1c
232
#define ReadCD_SecType_Any 0x00
233
#define ReadCD_SecType_CDDA 0x04
234
#define ReadCD_SecType_M1 0x08
235
#define ReadCD_SecType_M2 0x0c
236
#define ReadCD_SecType_M2F1 0x10
237
#define ReadCD_SecType_M2F2 0x14
238
239
struct
_READ_CD_MSF
{
240
UCHAR
OperationCode
;
241
242
UCHAR
Reserved0
: 1;
243
UCHAR
DAP
: 1;
244
UCHAR
ExpectedSectorType
: 3;
245
UCHAR
Reserved1
: 3;
246
247
UCHAR
Reserved2
;
248
UCHAR
Starting_MSF
[3];
249
UCHAR
Ending_MSF
[3];
250
251
UCHAR
Reserved3
: 1;
252
UCHAR
ErrorFlags
: 2;
253
UCHAR
IncludeEDC
: 1;
254
UCHAR
IncludeUserData
: 1;
255
UCHAR
HeaderCode
: 2;
256
UCHAR
IncludeSyncData
: 1;
257
258
UCHAR
SubChannelSelection
: 3;
259
UCHAR
Reserved4
: 5;
260
261
UCHAR
Control
;
262
}
READ_CD_MSF
, *
PREAD_CD_MSF
;
263
264
struct
_READ_CD
{
265
UCHAR
OperationCode
;
266
267
UCHAR
RelAdr
: 1;
// must be 0
268
UCHAR
DAP
: 1;
// Digital Audio Play - enable mute & interpolate when reading CDDA
269
UCHAR
ExpectedSectorType
: 3;
270
UCHAR
Reserved1
: 3;
271
272
UCHAR
LBA
[4];
273
UCHAR
NumOfBlocks
[3];
274
275
UCHAR
Reserved3
: 1;
276
UCHAR
ErrorFlags
: 2;
277
UCHAR
IncludeEDC
: 1;
278
UCHAR
IncludeUserData
: 1;
279
UCHAR
HeaderCode
: 2;
280
UCHAR
IncludeSyncData
: 1;
281
282
UCHAR
SubChannelSelection
: 3;
283
UCHAR
Reserved4
: 5;
284
285
UCHAR
Control
;
286
}
READ_CD
, *
PREAD_CD
;
287
288
#define WriteCd_RELADR 0x01
289
#define WriteCd_FUA 0x08
290
#define WriteCd_DPO 0x10
291
292
struct
_WRITE_CD
{
293
UCHAR
OperationCode
;
294
union
{
295
UCHAR
Flags
;
296
struct
{
297
UCHAR
RELADR
: 1;
298
UCHAR
Reserved0
: 2;
299
UCHAR
FUA
: 1;
300
UCHAR
DPO
: 1;
301
UCHAR
Reserved1
: 3;
302
}
Fields
;
303
}
Byte1
;
304
UCHAR
LBA
[4];
305
UCHAR
Reserved1
;
306
UCHAR
NumOfBlocks
[2];
307
UCHAR
Reserved2
[3];
308
}
WRITE_CD
, *
PWRITE_CD
;
309
310
// Mode sense
311
struct
_MODE_SENSE
{
312
UCHAR
OperationCode
;
313
UCHAR
Reserved1
: 3;
314
UCHAR
Dbd
: 1;
315
UCHAR
Reserved2
: 1;
316
UCHAR
Lun
: 3;
317
UCHAR
PageCode
: 6;
318
UCHAR
Pc
: 2;
319
UCHAR
Reserved3
;
320
UCHAR
AllocationLength
;
321
UCHAR
Control
;
322
}
MODE_SENSE
, *
PMODE_SENSE
;
323
324
// 10 bytes
325
struct
_MODE_SENSE10
{
326
UCHAR
OperationCode
;
327
UCHAR
Reserved1
: 3;
328
UCHAR
Dbd
: 1;
329
UCHAR
Reserved2
: 1;
330
UCHAR
Lun
: 3;
331
UCHAR
PageCode
: 6;
332
UCHAR
Pc
: 2;
333
UCHAR
Reserved3
[4];
334
UCHAR
AllocationLength
[2];
335
UCHAR
Control
;
336
}
MODE_SENSE10
, *
PMODE_SENSE10
;
337
338
// 6 bytes
339
struct
_MODE_SELECT
{
340
UCHAR
OperationCode
;
341
UCHAR
SPBit
: 1;
342
UCHAR
Reserved1
: 3;
343
UCHAR
PFBit
: 1;
344
UCHAR
Lun
: 3;
345
UCHAR
Reserved2
[2];
346
UCHAR
ParameterListLength
;
347
UCHAR
Control
;
348
}
MODE_SELECT
, *
PMODE_SELECT
;
349
350
struct
_MODE_SELECT10
{
351
UCHAR
OperationCode
;
352
UCHAR
SPBit
: 1;
353
UCHAR
Reserved1
: 3;
354
UCHAR
PFBit
: 1;
355
UCHAR
Lun
: 3;
356
UCHAR
Reserved2
[5];
357
UCHAR
ParameterListLength
[2];
358
UCHAR
Control
;
359
}
MODE_SELECT10
, *
PMODE_SELECT10
;
360
361
struct
_LOGSENSE
{
362
UCHAR
OperationCode
;
363
UCHAR
SPBit
: 1;
364
UCHAR
PPCBit
: 1;
365
UCHAR
Reserved1
: 3;
366
UCHAR
Lun
: 3;
367
UCHAR
PageCode
: 6;
368
UCHAR
PCBit
: 2;
369
UCHAR
Reserved2
;
370
UCHAR
Reserved3
;
371
UCHAR
ParameterPointer
[2];
// [0]=MSB, [1]=LSB
372
UCHAR
AllocationLength
[2];
// [0]=MSB, [1]=LSB
373
UCHAR
Control
;
374
}
LOGSENSE
, *
PLOGSENSE
;
375
376
struct
_SEEK
{
377
UCHAR
OperationCode
;
378
UCHAR
Reserved1
: 5;
379
UCHAR
Lun
: 3;
380
UCHAR
LBA
[4];
381
UCHAR
Reserved2
[3];
382
UCHAR
Control
;
383
}
SEEK
, *
PSEEK
;
384
385
#define StartStop_Start 0x01
386
#define StartStop_Load 0x02
387
388
struct
_START_STOP
{
389
UCHAR
OperationCode
;
390
UCHAR
Immediate
: 1;
391
UCHAR
Reserved1
: 4;
392
UCHAR
Lun
: 3;
393
UCHAR
Reserved2
[2];
394
UCHAR
Start
: 1;
395
UCHAR
LoadEject
: 1;
396
UCHAR
Reserved3
: 6;
397
UCHAR
Control
;
398
}
START_STOP
, *
PSTART_STOP
;
399
400
struct
_MEDIA_REMOVAL
{
401
UCHAR
OperationCode
;
402
UCHAR
Reserved1
: 5;
403
UCHAR
Lun
: 3;
404
UCHAR
Reserved2
[2];
405
UCHAR
Prevent
;
406
UCHAR
Control
;
407
}
MEDIA_REMOVAL
, *
PMEDIA_REMOVAL
;
408
409
//#ifndef WITHOUT_FORMATTER
410
// 10 bytes
411
struct
_READ_FORMAT_CAPACITIES
{
412
UCHAR
OperationCode
;
413
union
{
414
UCHAR
Flags
;
415
struct
{
416
UCHAR
Reserved0
: 5;
417
UCHAR
Reserved1
: 3;
418
}
Fields
;
419
}
Byte1
;
420
UCHAR
Reserved0
[5];
421
UCHAR
AllocationLength
[2];
422
UCHAR
Control
;
423
}
READ_FORMAT_CAPACITIES
, *
PREAD_FORMAT_CAPACITIES
;
424
//#endif //WITHOUT_FORMATTER
425
426
// Atapi 2.5 Changer 12-byte CDBs
427
#define LoadUnload_Start 0x01
428
#define LoadUnload_Load 0x02
429
430
struct
_LOAD_UNLOAD
{
431
UCHAR
OperationCode
;
432
UCHAR
Immediate
: 1;
433
UCHAR
Reserved1
: 7;
434
UCHAR
Reserved2
[2];
435
UCHAR
Start
: 1;
436
UCHAR
LoadEject
: 1;
437
UCHAR
Reserved3
: 6;
438
UCHAR
Reserved4
[3];
439
UCHAR
Slot
;
440
UCHAR
Reserved5
[3];
441
}
LOAD_UNLOAD
, *
PLOAD_UNLOAD
;
442
443
struct
_MECH_STATUS
{
444
UCHAR
OperationCode
;
445
UCHAR
Reserved0
[7];
446
UCHAR
AllocationLength
[2];
447
UCHAR
Reserved2
[2];
448
}
MECH_STATUS
, *
PMECH_STATUS
;
449
450
struct
_LOCK_DOOR
{
451
UCHAR
OperationCode
;
452
UCHAR
Reserved0
[9];
453
}
LOCK_DOOR
, *
PLOCK_DOOR
;
454
455
#define EventStat_Immed 0x01
456
457
#define EventStat_Class_OpChange 0x02
458
#define EventStat_Class_PM 0x04
459
#define EventStat_Class_ExternalReq 0x08
460
#define EventStat_Class_Media 0x10
461
#define EventStat_Class_MultiInit 0x20
462
#define EventStat_Class_DevBusy 0x40
463
464
struct
_GET_EVENT_STATUS
{
465
UCHAR
OperationCode
;
466
union
{
467
UCHAR
Flags
;
468
struct
{
469
UCHAR
Immed
: 1;
470
UCHAR
Reserved0
: 7;
471
}
Fields
;
472
}
Byte1
;
473
UCHAR
Reserved0
[2];
474
UCHAR
NotificationClass
;
475
UCHAR
Reserved1
[2];
476
UCHAR
AllocationLength
[2];
477
UCHAR
Control
;
478
}
GET_EVENT_STATUS
, *
PGET_EVENT_STATUS
;
479
480
#define ReadDiscInfo_Type_Mask 0x07
481
#define ReadDiscInfo_Type_Std 0x00
482
#define ReadDiscInfo_Type_TrkRes 0x01
// MMC-6
483
#define ReadDiscInfo_Type_POWRes 0x02
// MMC-6
484
485
struct
_READ_DISC_INFO
{
486
UCHAR
OperationCode
;
487
488
UCHAR
DataType
: 3;
// MMC-6
489
UCHAR
Reserved0
: 5;
490
491
UCHAR
Reserved1
[5];
492
UCHAR
AllocationLength
[2];
493
UCHAR
Reserved2
[3];
494
}
READ_DISC_INFO
, *
PREAD_DISC_INFO
;
495
496
#define ReadTrackInfo_Type_Mask 0x01
497
#define ReadTrackInfo_Type_LBA 0x00
498
#define ReadTrackInfo_Type_Track 0x01
499
#define ReadTrackInfo_Type_POW 0x02
500
501
#define ReadTrackInfo_LastTrk 0xff
502
503
struct
_READ_TRACK_INFO
{
504
UCHAR
OperationCode
;
505
UCHAR
Track
: 1;
506
UCHAR
Reserved0
: 7;
507
UCHAR
LBA_TrkNum
[4];
508
UCHAR
Reserved1
;
509
UCHAR
AllocationLength
[2];
510
UCHAR
Reserved2
[3];
511
}
READ_TRACK_INFO
, *
PREAD_TRACK_INFO
;
512
513
#define ReadTrackInfo3_Type_Mask 0x03
514
#define ReadTrackInfo3_Type_LBA ReadTrackInfo_Type_LBA
515
#define ReadTrackInfo3_Type_Track ReadTrackInfo_Type_Track
516
#define ReadTrackInfo3_Type_Ses 0x02
517
518
#define ReadTrackInfo3_LastTrk ReadTrackInfo_LastTrk
519
#define ReadTrackInfo3_DiscLeadIn 0x00
// for Track type
520
521
struct
_READ_TRACK_INFO_3
{
522
UCHAR
OperationCode
;
523
UCHAR
DataType
: 2;
524
UCHAR
Reserved0
: 6;
525
UCHAR
LBA_TrkNum
[4];
526
UCHAR
Reserved1
;
527
UCHAR
AllocationLength
[2];
528
UCHAR
Reserved2
[3];
529
}
READ_TRACK_INFO_3
, *
PREAD_TRACK_INFO_3
;
530
531
struct
_RESERVE_TRACK
{
532
UCHAR
OperationCode
;
533
534
UCHAR
ARSV
:1;
// 0 - size format, 1 - start LBA
535
UCHAR
RMZ
:1;
// 0 - logical track, 1 - U-RMZ (HD-DVD)
536
UCHAR
Reserved0
:6;
537
538
union
{
539
struct
{
540
UCHAR
Reserved1
[3];
541
UCHAR
Blocks
[4];
542
}
Size
;
543
struct
{
544
UCHAR
Start
[4];
545
UCHAR
Reserved1
[3];
546
}
LBA
;
547
};
548
UCHAR
Control
;
549
}
RESERVE_TRACK
, *
PRESERVE_TRACK
;
550
551
#define CloseTrkSes_Immed 0x01
552
553
#define CloseTrkSes_BGF 0x00
// DVD+RW only
554
#define CloseTrkSes_Trk 0x01
// also stops BGF on MRW disks
555
#define CloseTrkSes_BGF_QCompat 0x02
// ensures 30mm radius of recorded area
556
#define CloseTrkSes_Ses 0x02
557
#define CloseTrkSes_BGF_Compat 0x03
558
#define CloseTrkSes_SesSpec 0x03
559
#define CloseTrkSes_FinSpec 0x05
// MMC-5, DVD+R only
560
#define CloseTrkSes_Fin 0x06
// MMC-5, DVD+R only
561
562
#define CloseTrkSes_LastTrkSes 0xff
563
564
#define CloseTrkSes_Delay 3100000000I64
// 310 s
565
566
struct
_CLOSE_TRACK_SESSION
{
567
UCHAR
OperationCode
;
568
union
{
569
UCHAR
Flags
;
570
struct
{
571
UCHAR
Immed
: 1;
572
UCHAR
Reserved0
: 7;
573
}
Fields
;
574
}
Byte1
;
575
union
{
576
UCHAR
Flags
;
577
struct
{
578
UCHAR
Track
: 1;
579
UCHAR
Session
: 1;
580
UCHAR
Reserved0
: 6;
581
}
Fields
;
582
}
Byte2
;
583
UCHAR
Reserved1
[2];
584
UCHAR
TrackNum
;
585
UCHAR
Reserved2
[6];
586
587
}
CLOSE_TRACK_SESSION
, *
PCLOSE_TRACK_SESSION
;
588
589
struct
_SET_CD_SPEED
{
590
UCHAR
OperationCode
;
591
UCHAR
RotCtrl
: 2;
592
593
#define CdSpeed_RotCtrl_CLV 0x00
594
#define CdSpeed_RotCtrl_CAV 0x01
595
596
UCHAR
Reserved0
: 6;
597
UCHAR
ReadSpeed
[2];
// Kbyte/sec
598
UCHAR
WriteSpeed
[2];
// Kbyte/sec
599
UCHAR
Reserved1
[6];
600
}
SET_CD_SPEED
, *
PSET_CD_SPEED
;
601
602
#define SyncCache_RELADR 0x01
603
#define SyncCache_Immed 0x02
604
605
struct
_SYNCHRONIZE_CACHE
{
606
UCHAR
OperationCode
;
607
union
{
608
UCHAR
Flags
;
609
struct
{
610
UCHAR
RELADR
: 1;
611
UCHAR
Immed
: 1;
612
UCHAR
Reserved0
: 6;
// All these are unused by drive
613
}
Fields
;
614
}
Byte1
;
615
UCHAR
LBA
[4];
616
UCHAR
Reserved1
;
617
UCHAR
NumOfBlocks
[2];
618
UCHAR
Reserved2
[3];
619
/*
620
UCHAR Unused [11];*/
621
}
SYNCHRONIZE_CACHE
, *
PSYNCHRONIZE_CACHE
;
622
623
#define BlankMedia_Mask 0x07
624
#define BlankMedia_Complete 0x00
625
#define BlankMedia_Minimal 0x01
626
#define BlankMedia_Track 0x02
627
#define BlankMedia_UnreserveTrack 0x03
628
#define BlankMedia_TrackTail 0x04
629
#define BlankMedia_UncloseLastSes 0x05
630
#define BlankMedia_EraseSes 0x06
631
#define BlankMedia_Immed 0x10
632
633
struct
_BLANK_MEDIA
{
634
UCHAR
OperationCode
;
635
union
{
636
UCHAR
Flags
;
637
struct
{
638
UCHAR
BlankType
: 3;
639
UCHAR
Reserved0
: 1;
640
UCHAR
Immed
: 1;
641
UCHAR
Reserved1
: 3;
642
}
Fields
;
643
}
Byte1
;
644
UCHAR
StartAddr_TrkNum
[4];
645
UCHAR
Reserved2
[6];
646
}
BLANK_MEDIA
, *
PBLANK_MEDIA
;
647
648
#define SendKey_ReportAGID 0x00
649
#define SendKey_ChallengeKey 0x01
650
#define SendKey_Key1 0x02
651
#define SendKey_Key2 0x03
652
#define SendKey_TitleKey 0x04
653
#define SendKey_ReportASF 0x05
654
#define SendKey_InvalidateAGID 0x3F
655
656
struct
_SEND_KEY
{
657
UCHAR
OperationCode
;
658
UCHAR
Reserved1
: 5;
659
UCHAR
Lun
: 3;
660
UCHAR
Reserved2
[6];
661
UCHAR
ParameterListLength
[2];
662
UCHAR
KeyFormat
: 6;
663
UCHAR
AGID
: 2;
664
UCHAR
Control
;
665
}
SEND_KEY
, *
PSEND_KEY
;
666
667
struct
_REPORT_KEY
{
668
UCHAR
OperationCode
;
// 0xA4
669
UCHAR
Reserved1
: 5;
670
UCHAR
Lun
: 3;
671
UCHAR
LBA
[4];
// for title key
672
UCHAR
Reserved2
[2];
673
UCHAR
AllocationLength
[2];
674
UCHAR
KeyFormat
: 6;
675
UCHAR
AGID
: 2;
676
UCHAR
Control
;
677
}
REPORT_KEY
, *
PREPORT_KEY
;
678
679
#define ReadDvdStruc_Fmt_PhInfo 0x00
680
#define ReadDvdStruc_Fmt_Copyright_LeadIn 0x01
681
#define ReadDvdStruc_Fmt_DiscKey 0x02
682
#define ReadDvdStruc_Fmt_BurstCuttingArea 0x03
683
#define ReadDvdStruc_Fmt_Manufacturer_LeadIn 0x04
684
#define ReadDvdStruc_Fmt_Copyright_Sector 0x05
685
#define ReadDvdStruc_Fmt_MediaId_BusKey 0x06
686
#define ReadDvdStruc_Fmt_MediaKeyBlock_BusKey 0x07
687
#define ReadDvdStruc_Fmt_DDS_RAM 0x08
688
#define ReadDvdStruc_Fmt_MediumStatus_RAM 0x09
689
#define ReadDvdStruc_Fmt_SpareArea_RAM 0x0a
690
// 0x0b
691
#define ReadDvdStruc_Fmt_LastRMD 0x0c
692
#define ReadDvdStruc_Fmt_RMD 0x0d
693
#define ReadDvdStruc_Fmt_PreRec_LeadIn 0x0e
694
#define ReadDvdStruc_Fmt_MediaId_R_RW 0x0f
695
#define ReadDvdStruc_Fmt_PhFmtInfo_R_RW 0x10
696
697
#define ReadDvdStruc_Fmt_DCB 0x30
//Disc Control Block
698
#define ReadDvdStruc_Fmt_MTA_ECC_pMRW 0x31
699
700
#define ReadDvdStruc_Fmt_WriteProtection 0xc0
701
#define ReadDvdStruc_Fmt_ReadSend_DvdStruc_cap 0xff
702
703
struct
_READ_DVD_STRUCTURE
{
704
UCHAR
OperationCode
;
// 0xAD
705
UCHAR
MediaType
: 4;
// =1 For BlueRay (BD)
706
UCHAR
Reserved1
: 4;
707
UCHAR
RMDBlockNumber
[4];
708
UCHAR
LayerNumber
;
709
UCHAR
Format
;
710
UCHAR
AllocationLength
[2];
// [0]=MSB, [1]=LSB
711
UCHAR
Reserved3
: 6;
712
UCHAR
AGID
: 2;
713
UCHAR
Control
;
714
}
READ_DVD_STRUCTURE
, *
PREAD_DVD_STRUCTURE
;
715
716
struct
_READ_BUFFER_CAPACITY
{
717
UCHAR
OperationCode
;
718
UCHAR
Reserved0
[6];
719
UCHAR
AllocationLength
[2];
720
UCHAR
Reserved1
[3];
721
}
READ_BUFFER_CAPACITY
, *
PREAD_BUFFER_CAPACITY
;
722
723
struct
_GET_CONFIGURATION
{
724
UCHAR
OperationCode
;
725
union
{
726
UCHAR
Flags
;
727
struct
{
728
UCHAR
RT
: 2;
729
UCHAR
Reserved0
: 6;
730
}
Fields
;
731
}
Byte1
;
732
UCHAR
StartFeatureNum
[2];
733
UCHAR
Reserved0
[3];
734
UCHAR
AllocationLength
[2];
735
UCHAR
Control
;
736
}
GET_CONFIGURATION
, *
PGET_CONFIGURATION
;
737
738
struct
_SET_READ_AHEAD
{
739
UCHAR
OperationCode
;
740
UCHAR
Reserved0
;
741
UCHAR
TriggerLBA
[4];
742
UCHAR
ReadAheadLBA
[4];
743
UCHAR
Reserved1
;
744
UCHAR
Control
;
745
}
SET_READ_AHEAD
, *
PSET_READ_AHEAD
;
746
747
#define SendOpc_DoOpc 0x01
748
749
struct
_SEND_OPC_INFO
{
750
UCHAR
OperationCode
;
751
union
{
752
UCHAR
Flags
;
753
struct
{
754
UCHAR
DoOpc
: 1;
755
UCHAR
Reserved0
: 4;
756
UCHAR
Reserved1
: 3;
757
}
Fields
;
758
}
Byte1
;
759
union
{
760
UCHAR
Flags
;
761
struct
{
762
UCHAR
Exclude0
: 1;
// exclude layer 0
763
UCHAR
Exclude1
: 1;
// exclude layer 0
764
UCHAR
Reserved1
: 6;
765
}
Fields
;
766
}
Byte2
;
767
UCHAR
Reserved0
[4];
768
UCHAR
AllocationLength
[2];
769
UCHAR
Control
;
770
}
SEND_OPC_INFO
, *
PSEND_OPC_INFO
;
771
772
struct
_SEND_CUE_SHEET
{
773
UCHAR
OperationCode
;
774
UCHAR
Reserved0
[5];
775
UCHAR
AllocationLength
[3];
776
UCHAR
Control
;
777
}
SEND_CUE_SHEET
, *
PSEND_CUE_SHEET
;
778
779
struct
_CDB12
{
780
UCHAR
OperationCode
;
781
UCHAR
Params
[11];
782
}
CDB12
, *
PCDB12
;
783
784
struct
_CDB12READWRITE
{
785
UCHAR
OperationCode
;
786
union
{
787
UCHAR
Flags
;
788
struct
{
789
UCHAR
RELADR
: 1;
790
UCHAR
Reserved0
: 2;
791
UCHAR
FUA
: 1;
792
UCHAR
DPO
: 1;
793
UCHAR
Reserved1
: 3;
794
}
Fields
;
795
}
Byte1
;
796
UCHAR
LBA
[4];
797
UCHAR
NumOfBlocks
[4];
798
799
UCHAR
Reserved1
: 7;
800
UCHAR
Streaming
: 1;
801
802
UCHAR
Reserved2
;
803
}
CDB12READWRITE
, *
PCDB12READWRITE
;
804
805
// Plextor Read CD-DA
806
struct
_PLXTR_READ_CDDA
{
807
UCHAR
OperationCode
;
808
UCHAR
Reserved0
: 5;
809
UCHAR
Lun
:3;
810
UCHAR
LBA
[4];
811
UCHAR
TransferBlock
[4];
812
UCHAR
SubCode
;
813
UCHAR
Control
;
814
}
PLXTR_READ_CDDA
, *
PPLXTR_READ_CDDA
;
815
816
// NEC Read CD-DA
817
struct
_NEC_READ_CDDA
{
818
UCHAR
OperationCode
;
819
UCHAR
Reserved0
;
820
UCHAR
LBA
[4];
821
UCHAR
Reserved1
;
822
UCHAR
TransferBlock
[2];
823
UCHAR
Control
;
824
}
NEC_READ_CDDA
, *
PNEC_READ_CDDA
;
825
826
}
CDB
, *
PCDB
;
827
828
// Command Descriptor Block constants.
829
830
#define CDB6GENERIC_LENGTH 6
831
#define CDB10GENERIC_LENGTH 10
832
#define CDB12GENERIC_LENGTH 12
833
834
#define MAXIMUM_NUMBER_OF_TRACKS 100
835
#define MAXIMUM_NUMBER_OF_SESSIONS 1024
//maximal number of entries in Read Full TOC
836
837
#define SETBITON 1
838
#define SETBITOFF 0
839
840
// Mode Sense/Select page constants.
841
842
#define MODE_PAGE_ERROR_RECOVERY 0x01
843
#define MODE_PAGE_MRW2 0x03
// fuck, standard commitee claimed new standard
844
#define MODE_PAGE_WRITE_PARAMS 0x05
845
#define MODE_PAGE_VERIFY_ERROR 0x07
// shall not be used
846
#define MODE_PAGE_CACHING 0x08
// undocumented, but used by DirectCd
847
#define MODE_PAGE_MEDIUM_TYPES 0x0B
// shall not be used
848
#define MODE_PAGE_CD_DEVICE_PARAMS 0x0D
849
#define MODE_PAGE_CD_AUDIO_CONTROL 0x0E
850
#define MODE_PAGE_POWER_CONDITION 0x1A
851
#define MODE_PAGE_FAIL_REPORT 0x1C
852
#define MODE_PAGE_TIMEOUT_AND_PROTECT 0x1D
853
#define MODE_PAGE_PHILIPS_SECTOR_TYPE 0x21
854
#define MODE_PAGE_CAPABILITIES 0x2A
855
#define MODE_PAGE_MRW 0x2C
856
857
#define MODE_SENSE_RETURN_ALL 0x3f
858
859
#define MODE_SENSE_CURRENT_VALUES 0x00
860
#define MODE_SENSE_CHANGEABLE_VALUES 0x40
861
#define MODE_SENSE_DEFAULT_VAULES 0x80
862
#define MODE_SENSE_SAVED_VALUES 0xc0
863
864
// SCSI CDB operation codes
865
866
#define SCSIOP_TEST_UNIT_READY 0x00
867
#define SCSIOP_REZERO_UNIT 0x01
868
#define SCSIOP_REWIND 0x01
869
#define SCSIOP_REQUEST_BLOCK_ADDR 0x02
870
#define SCSIOP_REQUEST_SENSE 0x03
871
#define SCSIOP_FORMAT_UNIT 0x04
872
#define SCSIOP_READ_BLOCK_LIMITS 0x05
873
#define SCSIOP_REASSIGN_BLOCKS 0x07
874
#define SCSIOP_READ6 0x08
875
#define SCSIOP_RECEIVE 0x08
876
#define SCSIOP_WRITE6 0x0A
877
#define SCSIOP_PRINT 0x0A
878
#define SCSIOP_SEND 0x0A
879
#define SCSIOP_SEEK6 0x0B
880
#define SCSIOP_TRACK_SELECT 0x0B
881
#define SCSIOP_SLEW_PRINT 0x0B
882
#define SCSIOP_SEEK_BLOCK 0x0C
883
#define SCSIOP_PARTITION 0x0D
884
#define SCSIOP_READ_REVERSE 0x0F
885
#define SCSIOP_WRITE_FILEMARKS 0x10
886
#define SCSIOP_FLUSH_BUFFER 0x10
887
#define SCSIOP_SPACE 0x11
888
#define SCSIOP_INQUIRY 0x12
889
#define SCSIOP_VERIFY6 0x13
890
#define SCSIOP_RECOVER_BUF_DATA 0x14
891
#define SCSIOP_MODE_SELECT 0x15
892
#define SCSIOP_RESERVE_UNIT 0x16
893
#define SCSIOP_RELEASE_UNIT 0x17
894
#define SCSIOP_COPY 0x18
895
#define SCSIOP_ERASE 0x19
896
#define SCSIOP_MODE_SENSE 0x1A
897
#define SCSIOP_START_STOP_UNIT 0x1B
898
#define SCSIOP_STOP_PRINT 0x1B
899
#define SCSIOP_LOAD_UNLOAD 0x1B
900
#define SCSIOP_RECEIVE_DIAGNOSTIC 0x1C
901
#define SCSIOP_SEND_DIAGNOSTIC 0x1D
902
#define SCSIOP_MEDIUM_REMOVAL 0x1E
903
#define SCSIOP_READ_FORMAT_CAPACITY 0x23
904
#define SCSIOP_READ_CAPACITY 0x25
905
#define SCSIOP_READ 0x28
906
#define SCSIOP_WRITE 0x2A
907
#define SCSIOP_WRITE_CD 0x2A
908
#define SCSIOP_SEEK 0x2B
909
#define SCSIOP_LOCATE 0x2B
910
#define SCSIOP_ERASE10 0x2C
911
#define SCSIOP_WRITE_VERIFY 0x2E
912
#define SCSIOP_VERIFY 0x2F
913
#define SCSIOP_SEARCH_DATA_HIGH 0x30
914
#define SCSIOP_SEARCH_DATA_EQUAL 0x31
915
#define SCSIOP_SEARCH_DATA_LOW 0x32
916
#define SCSIOP_SET_LIMITS 0x33
917
#define SCSIOP_READ_POSITION 0x34
918
#define SCSIOP_SYNCHRONIZE_CACHE 0x35
919
#define SCSIOP_COMPARE 0x39
920
#define SCSIOP_COPY_COMPARE 0x3A
921
#define SCSIOP_COPY_VERIFY 0x3A
922
#define SCSIOP_WRITE_DATA_BUFF 0x3B
923
#define SCSIOP_READ_DATA_BUFF 0x3C
924
#define SCSIOP_CHANGE_DEFINITION 0x40
925
#define SCSIOP_PLAY_AUDIO10 0x41
926
#define SCSIOP_READ_SUB_CHANNEL 0x42
927
#define SCSIOP_READ_TOC 0x43
928
#define SCSIOP_READ_HEADER 0x44
929
#define SCSIOP_PLAY_AUDIO 0x45
930
#define SCSIOP_GET_CONFIGURATION 0x46
931
#define SCSIOP_PLAY_AUDIO_MSF 0x47
932
#define SCSIOP_PLAY_TRACK_INDEX 0x48
933
#define SCSIOP_PLAY_TRACK_RELATIVE 0x49
934
#define SCSIOP_GET_EVENT_STATUS 0x4A
935
#define SCSIOP_PAUSE_RESUME 0x4B
936
#define SCSIOP_LOG_SELECT 0x4C
937
#define SCSIOP_LOG_SENSE 0x4D
938
#define SCSIOP_STOP_PLAY_SCAN 0x4E
939
#define SCSIOP_READ_DISC_INFO 0x51
940
#define SCSIOP_READ_TRACK_INFO 0x52
941
#define SCSIOP_RESERVE_TRACK 0x53
942
#define SCSIOP_SEND_OPC_INFO 0x54
943
#define SCSIOP_MODE_SELECT10 0x55
944
#define SCSIOP_REPAIR_TRACK 0x58
// obsolete
945
#define SCSIOP_READ_MASTER_CUE 0x59
946
#define SCSIOP_MODE_SENSE10 0x5A
947
#define SCSIOP_CLOSE_TRACK_SESSION 0x5B
948
#define SCSIOP_READ_BUFFER_CAPACITY 0x5C
949
#define SCSIOP_SEND_CUE_SHEET 0x5D
950
#define SCSIOP_BLANK 0xA1
951
#define SCSIOP_SEND_KEY 0xA3
952
#define SCSIOP_REPORT_KEY 0xA4
953
#define SCSIOP_PLAY_AUDIO12 0xA5
954
#define SCSIOP_LOAD_UNLOAD_SLOT 0xA6
955
#define SCSIOP_SET_READ_AHEAD 0xA7
956
#define SCSIOP_READ12 0xA8
957
#define SCSIOP_WRITE12 0xAA
958
#define SCSIOP_SEEK12 0xAB
959
#define SCSIOP_GET_PERFORMANCE 0xAC
960
#define SCSIOP_READ_DVD_STRUCTURE 0xAD
961
#define SCSIOP_WRITE_VERIFY12 0xAE
962
#define SCSIOP_VERIFY12 0xAF
963
#define SCSIOP_SET_STREAMING 0xB6
964
#define SCSIOP_READ_CD_MSF 0xB9
965
#define SCSIOP_SET_CD_SPEED 0xBB
966
#define SCSIOP_MECHANISM_STATUS 0xBD
967
#define SCSIOP_READ_CD 0xBE
968
#define SCSIOP_SEND_DISK_STRUCTURE 0xBF
969
#define SCSIOP_SEND_DVD_STRUCTURE 0xBF
// see sub-command field
970
#define SCSIOP_SEND_BD_STRUCTURE 0xBF
// see sub-command field
971
#define SCSIOP_DOORLOCK 0xDE
// lock door on removable drives
972
#define SCSIOP_DOORUNLOCK 0xDF
// unlock door on removable drives
973
974
// If the IMMED bit is 1, status is returned as soon
975
// as the operation is initiated. If the IMMED bit
976
// is 0, status is not returned until the operation
977
// is completed.
978
979
#define CDB_RETURN_ON_COMPLETION 0
980
#define CDB_RETURN_IMMEDIATE 1
981
982
// end_ntminitape
983
984
// CDB Force media access used in extended read and write commands.
985
986
#define CDB_FORCE_MEDIA_ACCESS 0x08
987
988
// Denon CD ROM operation codes
989
990
#define SCSIOP_DENON_EJECT_DISC 0xE6
991
#define SCSIOP_DENON_STOP_AUDIO 0xE7
992
#define SCSIOP_DENON_PLAY_AUDIO 0xE8
993
#define SCSIOP_DENON_READ_TOC 0xE9
994
#define SCSIOP_DENON_READ_SUBCODE 0xEB
995
996
// Philips/Matshushita CD-R(W) operation codes
997
998
#define SCSIOP_PHILIPS_GET_NWA 0xE2
999
#define SCSIOP_PHILIPS_RESERVE_TRACK 0xE4
1000
#define SCSIOP_PHILIPS_WRITE_TRACK 0xE6
1001
#define SCSIOP_PHILIPS_LOAD_UNLOAD 0xE7
1002
#define SCSIOP_PHILIPS_CLOSE_TRACK_SESSION 0xE9
1003
#define SCSIOP_PHILIPS_RECOVER_BUF_DATA 0xEC
1004
#define SCSIOP_PHILIPS_READ_SESSION_INFO 0xEE
1005
1006
// Plextor operation codes
1007
1008
#define SCSIOP_PLEXTOR_READ_CDDA 0xD8
1009
1010
// NEC operation codes
1011
1012
#define SCSIOP_NEC_READ_CDDA 0xD4
1013
1014
// SCSI Bus Messages
1015
1016
#define SCSIMESS_ABORT 0x06
1017
#define SCSIMESS_ABORT_WITH_TAG 0x0D
1018
#define SCSIMESS_BUS_DEVICE_RESET 0X0C
1019
#define SCSIMESS_CLEAR_QUEUE 0X0E
1020
#define SCSIMESS_COMMAND_COMPLETE 0X00
1021
#define SCSIMESS_DISCONNECT 0X04
1022
#define SCSIMESS_EXTENDED_MESSAGE 0X01
1023
#define SCSIMESS_IDENTIFY 0X80
1024
#define SCSIMESS_IDENTIFY_WITH_DISCON 0XC0
1025
#define SCSIMESS_IGNORE_WIDE_RESIDUE 0X23
1026
#define SCSIMESS_INITIATE_RECOVERY 0X0F
1027
#define SCSIMESS_INIT_DETECTED_ERROR 0X05
1028
#define SCSIMESS_LINK_CMD_COMP 0X0A
1029
#define SCSIMESS_LINK_CMD_COMP_W_FLAG 0X0B
1030
#define SCSIMESS_MESS_PARITY_ERROR 0X09
1031
#define SCSIMESS_MESSAGE_REJECT 0X07
1032
#define SCSIMESS_NO_OPERATION 0X08
1033
#define SCSIMESS_HEAD_OF_QUEUE_TAG 0X21
1034
#define SCSIMESS_ORDERED_QUEUE_TAG 0X22
1035
#define SCSIMESS_SIMPLE_QUEUE_TAG 0X20
1036
#define SCSIMESS_RELEASE_RECOVERY 0X10
1037
#define SCSIMESS_RESTORE_POINTERS 0X03
1038
#define SCSIMESS_SAVE_DATA_POINTER 0X02
1039
#define SCSIMESS_TERMINATE_IO_PROCESS 0X11
1040
1041
// SCSI Extended Message operation codes
1042
1043
#define SCSIMESS_MODIFY_DATA_POINTER 0X00
1044
#define SCSIMESS_SYNCHRONOUS_DATA_REQ 0X01
1045
#define SCSIMESS_WIDE_DATA_REQUEST 0X03
1046
1047
// SCSI Extended Message Lengths
1048
1049
#define SCSIMESS_MODIFY_DATA_LENGTH 5
1050
#define SCSIMESS_SYNCH_DATA_LENGTH 3
1051
#define SCSIMESS_WIDE_DATA_LENGTH 2
1052
1053
// SCSI extended message structure
1054
1055
typedef
struct
_SCSI_EXTENDED_MESSAGE
{
1056
UCHAR
InitialMessageCode
;
1057
UCHAR
MessageLength
;
1058
UCHAR
MessageType
;
1059
union
_EXTENDED_ARGUMENTS
{
1060
1061
struct
{
1062
UCHAR
Modifier
[4];
1063
}
Modify
;
1064
1065
struct
{
1066
UCHAR
TransferPeriod
;
1067
UCHAR
ReqAckOffset
;
1068
}
Synchronous
;
1069
1070
struct
{
1071
UCHAR
Width
;
1072
}
Wide
;
1073
}
ExtendedArguments
;
1074
}
SCSI_EXTENDED_MESSAGE
, *
PSCSI_EXTENDED_MESSAGE
;
1075
1076
// SCSI bus status codes.
1077
1078
#define SCSISTAT_GOOD 0x00
1079
#define SCSISTAT_CHECK_CONDITION 0x02
1080
#define SCSISTAT_CONDITION_MET 0x04
1081
#define SCSISTAT_BUSY 0x08
1082
#define SCSISTAT_INTERMEDIATE 0x10
1083
#define SCSISTAT_INTERMEDIATE_COND_MET 0x14
1084
#define SCSISTAT_RESERVATION_CONFLICT 0x18
1085
#define SCSISTAT_COMMAND_TERMINATED 0x22
1086
#define SCSISTAT_QUEUE_FULL 0x28
1087
1088
// Enable Vital Product Data Flag (EVPD)
1089
// used with INQUIRY command.
1090
1091
#define CDB_INQUIRY_EVPD 0x01
1092
1093
// retry time (in deci-seconds)
1094
#define NOT_READY_RETRY_INTERVAL 20
1095
1096
// Defines for format CDB
1097
#define LUN0_FORMAT_SAVING_DEFECT_LIST 0
1098
#define USE_DEFAULTMSB 0
1099
#define USE_DEFAULTLSB 0
1100
1101
#define START_UNIT_CODE 0x01
1102
#define STOP_UNIT_CODE 0x00
1103
1104
// Inquiry buffer structure. This is the data returned from the target
1105
// after it receives an inquiry.
1106
//
1107
// This structure may be extended by the number of bytes specified
1108
// in the field AdditionalLength. The defined size constant only
1109
// includes fields through ProductRevisionLevel.
1110
//
1111
// The NT SCSI drivers are only interested in the first 36 bytes of data.
1112
1113
#define INQUIRYDATABUFFERSIZE 36
1114
1115
typedef
struct
_INQUIRYDATA
{
1116
UCHAR
DeviceType
: 5;
1117
UCHAR
DeviceTypeQualifier
: 3;
1118
UCHAR
DeviceTypeModifier
: 7;
1119
UCHAR
RemovableMedia
: 1;
1120
UCHAR
Versions
;
1121
UCHAR
ResponseDataFormat
;
1122
UCHAR
AdditionalLength
;
1123
UCHAR
Reserved
[2];
1124
UCHAR
SoftReset
: 1;
1125
UCHAR
CommandQueue
: 1;
1126
UCHAR
Reserved2
: 1;
1127
UCHAR
LinkedCommands
: 1;
1128
UCHAR
Synchronous
: 1;
1129
UCHAR
Wide16Bit
: 1;
1130
UCHAR
Wide32Bit
: 1;
1131
UCHAR
RelativeAddressing
: 1;
1132
UCHAR
VendorId
[8];
1133
UCHAR
ProductId
[16];
1134
UCHAR
ProductRevisionLevel
[4];
1135
UCHAR
VendorSpecific
[20];
1136
UCHAR
Reserved3
[40];
1137
}
INQUIRYDATA
, *
PINQUIRYDATA
;
1138
1139
// Inquiry defines. Used to interpret data returned from target as result
1140
// of inquiry command.
1141
1142
// DeviceType field
1143
1144
#define DIRECT_ACCESS_DEVICE 0x00
// disks
1145
#define SEQUENTIAL_ACCESS_DEVICE 0x01
// tapes
1146
#define PRINTER_DEVICE 0x02
// printers
1147
#define PROCESSOR_DEVICE 0x03
// scanners, printers, etc
1148
#define WRITE_ONCE_READ_MULTIPLE_DEVICE 0x04
// worms
1149
#define READ_ONLY_DIRECT_ACCESS_DEVICE 0x05
// cdroms
1150
#define SCANNER_DEVICE 0x06
// scanners
1151
#define OPTICAL_DEVICE 0x07
// optical disks
1152
#define MEDIUM_CHANGER 0x08
// jukebox
1153
#define COMMUNICATION_DEVICE 0x09
// network
1154
#define LOGICAL_UNIT_NOT_PRESENT_DEVICE 0x7F
1155
#define DEVICE_QUALIFIER_NOT_SUPPORTED 0x03
1156
1157
// DeviceTypeQualifier field
1158
1159
#define DEVICE_CONNECTED 0x00
1160
1161
// Sense Data Format
1162
1163
typedef
struct
_SENSE_DATA
{
1164
UCHAR
ErrorCode
:7;
1165
UCHAR
Valid
:1;
1166
UCHAR
SegmentNumber
;
1167
UCHAR
SenseKey
:4;
1168
UCHAR
Reserved
:1;
1169
UCHAR
IncorrectLength
:1;
1170
UCHAR
EndOfMedia
:1;
1171
UCHAR
FileMark
:1;
1172
UCHAR
Information
[4];
1173
UCHAR
AdditionalSenseLength
;
1174
UCHAR
CommandSpecificInformation
[4];
1175
UCHAR
AdditionalSenseCode
;
1176
UCHAR
AdditionalSenseCodeQualifier
;
1177
UCHAR
FieldReplaceableUnitCode
;
1178
UCHAR
SenseKeySpecific
[3];
1179
}
SENSE_DATA
, *
PSENSE_DATA
;
1180
1181
// Default request sense buffer size
1182
1183
#define SENSE_BUFFER_SIZE (sizeof(SENSE_DATA))
1184
1185
// Sense keys
1186
1187
#define SCSI_SENSE_NO_SENSE 0x00
1188
#define SCSI_SENSE_RECOVERED_ERROR 0x01
1189
#define SCSI_SENSE_NOT_READY 0x02
1190
#define SCSI_SENSE_MEDIUM_ERROR 0x03
1191
#define SCSI_SENSE_HARDWARE_ERROR 0x04
1192
#define SCSI_SENSE_ILLEGAL_REQUEST 0x05
1193
#define SCSI_SENSE_UNIT_ATTENTION 0x06
1194
#define SCSI_SENSE_DATA_PROTECT 0x07
1195
#define SCSI_SENSE_BLANK_CHECK 0x08
1196
#define SCSI_SENSE_UNIQUE 0x09
1197
#define SCSI_SENSE_COPY_ABORTED 0x0A
1198
#define SCSI_SENSE_ABORTED_COMMAND 0x0B
1199
#define SCSI_SENSE_EQUAL 0x0C
1200
#define SCSI_SENSE_VOL_OVERFLOW 0x0D
1201
#define SCSI_SENSE_MISCOMPARE 0x0E
1202
#define SCSI_SENSE_RESERVED 0x0F
1203
1204
// Additional Sense codes
1205
1206
// SK = 0x00
1207
#define SCSI_ADSENSE_NO_SENSE 0x00
1208
1209
// SK = 0x01
1210
#define SCSI_ADSENSE_WARNING 0x0B
1211
#define SCSI_ADSENSE_REC_DATA_NOECC 0x17
1212
#define SCSI_ADSENSE_REC_DATA_ECC 0x18
1213
#define SCSI_ADSENSE_ROUNDED_PARAM 0x37
1214
#define SCSI_ADSENSE_FAILURE_PREDICTED 0x5D
1215
#define SCSI_ADSENSE_CD_CONTROL_ERR 0x73
1216
1217
// SK = 0x02
1218
#define SCSI_ADSENSE_LUN_NOT_READY 0x04
1219
#define SCSI_ADSENSE_INCOMPATIBLE_MEDIA 0x30
1220
#define SCSI_ADSENSE_INVALID_MEDIA SCSI_ADSENSE_INCOMPATIBLE_MEDIA
// for w2k
1221
#define SCSI_ADSENSE_NO_MEDIA_IN_DEVICE 0x3A
1222
#define SCSI_ADSENSE_POSITION_ERROR 0x3B
1223
#define SCSI_ADSENSE_NOT_SELF_CONFIGURED 0x3E
1224
1225
1226
// SK = 0x03
1227
#define SCSI_ADSENSE_NO_SEEK 0x02
1228
#define SCSI_ADSENSE_NO_REFERENCE 0x06
1229
#define SCSI_ADSENSE_CD_WRITE_ERROR 0x0C
1230
#define SCSI_ADSENSE_CD_READ_ERROR 0x11
1231
#define SCSI_ADSENSE_TRACK_ERROR 0x14
1232
#define SCSI_ADSENSE_SEEK_ERROR 0x15
1233
#define SCSI_ADSENSE_FORMAT_CORRUPTED 0x31
1234
#define SCSI_ADSENSE_ENCLOSURE_FAILURE 0x34
1235
#define SCSI_ADSENSE_ENCLOSURE_SERVICE 0x35
1236
#define SCSI_ADSENSE_ERASE_ERROR 0x51
1237
#define SCSI_ADSENSE_UNRECOVERED_TOC 0x57
1238
#define SCSI_ADSENSE_SESSION_FIXATION 0x71
1239
//#define SCSI_ADSENSE_CD_CONTROL_ERR 0x73 // redefinition
1240
1241
// SK = 0x04
1242
#define SCSI_ADSENSE_CLEAN_REQUEST 0x00
1243
#define SCSI_ADSENSE_SELECT 0x04
1244
#define SCSI_ADSENSE_COMMUNICATION 0x08
1245
#define SCSI_ADSENSE_LOST_STREAMING 0x09
1246
#define SCSI_ADSENSE_SYNC_ERROR 0x1B
1247
#define SCSI_ADSENSE_MECH_ERROR 0x3B
1248
#define SCSI_ADSENSE_LUN_ERROR 0x3E
1249
#define SCSI_ADSENSE_DIAGNOSTIC 0x40
1250
#define SCSI_ADSENSE_INTERNAL 0x44
1251
#define SCSI_ADSENSE_SOFT_RESET 0x46
1252
#define SCSI_ADSENSE_SCSI_PARITY 0x47
1253
#define SCSI_ADSENSE_CMD_PHASE 0x4A
1254
#define SCSI_ADSENSE_DATA_PHASE 0x4B
1255
#define SCSI_ADSENSE_SELF_CONFIG 0x4C
1256
#define SCSI_ADSENSE_MEDIUM_REMOVAL 0x53
1257
#define SCSI_ADSENSE_VOLTAGE 0x65
1258
1259
// SK = 0x05
1260
#define SCSI_ADSENSE_AUDIO_PLAY 0x00
1261
#define SCSI_ADSENSE_MULTISELECT 0x07
1262
#define SCSI_ADSENSE_INVALID_PARAM_LENGTH 0x1A
1263
#define SCSI_ADSENSE_ILLEGAL_COMMAND 0x20
1264
#define SCSI_ADSENSE_ILLEGAL_BLOCK 0x21
1265
#define SCSI_ADSENSE_INVALID_CDB 0x24
1266
#define SCSI_ADSENSE_INVALID_LUN 0x25
1267
#define SCSI_ADSENSE_INVALID_VALUE 0x26
1268
#define SCSI_ADSENSE_WRITE_PROTECT 0x27
1269
#define SCSI_ADSENSE_CANT_DISCONNECT 0x2B
1270
#define SCSI_ADSENSE_INVALID_CMD_SEQUENCE 0x2C
1271
#define SCSI_ADSENSE_INVALID_SESSION_MODE 0x30
1272
#define SCSI_ADSENSE_SAVE_NOT_SUPPORTED 0x35
1273
#define SCSI_ADSENSE_INVALID_BITS_IN_IDENT_MSG 0x3D
1274
#define SCSI_ADSENSE_MSG_ERROR 0x43
1275
//#define SCSI_ADSENSE_MEDIUM_REMOVAL 0x53 // redefinition
1276
#define SCSI_ADSENSE_SYS_RESOURCE_FAILURE 0x55
1277
#define SCSI_ADSENSE_OUT_OF_SPACE 0x63
1278
#define SCSI_ADSENSE_ILLEGAL_MODE_FOR_THIS_TRACK 0x64
1279
#define SCSI_ADSENSE_CD_COPY_ERROR 0x6F
1280
#define SCSI_ADSENSE_INCOMPLETE_DATA 0x72
1281
#define SCSI_ADSENSE_VENDOR_UNIQUE 0x80
1282
#define SCSI_ADSENSE_MUSIC_AREA 0xA0
1283
#define SCSI_ADSENSE_DATA_AREA 0xA1
1284
#define SCSI_ADSENSE_VOLUME_OVERFLOW 0xA7
1285
1286
// SK = 0x06
1287
#define SCSI_ADSENSE_LOG_OVERFLOW 0x0A
1288
#define SCSI_ADSENSE_MEDIUM_CHANGED 0x28
1289
#define SCSI_ADSENSE_BUS_RESET 0x29
1290
#define SCSI_ADSENSE_PARAM_CHANGE 0x2A
1291
#define SCSI_ADSENSE_CMD_CLEARED_BY_ANOTHER 0x2F
1292
#define SCSI_ADSENSE_MEDIA_STATE 0x3B
1293
#define SCSI_ADSENSE_FUNCTIONALTY_CHANGE 0x3F
1294
#define SCSI_ADSENSE_OPERATOR 0x5A
1295
#define SCSI_ADSENSE_MAX_LOG 0x5B
1296
#define SCSI_ADSENSE_POWER 0x5E
1297
1298
// SK = 0x0B
1299
#define SCSI_ADSENSE_READ_LOST_STREAMING 0x11
1300
#define SCSI_ADSENSE_RESELECT_FAILURE 0x45
1301
#define SCSI_ADSENSE_ERR_MSG_DETECTED 0x48
1302
#define SCSI_ADSENSE_INVALID_ERR_MSG 0x49
1303
#define SCSI_ADSENSE_TEGGED_OVERLAPPED 0x4D
1304
#define SCSI_ADSENSE_OVERLAPPED_ATTEMPT 0x4E
1305
1306
// Additional sense code qualifier
1307
1308
#define SCSI_SENSEQ_NO_SENSE 0x00
1309
1310
// SK:ASC = 02:04
1311
//#define SCSI_SENSEQ_NO_SENSE 0x00
1312
#define SCSI_SENSEQ_CAUSE_NOT_REPORTABLE 0x00
1313
#define SCSI_SENSEQ_BECOMING_READY 0x01
1314
#define SCSI_SENSEQ_INIT_COMMAND_REQUIRED 0x02
1315
#define SCSI_SENSEQ_MANUAL_INTERVENTION_REQUIRED 0x03
1316
#define SCSI_SENSEQ_FORMAT_IN_PROGRESS 0x04
1317
#define SCSI_SENSEQ_OPERATION_IN_PROGRESS 0x07
1318
#define SCSI_SENSEQ_LONG_WRITE_IN_PROGRESS 0x08
1319
1320
// SK:ASC = 02:30
1321
#define SCSI_SENSEQ_INCOMPATIBLE_MEDIA_INSTALLED 0x00
1322
#define SCSI_SENSEQ_UNKNOWN_FORMAT 0x01
1323
#define SCSI_SENSEQ_INCOMPATIBLE_FORMAT 0x02
1324
#define SCSI_SENSEQ_CLEANING_CARTRIDGE_INSTALLED 0x03
1325
#define SCSI_SENSEQ_WRITE_UNKNOWN_FORMAT 0x04
1326
#define SCSI_SENSEQ_WRITE_INCOMPATIBLE_FORMAT 0x05
1327
#define SCSI_SENSEQ_FORMAT_INCOMPATIBLE_MEDIUM 0x06
1328
#define SCSI_SENSEQ_CLEANING_FAILURE 0x07
1329
1330
// SK:ASC = 02:3A
1331
#define SCSI_SENSEQ_TRAY_CLOSED 0x01
1332
#define SCSI_SENSEQ_TRAY_OPEN 0x02
1333
1334
// SK:ASC = 03:0C
1335
#define SENSEQ_W_RECOVERY_NEEDED 0x07
1336
#define SENSEQ_W_RECOVERY_FAILED 0x08
1337
#define SENSEQ_LOST_STREAMING 0x09
1338
#define SENSEQ_PADDING_BLOCKS_ADDED 0x0A
1339
1340
// SK:ASC = 03:72, 05:72
1341
//#define SCSI_SENSEQ_NO_SENSE 0x00
1342
#define SCSI_SENSEQ_LEAD_IN_ERROR 0x01
1343
#define SCSI_SENSEQ_LEAD_OUT_ERRROR 0x02
1344
#define SCSI_SENSEQ_INCOMPLETE_TRACK 0x03
1345
#define SCSI_SENSEQ_INCOMPLETE_RESERVED_TRACK 0x04
1346
#define SCSI_SENSEQ_NO_MORE_RESERVATION 0x05
1347
1348
// SK:ASC = 04:3E
1349
#define SCSI_SENSEQ_LUN_FAILURE 0x01
1350
#define SCSI_SENSEQ_LUN_TIMEOUT 0x02
1351
1352
// SK:ASC = 05:21
1353
#define SCSI_SENSEQ_ADDR_OUT_OF_RANGE 0x00
1354
#define SCSI_SENSEQ_INVALID_ELEMENT_ADDR 0x01
1355
#define SCSI_SENSEQ_INVALID_WRITE_ADDR 0x02
1356
#define SCSI_SENSEQ_INVALID_WRITE_CROSS_LAYER_JUMP 0x03
1357
1358
// SK:ASC = 05:26
1359
#define SCSI_SENSEQ_PARAM_NOT_SUPPORTED 0x01
1360
#define SCSI_SENSEQ_PARAM_INVALID_VALUE 0x02
1361
#define SCSI_SENSEQ_THRESHOLD_PARAM_NOT_SUPPORTED 0x03
1362
#define SCSI_SENSEQ_INVALID_RELEASE_OF_PERSISTENT_RESERVATION 0x04
1363
1364
// SK:ASC = 05:27
1365
#define SCSI_SENSEQ_HW_PROTECTION 0x01
1366
#define SCSI_SENSEQ_LUN_SOFT_PROTECTION 0x02
1367
#define SCSI_SENSEQ_ASSOCIATED_PROTECTION 0x03
1368
#define SCSI_SENSEQ_PERSIST_PROTECTION 0x04
1369
#define SCSI_SENSEQ_PERMANENT_PROTECTION 0x05
1370
1371
// SK:ASC = 05:2C
1372
#define SCSI_SENSEQ_PROGRAMM_AREA_NOT_EMPTY 0x03
1373
#define SCSI_SENSEQ_PROGRAMM_AREA_EMPTY 0x04
1374
1375
// SK:ASC = 05:30
1376
//#define SCSI_SENSEQ_INCOMPATIBLE_MEDIA_INSTALLED 0x00
1377
//#define SCSI_SENSEQ_UNKNOWN_FORMAT 0x01
1378
//#define SCSI_SENSEQ_INCOMPATIBLE_FORMAT 0x02
1379
//#define SCSI_SENSEQ_CLEANING_CARTRIDGE_INSTALLED 0x03
1380
//#define SCSI_SENSEQ_WRITE_UNKNOWN_FORMAT 0x04
1381
//#define SCSI_SENSEQ_WRITE_INCOMPATIBLE_FORMAT 0x05
1382
//#define SCSI_SENSEQ_FORMAT_INCOMPATIBLE_MEDIUM 0x06
1383
//#define SCSI_SENSEQ_CLEANING_FAILURE 0x07
1384
#define SCSI_SENSEQ_APP_CODE_MISSMATCH 0x08
1385
#define SCSI_SENSEQ_NOT_FIXED_FOR_APPEND 0x09
1386
#define SCSI_SENSEQ_NOT_FORMATTED 0x10
1387
#define SCSI_SENSEQ_UNSUPPORTED_MEDIA_VERSION 0x11
1388
1389
// SK:ASC = 05:6F
1390
#define SCSI_SENSEQ_AUTHENTICATION_FAILURE 0x00
1391
#define SCSI_SENSEQ_KEY_NOT_PRESENT 0x01
1392
#define SCSI_SENSEQ_KEY_NOT_ESTABLISHED 0x02
1393
#define SCSI_SENSEQ_READ_OF_SCRAMBLED_SECTOR_WITHOUT_AUTHENTICATION 0x03
1394
#define SCSI_SENSEQ_MEDIA_CODE_MISMATCHED_TO_LOGICAL_UNIT 0x04
1395
#define SCSI_SENSEQ_LOGICAL_UNIT_RESET_COUNT_ERROR 0x05
1396
1397
// SK:ASC = 06:28
1398
#define SCSI_SENSEQ_IMPORT_OR_EXPERT_ELEMENT_ACCESS 0x01
1399
1400
// SK:ASC = 06:29
1401
#define SCSI_SENSEQ_POWER_ON 0x01
1402
#define SCSI_SENSEQ_SCSI_BUS 0x02
1403
#define SCSI_SENSEQ_BUS_DEVICE_FUNCTION 0x03
1404
#define SCSI_SENSEQ_DEVICE_INTERNAL 0x04
1405
1406
// SK:ASC = 06:2A
1407
#define SCSI_SENSEQ_MODE_PARAMETERS 0x01
1408
#define SCSI_SENSEQ_LOG_PARAMETERS 0x02
1409
#define SCSI_SENSEQ_RESERVATIONS_PREEMPTED 0x03
1410
1411
// SK:ASC = 06:3B
1412
#define SCSI_SENSEQ_DESTINATION_ELEMENT_FULL 0x0D
1413
#define SCSI_SENSEQ_SOURCE_ELEMENT_EMPTY 0x0E
1414
#define SCSI_SENSEQ_END_OF_MEDIUM 0x0F
1415
#define SCSI_SENSEQ_MAGAZINE_NOT_ACCESSIBLE 0x11
1416
#define SCSI_SENSEQ_MAGAZINE_REMOVED 0x12
1417
#define SCSI_SENSEQ_MAGAZINE_INSERTED 0x13
1418
#define SCSI_SENSEQ_MAGAZINE_LOCKED 0x14
1419
#define SCSI_SENSEQ_MAGAZINE_UNLOCKED 0x15
1420
1421
// SK:ASC = 06:3F
1422
#define SCSI_SENSEQ_MICROCODE 0x01
1423
#define SCSI_SENSEQ_OPERATION_DEFINITION 0x02
1424
#define SCSI_SENSEQ_INQUIRY_DATA 0x03
1425
1426
// SK:ASC = 06:5A
1427
#define SCSI_SENSEQ_MEDIUM_CHANGE_REQ 0x01
1428
#define SCSI_SENSEQ_W_PROTECT_SELECTED 0x02
1429
#define SCSI_SENSEQ_W_PROTECT_PERMITED 0x03
1430
1431
// SK:ASC = 06:5E
1432
#define SCSI_SENSEQ_LOW_POWER_COND 0x00
1433
#define SCSI_SENSEQ_IDLE_BY_TIMER 0x01
1434
#define SCSI_SENSEQ_STANDBY_BY_TIMER 0x02
1435
#define SCSI_SENSEQ_IDLE_BY_CMD 0x03
1436
#define SCSI_SENSEQ_STANDBY_BY_CMD 0x04
1437
1438
#define SCSI_SENSEQ_FILEMARK_DETECTED 0x01
1439
#define SCSI_SENSEQ_SETMARK_DETECTED 0x03
1440
#define SCSI_SENSEQ_END_OF_MEDIA_DETECTED 0x02
1441
#define SCSI_SENSEQ_BEGINNING_OF_MEDIA_DETECTED 0x04
1442
1443
// SK:ASC = 0B:00
1444
#define SCSI_SENSEQ_IO_TERMINATED 0x06
1445
1446
1447
// SCSI IO Device Control Codes
1448
1449
#define FILE_DEVICE_SCSI 0x0000001b
1450
1451
#define IOCTL_SCSI_EXECUTE_IN ((FILE_DEVICE_SCSI << 16) + 0x0011)
1452
#define IOCTL_SCSI_EXECUTE_OUT ((FILE_DEVICE_SCSI << 16) + 0x0012)
1453
#define IOCTL_SCSI_EXECUTE_NONE ((FILE_DEVICE_SCSI << 16) + 0x0013)
1454
1455
// SMART support in atapi
1456
1457
#define IOCTL_SCSI_MINIPORT_SMART_VERSION ((FILE_DEVICE_SCSI << 16) + 0x0500)
1458
#define IOCTL_SCSI_MINIPORT_IDENTIFY ((FILE_DEVICE_SCSI << 16) + 0x0501)
1459
#define IOCTL_SCSI_MINIPORT_READ_SMART_ATTRIBS ((FILE_DEVICE_SCSI << 16) + 0x0502)
1460
#define IOCTL_SCSI_MINIPORT_READ_SMART_THRESHOLDS ((FILE_DEVICE_SCSI << 16) + 0x0503)
1461
#define IOCTL_SCSI_MINIPORT_ENABLE_SMART ((FILE_DEVICE_SCSI << 16) + 0x0504)
1462
#define IOCTL_SCSI_MINIPORT_DISABLE_SMART ((FILE_DEVICE_SCSI << 16) + 0x0505)
1463
#define IOCTL_SCSI_MINIPORT_RETURN_STATUS ((FILE_DEVICE_SCSI << 16) + 0x0506)
1464
#define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTOSAVE ((FILE_DEVICE_SCSI << 16) + 0x0507)
1465
#define IOCTL_SCSI_MINIPORT_SAVE_ATTRIBUTE_VALUES ((FILE_DEVICE_SCSI << 16) + 0x0508)
1466
#define IOCTL_SCSI_MINIPORT_EXECUTE_OFFLINE_DIAGS ((FILE_DEVICE_SCSI << 16) + 0x0509)
1467
1468
// Read Capacity Data - returned in Big Endian format
1469
1470
typedef
struct
_READ_CAPACITY_DATA
{
1471
ULONG
LogicalBlockAddress
;
1472
ULONG
BytesPerBlock
;
1473
}
READ_CAPACITY_DATA
, *
PREAD_CAPACITY_DATA
;
1474
1475
typedef
struct
_CD_SECTOR_HEADER
{
1476
UCHAR
MSF
[3];
1477
1478
// See WParam_SubHdr_xxx
1479
1480
/*
1481
#define WParam_SubHdr_Mode_Mask 0x03
1482
#define WParam_SubHdr_Mode0 0x00
1483
#define WParam_SubHdr_Mode1 0x01
1484
#define WParam_SubHdr_Mode2 0x02
1485
#define WParam_SubHdr_Format_Mask 0xe0
1486
#define WParam_SubHdr_Format_UserData 0x00
1487
#define WParam_SubHdr_Format_RunIn4 0x20
1488
#define WParam_SubHdr_Format_RunIn3 0x40
1489
#define WParam_SubHdr_Format_RunIn2 0x60
1490
#define WParam_SubHdr_Format_RunIn1 0x80
1491
#define WParam_SubHdr_Format_Link 0xa0
1492
#define WParam_SubHdr_Format_RunOut2 0xc0
1493
#define WParam_SubHdr_Format_RunOut1 0xe0
1494
*/
1495
union
{
1496
UCHAR
Flags
;
1497
struct
{
1498
UCHAR
Mode
: 2;
1499
UCHAR
Reserved
: 3;
1500
UCHAR
Format
: 3;
1501
}
Fields
;
1502
}
Mode
;
1503
}
CD_SECTOR_HEADER
, *
PCD_SECTOR_HEADER
;
1504
1505
// CD ROM Read Table Of Contents (TOC) structures
1506
// Format 0 - Get table of contents
1507
1508
#define TocControl_TrkMode_Mask WParam_TrkMode_Mask
1509
#define TocControl_TrkMode_Audio WParam_TrkMode_Audio
1510
#define TocControl_TrkMode_Audio_PreEmph WParam_TrkMode_Audio_PreEmph
1511
#define TocControl_TrkMode_Data WParam_TrkMode_Data
1512
#define TocControl_TrkMode_IncrData WParam_TrkMode_IncrData
1513
#define TocControl_TrkMode_QAudio_PreEmph WParam_TrkMode_QAudio_PreEmph
1514
#define TocControl_TrkMode_AllowCpy WParam_TrkMode_AllowCpy
1515
1516
typedef
struct
_TOC_TRACK_INFO
{
1517
UCHAR
Reserved
;
1518
UCHAR
Control
: 4;
1519
UCHAR
Adr
: 4;
1520
UCHAR
TrackNum
;
1521
UCHAR
Reserved1
;
1522
UCHAR
LBA
[4];
1523
}
TOC_TRACK_INFO
, *
PTOC_TRACK_INFO
;
1524
1525
typedef
struct
_READ_TOC_HEADER
{
1526
UCHAR
Length
[2];
1527
UCHAR
First_TrackSes
;
1528
UCHAR
Last_TrackSes
;
1529
}
READ_TOC_HEADER
, *
PREAD_TOC_HEADER
;
1530
1531
#define TOC_LastTrack_ID 0xAA
1532
1533
typedef
struct
_READ_TOC_TOC
{
1534
READ_TOC_HEADER
Tracks
;
1535
TOC_TRACK_INFO
TrackData
[
MAXIMUM_NUMBER_OF_TRACKS
+1];
1536
}
READ_TOC_TOC
, *
PREAD_TOC_TOC
;
1537
1538
// Format 1 - Session Info
1539
1540
typedef
struct
_READ_TOC_SES
{
1541
READ_TOC_HEADER
Sessions
;
1542
TOC_TRACK_INFO
LastSes_1stTrack
;
// First Track Number In Last Complete Session
1543
}
READ_TOC_SES
, *
PREAD_TOC_SES
;
1544
1545
// Format 2,3 - Full TOC, PMA
1546
1547
#define TOC_CTL_Normal 0x00
1548
//#define TOC_CTL_MRW 0x01
1549
#define TOC_CTL_MRWTrackInfo 0x06
1550
#define TOC_CTL_MRWLastSes 0x07
1551
1552
// Ctl = 0
1553
#define TOC_ADR_TrackInfo 0x01
1554
#define TOC_ADR_Internal 0x05
1555
// ?? // Ctl = 1
1556
1557
// ADR = 1
1558
#define POINT_StartPositionOfTrack_Min 0x01
1559
#define POINT_StartPositionOfTrack_Max 0x63
1560
#define POINT_FirstTrackNum 0xA0
1561
#define POINT_LastTrackNum 0xA1
1562
#define POINT_StartPositionOfLeadOut 0xA2
1563
// ADR = 5
1564
#define POINT_SkipInterval_Min 0x01
1565
#define POINT_SkipInterval_Max 0x40
1566
#define POINT_StartPositionOfNextProgramArea 0xB0
1567
#define POINT_NumOfSkips 0xB1
1568
#define POINT_SkipTrackAssignmet_Min 0xB2
1569
#define POINT_SkipTrackAssignmet_Max 0xB4
1570
#define POINT_StartPositionOfFirstLeadIn 0xC0
1571
#define POINT_CopyOfAdditionalAreaInATIP 0xC1
1572
// ADR = 6, Control = 1
1573
// POINT 0x01 - 0x63, 0xA0 - 0xA2 are treated like for ADR = 1
1574
// rest - like for ADR = 5
1575
1576
// ADR = 7, Control = 1
1577
// POINT 0x01 - 0x63 are treated as FirstTrackInLastSession
1578
1579
typedef
struct
_TOC_SES_INFO
{
1580
UCHAR
SesNumber
;
1581
UCHAR
Control
: 4;
1582
UCHAR
Adr
: 4;
1583
UCHAR
TNO
;
1584
UCHAR
POINT
;
1585
1586
union
{
1587
1588
struct
{
1589
UCHAR
MSF
[3];
1590
UCHAR
Reserved
;
1591
UCHAR
P_MSF
[3];
1592
}
GENERIC
;
1593
1594
// ADR = 1
1595
// or
1596
// ADR = 6, Control = 1
1597
// or
1598
// ADR = 7, Control = 1:
1599
1600
//0x01 - 0x63
1601
struct
{
1602
UCHAR
ATIME
[3];
1603
UCHAR
Zero
;
1604
UCHAR
MSF
[3];
1605
}
StartPositionOfTrack
;
1606
1607
// ADR = 1
1608
// or
1609
// ADR = 6, Control = 1:
1610
1611
//0xA0
1612
#define FullTOC_DiscType_CDDA_or_M1 WParam_SesFmt_CdRom
// 0x00
1613
#define FullTOC_DiscType_CDI WParam_SesFmt_CdI
// 0x10
1614
#define FullTOC_DiscType_CDXA_M2 WParam_SesFmt_CdRomXa
// 0x20
1615
1616
struct
{
1617
UCHAR
ATIME
[3];
1618
UCHAR
Zero
;
1619
UCHAR
FirstTrackNum
;
1620
UCHAR
DiscType
;
1621
UCHAR
Zero1
;
1622
}
FirstTrackNum
;
1623
1624
//0xA1
1625
struct
{
1626
UCHAR
ATIME
[3];
1627
UCHAR
Zero
;
1628
UCHAR
LastTrackNum
;
1629
UCHAR
Zero1
[2];
1630
}
LastTrackNum
;
1631
1632
//0xA2
1633
struct
{
1634
UCHAR
ATIME
[3];
1635
UCHAR
Zero
;
1636
UCHAR
MSF
[3];
1637
}
StartPositionOfLeadOut
;
1638
1639
// ADR = 5:
1640
1641
//0x01 - 0x40
1642
struct
{
1643
UCHAR
End_MSF
[3];
1644
UCHAR
Reserved
;
1645
UCHAR
Start_MSF
[3];
1646
}
SkipInterval
;
1647
1648
// ADR = 5
1649
// or
1650
// ADR = 6, Control = 1:
1651
1652
//0xB0
1653
struct
{
1654
UCHAR
Program_MSF
[3];
1655
UCHAR
NumOfPointers_M5
;
1656
UCHAR
MaxLeadOut_MSF
[3];
1657
}
StartPositionOfNextProgramArea
;
1658
1659
//0xB1
1660
struct
{
1661
UCHAR
Zero
[4];
1662
UCHAR
Intervals
;
1663
UCHAR
Tracks
;
1664
UCHAR
Zero1
;
1665
}
NumOfSkips
;
1666
1667
//0xB2 - 0xB4
1668
struct
{
1669
UCHAR
SkipNum
[7];
1670
}
SkipTrackAsignment
;
1671
1672
//0xC0
1673
struct
{
1674
UCHAR
OptimumRecordingPower
;
1675
UCHAR
SpecInfoATIP
[3];
1676
UCHAR
LeadIn_MSF
[3];
1677
}
StartPositionOfFirstLeadIn
;
1678
1679
//0xC1
1680
struct
{
1681
UCHAR
Bytes
[7];
1682
}
AdditionalAreaInATIP
;
1683
1684
}
Params
;
1685
}
TOC_SES_INFO
, *
PTOC_SES_INFO
;
1686
1687
typedef
struct
_READ_TOC_FULL_TOC
{
1688
READ_TOC_HEADER
Sessions
;
1689
TOC_SES_INFO
SessionData
[
MAXIMUM_NUMBER_OF_SESSIONS
];
1690
}
READ_TOC_FULL_TOC
, *
PREAD_TOC_FULL_TOC
;
1691
1692
typedef
READ_TOC_FULL_TOC
READ_TOC_PMA
;
1693
typedef
PREAD_TOC_FULL_TOC
PREAD_TOC_PMA
;
1694
1695
// Format 4 - ATIP
1696
1697
typedef
struct
_READ_TOC_ATIP
{
1698
UCHAR
Length
[2];
1699
UCHAR
Reserved
[2];
1700
1701
#define ATIP_SpeedRef_Mask 0x07
1702
#define ATIP_SpeedRef_2X 0x01
1703
#define ATIP_WritingPower_Mask 0x07
1704
1705
union
{
1706
UCHAR
Flags
;
1707
struct
{
1708
UCHAR
SpeedRef
: 3;
1709
UCHAR
Reserved
: 1;
1710
UCHAR
WritingPower
: 3;
1711
UCHAR
One
: 1;
1712
}
Fields
;
1713
}
Flags1
;
1714
1715
#define ATIP_URU 0x40
1716
1717
union
{
1718
UCHAR
Flags
;
1719
struct
{
1720
UCHAR
Reserved
: 6;
1721
UCHAR
URU
: 1;
1722
UCHAR
Zero
: 1;
1723
}
Fields
;
1724
}
Flags2
;
1725
1726
#define ATIP_A1 0x01
// 16-18 are valid
1727
#define ATIP_A2 0x02
// 20-22 are valid
1728
#define ATIP_A3 0x04
// 24-26 are valid
1729
#define ATIP_SubType_Mask 0x38
// shall be set to zero
1730
#define ATIP_Type_Mask 0x40
1731
#define ATIP_Type_CDR 0x00
1732
#define ATIP_Type_CDRW 0x40
1733
1734
union
{
1735
UCHAR
Flags
;
1736
struct
{
1737
UCHAR
A1
: 1;
1738
UCHAR
A2
: 1;
1739
UCHAR
A3
: 1;
1740
UCHAR
SubType
: 3;
1741
UCHAR
Type
: 1;
1742
UCHAR
One
: 1;
1743
}
Fields
;
1744
}
DiscType
;
1745
1746
UCHAR
Reserved0
;
1747
UCHAR
LeadIn_MSF
[3];
1748
UCHAR
Reserved1
;
1749
UCHAR
LeadOut_MSF
[3];
1750
UCHAR
Reserved2
;
1751
1752
#define ATIP_MinSpeedCVL_Mask 0x70
1753
#define ATIP_MinSpeedCVL_2X 0x10
1754
#define ATIP_MaxSpeedCVL_Mask 0x0f
1755
#define ATIP_MaxSpeedCVL_2X 0x01
1756
#define ATIP_MaxSpeedCVL_4X 0x02
1757
#define ATIP_MaxSpeedCVL_6X 0x03
1758
#define ATIP_MaxSpeedCVL_8X 0x04
1759
1760
union
{
1761
UCHAR
Flags
;
1762
struct
{
1763
UCHAR
MaxSpeedCVL
: 4;
1764
UCHAR
MinSpeedCVL
: 3;
1765
UCHAR
Zero
: 1;
1766
}
Fields
;
1767
}
Speed
;
1768
1769
#define ATIP_Power_Y_Mask 0x0e
1770
#define ATIP_Power_P_Mask 0x70
1771
1772
union
{
1773
UCHAR
Flags
;
1774
struct
{
1775
UCHAR
Reserved
: 1;
1776
UCHAR
Y_value
: 3;
1777
UCHAR
P_factor
: 3;
1778
UCHAR
Zero
: 1;
1779
}
Fields
;
1780
}
Power
;
1781
1782
#define ATIP_PW_ratio_Mask 0x70
1783
1784
union
{
1785
UCHAR
Flags
;
1786
struct
{
1787
UCHAR
Reserved
: 4;
1788
UCHAR
P_W_ratio
: 3;
1789
UCHAR
Zero
: 1;
1790
}
Fields
;
1791
}
ErasePower
;
1792
1793
UCHAR
Reserved3
;
1794
UCHAR
A1_value
[3];
1795
UCHAR
Reserved4
;
1796
UCHAR
A2_value
[3];
1797
UCHAR
Reserved5
;
1798
UCHAR
A3_value
[3];
1799
1800
}
READ_TOC_ATIP
, *
PREAD_TOC_ATIP
;
1801
1802
// Format 5 - CD-TEXT
1803
1804
typedef
struct
_CD_TEXT_PACK_DATA
{
1805
1806
#define CdText_ID1_Title 0x80
// ID2 = 0 - Album, ID2 = 1-63 - Track
1807
#define CdText_ID1_Performer 0x81
1808
#define CdText_ID1_Songwriter 0x82
1809
#define CdText_ID1_Composer 0x83
1810
#define CdText_ID1_Arranger 0x84
1811
#define CdText_ID1_Message 0x85
1812
#define CdText_ID1_DiscID 0x86
1813
#define CdText_ID1_GenreInfo 0x87
1814
#define CdText_ID1_TOC 0x88
1815
#define CdText_ID1_TOC2 0x89
1816
#define CdText_ID1_Special 0x8D
1817
#define CdText_ID1_UPC_EAN_ISRC 0x8E
1818
#define CdText_ID1_BlockSizeInfo 0x8F
1819
1820
UCHAR
ID1
;
1821
UCHAR
ID2
;
1822
UCHAR
ID3
;
1823
1824
#define CdText_CharPos_Mask 0x0f
1825
#define CdText_BlkNum_Mask 0x70
1826
1827
union
{
1828
UCHAR
Flags
;
1829
struct
{
1830
UCHAR
CharPos
: 4;
1831
UCHAR
BlkNum
: 3;
1832
UCHAR
DBCC
: 1;
// used to indicate Double Byte text encoding (Unicode ?)
1833
}
Fields
;
1834
}
BlkNum_CharPos
;
1835
1836
UCHAR
TextData
[12];
1837
UCHAR
CRC
[2];
1838
}
CD_TEXT_PACK_DATA
, *
PCD_TEXT_PACK_DATA
;
1839
1840
typedef
struct
_READ_TOC_CD_TEXT
{
1841
UCHAR
Length
[2];
1842
UCHAR
Reserved
[2];
1843
CD_TEXT_PACK_DATA
Chunk0
;
1844
}
READ_TOC_CD_TEXT
, *
PREAD_TOC_CD_TEXT
;
1845
1846
// Read header
1847
1848
#define ReadHeader_CdMode_Audio 0x00
1849
#define ReadHeader_CdMode_Mode1 0x01
1850
#define ReadHeader_CdMode_Mode2 0x02
1851
1852
typedef
struct
_READ_HEADER_LBA
{
1853
UCHAR
CdDataMode
;
1854
UCHAR
Reserved
[3];
1855
UCHAR
LBA
[4];
1856
}
READ_HEADER_LBA
, *
PREAD_HEADER_LBA
;
1857
1858
typedef
struct
_READ_HEADER_MSF
{
1859
UCHAR
CdDataMode
;
1860
UCHAR
Reserved
[4];
1861
UCHAR
MSF
[3];
1862
}
READ_HEADER_MSF
, *
PREAD_HEADER_MSF
;
1863
1864
1865
// OPC block
1866
1867
typedef
struct
_OPC_INFO_BLOCK
{
1868
UCHAR
Speed
[2];
1869
UCHAR
OpcValue
[6];
1870
}
OPC_INFO_BLOCK
, *
POPC_INFO_BLOCK
;
1871
1872
// Buffer Capacity format
1873
1874
typedef
struct
_BUFFER_CAPACITY_BLOCK
{
1875
UCHAR
DataLength
[2];
1876
UCHAR
Reserved0
[2];
1877
UCHAR
BufferLength
[4];
1878
UCHAR
BlankBufferLength
[4];
1879
}
BUFFER_CAPACITY_BLOCK
, *
PBUFFER_CAPACITY_BLOCK
;
1880
1881
//#ifndef WITHOUT_FORMATTER
1882
// Format Unit structures
1883
1884
typedef
struct
_FORMAT_LIST_HEADER
{
1885
UCHAR
Reserved0
;
1886
1887
#define FormatHeader_VS 0x01
1888
#define FormatHeader_Immed 0x02
1889
#define FormatHeader_DSP 0x04
1890
#define FormatHeader_IP 0x08
1891
#define FormatHeader_STPF 0x10
1892
#define FormatHeader_DCRT 0x20
1893
#define FormatHeader_DPRY 0x40
1894
#define FormatHeader_FOV 0x80
1895
1896
union
{
1897
UCHAR
Flags
;
1898
struct
{
1899
UCHAR
VS
: 1;
1900
UCHAR
Immed
: 1;
1901
UCHAR
DSP
: 1;
1902
UCHAR
IP
: 1;
1903
UCHAR
STPF
: 1;
1904
UCHAR
DCRT
: 1;
1905
UCHAR
DPRY
: 1;
1906
UCHAR
FOV
: 1;
1907
}
Fields
;
1908
}
Flags
;
1909
UCHAR
FormatDescriptorLength
[2];
// =0x0008
1910
}
FORMAT_LIST_HEADER
, *
PFORMAT_LIST_HEADER
;
1911
1912
typedef
struct
_CDRW_FORMAT_DESCRIPTOR
{
1913
1914
#define FormatDesc_Grow 0x40
1915
#define FormatDesc_Ses 0x80
1916
1917
union
{
1918
UCHAR
Flags
;
1919
struct
{
1920
UCHAR
Reserved0
: 6;
1921
UCHAR
Grow
: 1;
1922
UCHAR
Ses
: 1;
1923
}
Fields
;
1924
}
Flags
;
1925
UCHAR
Reserved1
[3];
1926
UCHAR
FormatSize
[4];
1927
}
CDRW_FORMAT_DESCRIPTOR
, *
PCDRW_FORMAT_DESCRIPTOR
;
1928
1929
typedef
struct
_DVD_FORMAT_DESCRIPTOR
{
1930
1931
UCHAR
NumOfBlocks
[4];
1932
1933
#define DvdFormatType_Full 0x00
1934
#define DvdFormatType_SpareExpansion 0x01
1935
#define DvdFormatType_ZoneReformat 0x04
1936
#define DvdFormatType_ZoneFormat 0x05
1937
#define DvdFormatType_CD_DVD_RW_Full 0x10
1938
#define DvdFormatType_CD_DVD_RW_GrowSes 0x11
1939
#define DvdFormatType_CD_DVD_RW_AddSes 0x12
1940
#define DvdFormatType_DVD_RW_QuickGrowSes 0x13
1941
#define DvdFormatType_DVD_RW_QuickAddSes 0x14
1942
#define DvdFormatType_DVD_RW_Quick 0x15
1943
#define DvdFormatType_DVD_pRW_Full_3Gb 0x20
// obsolete
1944
#define DvdFormatType_CD_MRW_Full 0x24
1945
#define DvdFormatType_DVD_pRW_basic 0x26
1946
#define DvdFormatType_DDCD_RW_Quick 0x28
1947
#define DvdFormatType_BDRE_Full_Spare 0x30
1948
#define DvdFormatType_BDRE_Full 0x31
1949
#define DvdFormatType_BDR_Full_Spare 0x32
1950
1951
#define DvdFormatSubType_BDRE_QuickReformat 0x00
1952
#define DvdFormatSubType_BDRE_NoCert 0x01
1953
#define DvdFormatSubType_BDRE_FullCert 0x02
1954
#define DvdFormatSubType_BDRE_QuickCert 0x03
1955
1956
#define DvdFormatSubType_BDR_SRMpPOW 0x00
1957
#define DvdFormatSubType_BDR_SRM_POW 0x01
1958
#define DvdFormatSubType_BDR_RRM 0x02
1959
1960
union
{
1961
UCHAR
Flags
;
1962
struct
{
1963
UCHAR
FormatSubType
: 2;
1964
UCHAR
FormatType
: 6;
1965
}
Fields
;
1966
}
Flags
;
1967
1968
/*
1969
#define FormatUnit_MRW_SetNew(desc) { desc->TypeDependent[0] = 0; \
1970
desc->TypeDependent[1] = 0; \
1971
desc->TypeDependent[2] = 0; }
1972
1973
#define FormatUnit_MRW_SetRestart(desc) { desc->TypeDependent[0] = 0; \
1974
desc->TypeDependent[1] = 0; \
1975
desc->TypeDependent[2] = 1; }
1976
*/
1977
union
{
1978
UCHAR
BlockSize
[3];
1979
UCHAR
TypeDependent
[3];
1980
struct
{
1981
UCHAR
Reserved1
[2];
1982
UCHAR
Restart
: 1;
1983
UCHAR
QuickStart
: 1;
// MMC-5
1984
UCHAR
Reserved2
: 6;
1985
}
MRW
;
1986
};
1987
1988
1989
}
DVD_FORMAT_DESCRIPTOR
, *
PDVD_FORMAT_DESCRIPTOR
;
1990
1991
typedef
struct
_FORMAT_UNIT_PARAMETER_LIST
{
1992
FORMAT_LIST_HEADER
Header
;
1993
union
{
1994
struct
{
1995
UCHAR
InitPatternDescr
[4];
1996
CDRW_FORMAT_DESCRIPTOR
CdFormatDescr
;
1997
};
1998
DVD_FORMAT_DESCRIPTOR
DvdFormatDescr
;
1999
};
2000
}
FORMAT_UNIT_PARAMETER_LIST
, *
PFORMAT_UNIT_PARAMETER_LIST
;
2001
2002
// define Read Format Capacities info blocks
2003
2004
typedef
struct
_CAPACITY_LIST_HEADER
{
2005
UCHAR
Reserved
[3];
2006
UCHAR
Length
;
2007
}
CAPACITY_LIST_HEADER
, *
PCAPACITY_LIST_HEADER
;
2008
2009
typedef
struct
_FORMATTABLE_CAPACITY_DESCRIPTOR
{
2010
UCHAR
NumOfBlocks
[4];
2011
union
{
2012
UCHAR
Flags
;
2013
struct
{
2014
2015
#define FormatCapcity_Descr_Reserved 0x00
2016
#define FormatCapcity_Descr_Unformatted 0x01
2017
#define FormatCapcity_Descr_Formatted 0x02
2018
#define FormatCapcity_Descr_NoMedia 0x03
2019
2020
// valid for the 1st descriptor only
2021
UCHAR
DescType
: 2;
2022
2023
// valid for all descriptors except the 1st one
2024
UCHAR
FormatType
: 6;
2025
2026
}
Fields
;
2027
}
Flags
;
2028
union
{
2029
UCHAR
BlockSize
[3];
2030
UCHAR
TypeDependent
[3];
2031
};
2032
}
FORMATTABLE_CAPACITY_DESCRIPTOR
, *
PFORMATTABLE_CAPACITY_DESCRIPTOR
;
2033
2034
typedef
struct
_FORMAT_CAPACITIES_DATA
{
2035
CAPACITY_LIST_HEADER
Header
;
2036
2037
#define FormatCap_CurMaxDescrOffset 0x00
2038
#define FormatCap_FormatDescrOffset(i) (i+1)
2039
2040
FORMATTABLE_CAPACITY_DESCRIPTOR
Descriptors
[1];
2041
}
FORMAT_CAPACITIES_DATA
, *
PFORMAT_CAPACITIES_DATA
;
2042
2043
//#endif //WITHOUT_FORMATTER
2044
2045
// Define Event Status info blocks
2046
2047
typedef
struct
_EVENT_STAT_HEADER
{
2048
UCHAR
DataLength
[2];
2049
2050
#define EventRetStat_Class_Mask 0x07
2051
#define EventRetStat_Class_OpChange 0x01
2052
#define EventRetStat_Class_PM 0x02
2053
#define EventRetStat_Class_ExternReq 0x03
2054
#define EventRetStat_Class_Media 0x04
2055
#define EventRetStat_Class_MultInitiators 0x05
2056
#define EventRetStat_Class_DevBusy 0x06
2057
#define EventRetStat_NEA 0x80
2058
2059
union
{
2060
UCHAR
Flags
;
2061
struct
{
2062
UCHAR
Class
: 3;
2063
UCHAR
Reserved0
: 4;
2064
UCHAR
NEA
: 1;
2065
}
Fields
;
2066
}
Flags
;
2067
2068
UCHAR
SupportedClasses
;
// see command format
2069
2070
}
EVENT_STAT_HEADER
, *
PEVENT_STAT_HEADER
;
2071
2072
typedef
struct
_EVENT_STAT_OPERATIONAL_BLOCK
{
2073
2074
EVENT_STAT_HEADER
Header
;
2075
2076
#define EventStat_OpEvent_Mask 0x0f
2077
2078
union
{
2079
UCHAR
Flags
;
2080
struct
{
2081
UCHAR
OpEvent
: 4;
2082
UCHAR
Reserved0
: 4;
2083
}
Fields
;
2084
}
Byte0
;
2085
2086
#define EventStat_OpStat_Mask 0x0f
2087
#define EventStat_OpStat_Ready 0x00
2088
#define EventStat_OpStat_TempBusy 0x01
2089
#define EventStat_OpStat_Busy 0x02
2090
2091
union
{
2092
UCHAR
Flags
;
2093
struct
{
2094
UCHAR
OpStatus
: 4;
2095
UCHAR
Reserved0
: 3;
2096
UCHAR
PersistentPrevent
: 1;
2097
}
Fields
;
2098
}
Byte1
;
2099
2100
#define EventStat_OpReport_NoChg 0x00
2101
#define EventStat_OpReport_Change 0x01
2102
#define EventStat_OpReport_AddChg 0x02
2103
#define EventStat_OpReport_Reset 0x03
2104
#define EventStat_OpReport_FirmwareChg 0x04
// microcode change
2105
#define EventStat_OpReport_InquiryChg 0x05
2106
#define EventStat_OpReport_CtrlReq 0x06
2107
#define EventStat_OpReport_CtrlRelease 0x07
2108
2109
UCHAR
OpReport
[2];
2110
2111
}
EVENT_STAT_OPERATIONAL_BLOCK
, *
PEVENT_STAT_OPERATIONAL_BLOCK
;
2112
2113
typedef
struct
_EVENT_STAT_PM_BLOCK
{
2114
2115
EVENT_STAT_HEADER
Header
;
2116
2117
#define EventStat_PowerEvent_Mask 0x0f
2118
#define EventStat_PowerEvent_NoChg 0x00
2119
#define EventStat_PowerEvent_ChgOK 0x01
2120
#define EventStat_PowerEvent_ChgFail 0x02
2121
2122
union
{
2123
UCHAR
Flags
;
2124
struct
{
2125
UCHAR
PowerEvent
: 4;
2126
UCHAR
Reserved0
: 4;
2127
}
Fields
;
2128
}
Byte0
;
2129
2130
#define EventStat_PowerStat_Mask 0x0f
2131
#define EventStat_PowerStat_Active 0x01
2132
#define EventStat_PowerStat_Idle 0x02
2133
#define EventStat_PowerStat_Standby 0x03
2134
#define EventStat_PowerStat_Sleep 0x04
2135
2136
union
{
2137
UCHAR
Flags
;
2138
struct
{
2139
UCHAR
PowerStatus
: 4;
2140
UCHAR
Reserved0
: 4;
2141
}
Fields
;
2142
}
Byte1
;
2143
2144
UCHAR
Reserved0
[2];
2145
2146
}
EVENT_STAT_PM_BLOCK
, *
PEVENT_STAT_PM_BLOCK
;
2147
2148
typedef
struct
_EVENT_STAT_EXT_REQ_BLOCK
{
2149
2150
EVENT_STAT_HEADER
Header
;
2151
2152
#define EventStat_ExtrnReqEvent_Mask 0x0f
2153
#define EventStat_ExtrnReqEvent_None 0x00
2154
#define EventStat_ExtrnReqEvent_KeyDown 0x01
2155
#define EventStat_ExtrnReqEvent_KeyUp 0x02
2156
#define EventStat_ExtrnReqEvent_ExtrnReq 0x03
2157
2158
union
{
2159
UCHAR
Flags
;
2160
struct
{
2161
UCHAR
ExtrnReqEvent
: 4;
2162
UCHAR
Reserved0
: 4;
2163
}
Fields
;
2164
}
Byte0
;
2165
2166
#define EventStat_ExtrnReqStatus_Mask 0x0f
2167
#define EventStat_ExtrnReqStatus_Ready 0x00
2168
#define EventStat_ExtrnReqStatus_OtherPrevent 0x01
2169
2170
union
{
2171
UCHAR
Flags
;
2172
struct
{
2173
UCHAR
ExtrnReqStatus
: 4;
2174
UCHAR
Reserved0
: 3;
2175
UCHAR
PersistentPrevent
: 1;
2176
}
Fields
;
2177
}
Byte1
;
2178
2179
#define EventStat_ExtrnReq_None 0x000
2180
#define EventStat_ExtrnReq_Overrun 0x001
2181
#define EventStat_ExtrnReq_Play 0x101
2182
#define EventStat_ExtrnReq_Rewind 0x102
2183
#define EventStat_ExtrnReq_FastFwd 0x103
2184
#define EventStat_ExtrnReq_Pause 0x104
2185
#define EventStat_ExtrnReq_Stop 0x106
2186
#define EventStat_ExtrnReq_MinASCII 0x200
2187
#define EventStat_ExtrnReq_MaxASCII 0x2ff
2188
2189
UCHAR
ExternalReq
[2];
2190
2191
}
EVENT_STAT_EXT_REQ_BLOCK
, *
PEVENT_STAT_EXT_REQ_BLOCK
;
2192
2193
typedef
struct
_EVENT_STAT_MEDIA_BLOCK
{
2194
2195
EVENT_STAT_HEADER
Header
;
2196
2197
#define EventStat_MediaEvent_Mask 0x0f
2198
#define EventStat_MediaEvent_None 0x00
2199
#define EventStat_MediaEvent_EjectReq 0x01
2200
#define EventStat_MediaEvent_New 0x02
2201
#define EventStat_MediaEvent_Removal 0x03
2202
#define EventStat_MediaEvent_Chg 0x04
2203
#define EventStat_MediaEvent_BGFormatOk 0x05
2204
#define EventStat_MediaEvent_BGFormatRst 0x06
2205
2206
union
{
2207
UCHAR
Flags
;
2208
struct
{
2209
UCHAR
MediaEvent
: 4;
2210
UCHAR
Reserved0
: 4;
2211
}
Fields
;
2212
}
Byte0
;
2213
2214
#define EventStat_MediaStat_DoorOpen 0x01
2215
#define EventStat_MediaStat_Present 0x02
2216
2217
union
{
2218
UCHAR
Flags
;
2219
struct
{
2220
UCHAR
DoorOpen
: 1;
2221
UCHAR
Present
: 1;
2222
UCHAR
Reserved0
: 6;
2223
}
Fields
;
2224
}
Byte1
;
2225
2226
UCHAR
StartSlot
;
2227
UCHAR
EndSlot
;
2228
2229
}
EVENT_STAT_MEDIA_BLOCK
, *
PEVENT_STAT_MEDIA_BLOCK
;
2230
2231
typedef
struct
_EVENT_STAT_DEV_BUSY_BLOCK
{
2232
2233
EVENT_STAT_HEADER
Header
;
2234
2235
#define EventStat_BusyEvent_Mask 0x0f
2236
#define EventStat_BusyEvent_None 0x00
2237
#define EventStat_BusyEvent_Busy 0x01
2238
2239
union
{
2240
UCHAR
Flags
;
2241
struct
{
2242
UCHAR
BusyEvent
: 4;
2243
UCHAR
Reserved0
: 4;
2244
}
Fields
;
2245
}
Byte0
;
2246
2247
#define EventStat_BusyStat_Mask 0x0f
2248
#define EventStat_BusyStat_NoEvent 0x00
2249
#define EventStat_BusyStat_Power 0x01
2250
#define EventStat_BusyStat_Immed 0x02
2251
#define EventStat_BusyStat_Deferred 0x03
2252
2253
union
{
2254
UCHAR
Flags
;
2255
struct
{
2256
UCHAR
BusyStatus
: 4;
2257
UCHAR
Reserved0
: 4;
2258
}
Fields
;
2259
}
Byte1
;
2260
2261
UCHAR
Time
[2];
2262
2263
}
EVENT_STAT_DEV_BUSY_BLOCK
, *
PEVENT_STAT_DEV_BUSY_BLOCK
;
2264
2265
// Define mode disc info block.
2266
2267
typedef
struct
_DISC_INFO_BLOCK
{
//
2268
UCHAR
DataLength
[2];
2269
2270
#define DiscInfo_Disk_Mask 0x03
2271
#define DiscInfo_Disk_Empty 0x00
2272
#define DiscInfo_Disk_Appendable 0x01
2273
#define DiscInfo_Disk_Complete 0x02
2274
#define DiscInfo_Disk_OtherRW 0x03
2275
2276
#define DiscInfo_Ses_Mask 0x0C
2277
#define DiscInfo_Ses_Empty 0x00
2278
#define DiscInfo_Ses_Incomplete 0x04
2279
#define DiscInfo_Ses_Complete 0x0C
2280
2281
#define DiscInfo_Disk_Erasable 0x10
2282
2283
union
{
2284
UCHAR
Flags
;
2285
struct
{
2286
UCHAR
DiscStat
: 2;
2287
UCHAR
LastSesStat
: 2;
2288
UCHAR
Erasable
: 1;
2289
UCHAR
DiscInfoType
: 3;
2290
}
Fields
;
2291
}
DiscStat
;
2292
2293
UCHAR
FirstTrackNum
;
2294
UCHAR
NumOfSes
;
2295
UCHAR
FirstTrackNumLastSes
;
2296
UCHAR
LastTrackNumLastSes
;
2297
2298
#define DiscInfo_BGF_Mask 0x03
2299
#define DiscInfo_BGF_None 0x00
2300
#define DiscInfo_BGF_Interrupted 0x01
// \ indicates that disk is MRW or Basic-formatted
2301
#define DiscInfo_BGF_InProgress 0x02
// } note, you should issue READ_TOC
2302
#define DiscInfo_BGF_Complete 0x03
// / to check MRW state on old drives
2303
2304
#define DiscInfo_DBit 0x04
// MRW structures may be not current (dirty)
2305
#define DiscInfo_DAC_V 0x10
// Disk Appclication Code valid
2306
#define DiscInfo_URU 0x20
// unrestricted use (1 for CD/DVD, 0 for DB)
2307
#define DiscInfo_DBC_V 0x40
// Disk Bar Code valid
2308
#define DiscInfo_DID_V 0x80
// DiskID valid
2309
2310
union
{
2311
UCHAR
Flags
;
2312
struct
{
2313
UCHAR
BGFmtStatus
: 2;
2314
UCHAR
DBit
: 1;
2315
UCHAR
Reserved1
: 1;
2316
UCHAR
DAC_V
: 1;
2317
UCHAR
URU
: 1;
2318
UCHAR
DBC_V
: 1;
// 0
2319
UCHAR
DID_V
: 1;
2320
}
Fields
;
2321
}
Flags
;
2322
2323
#define DiscInfo_Type_cdrom 0x00
// CD-DA / CD-ROM
2324
#define DiscInfo_Type_cdi 0x10
// CD-I
2325
#define DiscInfo_Type_cdromxa 0x20
// CD-ROM XA
2326
#define DiscInfo_Type_unknown 0xFF
// HZ ;)
2327
2328
UCHAR
DiskType
;
2329
UCHAR
NumOfSes2
;
// MSB MMC-3
2330
UCHAR
FirstTrackNumLastSes2
;
// MSB MMC-3
2331
UCHAR
LastTrackNumLastSes2
;
// MSB MMC-3
2332
UCHAR
DiskId
[4];
2333
UCHAR
LastSesLeadInTime
[4];
// MSF
2334
UCHAR
LastSesLeadOutTime
[4];
// MSF
2335
UCHAR
DiskBarCode
[8];
2336
UCHAR
Reserved3
;
2337
UCHAR
OPCNum
;
2338
2339
}
DISC_INFO_BLOCK
, *
PDISC_INFO_BLOCK
;
2340
2341
typedef
struct
_DISC_INFO_TRACK_BLOCK
{
//
2342
UCHAR
DataLength
[2];
2343
2344
UCHAR
Reserved
: 5;
2345
UCHAR
InfoType
: 3;
2346
UCHAR
Reserved1
;
2347
2348
UCHAR
MaxLastTrackNum
[2];
2349
UCHAR
NumOfTracks
[2];
2350
UCHAR
MaxNumOfAppendableTracks
[2];
2351
UCHAR
NumOfAppendableTracks
[2];
2352
2353
}
DISC_INFO_TRACK_BLOCK
, *
PDISC_INFO_TRACK_BLOCK
;
2354
2355
typedef
struct
_DISC_INFO_POW_BLOCK
{
//
2356
UCHAR
DataLength
[2];
2357
2358
UCHAR
Reserved
: 5;
2359
UCHAR
InfoType
: 3;
2360
UCHAR
Reserved1
;
2361
2362
UCHAR
RemainingPOWReplacements
[4];
2363
UCHAR
RemainingPOWMapEntries
[4];
2364
UCHAR
RemainingPOWUpdates
[4];
2365
2366
}
DISC_INFO_POW_BLOCK
, *
PDISC_INFO_POW_BLOCK
;
2367
2368
// Define track info block.
2369
2370
#define Trk_QSubChan_Type_Mask 0x0d
2371
#define Trk_QSubChan_Type_None 0x00
2372
#define Trk_QSubChan_Type_Audio 0x00
2373
#define Trk_QSubChan_Type_Audio_PreEmph 0x01
2374
#define Trk_QSubChan_Type_Data 0x04
2375
#define Trk_QSubChan_Type_IncrData 0x05
2376
#define Trk_QSubChan_Type_QAudio_PreEmph 0x08
2377
#define Trk_QSubChan_Type_AllowCpy 0x02
2378
2379
typedef
struct
_TRACK_INFO_BLOCK
{
2380
UCHAR
DataLength
[2];
2381
UCHAR
TrackNum
;
2382
UCHAR
SesNum
;
2383
UCHAR
Reserved0
;
2384
2385
#define TrkInfo_Trk_Mask Trk_QSubChan_Type_Mask
2386
#define TrkInfo_Trk_None Trk_QSubChan_Type_None
2387
#define TrkInfo_Trk_Mode1 Trk_QSubChan_Type_Audio_PreEmph
2388
#define TrkInfo_Trk_Mode2 (Trk_QSubChan_Type_Audio | Trk_QSubChan_Type_AllowCpy)
2389
#define TrkInfo_Trk_XA (Trk_QSubChan_Type_Audio | Trk_QSubChan_Type_AllowCpy)
2390
#define TrkInfo_Trk_DDCD Trk_QSubChan_Type_Data
// MMC-3
2391
#define TrkInfo_Trk_NonCD Trk_QSubChan_Type_Data
// MMC-3
2392
#define TrkInfo_Trk_Inc Trk_QSubChan_Type_IncrData
// MMC-3
2393
#define TrkInfo_Trk_unknown 0x0F
2394
2395
#define TrkInfo_Copy 0x10
2396
#define TrkInfo_Damage 0x20
2397
/* Layer Jump state */
2398
#define TrkInfo_LJ_Mask 0xc0
2399
#define TrkInfo_LJ_None 0x00
2400
#define TrkInfo_LJ_Ready 0x40
2401
#define TrkInfo_LJ_Manual 0x80
2402
#define TrkInfo_LJ_Regular 0xc0
2403
2404
UCHAR
TrackParam
;
2405
/* UCHAR TrackMode : 4;
2406
UCHAR Copy : 1;
2407
UCHAR Damage : 1;
2408
UCHAR LJRS : 2; */
2409
2410
#define TrkInfo_Dat_Mask 0x0F
2411
#define TrkInfo_Dat_Mode1 0x01
2412
#define TrkInfo_Dat_Mode2 0x02
2413
#define TrkInfo_Dat_XA 0x02
2414
#define TrkInfo_Dat_DDCD 0x02
2415
#define TrkInfo_Dat_unknown 0x0F
2416
#define TrkInfo_Dat_Unknown TrkInfo_Dat_unknown
2417
#define TrkInfo_FP 0x10
2418
#define TrkInfo_Packet 0x20
2419
#define TrkInfo_Blank 0x40
2420
#define TrkInfo_RT 0x80
2421
2422
UCHAR
DataParam
;
2423
/* UCHAR DataMode : 4;
2424
UCHAR FP : 1;
2425
UCHAR Packet : 1;
2426
UCHAR Blank : 1;
2427
UCHAR RT : 1; */
2428
2429
#define TrkInfo_NWA_V 0x01
2430
#define TrkInfo_LRA_V 0x02
// MMC-3
2431
2432
UCHAR
NWA_V
;
2433
/* UCHAR NWA_V : 1;
2434
UCHAR LRA_V : 1;
2435
UCHAR Reserved : 6; */
2436
2437
UCHAR
TrackStartAddr
[4];
2438
UCHAR
NextWriteAddr
[4];
2439
UCHAR
FreeBlocks
[4];
2440
UCHAR
FixPacketSize
[4];
2441
UCHAR
TrackLength
[4];
2442
2443
// MMC-3
2444
2445
UCHAR
LastRecordedAddr
[4];
2446
UCHAR
TrackNum2
;
// MSB
2447
UCHAR
SesNum2
;
// MSB
2448
UCHAR
Reserved2
[2];
2449
2450
// MMC-5
2451
2452
UCHAR
ReadCompatLBA
[4];
2453
2454
// MMC-6
2455
2456
UCHAR
NextLJ_LBA
[4];
2457
UCHAR
LastLJ_LBA
[4];
2458
2459
}
TRACK_INFO_BLOCK
, *
PTRACK_INFO_BLOCK
;
2460
2461
// Mode data structures.
2462
2463
// Define Mode parameter header.
2464
2465
#define MediaType_Unknown 0x00
2466
#define MediaType_120mm_CDROM_DataOnly 0x01
2467
#define MediaType_120mm_CDROM_AudioOnly 0x02
//CDDA
2468
#define MediaType_120mm_CDROM_DataAudioCombined 0x03
2469
#define MediaType_120mm_CDROM_Hybrid_PhotoCD 0x04
2470
#define MediaType_80mm_CDROM_DataOnly 0x05
2471
#define MediaType_80mm_CDROM_AudioOnly 0x06
//CDDA
2472
#define MediaType_80mm_CDROM_DataAudioCombined 0x07
2473
#define MediaType_80mm_CDROM_Hybrid_PhotoCD 0x08
2474
2475
#define MediaType_UnknownSize_CDR 0x10
2476
#define MediaType_120mm_CDR_DataOnly 0x11
2477
#define MediaType_120mm_CDR_AudioOnly 0x12
//CDDA
2478
#define MediaType_120mm_CDR_DataAudioCombined 0x13
2479
#define MediaType_120mm_CDR_Hybrid_PhotoCD 0x14
2480
#define MediaType_80mm_CDR_DataOnly 0x15
2481
#define MediaType_80mm_CDR_AudioOnly 0x16
//CDDA
2482
#define MediaType_80mm_CDR_DataAudioCombined 0x17
2483
#define MediaType_80mm_CDR_Hybrid_Photo_CD 0x18
2484
2485
#define MediaType_UnknownSize_CDRW 0x20
2486
#define MediaType_120mm_CDRW_DataOnly 0x21
2487
#define MediaType_120mm_CDRW_AudioOnly 0x22
//CDDA
2488
#define MediaType_120mm_CDRW_DataAudioCombined 0x23
2489
#define MediaType_120mm_CDRW_Hybrid 0x24
2490
#define MediaType_80mm_CDRW_DataOnly 0x25
2491
#define MediaType_80mm_CDRW_AudioOnly 0x26
//CDDA
2492
#define MediaType_80mm_CDRW_DataAudioCombined 0x27
2493
#define MediaType_80mm_CDRW_Hybrid 0x28
2494
2495
#define MediaType_UnknownSize_Unknown 0x30
2496
2497
#define MediaType_120mm_DVDRW_DataOnly 0x41
2498
2499
#define MediaType_NoDiscPresent 0x70
2500
#define MediaType_DoorOpen 0x71
2501
2502
//*********************************************************************************************
2503
2504
typedef
struct
_MODE_PARAMETER_HEADER
{
2505
UCHAR
ModeDataLength
;
2506
UCHAR
MediumType
;
2507
UCHAR
DeviceSpecificParameter
;
2508
UCHAR
BlockDescriptorLength
;
2509
}
MODE_PARAMETER_HEADER
, *
PMODE_PARAMETER_HEADER
;
2510
2511
typedef
struct
_MODE_PARAMETER_HEADER10
{
2512
UCHAR
ModeDataLength
[2];
2513
UCHAR
MediumType
;
2514
UCHAR
DeviceSpecificParameter
;
2515
UCHAR
Reserved
[2];
2516
UCHAR
BlockDescriptorLength
[2];
2517
}
MODE_PARAMETER_HEADER10
, *
PMODE_PARAMETER_HEADER10
;
2518
2519
#define MODE_FD_SINGLE_SIDE 0x01
2520
#define MODE_FD_DOUBLE_SIDE 0x02
2521
#define MODE_FD_MAXIMUM_TYPE 0x1E
2522
#define MODE_DSP_FUA_SUPPORTED 0x10
2523
#define MODE_DSP_WRITE_PROTECT 0x80
2524
2525
// Define the mode parameter block.
2526
2527
typedef
struct
_MODE_PARAMETER_BLOCK
{
2528
UCHAR
DensityCode
;
2529
UCHAR
NumberOfBlocks
[3];
2530
UCHAR
Reserved
;
2531
UCHAR
BlockLength
[3];
2532
}
MODE_PARAMETER_BLOCK
, *
PMODE_PARAMETER_BLOCK
;
2533
2534
typedef
struct
_MODE_PARM_READ_WRITE
{
2535
2536
MODE_PARAMETER_HEADER
ParameterListHeader
;
// List Header Format
2537
MODE_PARAMETER_BLOCK
ParameterListBlock
;
// List Block Descriptor
2538
2539
}
MODE_PARM_READ_WRITE_DATA
, *
PMODE_PARM_READ_WRITE_DATA
;
2540
2541
//*********************************************************************************************
2542
// Define read write recovery page
2543
2544
typedef
struct
_MODE_READ_WRITE_RECOVERY_PAGE
{
// 0x01
2545
2546
UCHAR
PageCode
: 6;
2547
UCHAR
Reserved1
: 1;
2548
UCHAR
PageSavable
: 1;
2549
2550
UCHAR
PageLength
;
2551
2552
union
{
2553
UCHAR
Flags
;
2554
struct
{
2555
UCHAR
DCRBit
: 1;
2556
UCHAR
DTEBit
: 1;
2557
UCHAR
PERBit
: 1;
2558
UCHAR
EERBit
: 1;
2559
UCHAR
RCBit
: 1;
2560
UCHAR
TBBit
: 1;
2561
UCHAR
ARRE
: 1;
2562
UCHAR
AWRE
: 1;
2563
}
Fields
;
2564
}
ErrorRecoveryParam
;
2565
UCHAR
ReadRetryCount
;
2566
UCHAR
CorrectionSpan
;
//SCSI CBS only
2567
UCHAR
HeadOffsetCount
;
//SCSI CBS only
2568
UCHAR
DataStrobOffsetCount
;
//SCSI CBS only
2569
union
{
2570
UCHAR
Flags
;
2571
struct
{
2572
UCHAR
EMCDR
: 2;
2573
UCHAR
Reserved
: 6;
2574
}
Fields
;
2575
}
ErrorRecoveryParam2
;
2576
UCHAR
WriteRetryCount
;
2577
union
{
2578
struct
{
2579
UCHAR
Reserved5
;
2580
UCHAR
RecoveryTimeLimit
[2];
// 0
2581
};
2582
UCHAR
ErrorReportingWindowSize
[3];
2583
};
2584
2585
}
MODE_READ_WRITE_RECOVERY_PAGE
, *
PMODE_READ_WRITE_RECOVERY_PAGE
;
2586
2587
// Define Read Recovery page - cdrom
2588
2589
typedef
struct
_MODE_READ_RECOVERY_PAGE
{
// 0x01
2590
2591
UCHAR
PageCode
: 6;
2592
UCHAR
Reserved1
: 1;
2593
UCHAR
PageSavable
: 1;
2594
2595
UCHAR
PageLength
;
2596
2597
UCHAR
DCRBit
: 1;
2598
UCHAR
DTEBit
: 1;
2599
UCHAR
PERBit
: 1;
2600
UCHAR
Reserved2
: 1;
2601
UCHAR
RCBit
: 1;
2602
UCHAR
TBBit
: 1;
2603
UCHAR
Reserved3
: 2;
2604
2605
UCHAR
ReadRetryCount
;
2606
UCHAR
Reserved4
[4];
2607
2608
}
MODE_READ_RECOVERY_PAGE
, *
PMODE_READ_RECOVERY_PAGE
;
2609
2610
//*********************************************************************************************
2611
// Define mode write parameters page.
2612
2613
typedef
struct
_MODE_WRITE_PARAMS_PAGE
{
// 0x05
2614
UCHAR
PageCode
: 6;
2615
UCHAR
Reserved1
: 1;
2616
UCHAR
PageSavable
: 1;
2617
2618
UCHAR
PageLength
;
// 0x32
2619
2620
#define WParam_WType_Mask 0x0f
2621
#define WParam_WType_Packet 0x00
2622
#define WParam_WType_TAO 0x01
2623
#define WParam_WType_Ses 0x02
2624
#define WParam_WType_Raw 0x03
2625
#define WParam_TestWrite 0x10
2626
#define WParam_LS_V 0x20
2627
#define WParam_BUFF 0x40
// buffer underrun protection
2628
2629
union
{
2630
UCHAR
Flags
;
2631
struct
{
2632
UCHAR
WriteType
: 4;
// 1
2633
UCHAR
TestWrite
: 1;
2634
UCHAR
LS_V
: 1;
2635
UCHAR
BUFF
: 1;
2636
UCHAR
Reserved1
: 1;
2637
}
Fields
;
2638
}
Byte2
;
2639
2640
#define WParam_TrkMode_Mask Trk_QSubChan_Type_Mask
//0x0d // xx0x
2641
#define WParam_TrkMode_None Trk_QSubChan_Type_None
//0x00
2642
#define WParam_TrkMode_Audio Trk_QSubChan_Type_Audio
//0x00
2643
#define WParam_TrkMode_Audio_PreEmph Trk_QSubChan_Type_Audio_PreEmph
//0x01
2644
#define WParam_TrkMode_Data Trk_QSubChan_Type_Data
//0x04
2645
#define WParam_TrkMode_IncrData Trk_QSubChan_Type_IncrData
//0x05
2646
#define WParam_TrkMode_QAudio_PreEmph Trk_QSubChan_Type_QAudio_PreEmph
//0x08
2647
#define WParam_TrkMode_AllowCpy Trk_QSubChan_Type_AllowCpy
//0x02
2648
#define WParam_Copy 0x10
2649
#define WParam_FP 0x20
2650
#define WParam_MultiSes_Mask 0xc0
2651
#define WParam_Multises_None 0x00
2652
#define WParam_Multises_Final 0x80
2653
#define WParam_Multises_Multi 0xc0
2654
2655
union
{
2656
UCHAR
Flags
;
2657
struct
{
2658
UCHAR
TrackMode
: 4;
// 4
2659
UCHAR
Copy
: 1;
// 0
2660
UCHAR
FP
: 1;
// 0
2661
UCHAR
Multisession
: 2;
// 11
2662
}
Fields
;
2663
}
Byte3
;
2664
2665
#define WParam_BlkType_Mask 0x0f
2666
#define WParam_BlkType_Raw_2352 0x00
2667
#define WParam_BlkType_RawPQ_2368 0x01
2668
#define WParam_BlkType_RawPW_2448 0x02
2669
#define WParam_BlkType_RawPW_R_2448 0x03
2670
#define WParam_BlkType_VendorSpec1 0x07
2671
#define WParam_BlkType_M1_2048 0x08
2672
#define WParam_BlkType_M2_2336 0x09
2673
#define WParam_BlkType_M2XAF1_2048 0x0a
2674
#define WParam_BlkType_M2XAF1SH_2056 0x0b
2675
#define WParam_BlkType_M2XAF2_2324 0x0c
2676
#define WParam_BlkType_M2XAFXSH_2332 0x0d
2677
#define WParam_BlkType_VendorSpec2 0x0f
2678
2679
union
{
2680
UCHAR
Flags
;
2681
struct
{
2682
UCHAR
DataBlockType
: 4;
// 8
2683
UCHAR
Reserved2
: 4;
2684
}
Fields
;
2685
}
Byte4
;
2686
2687
UCHAR
LinkSize
;
2688
UCHAR
Reserved3
;
2689
2690
union
{
2691
UCHAR
Flags
;
2692
struct
{
2693
UCHAR
HostAppCode
: 6;
// 0
2694
UCHAR
Reserved4
: 2;
2695
}
Fields
;
2696
}
Byte7
;
2697
2698
#define WParam_SesFmt_CdRom 0x00
2699
#define WParam_SesFmt_CdI 0x10
2700
#define WParam_SesFmt_CdRomXa 0x20
2701
2702
UCHAR
SesFmt
;
// 0
2703
UCHAR
Reserved5
;
2704
UCHAR
PacketSize
[4];
// 0
2705
UCHAR
AudioPause
[2];
// 150
2706
2707
UCHAR
Reserved6
: 7;
2708
UCHAR
MCVAL
: 1;
2709
2710
UCHAR
N
[13];
2711
UCHAR
Zero
;
2712
UCHAR
AFRAME
;
2713
2714
UCHAR
Reserved7
: 7;
2715
UCHAR
TCVAL
: 1;
2716
2717
UCHAR
I
[12];
2718
UCHAR
Zero_2
;
2719
UCHAR
AFRAME_2
;
2720
UCHAR
Reserved8
;
2721
2722
struct
{
2723
union
{
2724
UCHAR
MSF
[3];
2725
struct
_SubHdrParams1 {
2726
UCHAR
FileNum
;
2727
UCHAR
ChannelNum
;
2728
2729
#define WParam_SubHdr_SubMode0 0x00
2730
#define WParam_SubHdr_SubMode1 0x08
2731
2732
UCHAR
SubMode
;
2733
}
Params1
;
2734
}
Params
;
2735
2736
#define WParam_SubHdr_Mode_Mask 0x03
2737
#define WParam_SubHdr_Mode0 0x00
2738
#define WParam_SubHdr_Mode1 0x01
2739
#define WParam_SubHdr_Mode2 0x02
2740
#define WParam_SubHdr_Format_Mask 0xe0
2741
#define WParam_SubHdr_Format_UserData 0x00
2742
#define WParam_SubHdr_Format_RunIn4 0x20
2743
#define WParam_SubHdr_Format_RunIn3 0x40
2744
#define WParam_SubHdr_Format_RunIn2 0x60
2745
#define WParam_SubHdr_Format_RunIn1 0x80
2746
#define WParam_SubHdr_Format_Link 0xa0
2747
#define WParam_SubHdr_Format_RunOut2 0xc0
2748
#define WParam_SubHdr_Format_RunOut1 0xe0
2749
2750
union
{
2751
UCHAR
Flags
;
2752
struct
{
2753
UCHAR
Mode
: 2;
2754
UCHAR
Reserved
: 3;
2755
UCHAR
Format
: 3;
2756
}
Fields
;
2757
}
Mode
;
2758
}
SubHeader
;
2759
2760
}
MODE_WRITE_PARAMS_PAGE
, *
PMODE_WRITE_PARAMS_PAGE
;
2761
2762
typedef
struct
_MODE_WRITE_PARAMS_PAGE_3
{
2763
MODE_WRITE_PARAMS_PAGE
Standard
;
2764
UCHAR
VendorSpec
[4];
2765
}
MODE_WRITE_PARAMS_PAGE_3
, *
PMODE_WRITE_PARAMS_PAGE_3
;
2766
2767
//*********************************************************************************************
2768
// Define Caching page.
2769
2770
typedef
struct
_MODE_CACHING_PAGE
{
// 0x08
2771
UCHAR
PageCode
: 6;
2772
UCHAR
Reserved1
: 1;
2773
UCHAR
PageSavable
: 1;
2774
2775
UCHAR
PageLength
;
2776
2777
UCHAR
ReadDisableCache
: 1;
2778
UCHAR
MultiplicationFactor
: 1;
2779
UCHAR
WriteCacheEnable
: 1;
2780
UCHAR
Reserved2
: 5;
2781
2782
UCHAR
WriteRetensionPriority
: 4;
2783
UCHAR
ReadRetensionPriority
: 4;
2784
2785
UCHAR
DisablePrefetchTransfer
[2];
2786
UCHAR
MinimumPrefetch
[2];
2787
UCHAR
MaximumPrefetch
[2];
2788
UCHAR
MaximumPrefetchCeiling
[2];
2789
}
MODE_CACHING_PAGE
, *
PMODE_CACHING_PAGE
;
2790
2791
//*********************************************************************************************
2792
// Define CD Parameters page.
2793
2794
typedef
struct
_MODE_CD_PARAMS_PAGE
{
// 0x0D
2795
UCHAR
PageCode
: 6;
2796
UCHAR
Reserved
: 1;
2797
UCHAR
PageSavable
: 1;
2798
2799
UCHAR
PageLength
;
// 0x06
2800
UCHAR
Reserved1
;
2801
2802
#define CdParams_InactvityTime_Mask 0x0f
2803
2804
union
{
2805
UCHAR
Flags
;
2806
struct
{
2807
UCHAR
InactivityTime
: 4;
// 1 - 125ms, 2 - 250ms... 9 - 32s, A - 1min...
2808
UCHAR
Reserved0
: 4;
2809
}
Fields
;
2810
}
Byte2
;
2811
2812
UCHAR
SUnits_per_MUnit
[2];
2813
UCHAR
FUnits_per_SUnit
[2];
2814
}
MODE_CD_PARAMS_PAGE
, *
PMODE_CD_PARAMS_PAGE
;
2815
2816
//*********************************************************************************************
2817
// Define CD Audio Control Mode page.
2818
2819
typedef
struct
_CDDA_PORT_CONTROL
{
2820
2821
#define CddaPort_Channel_Mask 0x0f
2822
#define CddaPort_Channel_Mute 0x00
2823
#define CddaPort_Channel_0 0x01
2824
#define CddaPort_Channel_1 0x02
2825
#define CddaPort_Channel_0_1 0x03
2826
#define CddaPort_Channel_2 0x04
2827
#define CddaPort_Channel_3 0x08
2828
2829
UCHAR
ChannelSelection
;
2830
UCHAR
Volume
;
2831
}
CDDA_PORT_CONTROL
, *
PCDDA_PORT_CONTROL
;
2832
2833
typedef
struct
_MODE_CD_AUDIO_CONTROL_PAGE
{
// 0x0E
2834
UCHAR
PageCode
: 6;
2835
UCHAR
Reserved1
: 1;
2836
UCHAR
PageSavable
: 1;
2837
2838
UCHAR
PageLength
;
// 0x0E
2839
2840
#define CdAudio_SOTC 0x02
2841
#define CdAudio_Immed 0x04
2842
2843
union
{
2844
UCHAR
Flags
;
2845
struct
{
2846
UCHAR
Reserved0
: 1;
2847
UCHAR
SOTC
: 1;
2848
UCHAR
Immed
: 1;
2849
UCHAR
Reserved1
: 5;
2850
}
Fields
;
2851
}
Byte2
;
2852
2853
UCHAR
Reserved2
[2];
2854
UCHAR
LbaFormat
;
2855
UCHAR
LogicalBlocksPerSecond
[2];
2856
CDDA_PORT_CONTROL
Port
[4];
2857
}
MODE_CD_AUDIO_CONTROL_PAGE
, *
PMODE_CD_AUDIO_CONTROL_PAGE
;
2858
2859
//*********************************************************************************************
2860
// Define Power Condition Mode page.
2861
2862
typedef
struct
_MODE_POWER_CONDITION_PAGE
{
// 0x1A
2863
UCHAR
PageCode
: 6;
2864
UCHAR
Reserved1
: 1;
2865
UCHAR
PageSavable
: 1;
2866
2867
UCHAR
PageLength
;
// 0x0A
2868
UCHAR
Reserved2
;
2869
2870
#define PowerCond_Standby 0x01
2871
#define PowerCond_Idle 0x02
2872
2873
union
{
2874
UCHAR
Flags
;
2875
struct
{
2876
UCHAR
Standby
: 1;
2877
UCHAR
Idle
: 1;
2878
UCHAR
Reserved1
: 6;
2879
}
Fields
;
2880
}
Byte3
;
2881
2882
UCHAR
IdleTimer
[4];
// 1unit = 100ms
2883
UCHAR
StandbyTimer
[4];
// 1unit = 100ms
2884
}
MODE_POWER_CONDITION_PAGE
, *
PMODE_POWER_CONDITION_PAGE
;
2885
2886
//*********************************************************************************************
2887
// Define Fault/Failure Reporting Control page.
2888
2889
typedef
struct
_MODE_FAIL_REPORT_PAGE
{
// 0x1C
2890
UCHAR
PageCode
: 6;
2891
UCHAR
Reserved1
: 1;
2892
UCHAR
PageSavable
: 1;
2893
2894
UCHAR
PageLength
;
// 0x0A
2895
2896
#define FailReport_LogErr 0x01
2897
#define FailReport_Test 0x04
2898
#define FailReport_DExcept 0x08
2899
#define FailReport_Perf 0x80
2900
2901
union
{
2902
UCHAR
Flags
;
2903
struct
{
2904
UCHAR
LogErr
: 1;
2905
UCHAR
Reserved1
: 1;
2906
UCHAR
Test
: 1;
2907
UCHAR
DExcept
: 1;
2908
UCHAR
Reserved2
: 3;
2909
UCHAR
Perf
: 1;
2910
}
Fields
;
2911
}
Byte2
;
2912
2913
union
{
2914
UCHAR
Flags
;
2915
struct
{
2916
UCHAR
MRIE
: 4;
2917
UCHAR
Reserved1
: 4;
2918
}
Fields
;
2919
}
Byte3
;
2920
2921
UCHAR
IntervalTimer
[4];
// 1unit = 100ms
2922
UCHAR
ReportCount
[4];
2923
}
MODE_FAIL_REPORT_PAGE
, *
PMODE_FAIL_REPORT_PAGE
;
2924
2925
//*********************************************************************************************
2926
// Define Time-out and Protect page.
2927
2928
typedef
struct
_MODE_TIMEOUT_AND_PROTECT_PAGE
{
// 0x1D
2929
UCHAR
PageCode
: 6;
2930
UCHAR
Reserved1
: 1;
2931
UCHAR
PageSavable
: 1;
2932
2933
UCHAR
PageLength
;
// 0x08
2934
2935
UCHAR
Reserved2
[2];
2936
2937
#define Timeout_SW 0x01
2938
#define Timeout_DISP 0x02
2939
#define Timeout_TMOE 0x04
2940
2941
union
{
2942
UCHAR
Flags
;
2943
struct
{
2944
UCHAR
SW
: 1;
2945
UCHAR
DISP
: 1;
2946
UCHAR
TMOE
: 1;
2947
UCHAR
Reserved
: 5;
2948
}
Fields
;
2949
}
Byte4
;
2950
2951
UCHAR
Reserved3
;
2952
2953
UCHAR
Group1_Timeout
[2];
// 1unit = 1s
2954
UCHAR
Group2_Timeout
[2];
// 1unit = 1s
2955
}
MODE_TIMEOUT_AND_PROTECT_PAGE
, *
PMODE_TIMEOUT_AND_PROTECT_PAGE
;
2956
2957
//*********************************************************************************************
2958
// Define Philips CD-R(W) Sector Mode page.
2959
2960
typedef
struct
_MODE_PHILIPS_SECTOR_TYPE_PAGE
{
// 0x21
2961
UCHAR
PageCode
: 6;
2962
UCHAR
Reserved1
: 1;
2963
UCHAR
PSBit
: 1;
2964
2965
UCHAR
PageLength
;
2966
2967
UCHAR
Reserved0
[2];
2968
2969
union
{
2970
UCHAR
Flags
;
2971
struct
{
2972
UCHAR
DataBlockType
: 4;
// 8
2973
UCHAR
Reserved2
: 4;
2974
}
Fields
;
2975
}
Byte4
;
2976
2977
#define WParams_Philips_CreateNewTrack 0
2978
2979
UCHAR
Track
;
2980
UCHAR
ISRC
[9];
2981
2982
UCHAR
Reserved3
[2];
2983
}
MODE_PHILIPS_SECTOR_TYPE_PAGE
, *
PMODE_PHILIPS_SECTOR_TYPE_PAGE
;
2984
2985
//*********************************************************************************************
2986
// Define CD-X Capabilities and Mechanical Status page.
2987
2988
typedef
struct
_MODE_CAPABILITIES_PAGE2
{
// 0x2A
2989
UCHAR
PageCode
: 6;
2990
UCHAR
Reserved1
: 1;
2991
UCHAR
PSBit
: 1;
2992
2993
UCHAR
PageLength
;
2994
2995
#define DevCap_read_cd_r 0x01
// reserved in 1.2
2996
#define DevCap_read_cd_rw 0x02
// reserved in 1.2
2997
#define DevCap_method2 0x04
2998
#define DevCap_read_dvd_rom 0x08
2999
#define DevCap_read_dvd_r 0x10
3000
#define DevCap_read_dvd_ram 0x20
3001
3002
#define DevCap_read_dvd (DevCap_read_dvd_rom | DevCap_read_dvd_r | DevCap_read_dvd_ram)
3003
3004
UCHAR
ReadCap
;
// DevCap_*_read // 0x02
3005
/* UCHAR cd_r_read : 1; // reserved in 1.2
3006
UCHAR cd_rw_read : 1; // reserved in 1.2
3007
UCHAR method2 : 1;
3008
UCHAR dvd_rom : 1;
3009
UCHAR dvd_r_read : 1;
3010
UCHAR dvd_ram_read : 1;
3011
UCHAR Reserved2 : 2;*/
3012
3013
#define DevCap_write_cd_r 0x01
// reserved in 1.2
3014
#define DevCap_write_cd_rw 0x02
// reserved in 1.2
3015
#define DevCap_test_write 0x04
3016
#define DevCap_write_dvd_r 0x10
3017
#define DevCap_write_dvd_ram 0x20
3018
3019
UCHAR
WriteCap
;
// DevCap_*_write // 0x03
3020
/* UCHAR cd_r_write : 1; // reserved in 1.2
3021
UCHAR cd_rw_write : 1; // reserved in 1.2
3022
UCHAR test_write : 1;
3023
UCHAR reserved3a : 1;
3024
UCHAR dvd_r_write : 1;
3025
UCHAR dvd_ram_write : 1;
3026
UCHAR Reserved3 : 2;*/
3027
3028
#define DevCap_audio_play 0x01
3029
#define DevCap_composite 0x02
3030
#define DevCap_digport1 0x04
3031
#define DevCap_digport2 0x08
3032
#define DevCap_mode2_form1 0x10
3033
#define DevCap_mode2_form2 0x20
3034
#define DevCap_multisession 0x40
3035
3036
UCHAR
Capabilities0
;
// 0x04
3037
/* UCHAR audio_play : 1;
3038
UCHAR composite : 1;
3039
UCHAR digport1 : 1;
3040
UCHAR digport2 : 1;
3041
UCHAR mode2_form1 : 1;
3042
UCHAR mode2_form2 : 1;
3043
UCHAR multisession : 1;
3044
UCHAR Reserved4 : 1;*/
3045
3046
#define DevCap_cdda 0x01
3047
#define DevCap_cdda_accurate 0x02
3048
#define DevCap_rw_supported 0x04
3049
#define DevCap_rw_corr 0x08
3050
#define DevCap_c2_pointers 0x10
3051
#define DevCap_isrc 0x20
3052
#define DevCap_upc 0x40
3053
#define DevCap_read_bar_code 0x80
3054
3055
UCHAR
Capabilities1
;
// 0x05
3056
/* UCHAR cdda : 1;
3057
UCHAR cdda_accurate : 1;
3058
UCHAR rw_supported : 1;
3059
UCHAR rw_corr : 1;
3060
UCHAR c2_pointers : 1;
3061
UCHAR isrc : 1;
3062
UCHAR upc : 1;
3063
UCHAR Reserved5 : 1;*/
3064
3065
#define DevCap_lock 0x01
3066
#define DevCap_lock_state 0x02
3067
#define DevCap_prevent_jumper 0x04
3068
#define DevCap_eject 0x08
3069
#define DevCap_mechtype_mask 0xE0
3070
#define DevCap_mechtype_caddy 0x00
3071
#define DevCap_mechtype_tray (0x01<<5)
3072
#define DevCap_mechtype_popup (0x02<<5)
3073
#define DevCap_mechtype_individual_changer (0x04<<5)
3074
#define DevCap_mechtype_cartridge_changer (0x05<<5)
3075
3076
UCHAR
Capabilities2
;
// 0x06
3077
/* UCHAR lock : 1;
3078
UCHAR lock_state : 1;
3079
UCHAR prevent_jumper : 1;
3080
UCHAR eject : 1;
3081
UCHAR Reserved6 : 1;
3082
UCHAR mechtype : 3;*/
3083
3084
#define DevCap_separate_volume 0x01
3085
#define DevCap_separate_mute 0x02
3086
#define DevCap_disc_present 0x04
// reserved in 1.2
3087
#define DevCap_sw_slot_select 0x08
// reserved in 1.2
3088
#define DevCap_change_side_cap 0x10
3089
#define DevCap_rw_leadin_read 0x20
3090
3091
UCHAR
Capabilities3
;
// 0x07
3092
/* UCHAR separate_volume : 1;
3093
UCHAR separate_mute : 1;
3094
UCHAR disc_present : 1; // reserved in 1.2
3095
UCHAR sss : 1; // reserved in 1.2
3096
UCHAR Reserved7 : 4;*/
3097
3098
UCHAR
MaximumSpeedSupported
[2];
// 0x08
3099
UCHAR
NumberVolumeLevels
[2];
// 0x0a
3100
UCHAR
BufferSize
[2];
// 0x0c
3101
UCHAR
CurrentSpeed
[2];
// obsolete in MMC3 // 0x0e
3102
3103
UCHAR
Reserved8
;
// 0x10
3104
3105
UCHAR
SpecialParameters0
;
// 0x11
3106
/* UCHAR Reserved9 : 1;
3107
UCHAR BCK : 1;
3108
UCHAR RCK : 1;
3109
UCHAR LSBF : 1;
3110
UCHAR Length : 2;
3111
UCHAR Reserved10 : 2;*/
3112
3113
UCHAR
MaximumWriteSpeedSupported
[2];
// obsolete in MMC3
3114
UCHAR
CurrentWriteSpeed
[2];
// obsolete in MMC3
3115
UCHAR
CopyManagementRevision
[2];
// 0x16
3116
UCHAR
Reserved11
[2];
// 0x18
3117
3118
// MMC3
3119
3120
UCHAR
Reserved12
;
// 0x1a
3121
3122
UCHAR
SpecialParameters1
;
// 0x1b
3123
/* UCHAR RCS : 2; // rotation control selected
3124
UCHAR Reserved13 : 6; */
3125
3126
UCHAR
CurrentWriteSpeed3
[2];
// 0x1c
3127
UCHAR
LunWPerfDescriptorCount
[2];
// 0x1e
3128
3129
// LUN_WRITE_PERF_DESC LunWPerfDescriptor[0];
3130
}
MODE_CAPABILITIES_PAGE2
, *
PMODE_CAPABILITIES_PAGE2
;
3131
3132
/*typedef struct _MODE_CAPABILITIES_PAGE3 { // 0x2A
3133
struct MODE_CAPABILITIES_PAGE2;
3134
3135
} MODE_CAPABILITIES_PAGE3, *PMODE_CAPABILITIES_PAGE3;*/
3136
3137
typedef
struct
_LUN_WRITE_PERF_DESC
{
3138
UCHAR
Reserved
;
3139
3140
#define LunWPerf_RotCtrl_Mask 0x07
3141
#define LunWPerf_RotCtrl_CLV 0x00
3142
#define LunWPerf_RotCtrl_CAV 0x01
3143
3144
UCHAR
RotationControl
;
3145
UCHAR
WriteSpeedSupported
[2];
// kbps
3146
3147
}
LUN_WRITE_PERF_DESC
, *
PLUN_WRITE_PERF_DESC
;
3148
3149
// Mode parameter list block descriptor -
3150
// set the block length for reading/writing
3151
3152
#define MODE_BLOCK_DESC_LENGTH 8
3153
#define MODE_HEADER_LENGTH 4
3154
#define MODE_HEADER_LENGTH10 8
3155
3156
#define CDB_USE_MSF 0x01
3157
3158
// Atapi 2.5 changer
3159
typedef
struct
_MECHANICAL_STATUS_INFORMATION_HEADER
{
3160
UCHAR
CurrentSlot
: 5;
3161
UCHAR
ChangerState
: 2;
3162
UCHAR
Fault
: 1;
3163
UCHAR
Reserved
: 5;
3164
UCHAR
MechanismState
: 3;
3165
UCHAR
CurrentLogicalBlockAddress
[3];
3166
UCHAR
NumberAvailableSlots
;
3167
UCHAR
SlotTableLength
[2];
3168
}
MECHANICAL_STATUS_INFORMATION_HEADER
, *
PMECHANICAL_STATUS_INFORMATION_HEADER
;
3169
3170
typedef
struct
_SLOT_TABLE_INFORMATION
{
3171
UCHAR
DiscChanged
: 1;
3172
UCHAR
Reserved
: 6;
3173
UCHAR
DiscPresent
: 1;
3174
UCHAR
Reserved2
[3];
3175
}
SLOT_TABLE_INFORMATION
, *
PSLOT_TABLE_INFORMATION
;
3176
3177
typedef
struct
_MECHANICAL_STATUS
{
3178
MECHANICAL_STATUS_INFORMATION_HEADER
MechanicalStatusHeader
;
3179
SLOT_TABLE_INFORMATION
SlotTableInfo
[1];
3180
}
MECHANICAL_STATUS
, *
PMECHANICAL_STATUS
;
3181
3182
typedef
struct
_MODE_MRW_PAGE
{
// 0x2C
3183
UCHAR
PageCode
: 6;
3184
UCHAR
Reserved1
: 1;
3185
UCHAR
PSBit
: 1;
3186
3187
UCHAR
PageLength
;
3188
3189
UCHAR
Reserved2
;
3190
3191
#define MrwPage_use_DMA 0x00
3192
#define MrwPage_use_GAA 0x01
3193
3194
UCHAR
AddressMode
;
3195
UCHAR
Reserved3
[4];
3196
3197
}
MODE_MRW_PAGE
, *
PMODE_MRW_PAGE
;
3198
3199
#define MRW_DMA_OFFSET 0x500
3200
#define MRW_DA_SIZE (136*32)
3201
#define MRW_SA_SIZE (8*32)
3202
#define MRW_DMA_SEGMENT_SIZE (MRW_DA_SIZE+MRW_SA_SIZE)
3203
3204
//
3205
// SET STREAMING descriptors
3206
//
3207
3208
typedef
struct
_SET_STREAMING_PERFORMANCE_DESCRIPTOR
{
3209
UCHAR
RA
: 1;
// Random Access
3210
UCHAR
Exact
: 1;
3211
UCHAR
RDD
: 1;
// Restore Defaults
3212
UCHAR
WRC
: 2;
3213
UCHAR
Reserved0
: 3;
3214
3215
UCHAR
Reserved1
[3];
3216
3217
UCHAR
StartLBA
[4];
3218
UCHAR
EndLBA
[4];
3219
3220
UCHAR
ReadSize
[4];
// KBytes
3221
UCHAR
ReadTime
[4];
// ms
3222
3223
UCHAR
WriteSize
[4];
// KBytes
3224
UCHAR
WriteTime
[4];
// ms
3225
3226
}
SET_STREAMING_PERFORMANCE_DESCRIPTOR
, *
PSET_STREAMING_PERFORMANCE_DESCRIPTOR
;
3227
3228
//
3229
// GET CONFIGURATION response format
3230
//
3231
3232
// Feature Request types
3233
#define RT_ALL 0x00
3234
#define RT_CURRENT 0x01
3235
#define RT_ONE 0x02
3236
#define RT_RESERVED 0x03
3237
3238
// Feature codes
3239
#define FC_PROFILE_LIST 0x0000
3240
#define FC_CORE 0x0001
3241
#define FC_MORPHING 0x0002
3242
#define FC_REMOVALE_MEDIUM 0x0003
3243
#define FC_WRITE_PROTECT_CTL 0x0004
3244
#define FC_RANDOM_READABLE 0x0010
3245
#define FC_MULTIREAD 0x001d
3246
#define FC_CDREAD 0x001e
3247
#define FC_DVDREAD 0x001f
3248
#define FC_RANDOM_WRITEABLE 0x0020
3249
#define FC_INCREMENTAL_STREAMING_WRITEABLE 0x0021
3250
#define FC_SECTOR_ERASABLE 0x0022
3251
#define FC_FORMATTABLE 0x0023
3252
#define FC_DEFECT_MANAGMENT 0x0024
3253
#define FC_WRITE_ONCE 0x0025
3254
#define FC_RESTRICTED_OWERWRITE 0x0026
3255
#define FC_CDRW_CAV_WRITE 0x0027
3256
#define FC_MRW 0x0028
3257
#define FC_ENHANCED_DEFECT_REPORTING 0x0029
3258
#define FC_DVDpRW 0x002a
3259
#define FC_DVDpR 0x002b
// MMC-6
3260
#define FC_RIGID_RESTRICTED_OWERWRITE 0x002c
3261
#define FC_CD_TAO 0x002d
3262
#define FC_CD_MASTERING 0x002e
3263
#define FC_DVD_R_RW_WRITE 0x002f
3264
#define FC_DDCD_READ 0x0030
// removed from MMC-5
3265
#define FC_DDCDR_WRITE 0x0031
// removed from MMC-5
3266
#define FC_DDCDRW_WRITE 0x0032
// removed from MMC-5
3267
#define FC_LAYER_JUMP_RECORDING 0x0033
// MMC-6
3268
#define FC_CDRW_WRITE 0x0037
// MMC-5
3269
#define FC_BDR_POW 0x0038
// MMC-6
3270
#define FC_DVDpR_DL 0x003a
// MMC-6
3271
#define FC_DVDpRW_DL 0x003b
// MMC-5
3272
#define FC_BD_READ 0x0040
// MMC-5, BlueRay
3273
#define FC_BD_WRITE 0x0041
// MMC-6, BlueRay
3274
#define FC_TSR 0x0042
// MMC-6
3275
#define FC_HD_DVD_READ 0x0050
// MMC-6
3276
#define FC_HD_DVD_WRITE 0x0051
// MMC-6
3277
#define FC_HYBRID_DISC 0x0080
// MMC-6
3278
#define FC_POWER_MANAGMENT 0x0100
3279
#define FC_SMART 0x0101
3280
#define FC_EMBEDED_CHANGER 0x0102
3281
#define FC_CD_AUDIO_ANALOG_PLAY 0x0103
3282
#define FC_MICROCODE_UPGRADE 0x0104
3283
#define FC_TIMEOUT 0x0105
3284
#define FC_DVD_CSS 0x0106
3285
#define FC_REAL_TIME_STREAMING 0x0107
3286
#define FC_LU_SERIAL_NUMBER 0x0108
3287
#define FC_MEDIA_SERIAL_NUMBER 0x0109
3288
#define FC_DISK_CONTROL_BLOCK 0x010a
3289
#define FC_DVD_CPRM 0x010b
3290
#define FC_FIRMWARE_INFO 0x010c
3291
#define FC_AACS 0x010d
3292
3293
// Feature Header
3294
typedef
struct
_FEATURE_LIST_HEADER
{
3295
UCHAR
DataLength
[4];
3296
UCHAR
Reserved
[2];
3297
UCHAR
CurrentProfile
[2];
3298
}
FEATURE_LIST_HEADER
, *
PFEATURE_LIST_HEADER
;
3299
3300
// Profile List Feature
3301
3302
3303
// Profile list descriptor format
3304
typedef
struct
_PROFILE_LIST_DESCRIPTOR
{
3305
UCHAR
FC
[2];
// Feature code
3306
UCHAR
Current
: 1;
3307
UCHAR
Persistent
: 1;
3308
UCHAR
Version
: 4;
3309
UCHAR
Reserved
: 2;
3310
UCHAR
AdditionLen
;
3311
}
PROFILE_LIST_DESCRIPTOR
, *
PPROFILE_LIST_DESCRIPTOR
;
3312
3313
// Profile descriptor format
3314
typedef
struct
_PROFILE_DESCRIPTOR
{
3315
UCHAR
ProfileNum
[2];
// Profile Number
3316
UCHAR
CurrentProfile
: 1;
// indicate that this Profile curently active
3317
UCHAR
Reserved1
: 7;
3318
UCHAR
Reserved
;
3319
}
PROFILE_DESCRIPTOR
, *
PPROFILE_DESCRIPTOR
;
3320
3321
#define PFNUM_Min 0x0001
3322
#define PFNUM_NonRemovableDisk 0x0001
3323
#define PFNUM_RemovableDisk 0x0002
3324
#define PFNUM_MO_Erasable 0x0003
3325
#define PFNUM_MO_WORM 0x0004
3326
#define PFNUM_AS_MO 0x0005
3327
#define PFNUM_CDROM 0x0008
3328
#define PFNUM_CDR 0x0009
3329
#define PFNUM_CDRW 0x000a
3330
#define PFNUM_DVDROM 0x0010
3331
#define PFNUM_DVDR 0x0011
3332
#define PFNUM_DVDRAM 0x0012
3333
#define PFNUM_DVDRW_RESTRICTED_OVERWRITE 0x0013
3334
#define PFNUM_DVDRW_SEQUENTIAL 0x0014
3335
#define PFNUM_DVDR_DL_SEQUENTIAL 0x0015
// MMC-6
3336
#define PFNUM_DVDR_DL_JUMP_RECORDING 0x0016
// MMC-6
3337
#define PFNUM_DVDRW_DL 0x0017
// MMC-6
3338
#define PFNUM_DVDpRW 0x001a
3339
#define PFNUM_DVDpR 0x001b
3340
#define PFNUM_DDCDROM 0x0020
3341
#define PFNUM_DDCDR 0x0021
3342
#define PFNUM_DDCDRW 0x0022
3343
#define PFNUM_DVDpRW_DL 0x002a
3344
#define PFNUM_DVDpR_DL 0x002b
3345
#define PFNUM_BDROM 0x0040
// BlueRay
3346
#define PFNUM_BDR_SEQUENTIAL 0x0041
3347
#define PFNUM_BDR_RANDOM 0x0042
3348
#define PFNUM_BDRE 0x0043
// BlueRay
3349
#define PFNUM_HD_DVDROM 0x0050
3350
#define PFNUM_HD_DVDR 0x0051
3351
#define PFNUM_HD_DVDRAM 0x0052
3352
#define PFNUM_HD_DVDRW 0x0053
3353
#define PFNUM_HD_DVDR_DL 0x0058
3354
#define PFNUM_HD_DVDRW_DL 0x005a
3355
#define PFNUM_Max PFNUM_HD_DVDRW_DL
3356
//
3357
3358
// ** FC_REMOVALE_MEDIUM **
3359
// Removable Media descriptor format 0x03
3360
typedef
struct
_REMOVABLE_MEDIA_DESCRIPTOR
{
3361
PROFILE_LIST_DESCRIPTOR
header
;
3362
3363
UCHAR
lock
: 1;
3364
UCHAR
Reserved0
: 1;
// read current state from header.Current
3365
UCHAR
prevent_jumper
: 1;
3366
UCHAR
eject
: 1;
3367
UCHAR
Reserved1
: 1;
3368
UCHAR
mechtype
: 3;
// see Capabilities2 in MODE_CAPABILITIES_PAGE2
3369
3370
}
REMOVABLE_MEDIA_DESCRIPTOR
, *
PREMOVABLE_MEDIA_DESCRIPTOR
;
3371
3372
// ** FC_MULTIREAD **
3373
// MultiRead descriptor format 0x1d
3374
typedef
struct
_MULTIREAD_DESCRIPTOR
{
3375
PROFILE_LIST_DESCRIPTOR
header
;
3376
}
MULTIREAD_DESCRIPTOR
, *
PMULTIREAD_DESCRIPTOR
;
3377
3378
// ** FC_CDREAD **
3379
// CD-Read descriptor format 0x1e
3380
typedef
struct
_CD_READ_DESCRIPTOR
{
3381
PROFILE_LIST_DESCRIPTOR
header
;
3382
3383
UCHAR
CdText
: 1;
3384
UCHAR
c2_pointers
: 1;
3385
UCHAR
Reserved2
: 5;
3386
UCHAR
DAP
: 1;
// DAP bit support in READ_CD/READ_CD_MFS
3387
3388
UCHAR
Reserved3
[3];
3389
}
CD_READ_DESCRIPTOR
, *
PCD_READ_DESCRIPTOR
;
3390
3391
// ** FC_FORMATTABLE **
3392
// Formattable descriptor format 0x23
3393
typedef
struct
_FORMATTABLE_DESCRIPTOR
{
3394
PROFILE_LIST_DESCRIPTOR
header
;
3395
// BD-RE options
3396
UCHAR
Cert
: 1;
3397
UCHAR
QCert
: 1;
3398
UCHAR
Expand
: 1;
// Format Type 0x01 (Expand Spare)
3399
UCHAR
RENoSA
: 1;
// Format Type 0x31 (NoSpare)
3400
UCHAR
Reserved
: 4;
3401
UCHAR
Reserved2
[3];
3402
// BD-R options
3403
UCHAR
RRM
: 1;
3404
UCHAR
Reserved3
: 7;
3405
UCHAR
Reserved4
[3];
3406
}
FORMATTABLE_DESCRIPTOR
, *
PFORMATTABLE_DESCRIPTOR
;
3407
3408
// ** FC_CDRW_CAV_WRITE **
3409
// CD-RW CAV descriptor format 0x27
3410
typedef
struct
_CDRW_CAV_DESCRIPTOR
{
3411
PROFILE_LIST_DESCRIPTOR
header
;
3412
3413
UCHAR
Reserved
[4];
3414
}
CDRW_CAV_DESCRIPTOR
, *
PCDRW_CAV_DESCRIPTOR
;
3415
3416
// ** FC_MRW **
3417
// MRW descriptor format 0x28
3418
typedef
struct
_MRW_DESCRIPTOR
{
3419
PROFILE_LIST_DESCRIPTOR
header
;
3420
3421
UCHAR
Write
: 1;
3422
UCHAR
Reserved2
: 7;
3423
UCHAR
Reserved3
[3];
3424
}
MRW_DESCRIPTOR
, *
PMRW_DESCRIPTOR
;
3425
3426
// ** FC_DVDpRW **
3427
// DVD+RW descriptor format
3428
typedef
struct
_DVDpRW_DESCRIPTOR
{
3429
PROFILE_LIST_DESCRIPTOR
header
;
3430
3431
UCHAR
Write
: 1;
3432
UCHAR
Reserved1
: 7;
3433
3434
UCHAR
CloseOnly
: 1;
3435
UCHAR
QuickStart
: 1;
3436
UCHAR
Reserved2
: 6;
3437
3438
UCHAR
Reserved3
[2];
3439
}
DVDpRW_DESCRIPTOR
, *
PDVDpRW_DESCRIPTOR
;
3440
3441
// ** FC_DVDpR **
3442
// DVD+R descriptor format
3443
typedef
struct
_DVDpR_DESCRIPTOR
{
3444
PROFILE_LIST_DESCRIPTOR
header
;
3445
3446
UCHAR
Write
: 1;
3447
UCHAR
Reserved2
: 7;
3448
UCHAR
Reserved3
[3];
3449
}
DVDpR_DESCRIPTOR
, *
PDVDpR_DESCRIPTOR
;
3450
3451
// ** FC_DVD_R_RW_WRITE **
3452
// DVD+R/RW writable descriptor format
3453
typedef
struct
_DVD_R_RW_WRITE_DESCRIPTOR
{
3454
PROFILE_LIST_DESCRIPTOR
header
;
3455
3456
UCHAR
Reserved1
: 1;
3457
UCHAR
DvdRW
: 1;
3458
UCHAR
TestWrite
: 1;
3459
UCHAR
Reserved2
: 3;
3460
UCHAR
BUF
: 1;
3461
UCHAR
Reserved3
: 1;
3462
3463
UCHAR
Reserved4
[3];
3464
}
DVD_R_RW_WRITE_DESCRIPTOR
, *
PDVD_R_RW_WRITE_DESCRIPTOR
;
3465
3466
// ** FC_DVDpR_DL **
3467
// DVD+R DL descriptor format
3468
typedef
struct
_DVDpR_DL_DESCRIPTOR
{
3469
PROFILE_LIST_DESCRIPTOR
header
;
3470
3471
UCHAR
Write
: 1;
3472
UCHAR
Reserved2
: 7;
3473
UCHAR
Reserved3
[3];
3474
}
DVDpR_DL_DESCRIPTOR
, *
PDVDpR_DL_DESCRIPTOR
;
3475
3476
// ** FC_REAL_TIME_STREAMING **
3477
// Real-time streaming descriptor format
3478
typedef
struct
_REAL_TIME_STREAMING_DESCRIPTOR
{
3479
PROFILE_LIST_DESCRIPTOR
header
;
3480
3481
UCHAR
SW
: 1;
// Stream Writing
3482
UCHAR
WSPD
: 1;
// Write Speed (0x03) in GET_PREFORMANCE supported
3483
UCHAR
MP2A
: 1;
// Mode page 2a (capabilities) supported
3484
UCHAR
SCS
: 1;
// Set CD Speed supported
3485
UCHAR
RBCB
: 1;
// Read Buffer Capacity supported
3486
UCHAR
Reserved
: 3;
3487
3488
UCHAR
Reserved3
[3];
3489
}
REAL_TIME_STREAMING_DESCRIPTOR
, *
PREAL_TIME_STREAMING_DESCRIPTOR
;
3490
3491
// ** FC_BD_READ **
3492
// BlueRay Read descriptor format 0x40
3493
typedef
struct
_BD_READ_DESCRIPTOR
{
3494
PROFILE_LIST_DESCRIPTOR
header
;
3495
3496
UCHAR
Reserved
[4];
3497
struct
{
3498
UCHAR
Class0
[2];
3499
UCHAR
Class1
[2];
3500
UCHAR
Class2
[2];
3501
UCHAR
Class3
[2];
3502
}
BD_RE_Bitmaps
;
3503
struct
{
3504
UCHAR
Class0
[2];
3505
UCHAR
Class1
[2];
3506
UCHAR
Class2
[2];
3507
UCHAR
Class3
[2];
3508
}
BD_R_Bitmaps
;
3509
struct
{
3510
UCHAR
Class0
[2];
3511
UCHAR
Class1
[2];
3512
UCHAR
Class2
[2];
3513
UCHAR
Class3
[2];
3514
}
BD_ROM_Bitmaps
;
3515
3516
}
BD_READ_DESCRIPTOR
, *
PBD_READ_DESCRIPTOR
;
3517
3518
// ** FC_BD_WRITE **
3519
// BlueRay Write descriptor format 0x41
3520
typedef
struct
_BD_WRITE_DESCRIPTOR
{
3521
PROFILE_LIST_DESCRIPTOR
header
;
3522
3523
UCHAR
SVNR
: 1;
3524
UCHAR
Reserved
: 7;
3525
UCHAR
Reserved2
[3];
3526
struct
{
3527
UCHAR
Class0
[2];
3528
UCHAR
Class1
[2];
3529
UCHAR
Class2
[2];
3530
UCHAR
Class3
[2];
3531
}
BD_RE_Bitmaps
;
3532
struct
{
3533
UCHAR
Class0
[2];
3534
UCHAR
Class1
[2];
3535
UCHAR
Class2
[2];
3536
UCHAR
Class3
[2];
3537
}
BD_R_Bitmaps
;
3538
3539
}
BD_WRITE_DESCRIPTOR
, *
PBD_WRITE_DESCRIPTOR
;
3540
3541
// DVD structure blocks
3542
3543
#define DvdBookType_ROM 0
3544
#define DvdBookType_RAM 1
3545
#define DvdBookType_R 2
3546
#define DvdBookType_RW 3
3547
#define DvdBookType_HD_ROM 4
3548
#define DvdBookType_HD_RAM 5
3549
#define DvdBookType_HD_R 6
3550
#define DvdBookType_pRold 8
// old spec ??
3551
#define DvdBookType_pRW 9
3552
#define DvdBookType_pR 0x0a
3553
#define DvdBookType_pRW_DL 0x0d
3554
#define DvdBookType_pR_DL 0x0e
3555
3556
#define DvdDiskSize_120mm 0
3557
#define DvdDiskSize_80mm 1
3558
3559
#define DvdLayerType_ROM 0x01
3560
#define DvdLayerType_R 0x02
3561
#define DvdLayerType_RW 0x04
3562
3563
#define DvdMinimumRate_2_52 0x00
3564
#define DvdMinimumRate_5_04 0x01
3565
#define DvdMinimumRate_10_08 0x02
3566
#define DvdMinimumRate_20_16 0x03
3567
#define DvdMinimumRate_30_24 0x04
3568
#define DvdMinimumRate_NotSpecified 0x0f
3569
3570
typedef
struct
_DVD_COPYRIGHT_INFORMATION
{
3571
UCHAR
CopyrightProtectionSystemType
;
3572
UCHAR
RegionManagementInformation
;
3573
UCHAR
Reserved
[2];
3574
}
DVD_COPYRIGHT_INFORMATION
, *
PDVD_COPYRIGHT_INFORMATION
;
3575
3576
typedef
struct
_DVD_DISK_KEY_STRUCTURES
{
3577
UCHAR
DiskKeyData
[2048];
3578
}
DVD_DISK_KEY_STRUCTURES
, *
PDVD_DISK_KEY_STRUCTURES
;
3579
3580
typedef
struct
_CDVD_KEY_HEADER
{
3581
UCHAR
DataLength
[2];
3582
UCHAR
Reserved
[2];
3583
}
CDVD_KEY_HEADER
, *
PCDVD_KEY_HEADER
;
3584
3585
typedef
struct
_CDVD_REPORT_AGID_DATA
{
3586
CDVD_KEY_HEADER
Header
;
3587
UCHAR
Reserved1
[3];
3588
UCHAR
Reserved2
: 6;
3589
UCHAR
AGID
: 2;
3590
}
CDVD_REPORT_AGID_DATA
, *
PCDVD_REPORT_AGID_DATA
;
3591
3592
typedef
struct
_CDVD_CHALLENGE_KEY_DATA
{
3593
CDVD_KEY_HEADER
Header
;
3594
UCHAR
ChallengeKeyValue
[10];
3595
UCHAR
Reserved
[2];
3596
}
CDVD_CHALLENGE_KEY_DATA
, *
PCDVD_CHALLENGE_KEY_DATA
;
3597
3598
typedef
struct
_CDVD_KEY_DATA
{
3599
CDVD_KEY_HEADER
Header
;
3600
UCHAR
Key
[5];
3601
UCHAR
Reserved
[3];
3602
}
CDVD_KEY_DATA
, *
PCDVD_KEY_DATA
;
3603
3604
typedef
struct
_CDVD_REPORT_ASF_DATA
{
3605
CDVD_KEY_HEADER
Header
;
3606
UCHAR
Reserved1
[3];
3607
UCHAR
Success
: 1;
3608
UCHAR
Reserved2
: 7;
3609
}
CDVD_REPORT_ASF_DATA
, *
PCDVD_REPORT_ASF_DATA
;
3610
3611
typedef
struct
_CDVD_TITLE_KEY_HEADER
{
3612
CDVD_KEY_HEADER
Header
;
3613
UCHAR
Reserved1
[1];
3614
UCHAR
Reserved2
: 3;
3615
UCHAR
CGMS
: 2;
3616
UCHAR
CP_SEC
: 1;
3617
UCHAR
CPM
: 1;
3618
UCHAR
Zero
: 1;
3619
CDVD_KEY_DATA
TitleKey
;
3620
}
CDVD_TITLE_KEY_HEADER
, *
PCDVD_TITLE_KEY_HEADER
;
3621
3622
#pragma pack(pop)
3623<