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.
5 ////////////////////////////////////////////////////////////////////
6 /*
7 
8 Module Name:
9 
10     cdrw_usr.h
11 
12 Abstract:
13 
14     This file defines the interface between CD-Writer's driver & user
15     applications.
16 
17 Environment:
18 
19     NT kernel mode or Win32 app
20  */
21 
22 #ifndef __CDRW_PUBLIC_H__
23 #define __CDRW_PUBLIC_H__
24 
25 #define CDRW_SIGNATURE_v1 "ALWA CD-R/W v1"
26 
27 //#define CDRW_RESTRICT_ACCESS    // require W-acces rights for some IOCTLs
28 
29 #include "cdrw_hw.h"
30 //#include "ntdddisk.h"
31 
32 #include <ntddcdrm.h>
33 #include <ntddcdvd.h>
34 
35 #ifndef CTL_CODE
36 #pragma pack(push, 8)
37 #include "winioctl.h"
38 #pragma pack(pop)
39 #endif
40 
41 #if defined(CDRW_EXPORTS) || defined(FileSys_EXPORTS)
42 #include "mountmgr.h"
43 #endif
44 
45 #ifndef FILE_DEVICE_SECURE_OPEN
46 #define FILE_DEVICE_SECURE_OPEN 0x00000100
47 #endif //FILE_DEVICE_SECURE_OPEN
48 
49 #pragma pack(push, 1)
50 
51 #ifndef IRP_MJ_PNP
52 #define IRP_MJ_PNP      IRP_MJ_PNP_POWER // Obsolete....
53 #endif //IRP_MJ_PNP
54 
55 #ifndef FILE_DEVICE_CDRW
56 #define FILE_DEVICE_CDRW        0x00000999
57 #endif
58 
59 #define IOCTL_CDROM_MEDIA_REMOVAL    CTL_CODE(IOCTL_CDROM_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)
60 #define IOCTL_CDROM_EJECT_MEDIA      CTL_CODE(IOCTL_CDROM_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS)
61 #define IOCTL_CDROM_LOAD_MEDIA       CTL_CODE(IOCTL_CDROM_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS)
62 
63 #ifdef CDRW_RESTRICT_ACCESS
64 
65 #define CDRW_CTL_CODE_R(a,b)    CTL_CODE(FILE_DEVICE_CDRW, a,b, FILE_READ_DATA)
66 #define CDRW_CTL_CODE_W(a,b)    CTL_CODE(FILE_DEVICE_CDRW, a,b, FILE_READ_DATA)
67 #define CDRW_CTL_CODE_W(a,b)    CTL_CODE(FILE_DEVICE_CDRW, a,b, FILE_WRITE_DATA )
68 #define CDRW_CTL_CODE_A(a,b)    CTL_CODE(FILE_DEVICE_CDRW, a,b, FILE_READ_DATA | FILE_WRITE_DATA )
69 
70 #else //CDRW_RESTRICT_ACCESS
71 
72 #define CDRW_CTL_CODE_R(a,b)    CTL_CODE(FILE_DEVICE_CDRW, a,b, FILE_READ_DATA)
73 #define CDRW_CTL_CODE_W(a,b)    CTL_CODE(FILE_DEVICE_CDRW, a,b, FILE_READ_DATA)
74 #define CDRW_CTL_CODE_A(a,b)    CTL_CODE(FILE_DEVICE_CDRW, a,b, FILE_READ_DATA)
75 #define CDRW_CTL_CODE_X(a,b)    CTL_CODE(FILE_DEVICE_CDRW, a,b, FILE_ANY_ACCESS )
76 
77 #endif //CDRW_RESTRICT_ACCESS
78 
79 #define IOCTL_CDRW_LOCK_DOOR            CDRW_CTL_CODE_R(0x801, METHOD_BUFFERED)
80 #define IOCTL_CDRW_SET_SPEED            CDRW_CTL_CODE_R(0x802, METHOD_BUFFERED)
81 #define IOCTL_CDRW_SYNC_CACHE           CDRW_CTL_CODE_W(0x803, METHOD_BUFFERED)
82 #define IOCTL_CDRW_GET_CAPABILITIES     CDRW_CTL_CODE_X(0x804, METHOD_BUFFERED)
83 #define IOCTL_CDRW_GET_SPEED            IOCTL_CDRW_GET_CAPABILITIES
84 #define IOCTL_CDRW_GET_MEDIA_TYPE       CDRW_CTL_CODE_X(0x805, METHOD_BUFFERED)
85 #define IOCTL_CDRW_GET_WRITE_MODE       CDRW_CTL_CODE_R(0x806, METHOD_BUFFERED)
86 #define IOCTL_CDRW_SET_WRITE_MODE       CDRW_CTL_CODE_W(0x807, METHOD_BUFFERED)
87 #define IOCTL_CDRW_RESERVE_TRACK        CDRW_CTL_CODE_W(0x808, METHOD_BUFFERED)
88 #define IOCTL_CDRW_BLANK                CDRW_CTL_CODE_R(0x809, METHOD_BUFFERED)
89 #define IOCTL_CDRW_CLOSE_TRK_SES        CDRW_CTL_CODE_W(0x80a, METHOD_BUFFERED)
90 //#define IOCTL_CDRW_LL_WRITE             CDRW_CTL_CODE_R(0x80b, METHOD_OUT_DIRECT)
91 #define IOCTL_CDRW_LL_WRITE             CDRW_CTL_CODE_R(0x80b, METHOD_BUFFERED)
92 #define IOCTL_CDRW_READ_TRACK_INFO      CDRW_CTL_CODE_R(0x80c, METHOD_IN_DIRECT)
93 #define IOCTL_CDRW_READ_DISC_INFO       CDRW_CTL_CODE_R(0x80d, METHOD_IN_DIRECT)
94 #define IOCTL_CDRW_BUFFER_CAPACITY      CDRW_CTL_CODE_A(0x80e, METHOD_IN_DIRECT)
95 #define IOCTL_CDRW_GET_SIGNATURE        CDRW_CTL_CODE_X(0x80f, METHOD_BUFFERED)
96 #define IOCTL_CDRW_RESET_DRIVER         CDRW_CTL_CODE_A(0x810, METHOD_BUFFERED)
97 //#ifndef WITHOUT_FORMATTER
98 #define IOCTL_CDRW_FORMAT_UNIT          CDRW_CTL_CODE_W(0x811, METHOD_BUFFERED)
99 #define IOCTL_CDRW_SET_RANDOM_ACCESS    CDRW_CTL_CODE_W(0x812, METHOD_BUFFERED)
100 //#endif //WITHOUT_FORMATTER
101 #define IOCTL_CDRW_TEST_UNIT_READY      CDRW_CTL_CODE_X(0x813, METHOD_BUFFERED)
102 #define IOCTL_CDRW_RESET_WRITE_STATUS   CDRW_CTL_CODE_X(0x814, METHOD_BUFFERED)
103 #define IOCTL_CDRW_GET_LAST_ERROR       CDRW_CTL_CODE_R(0x815, METHOD_BUFFERED)
104 #define IOCTL_CDRW_MODE_SENSE           CDRW_CTL_CODE_X(0x816, METHOD_BUFFERED)
105 #define IOCTL_CDRW_MODE_SELECT          CDRW_CTL_CODE_R(0x817, METHOD_BUFFERED)
106 #define IOCTL_CDRW_SET_READ_AHEAD       CDRW_CTL_CODE_R(0x818, METHOD_BUFFERED)
107 #define IOCTL_CDRW_SET_DEFAULT_SESSION  CDRW_CTL_CODE_R(0x819, METHOD_BUFFERED) // RESERVED !!!
108 #define IOCTL_CDRW_NOTIFY_MEDIA_CHANGE  CDRW_CTL_CODE_X(0x81a, METHOD_BUFFERED)
109 #define IOCTL_CDRW_SEND_OPC_INFO        CDRW_CTL_CODE_W(0x81b, METHOD_BUFFERED)
110 #define IOCTL_CDRW_LL_READ              CDRW_CTL_CODE_R(0x81c, METHOD_BUFFERED)
111 #define IOCTL_CDRW_SEND_CUE_SHEET       CDRW_CTL_CODE_W(0x81d, METHOD_OUT_DIRECT)
112 #define IOCTL_CDRW_INIT_DEINIT          CDRW_CTL_CODE_A(0x81e, METHOD_BUFFERED)
113 #define IOCTL_CDRW_READ_FULL_TOC        CDRW_CTL_CODE_R(0x81f, METHOD_BUFFERED)
114 #define IOCTL_CDRW_READ_PMA             CDRW_CTL_CODE_R(0x820, METHOD_BUFFERED)
115 #define IOCTL_CDRW_READ_SESSION_INFO    CDRW_CTL_CODE_R(0x821, METHOD_BUFFERED)
116 #define IOCTL_CDRW_READ_ATIP            CDRW_CTL_CODE_R(0x822, METHOD_BUFFERED)
117 #define IOCTL_CDRW_READ_CD_TEXT         CDRW_CTL_CODE_R(0x823, METHOD_BUFFERED)
118 #define IOCTL_CDRW_READ_TOC_EX          CDRW_CTL_CODE_R(0x824, METHOD_BUFFERED)
119 #define IOCTL_CDRW_GET_DEVICE_INFO      CDRW_CTL_CODE_R(0x825, METHOD_BUFFERED)
120 #define IOCTL_CDRW_GET_EVENT            CDRW_CTL_CODE_R(0x826, METHOD_IN_DIRECT)
121 #define IOCTL_CDRW_GET_DEVICE_NAME      CDRW_CTL_CODE_R(0x827, METHOD_BUFFERED)
122 #define IOCTL_CDRW_RESET_DRIVER_EX      CDRW_CTL_CODE_A(0x828, METHOD_BUFFERED)
123 #define IOCTL_CDRW_GET_MEDIA_TYPE_EX    CDRW_CTL_CODE_X(0x829, METHOD_BUFFERED)
124 #ifndef WITHOUT_FORMATTER
125 #define IOCTL_CDRW_GET_MRW_MODE         CDRW_CTL_CODE_X(0x82a, METHOD_BUFFERED)
126 #define IOCTL_CDRW_SET_MRW_MODE         CDRW_CTL_CODE_X(0x82b, METHOD_BUFFERED)
127 #endif //WITHOUT_FORMATTER
128 #define IOCTL_CDRW_READ_CAPACITY        CDRW_CTL_CODE_R(0x82c, METHOD_IN_DIRECT)
129 #define IOCTL_CDRW_GET_DISC_LAYOUT      CDRW_CTL_CODE_R(0x82d, METHOD_IN_DIRECT)
130 #define IOCTL_CDRW_SET_STREAMING        CDRW_CTL_CODE_W(0x82e, METHOD_BUFFERED)
131 
132 #define IOCTL_CDRW_UNLOAD_DRIVER     IOCTL_CDROM_UNLOAD_DRIVER
133 
134 #define IOCTL_CDRW_READ_TOC          IOCTL_CDROM_READ_TOC
135 #define IOCTL_CDRW_GET_CONTROL       IOCTL_CDROM_GET_CONTROL
136 #define IOCTL_CDRW_PLAY_AUDIO_MSF    IOCTL_CDROM_PLAY_AUDIO_MSF
137 #define IOCTL_CDRW_SEEK_AUDIO_MSF    IOCTL_CDROM_SEEK_AUDIO_MSF
138 #define IOCTL_CDRW_STOP_AUDIO        IOCTL_CDROM_STOP_AUDIO
139 #define IOCTL_CDRW_PAUSE_AUDIO       IOCTL_CDROM_PAUSE_AUDIO
140 #define IOCTL_CDRW_RESUME_AUDIO      IOCTL_CDROM_RESUME_AUDIO
141 #define IOCTL_CDRW_GET_VOLUME        IOCTL_CDROM_GET_VOLUME
142 #define IOCTL_CDRW_SET_VOLUME        IOCTL_CDROM_SET_VOLUME
143 #define IOCTL_CDRW_READ_Q_CHANNEL    IOCTL_CDROM_READ_Q_CHANNEL
144 #define IOCTL_CDRW_GET_LAST_SESSION  IOCTL_CDROM_GET_LAST_SESSION
145 #define IOCTL_CDRW_RAW_READ          IOCTL_CDROM_RAW_READ
146 #define IOCTL_CDRW_DISK_TYPE         IOCTL_CDROM_DISK_TYPE
147 
148 #define IOCTL_CDRW_CHECK_VERIFY      IOCTL_CDROM_CHECK_VERIFY
149 #define IOCTL_CDRW_MEDIA_REMOVAL     IOCTL_CDROM_MEDIA_REMOVAL
150 #define IOCTL_CDRW_EJECT_MEDIA       IOCTL_CDROM_EJECT_MEDIA
151 #define IOCTL_CDRW_LOAD_MEDIA        IOCTL_CDROM_LOAD_MEDIA
152 #define IOCTL_CDRW_RESERVE           IOCTL_CDROM_RESERVE
153 #define IOCTL_CDRW_RELEASE           IOCTL_CDROM_RELEASE
154 #define IOCTL_CDRW_FIND_NEW_DEVICES  IOCTL_CDROM_FIND_NEW_DEVICES
155 
156 #ifndef IOCTL_DVD_READ_STRUCTURE
157 #define IOCTL_DVD_READ_STRUCTURE     CTL_CODE(IOCTL_DVD_BASE, 0x0450, METHOD_BUFFERED, FILE_READ_ACCESS)
158 
159 #define IOCTL_DVD_START_SESSION      CTL_CODE(IOCTL_DVD_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS)
160 #define IOCTL_DVD_READ_KEY           CTL_CODE(IOCTL_DVD_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS)
161 #define IOCTL_DVD_SEND_KEY           CTL_CODE(IOCTL_DVD_BASE, 0x0402, METHOD_BUFFERED, FILE_READ_ACCESS)
162 #define IOCTL_DVD_END_SESSION        CTL_CODE(IOCTL_DVD_BASE, 0x0403, METHOD_BUFFERED, FILE_READ_ACCESS)
163 #define IOCTL_DVD_SET_READ_AHEAD     CTL_CODE(IOCTL_DVD_BASE, 0x0404, METHOD_BUFFERED, FILE_READ_ACCESS)
164 #define IOCTL_DVD_GET_REGION         CTL_CODE(IOCTL_DVD_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS)
165 #define IOCTL_DVD_SEND_KEY2          CTL_CODE(IOCTL_DVD_BASE, 0x0406, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
166 #endif  //IOCTL_DVD_READ_STRUCTURE
167 
168 #ifndef IOCTL_DISK_GET_DRIVE_GEOMETRY
169 #define IOCTL_DISK_GET_DRIVE_GEOMETRY   CTL_CODE(IOCTL_DISK_BASE, 0x0000, METHOD_BUFFERED, FILE_ANY_ACCESS)
170 #define IOCTL_DISK_VERIFY               CTL_CODE(IOCTL_DISK_BASE, 0x0005, METHOD_BUFFERED, FILE_ANY_ACCESS)
171 #define IOCTL_DISK_FORMAT_TRACKS        CTL_CODE(IOCTL_DISK_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
172 #define IOCTL_DISK_IS_WRITABLE          CTL_CODE(IOCTL_DISK_BASE, 0x0009, METHOD_BUFFERED, FILE_ANY_ACCESS)
173 #define IOCTL_DISK_FORMAT_TRACKS_EX     CTL_CODE(IOCTL_DISK_BASE, 0x000b, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
174 
175 #define IOCTL_DISK_CHECK_VERIFY     CTL_CODE(IOCTL_DISK_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS)
176 #define IOCTL_DISK_MEDIA_REMOVAL    CTL_CODE(IOCTL_DISK_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)
177 #define IOCTL_DISK_EJECT_MEDIA      CTL_CODE(IOCTL_DISK_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS)
178 #define IOCTL_DISK_LOAD_MEDIA       CTL_CODE(IOCTL_DISK_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS)
179 #define IOCTL_DISK_RESERVE          CTL_CODE(IOCTL_DISK_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS)
180 #define IOCTL_DISK_RELEASE          CTL_CODE(IOCTL_DISK_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS)
181 #define IOCTL_DISK_FIND_NEW_DEVICES CTL_CODE(IOCTL_DISK_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS)
182 #define IOCTL_DISK_GET_MEDIA_TYPES  CTL_CODE(IOCTL_DISK_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS)
183 #endif  //IOCTL_DISK_GET_DRIVE_GEOMETRY
184 
185 #ifndef IOCTL_STORAGE_SET_READ_AHEAD
186 #define IOCTL_STORAGE_SET_READ_AHEAD CTL_CODE(IOCTL_STORAGE_BASE, 0x0100, METHOD_BUFFERED, FILE_READ_ACCESS)
187 #endif  //IOCTL_STORAGE_SET_READ_AHEAD
188 
189 #ifndef IOCTL_STORAGE_GET_MEDIA_TYPES_EX
190 #define IOCTL_STORAGE_GET_MEDIA_TYPES_EX CTL_CODE(IOCTL_STORAGE_BASE, 0x0301, METHOD_BUFFERED, FILE_ANY_ACCESS)
191 
192 typedef enum _STORAGE_MEDIA_TYPE {
193     //
194     // Following are defined in ntdddisk.h in the MEDIA_TYPE enum
195     //
196     // Unknown,                // Format is unknown
197     // F5_1Pt2_512,            // 5.25", 1.2MB,  512 bytes/sector
198     // F3_1Pt44_512,           // 3.5",  1.44MB, 512 bytes/sector
199     // F3_2Pt88_512,           // 3.5",  2.88MB, 512 bytes/sector
200     // F3_20Pt8_512,           // 3.5",  20.8MB, 512 bytes/sector
201     // F3_720_512,             // 3.5",  720KB,  512 bytes/sector
202     // F5_360_512,             // 5.25", 360KB,  512 bytes/sector
203     // F5_320_512,             // 5.25", 320KB,  512 bytes/sector
204     // F5_320_1024,            // 5.25", 320KB,  1024 bytes/sector
205     // F5_180_512,             // 5.25", 180KB,  512 bytes/sector
206     // F5_160_512,             // 5.25", 160KB,  512 bytes/sector
207     // RemovableMedia,         // Removable media other than floppy
208     // FixedMedia,             // Fixed hard disk media
209     // F3_120M_512,            // 3.5", 120M Floppy
210     // F3_640_512,             // 3.5" ,  640KB,  512 bytes/sector
211     // F5_640_512,             // 5.25",  640KB,  512 bytes/sector
212     // F5_720_512,             // 5.25",  720KB,  512 bytes/sector
213     // F3_1Pt2_512,            // 3.5" ,  1.2Mb,  512 bytes/sector
214     // F3_1Pt23_1024,          // 3.5" ,  1.23Mb, 1024 bytes/sector
215     // F5_1Pt23_1024,          // 5.25",  1.23MB, 1024 bytes/sector
216     // F3_128Mb_512,           // 3.5" MO 128Mb   512 bytes/sector
217     // F3_230Mb_512,           // 3.5" MO 230Mb   512 bytes/sector
218     // F8_256_128,             // 8",     256KB,  128 bytes/sector
219     //
220 
221     DDS_4mm = 0x20,            // Tape - DAT DDS1,2,... (all vendors)
222     MiniQic,                   // Tape - miniQIC Tape
223     Travan,                    // Tape - Travan TR-1,2,3,...
224     QIC,                       // Tape - QIC
225     MP_8mm,                    // Tape - 8mm Exabyte Metal Particle
226     AME_8mm,                   // Tape - 8mm Exabyte Advanced Metal Evap
227     AIT1_8mm,                  // Tape - 8mm Sony AIT1
228     DLT,                       // Tape - DLT Compact IIIxt, IV
229     NCTP,                      // Tape - Philips NCTP
230     IBM_3480,                  // Tape - IBM 3480
231     IBM_3490E,                 // Tape - IBM 3490E
232     IBM_Magstar_3590,          // Tape - IBM Magstar 3590
233     IBM_Magstar_MP,            // Tape - IBM Magstar MP
234     STK_DATA_D3,               // Tape - STK Data D3
235     SONY_DTF,                  // Tape - Sony DTF
236     DV_6mm,                    // Tape - 6mm Digital Video
237     DMI,                       // Tape - Exabyte DMI and compatibles
238     SONY_D2,                   // Tape - Sony D2S and D2L
239     CLEANER_CARTRIDGE,         // Cleaner - All Drive types that support Drive Cleaners
240     CD_ROM,                    // Opt_Disk - CD
241     CD_R,                      // Opt_Disk - CD-Recordable (Write Once)
242     CD_RW,                     // Opt_Disk - CD-Rewriteable
243     DVD_ROM,                   // Opt_Disk - DVD-ROM
244     DVD_R,                     // Opt_Disk - DVD-Recordable (Write Once)
245     DVD_RW,                    // Opt_Disk - DVD-Rewriteable
246     MO_3_RW,                   // Opt_Disk - 3.5" Rewriteable MO Disk
247     MO_5_WO,                   // Opt_Disk - MO 5.25" Write Once
248     MO_5_RW,                   // Opt_Disk - MO 5.25" Rewriteable (not LIMDOW)
249     MO_5_LIMDOW,               // Opt_Disk - MO 5.25" Rewriteable (LIMDOW)
250     PC_5_WO,                   // Opt_Disk - Phase Change 5.25" Write Once Optical
251     PC_5_RW,                   // Opt_Disk - Phase Change 5.25" Rewriteable
252     PD_5_RW,                   // Opt_Disk - PhaseChange Dual Rewriteable
253     ABL_5_WO,                  // Opt_Disk - Ablative 5.25" Write Once Optical
254     PINNACLE_APEX_5_RW,        // Opt_Disk - Pinnacle Apex 4.6GB Rewriteable Optical
255     SONY_12_WO,                // Opt_Disk - Sony 12" Write Once
256     PHILIPS_12_WO,             // Opt_Disk - Philips/LMS 12" Write Once
257     HITACHI_12_WO,             // Opt_Disk - Hitachi 12" Write Once
258     CYGNET_12_WO,              // Opt_Disk - Cygnet/ATG 12" Write Once
259     KODAK_14_WO,               // Opt_Disk - Kodak 14" Write Once
260     MO_NFR_525,                // Opt_Disk - Near Field Recording (Terastor)
261     NIKON_12_RW,               // Opt_Disk - Nikon 12" Rewriteable
262     IOMEGA_ZIP,                // Mag_Disk - Iomega Zip
263     IOMEGA_JAZ,                // Mag_Disk - Iomega Jaz
264     SYQUEST_EZ135,             // Mag_Disk - Syquest EZ135
265     SYQUEST_EZFLYER,           // Mag_Disk - Syquest EzFlyer
266     SYQUEST_SYJET,             // Mag_Disk - Syquest SyJet
267     AVATAR_F2,                 // Mag_Disk - 2.5" Floppy
268     MP2_8mm,                   // Tape - 8mm Hitachi
269     DST_S,                     // Ampex DST Small Tapes
270     DST_M,                     // Ampex DST Medium Tapes
271     DST_L,                     // Ampex DST Large Tapes
272     VXATape_1,                 // Ecrix 8mm Tape
273     VXATape_2,                 // Ecrix 8mm Tape
274     STK_EAGLE,                 // STK Eagle
275     LTO_Ultrium,               // IBM, HP, Seagate LTO Ultrium
276     LTO_Accelis                // IBM, HP, Seagate LTO Accelis
277 } STORAGE_MEDIA_TYPE, *PSTORAGE_MEDIA_TYPE;
278 
279 #endif  //IOCTL_STORAGE_GET_MEDIA_TYPES_EX
280 
281 
282 //**********************************************************************************************
283 
284 typedef struct _SET_CD_SPEED_USER_IN {
285     ULONG ReadSpeed;        // Kbyte/sec        176 = 1X
286     ULONG WriteSpeed;       // Kbyte/sec
287 } SET_CD_SPEED_USER_IN, *PSET_CD_SPEED_USER_IN;
288 
289 typedef struct _SET_CD_SPEED_EX_USER_IN {
290     ULONG ReadSpeed;        // Kbyte/sec        176 = 1X
291     ULONG WriteSpeed;       // Kbyte/sec
292     UCHAR RotCtrl;
293     UCHAR Reserved[3];
294 } SET_CD_SPEED_EX_USER_IN, *PSET_CD_SPEED_EX_USER_IN;
295 
296 //**********************************************************************************************
297 
298 typedef struct _SET_STREAMING_USER_IN {
299     union {
300         UCHAR Flags;
301         struct {
302             UCHAR RA    : 1; // Random Access
303             UCHAR Exact : 1;
304             UCHAR RDD   : 1; // Restore Defaults
305             UCHAR WRC   : 2;
306             UCHAR Reserved0 : 3;
307         } Fields;
308     } Options;
309 
310     UCHAR Reserved1[3];
311 
312     ULONG StartLBA;
313     ULONG EndLBA;
314 
315     ULONG ReadSize;  // KBytes
316     ULONG ReadTime;  // ms
317 
318     ULONG WriteSize; // KBytes
319     ULONG WriteTime; // ms
320 } SET_STREAMING_USER_IN, *PSET_STREAMING_USER_IN;
321 
322 //**********************************************************************************************
323 
324 /*
325 #ifndef SyncCache_RELADR
326 #define SyncCache_RELADR        0x01
327 #define SyncCache_Immed         0x02
328 #endif //SyncCache_RELADR
329 */
330 
331 typedef struct _SYNC_CACHE_USER_IN {
332     union {
333         UCHAR Flags;
334         struct {
335             UCHAR RELADR    : 1;
336             UCHAR Immed     : 1;
337             UCHAR Reserved0 : 6;
338         } Fields;
339     } Byte1;
340     ULONG LBA;
341     USHORT NumOfBlocks;
342 } SYNC_CACHE_USER_IN, *PSYNC_CACHE_USER_IN;
343 
344 //**********************************************************************************************
345 
346 typedef struct _BUFFER_CAPACITY_BLOCK_USER_OUT {
347     UCHAR Reserved0[4];
348     ULONG BufferLength;
349     ULONG BlankBufferLength;
350     ULONG WriteStatus;
351     BOOLEAN LostStreaming;
352     ULONG MaximumPhysicalPages;
353     ULONG MaximumTransferLength;
354     ULONG ActualMaximumTransferLength;
355 } BUFFER_CAPACITY_BLOCK_USER_OUT, *PBUFFER_CAPACITY_BLOCK_USER_OUT;
356 
357 //**********************************************************************************************
358 
359 typedef struct _TRACK_INFO_BLOCK_USER_OUT {
360     USHORT DataLength;
361     UCHAR _TrackNum;
362     UCHAR _SesNum;
363     UCHAR Reserved0;
364 
365     union {
366         UCHAR Flags;
367         struct {
368             UCHAR TrackMode : 4;
369             UCHAR Copy      : 1;
370             UCHAR Damage    : 1;
371             UCHAR Reserved1 : 2;
372         } Fields;
373     } TrackParam;
374 
375     union {
376         UCHAR Flags;
377         struct {
378             UCHAR DataMode  : 4;
379             UCHAR FP        : 1;
380             UCHAR Packet    : 1;
381             UCHAR Blank     : 1;
382             UCHAR RT        : 1;
383         } Fields;
384     } DataParam;
385 
386     UCHAR NWA_V;
387     ULONG TrackStartLBA;
388     ULONG NextWriteLBA;
389     ULONG FreeBlocks;
390     ULONG FixPacketSize;
391     ULONG TrackLength;
392 
393 // MMC-3
394 
395     ULONG LastRecordedAddr;
396     UCHAR _TrackNum2;  // MSB
397     UCHAR _SesNum2;    // MSB
398     UCHAR Reserved2[2];
399 
400 // MMC-5
401 
402     ULONG ReadCompatLBA;
403 
404 // Additional
405 
406     UCHAR TrackStartMSF[3];
407     UCHAR NextWriteMSF[3];
408     ULONG TrackNum;
409     ULONG SesNum;
410 
411 } TRACK_INFO_BLOCK_USER_OUT, *PTRACK_INFO_BLOCK_USER_OUT;
412 
413 //**********************************************************************************************
414 
415 typedef struct _TRACK_INFO_BLOCK_USER_IN {
416         BOOLEAN Track;
417         ULONG LBA_TrkNum;
418 } TRACK_INFO_BLOCK_USER_IN, *PTRACK_INFO_BLOCK_USER_IN;
419 
420 //**********************************************************************************************
421 
422 typedef READ_CAPACITY_DATA  READ_CAPACITY_USER_OUT;
423 typedef PREAD_CAPACITY_DATA PREAD_CAPACITY_USER_OUT;
424 
425 //**********************************************************************************************
426 
427 typedef struct _GET_SIGNATURE_USER_OUT {
428         ULONG MagicDword;
429         USHORT VersiomMajor ;
430         USHORT VersiomMinor ;
431         USHORT VersiomId ;          // alfa/beta/...
432         USHORT Reserved;
433         UCHAR VendorId[32];
434 } GET_SIGNATURE_USER_OUT, *PGET_SIGNATURE_USER_OUT;
435 
436 //**********************************************************************************************
437 
438 /*
439 #ifndef BlankMedia_Mask
440 #define BlankMedia_Mask             0x07
441 #define BlankMedia_Complete         0x00
442 #define BlankMedia_Minimal          0x01
443 #define BlankMedia_Track            0x02
444 #define BlankMedia_UnreserveTrack   0x03
445 #define BlankMedia_TrackTail        0x04
446 #define BlankMedia_UncloseLastSes   0x05
447 #define BlankMedia_EraseSes         0x06
448 #define BlankMedia_Immed            0x10
449 #endif //BlankMedia_Mask
450 */
451 
452 typedef struct _BLANK_MEDIA_USER_IN {
453     union {
454         UCHAR Flags;
455         ULONG Reserved;
456         struct {
457             UCHAR BlankType : 3;
458             UCHAR Reserved0 : 1;
459             UCHAR Immed     : 1;
460             UCHAR Reserved1 : 3;
461         } Fields;
462     } Byte1;
463     ULONG StartAddr_TrkNum;
464 } BLANK_MEDIA_USER_IN, *PBLANK_MEDIA_USER_IN;
465 
466 //**********************************************************************************************
467 
468 typedef struct _RESERVE_TRACK_USER_IN {
469     ULONG Size;
470 } RESERVE_TRACK_USER_IN, *PRESERVE_TRACK_USER_IN;
471 
472 #define RESERVE_TRACK_EX_SIZE          0x0
473 #define RESERVE_TRACK_EX_START_LBA     0x1
474 #define RESERVE_TRACK_EX_RMZ           0x2
475 
476 typedef struct _RESERVE_TRACK_EX_USER_IN {
477     ULONG Flags;
478     union {
479         ULONG Size;
480         ULONG StartLBA;
481     };
482 } RESERVE_TRACK_EX_USER_IN, *PRESERVE_TRACK_EX_USER_IN;
483 
484 //**********************************************************************************************
485 
486 typedef struct _LL_WRITE_USER_IN {
487     union {
488         UCHAR Flags;
489         ULONG Reserved;
490         struct {
491             UCHAR RELADR    : 1;
492             UCHAR Reserved0 : 2;
493             UCHAR FUA       : 1;
494             UCHAR DPO       : 1;
495             UCHAR Reserved1 : 3;
496         } Fields;
497     } Flags;
498     ULONG LBA;
499     USHORT NumOfBlocks;
500     UCHAR Reserved1[2];
501 } LL_WRITE_USER_IN, *PLL_WRITE_USER_IN;
502 
503 //**********************************************************************************************
504 
505 //#ifndef WITHOUT_FORMATTER
506 
507 /*
508 #ifndef FormatDesc_Grow
509 #define FormatDesc_Grow     0x40
510 #define FormatDesc_Ses      0x80
511 #endif
512 */
513 
514 #define FORMAT_UNIT_FORCE_STD_MODE  0x80000000
515 #define FORMAT_UNIT_FORCE_FULL_FMT  0x40000000
516 #define FORMAT_UNIT_RESTART_MRW     0x01000000
517 
518 typedef struct _FORMAT_CDRW_PARAMETERS_USER_IN {
519     union {
520         UCHAR Flags;
521         ULONG FlagsEx;
522         struct {
523             UCHAR Reserved0: 6;
524             UCHAR Grow: 1;
525             UCHAR Ses: 1;
526         } Fields;
527     } Flags;
528     LONG BlockCount;
529 } FORMAT_CDRW_PARAMETERS_USER_IN, *PFORMAT_CDRW_PARAMETERS_USER_IN;
530 
531 //#endif //WITHOUT_FORMATTER
532 
533 //**********************************************************************************************
534 
535 /*
536 #ifndef CloseTrkSes_Immed
537 #define CloseTrkSes_Immed   0x01
538 
539 #define CloseTrkSes_Trk   0x01
540 #define CloseTrkSes_Ses   0x02
541 
542 #define CloseTrkSes_LastTrkSes  0xff
543 #endif
544 */
545 
546 typedef struct _CLOSE_TRK_SES_USER_IN {
547     union {
548         UCHAR Flags;
549         struct {
550             UCHAR Immed     : 1;
551             UCHAR Reserved0 : 7;
552         } Fields;
553     } Byte1;
554     union {
555         UCHAR Flags;
556         struct {
557             UCHAR Track     : 1;
558             UCHAR Session   : 1;
559             UCHAR Reserved0 : 6;
560         } Fields;
561     } Byte2;
562     UCHAR TrackNum;
563 } CLOSE_TRK_SES_USER_IN, *PCLOSE_TRK_SES_USER_IN;
564 
565 //**********************************************************************************************
566 
567 typedef struct _PREVENT_MEDIA_REMOVAL_USER_IN {
568     BOOLEAN PreventMediaRemoval;
569 } PREVENT_MEDIA_REMOVAL_USER_IN, *PPREVENT_MEDIA_REMOVAL_USER_IN;
570 
571 //**********************************************************************************************
572 
573 typedef struct _SET_RANDOM_ACCESS_USER_IN {
574     BOOLEAN RandomAccessMode;
575 } SET_RANDOM_ACCESS_USER_IN, *PSET_RANDOM_ACCESS_USER_IN;
576 
577 //**********************************************************************************************
578 
579 /*
580 #ifndef DiscInfo_Disk_Mask
581 #define DiscInfo_Disk_Mask          0x03
582 #define DiscInfo_Disk_Empty         0x00
583 #define DiscInfo_Disk_Appendable    0x01
584 #define DiscInfo_Disk_Complete      0x02
585 
586 #define DiscInfo_Ses_Mask       0x0C
587 #define DiscInfo_Ses_Empty      0x00
588 #define DiscInfo_Ses_Incomplete 0x04
589 #define DiscInfo_Ses_Complete   0x0C
590 
591 #define DiscInfo_Disk_Erasable  0x10
592 
593 #define DiscInfo_URU            0x10
594 #define DiscInfo_DBC_V          0x20
595 #define DiscInfo_DID_V          0x40
596 
597 #define DiscInfo_Type_cdrom     0x00    // CD-DA / CD-ROM
598 #define DiscInfo_Type_cdi       0x10    // CD-I
599 #define DiscInfo_Type_cdromxa   0x20    // CD-ROM XA
600 #define DiscInfo_Type_unknown   0xFF    // HZ ;)
601 
602 #endif
603 */
604 
605 typedef struct _DISC_STATUS_INFO_USER_OUT {
606     UCHAR ErrorCode;
607     UCHAR SenseKey;
608     UCHAR AdditionalSenseCode;
609     UCHAR AdditionalSenseCodeQualifier;
610     UCHAR SrbStatus;
611     BOOLEAN RandomAccessMode;
612     BOOLEAN CUE_sent;
613     UCHAR Flags;
614     LARGE_INTEGER MediaChangeTime;
615 
616     UCHAR LastSesLeadInMSF[4];
617     UCHAR LastSesLeadOutMSF[4];
618 
619     ULONG NumOfSes;
620     ULONG FirstTrackNumLastSes;
621     ULONG LastTrackNumLastSes;
622     ULONG Reserved1;                            // this is used to align data
623 
624 } DISC_STATUS_INFO_USER_OUT, *PDISC_STATUS_INFO_USER_OUT;
625 
626 #define DiscStatus_Formattable    0x01
627 
628 typedef struct _DISC_INFO_BLOCK_USER_OUT {        //
629 
630     DISC_STATUS_INFO_USER_OUT Status;
631 
632     USHORT DataLength;
633 
634     union {
635         UCHAR Flags;
636         struct {
637             UCHAR DiscStat : 2;
638             UCHAR LastSesStat : 2;
639             UCHAR Erasable : 1;
640             UCHAR Reserved0: 3;
641         } Fields;
642     } DiscStat;
643 
644     UCHAR FirstTrackNum;
645     UCHAR NumOfSes;
646     UCHAR FirstTrackNumLastSes;
647     UCHAR LastTrackNumLastSes;
648 
649     union {
650         UCHAR Flags;
651         struct {
652             UCHAR Reserved1: 5;
653             UCHAR URU      : 1;
654             UCHAR DBC_V    : 1; // 0
655             UCHAR DID_V    : 1;
656         } Fields;
657     } Flags;
658 
659     UCHAR DiskType;
660     UCHAR NumOfSes2;              // MSB MMC-3
661     UCHAR FirstTrackNumLastSes2;  // MSB MMC-3
662     UCHAR LastTrackNumLastSes2;   // MSB MMC-3
663     UCHAR DiskId [4];
664     ULONG LastSesLeadInLBA;
665     ULONG LastSesLeadOutLBA;
666     UCHAR DiskBarCode [8];
667     UCHAR Reserved3;
668     UCHAR OPCNum;
669 } DISC_INFO_BLOCK_USER_OUT, *PDISC_INFO_BLOCK_USER_OUT;
670 
671 //**********************************************************************************************
672 
673 typedef struct _TEST_UNIT_READY_USER_IN {
674     ULONG MaxReadyRetry;
675 } TEST_UNIT_READY_USER_IN, *PTEST_UNIT_READY_USER_IN;
676 
677 typedef struct _TEST_UNIT_READY_USER_OUT {
678     UCHAR ErrorCode;
679     UCHAR SenseKey;
680     UCHAR AdditionalSenseCode;
681     UCHAR AdditionalSenseCodeQualifier;
682 } TEST_UNIT_READY_USER_OUT, *PTEST_UNIT_READY_USER_OUT;
683 
684 //**********************************************************************************************
685 
686 /*
687 #ifndef MediaType_Unknown
688 
689 #define MediaType_Unknown                        0x00
690 #define MediaType_120mm_CDROM_DataOnly           0x01
691 #define MediaType_120mm_CDROM_AudioOnly          0x02        //CDDA
692 #define MediaType_120mm_CDROM_DataAudioCombined  0x03
693 #define MediaType_120mm_CDROM_Hybrid_PhotoCD     0x04
694 #define MediaType_80mm_CDROM_DataOnly            0x05
695 #define MediaType_80mm_CDROM_AudioOnly           0x06        //CDDA
696 #define MediaType_80mm_CDROM_DataAudioCombined   0x07
697 #define MediaType_80mm_CDROM_Hybrid_PhotoCD      0x08
698 
699 #define MediaType_UnknownSize_CDR                0x10
700 #define MediaType_120mm_CDR_DataOnly             0x11
701 #define MediaType_120mm_CDR_AudioOnly            0x12        //CDDA
702 #define MediaType_120mm_CDR_DataAudioCombined    0x13
703 #define MediaType_120mm_CDR_Hybrid_PhotoCD       0x14
704 #define MediaType_80mm_CDR_DataOnly              0x15
705 #define MediaType_80mm_CDR_AudioOnly             0x16        //CDDA
706 #define MediaType_80mm_CDR_DataAudioCombined     0x17
707 #define MediaType_80mm_CDR_Hybrid_Photo_CD       0x18
708 
709 #define MediaType_UnknownSize_CDRW               0x20
710 #define MediaType_120mm_CDRW_DataOnly            0x21
711 #define MediaType_120mm_CDRW_AudioOnly           0x22        //CDDA
712 #define MediaType_120mm_CDRW_DataAudioCombined   0x23
713 #define MediaType_120mm_CDRW_Hybrid              0x24
714 #define MediaType_80mm_CDRW_DataOnly             0x25
715 #define MediaType_80mm_CDRW_AudioOnly            0x26        //CDDA
716 #define MediaType_80mm_CDRW_DataAudioCombined    0x27
717 #define MediaType_80mm_CDRW_Hybrid               0x28
718 
719 #define MediaType_UnknownSize_Unknown            0x30
720 
721 #define MediaType_NoDiscPresent                  0x70
722 #define MediaType_DoorOpen                       0x71
723 
724 #endif
725 */
726 
727 typedef struct _GET_MEDIA_TYPE_USER_OUT {
728     UCHAR MediaType;
729 } GET_MEDIA_TYPE_USER_OUT, *PGET_MEDIA_TYPE_USER_OUT;
730 
731 typedef struct _GET_MEDIA_TYPE_EX_USER_OUT {
732     UCHAR OldStyleMediaType; // see GET_MEDIA_TYPE_USER_OUT
733     UCHAR MediaClass;
734     UCHAR MediaSize;
735     UCHAR DataType;
736     UCHAR MediaClassEx;
737     UCHAR DataClassEx;
738     UCHAR CapFlags;
739     UCHAR Layers;                    // Number of layers - 1 (e.g. 0 => 1 layer)
740     UCHAR Reserved[8];               // for future implementation
741 } GET_MEDIA_TYPE_EX_USER_OUT, *PGET_MEDIA_TYPE_EX_USER_OUT;
742 
743 #define CdMediaClass_CDROM         0x00
744 #define CdMediaClass_CDR           0x01
745 #define CdMediaClass_CDRW          0x02
746 #define CdMediaClass_DVDROM        0x03
747 #define CdMediaClass_DVDRAM        0x05
748 #define CdMediaClass_DVDR          0x06
749 #define CdMediaClass_DVDRW         0x07
750 #define CdMediaClass_DVDpR         0x08
751 #define CdMediaClass_DVDpRW        0x09
752 #define CdMediaClass_DDCDROM       0x0a
753 #define CdMediaClass_DDCDR         0x0b
754 #define CdMediaClass_DDCDRW        0x0c
755 #define CdMediaClass_BDROM         0x0d
756 #define CdMediaClass_BDRE          0x0e
757 #define CdMediaClass_BDR           0x0f
758 #define CdMediaClass_HD_DVDROM     0x10
759 #define CdMediaClass_HD_DVDRAM     0x11
760 #define CdMediaClass_HD_DVDR       0x12
761 #define CdMediaClass_HD_DVDRW      0x13
762 #define CdMediaClass_NoDiscPresent 0x70
763 #define CdMediaClass_DoorOpen      0x71
764 #define CdMediaClass_Unknown       0xff
765 
766 #define CdMediaClass_Max           CdMediaClass_HD_DVDRW
767 
768 #define CdMediaSize_Unknown        0
769 #define CdMediaSize_120mm          1
770 #define CdMediaSize_80mm           2
771 
772 #define CdDataType_Unknown             0
773 #define CdDataType_DataOnly            1
774 #define CdDataType_AudioOnly           2        //CDDA
775 #define CdDataType_DataAudioCombined   3
776 #define CdDataType_Hybrid              4
777 #define CdDataType_DataOnlyMRW         5
778 
779 #define CdMediaClassEx_CD          0x00
780 #define CdMediaClassEx_DVD         0x01
781 #define CdMediaClassEx_DDCD        0x02
782 #define CdMediaClassEx_BD          0x03
783 #define CdMediaClassEx_HD_DVD      0x04
784 #define CdMediaClassEx_None        0x70
785 #define CdMediaClassEx_Unknown     0xff
786 
787 #define CdDataClassEx_ROM          0x00
788 #define CdDataClassEx_R            0x01
789 #define CdDataClassEx_RW           0x02
790 #define CdDataClassEx_Unknown      0xff
791 
792 #define CdCapFlags_Writable        0x01
793 #define CdCapFlags_Erasable        0x02
794 #define CdCapFlags_Formatable      0x04
795 #define CdCapFlags_WriteParamsReq  0x08
796 #define CdCapFlags_RandomWritable  0x10
797 #define CdCapFlags_Cav             0x20
798 
799 #define CdrwMediaClassEx_IsRAM(MediaClassEx) ( \
800   ((MediaClassEx) == CdMediaClass_DVDRAM) || \
801   ((MediaClassEx) == CdMediaClass_BDRE) || \
802   ((MediaClassEx) == CdMediaClass_HD_DVDRAM) )
803 
804 #define CdrwIsDvdOverwritable(MediaClassEx) \
805           ((MediaClassEx) == CdMediaClass_DVDRW || \
806            (MediaClassEx) == CdMediaClass_DVDpRW || \
807            (MediaClassEx) == CdMediaClass_DVDRAM || \
808            (MediaClassEx) == CdMediaClass_BDRE || \
809            (MediaClassEx) == CdMediaClass_HD_DVDRW || \
810            (MediaClassEx) == CdMediaClass_HD_DVDRAM \
811           )
812 
813 //**********************************************************************************************
814 
815 /*
816 #ifndef MAX_PAGE_SIZE
817 #define MAX_PAGE_SIZE   0x100
818 #endif
819 */
820 
821 typedef struct _MODE_SENSE_USER_IN {
822     union {
823         UCHAR Byte;
824         struct {
825             UCHAR PageCode : 6;
826             UCHAR Reserved0: 1;
827             UCHAR PageSavable : 1;
828         } Fields;
829     } PageCode;
830 } MODE_SENSE_USER_IN, *PMODE_SENSE_USER_IN;
831 
832 typedef struct _MODE_SENSE_USER_OUT {
833     MODE_PARAMETER_HEADER   Header;
834 } MODE_SENSE_USER_OUT, *PMODE_SENSE_USER_OUT;
835 
836 //**********************************************************************************************
837 
838 typedef struct _MODE_SELECT_USER_IN {
839     MODE_PARAMETER_HEADER   Header;
840 } MODE_SELECT_USER_IN, *PMODE_SELECT_USER_IN;
841 
842 //**********************************************************************************************
843 
844 typedef struct _MODE_WRITE_PARAMS_PAGE_USER {        // 0x05
845     UCHAR PageCode : 6;
846     UCHAR Reserved0: 1;
847     UCHAR PageSavable : 1;
848 
849     UCHAR PageLength;               // 0x32
850 
851 /*
852 #ifndef WParam_WType_Mask
853 #define WParam_WType_Mask   0x0f
854 #define WParam_WType_Packet 0x00
855 #define WParam_WType_TAO    0x01
856 #define WParam_WType_Ses    0x02
857 #define WParam_WType_Raw    0x03
858 #define WParam_TestWrite    0x10
859 #define WParam_LS_V         0x20
860 #define WParam_BUFF         0x40
861 #endif
862 */
863 
864     union {
865         UCHAR Flags;
866         struct {
867             UCHAR WriteType: 4;             // 1
868             UCHAR TestWrite: 1;
869             UCHAR LS_V: 1;
870             UCHAR BUFF: 1;
871             UCHAR Reserved1: 1;
872         } Fields;
873     } Byte2;
874 
875 /*
876 #ifndef WParam_TrkMode_Mask
877 #define WParam_TrkMode_Mask             0x0f
878 #define WParam_TrkMode_None             0x00
879 #define WParam_TrkMode_Audio            0x00
880 #define WParam_TrkMode_Audio_PreEmph    0x01
881 #define WParam_TrkMode_Data             0x04
882 #define WParam_TrkMode_IncrData         0x05
883 #define WParam_TrkMode_QAudio_PreEmph   0x08
884 #define WParam_TrkMode_AllowCpy         0x02
885 #define WParam_Copy             0x10
886 #define WParam_FP               0x20
887 #define WParam_MultiSes_Mask    0xc0
888 #define WParam_Multises_None    0x00
889 #define WParam_Multises_Final   0x80
890 #define WParam_Multises_Multi   0xc0
891 #endif
892 */
893 
894     union {
895         UCHAR Flags;
896         struct {
897             UCHAR TrackMode: 4;             // 4
898             UCHAR Copy     : 1;             // 0
899             UCHAR FP       : 1;             // 0
900             UCHAR Multisession: 2;          // 11
901         } Fields;
902     } Byte3;
903 
904 /*
905 #ifndef WParam_BlkType_Mask
906 #define WParam_BlkType_Mask         0x0f
907 #define WParam_BlkType_Raw_2352     0x00
908 #define WParam_BlkType_RawPQ_2368   0x01
909 #define WParam_BlkType_RawPW_2448   0x02
910 #define WParam_BlkType_RawPW_R_2448 0x03
911 #define WParam_BlkType_M1_2048      0x08
912 #define WParam_BlkType_M2_2336      0x09
913 #define WParam_BlkType_M2XAF1_2048  0x0a
914 #define WParam_BlkType_M2XAF1SH_2056 0x0b
915 #define WParam_BlkType_M2XAF2_2324  0x0c
916 #define WParam_BlkType_M2XAFXSH_2332 0x0d
917 #endif
918 */
919 
920     union {
921         UCHAR Flags;
922         struct {
923             UCHAR DataBlockType: 4;         // 8
924             UCHAR Reserved2: 4;
925         } Fields;
926     } Byte4;
927 
928     UCHAR LinkSize;
929     UCHAR Reserved3;
930 
931     union {
932         UCHAR Flags;
933         struct {
934             UCHAR HostAppCode : 6;  // 0
935             UCHAR Reserved4: 2;
936         } Fields;
937     } Byte7;
938 
939 /*
940 #ifndef WParam_SesFmt_CdRom
941 #define WParam_SesFmt_CdRom     0x00
942 #define WParam_SesFmt_CdI       0x10
943 #define WParam_SesFmt_CdRomXa   0x20
944 #endif
945 */
946 
947     UCHAR SesFmt;                   // 0
948     UCHAR Reserved5;
949     ULONG PacketSize;               // 0
950     USHORT AudioPause;              // 150
951 
952     UCHAR Reserved6: 7;
953     UCHAR MCVAL    : 1;
954 
955     UCHAR N[13];
956     UCHAR Zero;
957     UCHAR AFRAME;
958 
959     UCHAR Reserved7: 7;
960     UCHAR TCVAL    : 1;
961 
962     UCHAR I[12];
963     UCHAR Zero_2;
964     UCHAR AFRAME_2;
965     UCHAR Reserved8;
966 
967     struct {
968         union {
969             UCHAR MSF[3];
970             struct _SubHdrParams1 {
971                 UCHAR FileNum;
972                 UCHAR ChannelNum;
973 
974 /*
975 #define WParam_SubHdr_SubMode0          0x00
976 #define WParam_SubHdr_SubMode1          0x08
977 */
978 
979                 UCHAR SubMode;
980             } Params1;
981         } Params;
982 
983 /*
984 #define WParam_SubHdr_Mode_Mask         0x03
985 #define WParam_SubHdr_Mode0             0x00
986 #define WParam_SubHdr_Mode1             0x01
987 #define WParam_SubHdr_Mode2             0x02
988 #define WParam_SubHdr_Format_Mask       0xe0
989 #define WParam_SubHdr_Format_UserData   0x00
990 #define WParam_SubHdr_Format_RunIn4     0x20
991 #define WParam_SubHdr_Format_RunIn3     0x40
992 #define WParam_SubHdr_Format_RunIn2     0x60
993 #define WParam_SubHdr_Format_RunIn1     0x80
994 #define WParam_SubHdr_Format_Link       0xa0
995 #define WParam_SubHdr_Format_RunOut2    0xc0
996 #define WParam_SubHdr_Format_RunOut1    0xe0
997 */
998 
999         union {
1000             UCHAR Flags;
1001             struct {
1002                 UCHAR Mode      : 2;
1003                 UCHAR Reserved  : 3;
1004                 UCHAR Format    : 3;
1005             } Fields;
1006         } Mode;
1007     } SubHeader;
1008 } MODE_WRITE_PARAMS_PAGE_USER, *PMODE_WRITE_PARAMS_PAGE_USER;
1009 
1010 typedef MODE_WRITE_PARAMS_PAGE_USER      GET_WRITE_MODE_USER_OUT;
1011 typedef PMODE_WRITE_PARAMS_PAGE_USER     PGET_WRITE_MODE_USER_OUT;
1012 
1013 typedef MODE_WRITE_PARAMS_PAGE_USER      SET_WRITE_MODE_USER_IN;
1014 typedef PMODE_WRITE_PARAMS_PAGE_USER     PSET_WRITE_MODE_USER_IN;
1015 
1016 //**********************************************************************************************
1017 
1018 #ifndef WITHOUT_FORMATTER
1019 
1020 typedef MODE_MRW_PAGE                    GET_MRW_MODE_USER_OUT;
1021 typedef PMODE_MRW_PAGE                   PGET_MRW_MODE_USER_OUT;
1022 
1023 typedef MODE_MRW_PAGE                    SET_MRW_MODE_USER_IN;
1024 typedef PMODE_MRW_PAGE                   PSET_MRW_MODE_USER_IN;
1025 
1026 #endif //WITHOUT_FORMATTER
1027 
1028 //**********************************************************************************************
1029 
1030 typedef struct _SET_READ_AHEAD_USER_IN {
1031     ULONG TriggerLBA;
1032     ULONG ReadAheadLBA;
1033 } SET_READ_AHEAD_USER_IN, *PSET_READ_AHEAD_USER_IN;
1034 
1035 //**********************************************************************************************
1036 
1037 typedef struct _GET_CAPABILITIES_USER_OUT {
1038     UCHAR PageCode : 6;
1039     UCHAR Reserved1 : 1;
1040     UCHAR PSBit : 1;
1041 
1042     UCHAR PageLength;
1043 
1044 /*
1045 #ifndef DevCap_read_cd_r
1046 #define DevCap_read_cd_r          0x01 // reserved in 1.2
1047 #define DevCap_read_cd_rw         0x02 // reserved in 1.2
1048 #define DevCap_method2            0x04
1049 #define DevCap_read_dvd_rom       0x08
1050 #define DevCap_read_dvd_r         0x10
1051 #define DevCap_read_dvd_ram       0x20
1052 #endif //DevCap_cd_r_read
1053 */
1054 
1055     UCHAR ReadCap;            // DevCap_*_read
1056 /*    UCHAR cd_r_read         : 1; // reserved in 1.2
1057     UCHAR cd_rw_read        : 1; // reserved in 1.2
1058     UCHAR method2           : 1;
1059     UCHAR dvd_rom           : 1;
1060     UCHAR dvd_r_read        : 1;
1061     UCHAR dvd_ram_read      : 1;
1062     UCHAR Reserved2            : 2;*/
1063 
1064 /*
1065 #ifndef DevCap_write_cd_r
1066 #define DevCap_write_cd_r         0x01 // reserved in 1.2
1067 #define DevCap_write_cd_rw        0x02 // reserved in 1.2
1068 #define DevCap_test_write         0x04
1069 #define DevCap_write_dvd_r        0x10
1070 #define DevCap_write_dvd_ram      0x20
1071 #endif //DevCap_cd_r_write
1072 */
1073 
1074     UCHAR WriteCap;            // DevCap_*_write
1075 /*    UCHAR cd_r_write        : 1; // reserved in 1.2
1076     UCHAR cd_rw_write        : 1; // reserved in 1.2
1077     UCHAR dvd_ram_write     : 1;
1078     UCHAR dvd_r_write       : 1;
1079     UCHAR reserved3a        : 1;
1080     UCHAR test_write        : 1;
1081     UCHAR Reserved3         : 2;*/
1082 
1083 /*
1084 #ifndef DevCap_audio_play
1085 #define DevCap_audio_play          0x01
1086 #define DevCap_composite          0x02
1087 #define DevCap_digport1           0x04
1088 #define DevCap_digport2           0x08
1089 #define DevCap_mode2_form1        0x10
1090 #define DevCap_mode2_form2        0x20
1091 #define DevCap_multisession       0x40
1092 #endif //DevCap_audio_play
1093 */
1094 
1095     UCHAR Capabilities0;
1096 /*    UCHAR audio_play        : 1;
1097     UCHAR composite         : 1;
1098     UCHAR digport1          : 1;
1099     UCHAR digport2          : 1;
1100     UCHAR mode2_form1       : 1;
1101     UCHAR mode2_form2       : 1;
1102     UCHAR multisession      : 1;
1103     UCHAR Reserved4         : 1;*/
1104 
1105 /*
1106 #ifndef DevCap_cdda
1107 #define DevCap_cdda               0x01
1108 #define DevCap_cdda_accurate      0x02
1109 #define DevCap_rw_supported       0x04
1110 #define DevCap_rw_corr            0x08
1111 #define DevCap_c2_pointers        0x10
1112 #define DevCap_isrc               0x20
1113 #define DevCap_upc                0x40
1114 #define DevCap_read_bar_code      0x80
1115 #endif //DevCap_cdda
1116 */
1117 
1118     UCHAR Capabilities1;
1119 /*    UCHAR cdda              : 1;
1120     UCHAR cdda_accurate     : 1;
1121     UCHAR rw_supported      : 1;
1122     UCHAR rw_corr           : 1;
1123     UCHAR c2_pointers       : 1;
1124     UCHAR isrc              : 1;
1125     UCHAR upc               : 1;
1126     UCHAR Reserved5         : 1;*/
1127 
1128 /*
1129 #ifndef DevCap_lock
1130 #define DevCap_lock               0x01
1131 #define DevCap_lock_state         0x02
1132 #define DevCap_prevent_jumper     0x04
1133 #define DevCap_eject              0x08
1134 #define DevCap_mechtype_mask                 0xE0
1135 #define DevCap_mechtype_caddy                 0x00
1136 #define DevCap_mechtype_tray                (0x01<<5)
1137 #define DevCap_mechtype_popup                (0x02<<5)
1138 #define DevCap_mechtype_individual_changer    (0x04<<5)
1139 #define DevCap_mechtype_cartridge_changer    (0x05<<5)
1140 #endif //DevCap_lock
1141 */
1142 
1143     UCHAR Capabilities2;
1144 /*    UCHAR lock              : 1;
1145     UCHAR lock_state        : 1;
1146     UCHAR prevent_jumper    : 1;
1147     UCHAR eject             : 1;
1148     UCHAR Reserved6         : 1;
1149     UCHAR mechtype            : 3;*/
1150 
1151 /*
1152 #ifndef DevCap_separate_volume
1153 #define DevCap_separate_volume    0x01
1154 #define DevCap_separate_mute      0x02
1155 #define DevCap_disc_present       0x04          // reserved in 1.2
1156 #define DevCap_sw_slot_select     0x08          // reserved in 1.2
1157 #define DevCap_change_side_cap    0x10
1158 #define DevCap_rw_leadin_read     0x20
1159 #endif //DevCap_separate_volume
1160 */
1161 
1162     UCHAR Capabilities3;
1163 /*    UCHAR separate_volume   : 1;
1164     UCHAR separate_mute     : 1;
1165     UCHAR disc_present      : 1;  // reserved in 1.2
1166     UCHAR sss               : 1;  // reserved in 1.2
1167     UCHAR Reserved7         : 4;*/
1168 
1169     USHORT MaximumSpeedSupported;
1170     USHORT NumberVolumeLevels;
1171     USHORT BufferSize;
1172     USHORT CurrentSpeed;
1173 
1174     UCHAR Reserved8;
1175 
1176     UCHAR SpecialParameters0;
1177 /*  UCHAR Reserved9        : 1;
1178     UCHAR BCK           : 1;
1179     UCHAR RCK           : 1;
1180     UCHAR LSBF          : 1;
1181     UCHAR Length        : 2;
1182     UCHAR Reserved10    : 2;*/
1183 
1184     USHORT MaximumWriteSpeedSupported;
1185     USHORT CurrentWriteSpeed;
1186     USHORT CopyManagementRevision;
1187     UCHAR Reserved11[2];
1188 
1189 } GET_CAPABILITIES_USER_OUT, *PGET_CAPABILITIES_USER_OUT;
1190 
1191 typedef struct _GET_CAPABILITIES_3_USER_OUT {
1192 
1193     UCHAR PageCode : 6;
1194     UCHAR Reserved1 : 1;
1195     UCHAR PSBit : 1;
1196 
1197     UCHAR PageLength;
1198     UCHAR ReadCap;             // DevCap_*_read
1199     UCHAR WriteCap;            // DevCap_*_write
1200     UCHAR Capabilities0;
1201     UCHAR Capabilities1;
1202     UCHAR Capabilities2;
1203     UCHAR Capabilities3;
1204     USHORT MaximumSpeedSupported;
1205     USHORT NumberVolumeLevels;
1206     USHORT BufferSize;
1207     USHORT CurrentSpeed;
1208 
1209     UCHAR Reserved8;
1210     UCHAR SpecialParameters0;
1211 
1212     USHORT MaximumWriteSpeedSupported;
1213     USHORT CurrentWriteSpeed;
1214     USHORT CopyManagementRevision;
1215     UCHAR Reserved11[2];
1216 
1217 // MMC 3
1218 
1219     UCHAR Reserved12;
1220 
1221     UCHAR SpecialParameters1;
1222 /*  UCHAR RCS           : 2; // rotation control selected
1223     UCHAR Reserved13    : 6; */
1224 
1225     USHORT CurrentWriteSpeed3;
1226     USHORT LunWPerfDescriptorCount;
1227 
1228 //    LUN_WRITE_PERF_DESC_USER WritePerfDescs[0];
1229 
1230 } GET_CAPABILITIES_3_USER_OUT, *PGET_CAPABILITIES_3_USER_OUT;
1231 
1232 typedef struct _LUN_WRITE_PERF_DESC_USER {
1233     UCHAR Reserved;
1234 
1235 #define LunWPerf_RotCtrl_Mask   0x07
1236 #define LunWPerf_RotCtrl_CLV    0x00
1237 #define LunWPerf_RotCtrl_CAV    0x01
1238 
1239     UCHAR RotationControl;
1240     USHORT WriteSpeedSupported; // kbps
1241 
1242 } LUN_WRITE_PERF_DESC_USER, *PLUN_WRITE_PERF_DESC_USER;
1243 
1244 //**********************************************************************************************
1245 
1246 typedef struct _SEND_OPC_INFO_USER_IN {
1247     USHORT Speed;
1248     UCHAR OpcValue[6];
1249 } SEND_OPC_INFO_USER_IN, *PSEND_OPC_INFO_USER_IN;
1250 
1251 typedef struct _SEND_OPC_INFO_HEADER_USER_IN {
1252     BOOLEAN DoOpc;
1253     USHORT OpcBlocksNumber;
1254 } SEND_OPC_INFO_HEADER_USER_IN, *PSEND_OPC_INFO_HEADER_USER_IN;
1255 
1256 //**********************************************************************************************
1257 
1258 typedef struct _LL_READ_USER_IN {
1259 
1260 #define ReadCd_BlkType_Mask 0x1c
1261 #define ReadCd_BlkType_Any  (0x00<<2)
1262 #define ReadCd_BlkType_CDDA (0x01<<2)
1263 #define ReadCd_BlkType_M1   (0x02<<2)
1264 #define ReadCd_BlkType_M2FX (0x03<<2)
1265 #define ReadCd_BlkType_M2F1 (0x04<<2)
1266 #define ReadCd_BlkType_M2F2 (0x05<<2)
1267 
1268     UCHAR ExpectedBlkType;
1269 
1270     ULONG LBA;          // negative value (-1) indicates tha (H)MSF must be used
1271     ULONG NumOfBlocks;
1272 
1273 #define ReadCd_Error_Mask       0x0006
1274 #define ReadCd_Error_None       0x0000
1275 #define ReadCd_Error_C2         0x0002
1276 #define ReadCd_Error_C2ex       0x0004
1277 #define ReadCd_Include_EDC      0x0008
1278 #define ReadCd_Include_UsrData  0x0010
1279 #define ReadCd_Header_Mask      0x0060
1280 #define ReadCd_Header_None      0x0000
1281 #define ReadCd_Header_Hdr       0x0020
1282 #define ReadCd_Header_SubHdr    0x0040
1283 #define ReadCd_Header_AllHdr    0x0060
1284 #define ReadCd_Include_SyncData 0x0080
1285 #define ReadCd_SubChan_Mask     0x0700
1286 #define ReadCd_SubChan_None     0x0000
1287 #define ReadCd_SubChan_Raw      0x0100
1288 #define ReadCd_SubChan_Q        0x0200
1289 #define ReadCd_SubChan_PW       0x0400
1290 #define ReadCd_SubChan_All      ReadCd_SubChan_Mask
1291 
1292     union {
1293         USHORT Flags;
1294         struct {
1295             UCHAR Reserved2 : 1;
1296             UCHAR ErrorFlags : 2;
1297             UCHAR IncludeEDC : 1;
1298             UCHAR IncludeUserData : 1;
1299             UCHAR HeaderCode : 2;
1300             UCHAR IncludeSyncData : 1;
1301 
1302             UCHAR SubChannelSelection : 3;
1303             UCHAR Reserved3 : 5;
1304         } Fields;
1305     } Flags;
1306 
1307     BOOLEAN UseMFS;
1308     CHAR Starting_MSF[3];
1309     CHAR Ending_MSF[3];
1310 
1311 } LL_READ_USER_IN, *PLL_READ_USER_IN;
1312 
1313 //**********************************************************************************************
1314 
1315 typedef struct _GET_LAST_ERROR_USER_OUT {
1316 
1317     UCHAR ErrorCode;
1318     UCHAR SenseKey;
1319     UCHAR AdditionalSenseCode;
1320     UCHAR AdditionalSenseCodeQualifier;
1321     UCHAR SrbStatus;
1322     ULONG LastError;
1323     BOOLEAN RandomAccessMode;
1324     LARGE_INTEGER MediaChangeTime;
1325     ULONG MediaChangeCount;
1326 
1327 } GET_LAST_ERROR_USER_OUT, *PGET_LAST_ERROR_USER_OUT;
1328 
1329 //**********************************************************************************************
1330 
1331 typedef struct _RAW_READ_USER_IN {
1332     LARGE_INTEGER DiskOffset;
1333     ULONG    SectorCount;
1334     TRACK_MODE_TYPE TrackMode;
1335 } RAW_READ_USER_IN, *PRAW_READ_USER_IN;
1336 
1337 //**********************************************************************************************
1338 
1339 typedef struct _PLAY_AUDIO_MSF_USER_IN {
1340     UCHAR StartingMSF[3];
1341     UCHAR EndingMSF[3];
1342 } PLAY_AUDIO_MSF_USER_IN, *PPLAY_AUDIO_MSF_USER_IN;
1343 
1344 //**********************************************************************************************
1345 
1346 #define AudioStatus_NotSupported    0x00
1347 #define AudioStatus_InProgress      0x11
1348 #define AudioStatus_Paused          0x12
1349 #define AudioStatus_PlayComplete    0x13
1350 #define AudioStatus_PlayError       0x14
1351 #define AudioStatus_NoStatus        0x15
1352 
1353 #define IOCTL_CDROM_SUB_Q_CHANNEL    0x00
1354 #define IOCTL_CDROM_CURRENT_POSITION 0x01
1355 #define IOCTL_CDROM_MEDIA_CATALOG    0x02
1356 #define IOCTL_CDROM_TRACK_ISRC       0x03
1357 
1358 typedef struct _SUB_Q_CHANNEL_DATA_USER_IN {
1359     UCHAR Format;
1360     UCHAR Track;
1361 } SUB_Q_CHANNEL_DATA_USER_IN, *PSUB_Q_CHANNEL_DATA_USER_IN;
1362 
1363 //**********************************************************************************************
1364 
1365 typedef struct _SEEK_AUDIO_MSF_USER_IN {
1366     UCHAR MSF[3];
1367 } SEEK_AUDIO_MSF_USER_IN, *PSEEK_AUDIO_MSF_USER_IN;
1368 
1369 //**********************************************************************************************
1370 
1371 typedef struct _AUDIO_CONTROL_USER_OUT {
1372     UCHAR LbaFormat;
1373     USHORT LogicalBlocksPerSecond;
1374 } AUDIO_CONTROL_USER_OUT, *PAUDIO_CONTROL_USER_OUT;
1375 
1376 //**********************************************************************************************
1377 
1378 typedef READ_TOC_TOC    READ_TOC_USER_OUT;
1379 typedef PREAD_TOC_TOC   PREAD_TOC_USER_OUT;
1380 
1381 typedef READ_TOC_SES    GET_LAST_SESSION_USER_OUT;
1382 typedef PREAD_TOC_SES   PGET_LAST_SESSION_USER_OUT;
1383 
1384 typedef READ_TOC_FULL_TOC   READ_FULL_TOC_USER_OUT;
1385 typedef PREAD_TOC_FULL_TOC  PREAD_FULL_TOC_USER_OUT;
1386 
1387 typedef READ_TOC_FULL_TOC   READ_PMA_USER_OUT;
1388 typedef PREAD_TOC_FULL_TOC  PREAD_PMA_USER_OUT;
1389 
1390 typedef READ_TOC_ATIP   READ_ATIP_USER_OUT;
1391 typedef PREAD_TOC_ATIP  PREAD_ATIP_USER_OUT;
1392 
1393 typedef READ_TOC_CD_TEXT   READ_CD_TEXT_USER_OUT;
1394 typedef PREAD_TOC_CD_TEXT  PREAD_CD_TEXT_USER_OUT;
1395 
1396 //**********************************************************************************************
1397 
1398 typedef struct _INIT_DEINIT_USER_IN {
1399     BOOLEAN PassThrough;
1400     BOOLEAN Reserved;                   // For separate device (de)initialization
1401 } INIT_DEINIT_USER_IN, *PINIT_DEINIT_USER_IN;
1402 
1403 typedef INIT_DEINIT_USER_IN     INIT_DEINIT_USER_OUT;
1404 typedef PINIT_DEINIT_USER_IN    PINIT_DEINIT_USER_OUT;
1405 
1406 //**********************************************************************************************
1407 
1408 typedef struct _READ_SESSION_INFO_USER_IN {
1409     BOOLEAN UseLBA;
1410     UCHAR Session;
1411 } READ_SESSION_INFO_USER_IN, *PREAD_SESSION_INFO_USER_IN;
1412 
1413 typedef READ_TOC_SES    READ_SESSION_INFO_USER_OUT;
1414 typedef PREAD_TOC_SES   PREAD_SESSION_INFO_USER_OUT;
1415 
1416 //**********************************************************************************************
1417 
1418 typedef struct _READ_TOC_EX_USER_IN {
1419     BOOLEAN UseLBA;
1420     UCHAR Track;
1421 } READ_TOC_EX_USER_IN, *PREAD_TOC_EX_USER_IN;
1422 
1423 typedef READ_TOC_SES    READ_TOC_EX_USER_OUT;
1424 typedef PREAD_TOC_SES   PREAD_TOC_EX_USER_OUT;
1425 
1426 //**********************************************************************************************
1427 
1428 #define DefSession_LastAvailable    0xff
1429 
1430 typedef struct _SET_DEFAULT_SESSION_USER_IN {
1431     UCHAR LastSes;
1432 } SET_DEFAULT_SESSION_USER_IN, *PSET_DEFAULT_SESSION_USER_IN;
1433 
1434 //**********************************************************************************************
1435 
1436 typedef struct _NOTIFY_MEDIA_CHANGE_USER_IN {
1437     BOOLEAN Autorun;
1438 } NOTIFY_MEDIA_CHANGE_USER_IN, *PNOTIFY_MEDIA_CHANGE_USER_IN;
1439 
1440 //**********************************************************************************************
1441 
1442 typedef DISK_GEOMETRY  GET_DRIVE_GEOMETRY_USER_OUT;
1443 typedef PDISK_GEOMETRY PGET_DRIVE_GEOMETRY_USER_OUT;
1444 
1445 //**********************************************************************************************
1446 
1447 typedef struct _GET_DEVICE_INFO_OLD_USER_OUT {
1448     UCHAR WModes [4][16];
1449     UCHAR VendorId[25];
1450     UCHAR SimulatedWModes [4][16];
1451     ULONG DeviceNumber;
1452     ULONG Features;
1453     INQUIRYDATA InquiryData;
1454     ULONG Features2[4];                        // form GET_CONFIG   0 - 128
1455 } GET_DEVICE_INFO_OLD_USER_OUT, *PGET_DEVICE_INFO_OLD_USER_OUT;
1456 
1457 typedef struct _GET_DEVICE_INFO_USER_OUT {
1458     ULONG Tag;
1459     ULONG Length;
1460     UCHAR WModes [4][16];
1461     UCHAR VendorId[25];
1462     UCHAR SimulatedWModes [4][16];
1463     ULONG DeviceNumber;
1464     ULONG Features;
1465     INQUIRYDATA InquiryData;
1466     ULONG Features2[4];                        // from GET_CONFIG
1467     ULONG Features2ex[64-4];                   // from GET_CONFIG (reserved for higher values)
1468     ULONG WriteCaps;                           // CDRW_DEV_CAPABILITY_xxx
1469     ULONG ReadCaps;                            // CDRW_DEV_CAPABILITY_xxx
1470 } GET_DEVICE_INFO_USER_OUT, *PGET_DEVICE_INFO_USER_OUT;
1471 
1472 #define CDRW_DEV_CAPABILITY_TAG     0xCA10AB11
1473 
1474 #define WMODE_SUPPORTED             0x01
1475 #define WMODE_SUPPORTED_FP          0x02
1476 #define WMODE_SUPPORTED_VP          0x04
1477 #define WMODE_NOT_SUPPORTED         0xff
1478 #define WMODE_NOT_TESTED            0x00
1479 
1480 #define CDRW_FEATURE_OPC            0x00000001 // use OPC regardless of OPCn in DISK_INFO
1481 #define CDRW_FEATURE_EVENT          0x00000002
1482 #define CDRW_FEATURE_GET_CFG        0x00000004
1483 #define CDRW_FEATURE_NO_LOCK_REP    0x00000008 // device doesn't report tray lock state
1484 #define CDRW_FEATURE_SYNC_ON_WRITE  0x00000010 // device preferes Sync Cache after each Write
1485 #define CDRW_FEATURE_BAD_RW_SEEK    0x00000020 // seek error occures with status Illegal Sector Mode For This Track
1486                                                //   on old CdRoms when they attempt to read outer sectors on FP formatted
1487                                                //   disk. Workaround: perform sequence of seeks from lower address
1488                                                //   to required with step about 0x800 blocks.
1489 #define CDRW_FEATURE_FP_ADDRESSING_PROBLEM  0x00000040
1490 #define CDRW_FEATURE_MRW_ADDRESSING_PROBLEM 0x00000080
1491 #define CDRW_FEATURE_FORCE_SYNC_ON_WRITE    0x00000100 // device requires Sync Cache after each Write
1492 #define CDRW_FEATURE_BAD_DVD_LAST_LBA       0x00000200 // device cannot determile LastLba on not closed DVD disks
1493 #define CDRW_FEATURE_FULL_BLANK_ON_FORMAT   0x00000400 // device cannot format disk until it is full-blanked
1494 #define CDRW_FEATURE_STREAMING              0x00000800 // device supports streaming read/write
1495 #define CDRW_FEATURE_FORCE_SYNC_BEFORE_READ 0x00001000 // device requires Sync Cache on Write -> Read state transition
1496 #define CDRW_FEATURE_CHANGER        0x80000000
1497 
1498 #define DEV_CAP_GET_PROFILE(arr, pf) \
1499     (((pf) > PFNUM_Max) ? 0 : (((arr)[(pf)/32] >> (pf)%32) & 1))
1500 
1501 #define CDRW_DEV_CAPABILITY_CDROM    ((ULONG)1 << CdMediaClass_CDROM  )
1502 #define CDRW_DEV_CAPABILITY_CDR      ((ULONG)1 << CdMediaClass_CDR    )
1503 #define CDRW_DEV_CAPABILITY_CDRW     ((ULONG)1 << CdMediaClass_CDRW   )
1504 #define CDRW_DEV_CAPABILITY_DVDROM   ((ULONG)1 << CdMediaClass_DVDROM )
1505 #define CDRW_DEV_CAPABILITY_DVDRAM   ((ULONG)1 << CdMediaClass_DVDRAM )
1506 #define CDRW_DEV_CAPABILITY_DVDR     ((ULONG)1 << CdMediaClass_DVDR   )
1507 #define CDRW_DEV_CAPABILITY_DVDRW    ((ULONG)1 << CdMediaClass_DVDRW  )
1508 #define CDRW_DEV_CAPABILITY_DVDpR    ((ULONG)1 << CdMediaClass_DVDpR  )
1509 #define CDRW_DEV_CAPABILITY_DVDpRW   ((ULONG)1 << CdMediaClass_DVDpRW )
1510 #define CDRW_DEV_CAPABILITY_DDCDROM  ((ULONG)1 << CdMediaClass_DDCDROM)
1511 #define CDRW_DEV_CAPABILITY_DDCDR    ((ULONG)1 << CdMediaClass_DDCDR  )
1512 #define CDRW_DEV_CAPABILITY_DDCDRW   ((ULONG)1 << CdMediaClass_DDCDRW )
1513 
1514 //**********************************************************************************************
1515 
1516 typedef ULONG CHECK_VERIFY_USER_OUT, *PCHECK_VERIFY_USER_OUT;
1517 
1518 //**********************************************************************************************
1519 
1520 /*
1521 #ifndef EventStat_Class_OpChange
1522 #define EventStat_Class_OpChange    0x01
1523 #define EventStat_Class_PM          0x02
1524 #define EventStat_Class_Media       0x04
1525 #define EventStat_Class_DevBusy     0x06
1526 #endif // end EventStat_Class_OpChange
1527 */
1528 
1529 typedef struct _GET_EVENT_USER_IN {
1530     UCHAR EventClass;
1531     BOOLEAN Immed;
1532 } GET_EVENT_USER_IN, *PGET_EVENT_USER_IN;
1533 
1534 typedef union _GET_EVENT_USER_OUT {
1535     EVENT_STAT_OPERATIONAL_BLOCK   Operational;
1536     EVENT_STAT_PM_BLOCK            PowerManagement;
1537     EVENT_STAT_EXT_REQ_BLOCK       ExternalReq;
1538     EVENT_STAT_MEDIA_BLOCK         MediaChange;
1539     EVENT_STAT_DEV_BUSY_BLOCK      DeviceBusy;
1540 } GET_EVENT_USER_OUT, *PGET_EVENT_USER_OUT;
1541 
1542 //**********************************************************************************************
1543 
1544 typedef ULONG DVD_SESSION_ID, *PDVD_SESSION_ID;
1545 
1546 typedef struct _DVD_READ_STRUCTURE_USER_IN {
1547     LARGE_INTEGER BlockByteOffset;
1548     DVD_STRUCTURE_FORMAT Format;
1549     DVD_SESSION_ID SessionId;
1550     UCHAR LayerNumber;
1551 } DVD_READ_STRUCTURE_USER_IN, *PDVD_READ_STRUCTURE_USER_IN;
1552 
1553 typedef struct _DVD_READ_STRUCTURE_USER_OUT {
1554     USHORT Length;
1555     UCHAR Reserved[2];
1556 //    UCHAR Data[0];
1557 } DVD_READ_STRUCTURE_USER_OUT, *PDVD_READ_STRUCTURE_USER_OUT;
1558 
1559 //**********************************************************************************************
1560 
1561 typedef struct _DVD_START_SESSION_USER_OUT {
1562     DVD_SESSION_ID SessionId;
1563 } DVD_START_SESSION_USER_OUT, *PDVD_START_SESSION_USER_OUT;
1564 
1565 //**********************************************************************************************
1566 
1567 typedef struct _DVD_READ_KEY_USER_IN {
1568     ULONG KeyLength;
1569     DVD_SESSION_ID SessionId;
1570     DVD_KEY_TYPE KeyType;
1571     ULONG KeyFlags;
1572     union {
1573         HANDLE FileHandle;
1574         LARGE_INTEGER TitleOffset;
1575     } Parameters;
1576 //    UCHAR KeyData[0];
1577 } DVD_READ_KEY_USER_IN, *PDVD_READ_KEY_USER_IN;
1578 
1579 typedef DVD_READ_KEY_USER_IN  DVD_READ_KEY_USER_OUT;
1580 typedef PDVD_READ_KEY_USER_IN PDVD_READ_KEY_USER_OUT;
1581 
1582 //**********************************************************************************************
1583 
1584 typedef DVD_START_SESSION_USER_OUT  DVD_END_SESSION_USER_IN;
1585 typedef PDVD_START_SESSION_USER_OUT PDVD_END_SESSION_USER_IN;
1586 
1587 //**********************************************************************************************
1588 
1589 // Predefined (Mt. Fuji) key sizes
1590 // Add sizeof(DVD_COPY_PROTECT_KEY) to get allocation size for
1591 // the full key structure
1592 
1593 #define DVD_CHALLENGE_KEY_LENGTH    (12 + sizeof(DVD_COPY_PROTECT_KEY))
1594 #define DVD_BUS_KEY_LENGTH          (8 + sizeof(DVD_COPY_PROTECT_KEY))
1595 #define DVD_TITLE_KEY_LENGTH        (8 + sizeof(DVD_COPY_PROTECT_KEY))
1596 #define DVD_DISK_KEY_LENGTH         (2048 + sizeof(DVD_COPY_PROTECT_KEY))
1597 #define DVD_RPC_KEY_LENGTH          (sizeof(DVD_RPC_KEY) + sizeof(DVD_COPY_PROTECT_KEY))
1598 #define DVD_SET_RPC_KEY_LENGTH      (sizeof(DVD_SET_RPC_KEY) + sizeof(DVD_COPY_PROTECT_KEY))
1599 #define DVD_ASF_LENGTH              (sizeof(DVD_ASF) + sizeof(DVD_COPY_PROTECT_KEY))
1600 
1601 //**********************************************************************************************
1602 
1603 typedef struct _DISK_VERIFY_USER_IN {
1604     LONGLONG StartingOffset;
1605     ULONG Length;
1606 } DISK_VERIFY_USER_IN, *PDISK_VERIFY_USER_IN;
1607 
1608 //**********************************************************************************************
1609 
1610 typedef struct _CDROM_DISK_DATA_USER_OUT {
1611 
1612     ULONG DiskData;
1613 
1614 } CDROM_DISK_DATA_USER_OUT, *PCDROM_DISK_DATA_USER_OUT;
1615 
1616 //**********************************************************************************************
1617 
1618 typedef struct _CDRW_RESET_DRIVER_USER_IN {
1619     BOOLEAN UnlockTray;
1620     BOOLEAN Reserved[3];
1621     ULONG   MagicWord;
1622 } CDRW_RESET_DRIVER_USER_IN, *PCDRW_RESET_DRIVER_USER_IN;
1623 
1624 //**********************************************************************************************
1625 
1626 typedef struct _MediaTrackMap {
1627     ULONG FirstLba;
1628     ULONG LastLba;
1629     ULONG NWA;
1630     ULONG PacketSize;
1631     ULONG Session;
1632     UCHAR  TrackParam;
1633     UCHAR  DataParam;
1634     UCHAR  NWA_V;
1635 
1636     UCHAR  Flags;
1637 #define     TrackMap_AllowCopyBit_variated     0x01
1638 #define     TrackMap_CopyBit_variated          0x02
1639 #define     TrackMap_Try_variation             0x04
1640 #define     TrackMap_Use_variation             0x08
1641 #define     TrackMap_FixFPAddressing           0x10
1642 #define     TrackMap_FixMRWAddressing          0x20
1643 
1644     // are used only if FixFPAddressing is enabled
1645     ULONG TrackFPOffset;
1646     ULONG PacketFPOffset;
1647 
1648 } MediaTrackMap, *PMediaTrackMap;
1649 
1650 typedef struct _GET_DISK_LAYOUT_USER_OUT {
1651     ULONG           Tag;
1652     ULONG           Length;
1653     ULONG           DiskLayoutFlags;
1654     // Number of last session
1655     ULONG           LastSession;
1656     ULONG           FirstTrackNum;
1657     ULONG           LastTrackNum;
1658     // First & Last LBA of the last session
1659     ULONG           FirstLBA;
1660     ULONG           LastLBA;
1661     // Last writable LBA
1662     ULONG           LastPossibleLBA;
1663     // First writable LBA
1664     ULONG           NWA;
1665     // sector type map
1666     struct _MediaTrackMap*  TrackMap;
1667     //
1668     ULONG           BlockSize;
1669     ULONG           WriteBlockSize;
1670     // disk state
1671     BOOLEAN         FP_disc;
1672     UCHAR           OPCNum;
1673     UCHAR           MediaClassEx;
1674     UCHAR           DiscStat;
1675     ULONG           PhSerialNumber;
1676     UCHAR           PhErasable;
1677     UCHAR           PhDiskType;
1678     UCHAR           MRWStatus;
1679 } GET_DISK_LAYOUT_USER_OUT, *PGET_DISK_LAYOUT_USER_OUT;
1680 
1681 #define         DiskLayout_FLAGS_TRACKMAP              (0x00002000)
1682 #define         DiskLayout_FLAGS_RAW_DISK              (0x00040000)
1683 
1684 //**********************************************************************************************
1685 
1686 // Error codes returned by IOCTL_CDRW_GEL_LAST_ERROR
1687 
1688 //#ifndef CDRW_ERR_NO_ERROR
1689 
1690 #define CDRW_ERR_NO_ERROR                       0x0000
1691 #define CDRW_ERR_WRITE_IN_PROGRESS_BUSY         0x0001
1692 #define CDRW_ERR_FORMAT_IN_PROGRESS_BUSY        0x0002
1693 #define CDRW_ERR_CLOSE_IN_PROGRESS_BUSY         0x0003
1694 #define CDRW_ERR_BAD_ADDR_ALIGNMENT             0x0004
1695 #define CDRW_ERR_BAD_SIZE_ALIGNMENT             0x0005
1696 #define CDRW_ERR_STREAM_LOSS                    0x0006
1697 #define CDRW_ERR_TEST_WRITE_UNSUPPORTED         0x0007
1698 #define CDRW_ERR_UNHANDLED_WRITE_TYPE           0x0008
1699 #define CDRW_ERR_CANT_ALLOC_TMP_BUFFER          0x0009
1700 #define CDRW_ERR_BUFFER_IS_FULL                 0x000a
1701 #define CDRW_ERR_VERIFY_REQUIRED                0x000b
1702 #define CDRW_ERR_PLAY_IN_PROGRESS_BUSY          0x000c
1703 #define CDRW_ERR_TOO_LONG_BLOCK_TO_TRANSFER     0x000d
1704 #define CDRW_ERR_INWALID_WRITE_PARAMETERS       0x000e  // use SET_WRITE_PARAMS properly
1705 #define CDRW_ERR_INVALID_IO_BUFFER_ADDRESS      0x000f
1706 #define CDRW_ERR_INVALID_INPUT_BUFFER_SIZE      0x0010
1707 #define CDRW_ERR_INVALID_OUTPUT_BUFFER_SIZE     0x0011
1708 #define CDRW_ERR_UNRECOGNIZED_MEDIA             0x0012
1709 #define CDRW_ERR_MEDIA_WRITE_PROTECTED          0x0013
1710 #define CDRW_ERR_NO_MEDIA                       0x0014
1711 #define CDRW_ERR_TRAY_OPEN                      0x0015
1712 #define CDRW_ERR_MEDIA_NOT_APPENDABLE           0x0016
1713 #define CDRW_ERR_INVALID_LBA                    0x0017
1714 #define CDRW_ERR_INVALID_FIXED_PACKET_SIZE      0x0018
1715 #define CDRW_ERR_INVALID_WRITE_TYPE_FOR_MEDIA   0x0019
1716 #define CDRW_ERR_CUE_SHEET_REQUIRED             0x001a  // you sould send cue sheet before SAO
1717 #define CDRW_ERR_CANT_DEINIT_IN_CLASS_MODE      0x001b  // there is no underlayered driver
1718 #define CDRW_ERR_INVALID_FORMAT_UNIT_SETTINGS   0x001c  // use SET_WRITE_PARAMS properly before
1719                                                         // calling FormatUnit
1720 #define CDRW_ERR_UNHANDLED_FORMAT_UNIT_MODE     0x001d  // this mode is not supported by
1721                                                         // Workaround module
1722 #define CDRW_ERR_CANT_READ_BUFFER_CAPACITY      0x001e
1723 #define CDRW_ERR_DEVICE_WRITE_ERROR             0x001f
1724 #define CDRW_ERR_UNHANDLED_IOCTL                0x0020
1725 #define CDRW_ERR_UNHANDLED_FORMAT_WORKAROUND_MODE   0x0021 // check your Registry settings
1726 #define CDRW_ERR_DOOR_LOCKED_BUSY               0x0022
1727 #define CDRW_ERR_MAGIC_WORD_REQUIRED            0x0023
1728 #define CDRW_ERR_INVALID_SECTOR_MODE            0x0024
1729 #define CDRW_ERR_DVD_LICENSE_VIOLATION          0x0025
1730 #define CDRW_ERR_INVALID_DVD_KEY_TYPE           0x0026
1731 #define CDRW_ERR_INVALID_DVD_REGION_CODE        0x0027
1732 #define CDRW_ERR_PAGE_IS_NOT_SUPPORTED          0x0028
1733 #define CDRW_ERR_STD_FORMAT_REQUIRED            0x0029
1734 //#define CDRW_ERR_                    0x00
1735 //#define CDRW_ERR_                    0x00
1736 //#define CDRW_ERR_                    0x00
1737 //#define CDRW_ERR_                    0x00
1738 
1739 //#endif
1740 
1741 // Registry keys
1742 #define REG_TIMEOUT_NAME_USER    ("TimeOutValue")
1743 #define REG_AUTORUN_NAME_USER    ("Autorun")
1744 #define REG_LOADMODE_NAME_USER   ("LoadMode")
1745 
1746 #define LOADMODE_CDRW_ONLY      0
1747 #define LOADMODE_ALWAYS         1
1748 #define LOADMODE_NEVER          2
1749 
1750 #define REG_PACKETSIZE_NAME_USER    ("PacketSize")      // Initial packet size (FP)
1751 
1752 #define PACKETSIZE_STREAM       0
1753 #define PACKETSIZE_UDF          32
1754 
1755 #ifndef WITHOUT_FORMATTER
1756 #define REG_FORMATUNIT_NAME_USER    ("FormatUnitMode")  // FORMAT_UNIT workaround mode
1757 
1758 #define FORMATUNIT_FP           0                       // simulation via FP
1759 #define FORMATUNIT_STD          1
1760 #endif //WITHOUT_FORMATTER
1761 
1762 #define REG_R_SPLIT_SIZE_NAME_USER  ("ReadSplitSize")       // Read request spliting limit
1763 #define REG_W_SPLIT_SIZE_NAME_USER  ("WriteSplitSize")      // Write request spliting limit
1764 
1765 #define REG_CDR_SIMULATION_NAME_USER    ("CdRSimulationMode")  // Influence on READ_DISC_INFO
1766                                                         // capability check on startup
1767 #define CDR_SIMULATION_CDROM    0
1768 #define CDR_SIMULATION_ALWAYS   1
1769 #define CDR_SIMULATION_NEVER    2
1770 
1771 #define REG_SPEEDMODE_NAME_USER     ("SpeedDetectionMode")
1772 
1773 #define SPEEDMODE_ASSUME_OK     0
1774 #define SPEEDMODE_REREAD        1
1775 
1776 //#define REG_MAX_WRITE_SPEED_R_NAME_USER   ("MaxWriteSpeedCDR")
1777 //#define REG_MAX_WRITE_SPEED_RW_NAME_USER  ("MaxWriteSpeedCDRW")
1778 
1779 //#define REG_SIMULATION_TABLE_NAME_USER ("WModeSimulationTable") // via Raw
1780 
1781 #define REG_WMODE_SIMULATION_NAME_USER ("WModeSimulation") // via Raw
1782 #define WMODE_SIMULATION_ON     1
1783 #define WMODE_SIMULATION_OFF    0
1784 #define WMODE_ASSUME_OK         2
1785 
1786 #define REG_SYNC_PACKETS_NAME_USER  ("SyncPacketsMode")
1787 #define SYNC_PACKETS_ALWAYS     0
1788 #define SYNC_PACKETS_RESET_DRV  1
1789 #define SYNC_PACKETS_NEVER      2
1790 #define SYNC_PACKETS_FP         3
1791 #define SYNC_PACKETS_DISABLED   4
1792 #define SYNC_PACKETS_VP_ONLY    5
1793 #define SYNC_PACKETS_BY_W_THROUGH 6
1794 
1795 #define REG_ASSURE_READY_NAME_USER  ("AssureReadiness")
1796 #define ASSURE_READY_TEST_UNIT  0
1797 #define ASSURE_READY_DELAY_100  1
1798 #define ASSURE_READY_NONE       2
1799 
1800 #define REG_WAIT_PACKETS_NAME_USER  ("WaitPackets")
1801 #define WAIT_PACKETS_ALWAYS     0
1802 #define WAIT_PACKETS_STREAM     1
1803 
1804 #define REG_BAD_RW_SEEK_NAME_USER   ("BadRWSeek")
1805 
1806 #define REG_ALLOW_PACKET_ON_CDR_NAME_USER  ("AllowPacketOnCdR")
1807 #define ALLOW_PACKET_ON_CDR_OFF 0
1808 #define ALLOW_PACKET_ON_CDR_ON  1
1809 
1810 #define REG_MAX_READY_RETRY_NAME_USER      ("MaxReadyRetry")
1811 
1812 #define REG_BAD_DVD_READ_TRACK_INFO_NAME_USER  ("DvdBadReadTrackInfo")
1813 #define REG_BAD_DVD_READ_DISC_INFO_NAME_USER   ("DvdBadReadDiscInfo")
1814 #define REG_BAD_DVD_READ_CAPACITY_NAME_USER    ("DvdBadReadCapacity")
1815 #define REG_BAD_DVD_LAST_LBA_NAME_USER         ("DvdBadLastLba")
1816 #define REG_BAD_DVD_LAST_LBA_NAME_USER         ("DvdBadLastLba")
1817 
1818 #define REG_FULL_BLANK_ON_FORMAT_NAME_USER     ("FullEraseBeforeFormat")
1819 
1820 #define DEFAULT_LAST_LBA_FP_CD  276159
1821 #define DEFAULT_LAST_LBA_DVD    0x23053f
1822 #define DEFAULT_LAST_LBA_BD     (25*1000*1000/2-1)
1823 
1824 
1825 #pragma pack(pop)
1826 
1827 #endif //__CDRW_PUBLIC_H__
1828