1/*
2 * ntddcdrm.h
3 *
4 * CDROM IOCTL interface.
5 *
6 * This file is part of the w32api package.
7 *
8 * Contributors:
9 *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
10 *
11 * THIS SOFTWARE IS NOT COPYRIGHTED
12 *
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
15 *
16 * This code is distributed in the hope that it will be useful but
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18 * DISCLAIMED. This includes but is not limited to warranties of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20 *
21 */
22
23#ifndef _NTDDCDRM_
24#define _NTDDCDRM_
25
26#include "ntddstor.h"
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
32#define IOCTL_CDROM_BASE                  FILE_DEVICE_CD_ROM
33
34#define IOCTL_CDROM_CHECK_VERIFY \
35  CTL_CODE(IOCTL_CDROM_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS)
36
37#define IOCTL_CDROM_FIND_NEW_DEVICES \
38  CTL_CODE(IOCTL_CDROM_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS)
39
40#define IOCTL_CDROM_GET_CONFIGURATION \
41  CTL_CODE(IOCTL_CDROM_BASE, 0x0016, METHOD_BUFFERED, FILE_READ_ACCESS)
42
43#define IOCTL_CDROM_GET_CONTROL \
44  CTL_CODE(IOCTL_CDROM_BASE, 0x000D, METHOD_BUFFERED, FILE_READ_ACCESS)
45
46#define IOCTL_CDROM_GET_DRIVE_GEOMETRY \
47  CTL_CODE(IOCTL_CDROM_BASE, 0x0013, METHOD_BUFFERED, FILE_READ_ACCESS)
48
49#define IOCTL_CDROM_GET_DRIVE_GEOMETRY_EX \
50  CTL_CODE(IOCTL_CDROM_BASE, 0x0014, METHOD_BUFFERED, FILE_READ_ACCESS)
51
52#define IOCTL_CDROM_GET_LAST_SESSION \
53  CTL_CODE(IOCTL_CDROM_BASE, 0x000E, METHOD_BUFFERED, FILE_READ_ACCESS)
54
55#define IOCTL_CDROM_GET_VOLUME \
56  CTL_CODE(IOCTL_CDROM_BASE, 0x0005, METHOD_BUFFERED, FILE_READ_ACCESS)
57
58#define IOCTL_CDROM_PAUSE_AUDIO \
59  CTL_CODE(IOCTL_CDROM_BASE, 0x0003, METHOD_BUFFERED, FILE_READ_ACCESS)
60
61#define IOCTL_CDROM_PLAY_AUDIO_MSF \
62  CTL_CODE(IOCTL_CDROM_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS)
63
64#define IOCTL_CDROM_RAW_READ \
65  CTL_CODE(IOCTL_CDROM_BASE, 0x000F, METHOD_OUT_DIRECT,  FILE_READ_ACCESS)
66
67#define IOCTL_CDROM_DISK_TYPE \
68  CTL_CODE(IOCTL_CDROM_BASE, 0x0010, METHOD_BUFFERED, FILE_ANY_ACCESS)
69
70#define IOCTL_CDROM_READ_Q_CHANNEL \
71  CTL_CODE(IOCTL_CDROM_BASE, 0x000B, METHOD_BUFFERED, FILE_READ_ACCESS)
72
73#define IOCTL_CDROM_READ_TOC \
74  CTL_CODE(IOCTL_CDROM_BASE, 0x0000, METHOD_BUFFERED, FILE_READ_ACCESS)
75
76#define IOCTL_CDROM_READ_TOC_EX \
77  CTL_CODE(IOCTL_CDROM_BASE, 0x0015, METHOD_BUFFERED, FILE_READ_ACCESS)
78
79#define IOCTL_CDROM_RESUME_AUDIO \
80  CTL_CODE(IOCTL_CDROM_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS)
81
82#define IOCTL_CDROM_SEEK_AUDIO_MSF \
83  CTL_CODE(IOCTL_CDROM_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
84
85#define IOCTL_CDROM_SET_VOLUME \
86  CTL_CODE(IOCTL_CDROM_BASE, 0x000A, METHOD_BUFFERED, FILE_READ_ACCESS)
87
88#define IOCTL_CDROM_SIMBAD \
89  CTL_CODE(IOCTL_CDROM_BASE, 0x1003, METHOD_BUFFERED, FILE_READ_ACCESS)
90
91#define IOCTL_CDROM_STOP_AUDIO \
92  CTL_CODE(IOCTL_CDROM_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS)
93
94
95#define MAXIMUM_NUMBER_TRACKS             100
96#define MAXIMUM_CDROM_SIZE                804
97#define MINIMUM_CDROM_READ_TOC_EX_SIZE    2
98
99typedef struct _TRACK_DATA {
100  UCHAR  Reserved;
101  UCHAR  Control : 4;
102  UCHAR  Adr : 4;
103  UCHAR  TrackNumber;
104  UCHAR  Reserved1;
105  UCHAR  Address[4];
106} TRACK_DATA, *PTRACK_DATA;
107
108/* CDROM_DISK_DATA.DiskData flags */
109#define CDROM_DISK_AUDIO_TRACK            0x00000001
110#define CDROM_DISK_DATA_TRACK             0x00000002
111
112typedef struct _CDROM_DISK_DATA {
113  ULONG  DiskData;
114} CDROM_DISK_DATA, *PCDROM_DISK_DATA;
115
116typedef struct _CDROM_PLAY_AUDIO_MSF {
117  UCHAR  StartingM;
118  UCHAR  StartingS;
119  UCHAR  StartingF;
120  UCHAR  EndingM;
121  UCHAR  EndingS;
122  UCHAR  EndingF;
123} CDROM_PLAY_AUDIO_MSF, *PCDROM_PLAY_AUDIO_MSF;
124
125/* CDROM_READ_TOC_EX.Format constants */
126#define CDROM_READ_TOC_EX_FORMAT_TOC      0x00
127#define CDROM_READ_TOC_EX_FORMAT_SESSION  0x01
128#define CDROM_READ_TOC_EX_FORMAT_FULL_TOC 0x02
129#define CDROM_READ_TOC_EX_FORMAT_PMA      0x03
130#define CDROM_READ_TOC_EX_FORMAT_ATIP     0x04
131#define CDROM_READ_TOC_EX_FORMAT_CDTEXT   0x05
132
133typedef struct _CDROM_READ_TOC_EX {
134  UCHAR  Format : 4;
135  UCHAR  Reserved1 : 3;
136  UCHAR  Msf : 1;
137  UCHAR  SessionTrack;
138  UCHAR  Reserved2;
139  UCHAR  Reserved3;
140} CDROM_READ_TOC_EX, *PCDROM_READ_TOC_EX;
141
142typedef struct _CDROM_SEEK_AUDIO_MSF {
143  UCHAR  M;
144  UCHAR  S;
145  UCHAR  F;
146} CDROM_SEEK_AUDIO_MSF, *PCDROM_SEEK_AUDIO_MSF;
147
148/* CDROM_SUB_Q_DATA_FORMAT.Format constants */
149#define IOCTL_CDROM_SUB_Q_CHANNEL         0x00
150#define IOCTL_CDROM_CURRENT_POSITION      0x01
151#define IOCTL_CDROM_MEDIA_CATALOG         0x02
152#define IOCTL_CDROM_TRACK_ISRC            0x03
153
154typedef struct _CDROM_SUB_Q_DATA_FORMAT {
155  UCHAR Format;
156  UCHAR Track;
157} CDROM_SUB_Q_DATA_FORMAT, *PCDROM_SUB_Q_DATA_FORMAT;
158
159typedef struct _CDROM_TOC {
160  UCHAR  Length[2];
161  UCHAR  FirstTrack;
162  UCHAR  LastTrack;
163  TRACK_DATA  TrackData[MAXIMUM_NUMBER_TRACKS];
164} CDROM_TOC, *PCDROM_TOC;
165
166#define CDROM_TOC_SIZE sizeof(CDROM_TOC)
167
168typedef struct _CDROM_TOC_SESSION_DATA {
169  UCHAR Length[2];
170  UCHAR FirstCompleteSession;
171  UCHAR LastCompleteSession;
172  TRACK_DATA TrackData[1];
173} CDROM_TOC_SESSION_DATA, *PCDROM_TOC_SESSION_DATA;
174
175typedef struct _CDROM_TOC_ATIP_DATA_BLOCK {
176  UCHAR  CdrwReferenceSpeed : 3;
177  UCHAR  Reserved3 : 1;
178  UCHAR  WritePower : 3;
179  UCHAR  True1 : 1;
180  UCHAR  Reserved4 : 6;
181  UCHAR  UnrestrictedUse : 1;
182  UCHAR  Reserved5 : 1;
183  UCHAR  A3Valid : 1;
184  UCHAR  A2Valid : 1;
185  UCHAR  A1Valid : 1;
186  UCHAR  Reserved6 : 3;
187  UCHAR  IsCdrw : 1;
188  UCHAR  True2 : 1;
189  UCHAR  Reserved7;
190  UCHAR  LeadInMsf[3];
191  UCHAR  Reserved8;
192  UCHAR  LeadOutMsf[3];
193  UCHAR  Reserved9;
194  UCHAR  A1Values[3];
195  UCHAR  Reserved10;
196  UCHAR  A2Values[3];
197  UCHAR  Reserved11;
198  UCHAR  A3Values[3];
199  UCHAR  Reserved12;
200} CDROM_TOC_ATIP_DATA_BLOCK, *PCDROM_TOC_ATIP_DATA_BLOCK;
201
202typedef struct _CDROM_TOC_ATIP_DATA {
203  UCHAR  Length[2];
204  UCHAR  Reserved1;
205  UCHAR  Reserved2;
206  CDROM_TOC_ATIP_DATA_BLOCK  Descriptors[0];
207} CDROM_TOC_ATIP_DATA, *PCDROM_TOC_ATIP_DATA;
208
209/* CDROM_TOC_CD_TEXT_DATA_BLOCK.PackType constants */
210#define CDROM_CD_TEXT_PACK_ALBUM_NAME 0x80
211#define CDROM_CD_TEXT_PACK_PERFORMER  0x81
212#define CDROM_CD_TEXT_PACK_SONGWRITER 0x82
213#define CDROM_CD_TEXT_PACK_COMPOSER   0x83
214#define CDROM_CD_TEXT_PACK_ARRANGER   0x84
215#define CDROM_CD_TEXT_PACK_MESSAGES   0x85
216#define CDROM_CD_TEXT_PACK_DISC_ID    0x86
217#define CDROM_CD_TEXT_PACK_GENRE      0x87
218#define CDROM_CD_TEXT_PACK_TOC_INFO   0x88
219#define CDROM_CD_TEXT_PACK_TOC_INFO2  0x89
220#define CDROM_CD_TEXT_PACK_UPC_EAN    0x8e
221#define CDROM_CD_TEXT_PACK_SIZE_INFO  0x8f
222
223typedef struct _CDROM_TOC_CD_TEXT_DATA_BLOCK {
224  UCHAR  PackType;
225  UCHAR  TrackNumber : 7;
226  UCHAR  ExtensionFlag : 1;
227  UCHAR  SequenceNumber;
228  UCHAR  CharacterPosition : 4;
229  UCHAR  BlockNumber : 3;
230  UCHAR  Unicode : 1;
231  _ANONYMOUS_UNION union {
232    UCHAR  Text[12];
233    WCHAR  WText[6];
234  } DUMMYUNIONNAME;
235  UCHAR  CRC[2];
236} CDROM_TOC_CD_TEXT_DATA_BLOCK, *PCDROM_TOC_CD_TEXT_DATA_BLOCK;
237
238typedef struct _CDROM_TOC_CD_TEXT_DATA {
239  UCHAR  Length[2];
240  UCHAR  Reserved1;
241  UCHAR  Reserved2;
242  CDROM_TOC_CD_TEXT_DATA_BLOCK  Descriptors[0];
243} CDROM_TOC_CD_TEXT_DATA, *PCDROM_TOC_CD_TEXT_DATA;
244
245/* CDROM_TOC_FULL_TOC_DATA_BLOCK.Adr constants */
246#define ADR_NO_MODE_INFORMATION           0x0
247#define ADR_ENCODES_CURRENT_POSITION      0x1
248#define ADR_ENCODES_MEDIA_CATALOG         0x2
249#define ADR_ENCODES_ISRC                  0x3
250
251typedef struct _CDROM_TOC_FULL_TOC_DATA_BLOCK {
252  UCHAR  SessionNumber;
253  UCHAR  Control : 4;
254  UCHAR  Adr : 4;
255  UCHAR  Reserved1;
256  UCHAR  Point;
257  UCHAR  MsfExtra[3];
258  UCHAR  Zero;
259  UCHAR  Msf[3];
260} CDROM_TOC_FULL_TOC_DATA_BLOCK, *PCDROM_TOC_FULL_TOC_DATA_BLOCK;
261
262typedef struct _CDROM_TOC_FULL_TOC_DATA {
263  UCHAR  Length[2];
264  UCHAR  FirstCompleteSession;
265  UCHAR  LastCompleteSession;
266  CDROM_TOC_FULL_TOC_DATA_BLOCK  Descriptors[0];
267} CDROM_TOC_FULL_TOC_DATA, *PCDROM_TOC_FULL_TOC_DATA;
268
269typedef struct _CDROM_TOC_PMA_DATA {
270  UCHAR  Length[2];
271  UCHAR  Reserved1;
272  UCHAR  Reserved2;
273  CDROM_TOC_FULL_TOC_DATA_BLOCK  Descriptors[0];
274} CDROM_TOC_PMA_DATA, *PCDROM_TOC_PMA_DATA;
275
276/* SUB_Q_HEADER.AudioStatus constants */
277#define AUDIO_STATUS_NOT_SUPPORTED  0x00
278#define AUDIO_STATUS_IN_PROGRESS    0x11
279#define AUDIO_STATUS_PAUSED         0x12
280#define AUDIO_STATUS_PLAY_COMPLETE  0x13
281#define AUDIO_STATUS_PLAY_ERROR     0x14
282#define AUDIO_STATUS_NO_STATUS      0x15
283
284typedef struct _SUB_Q_HEADER {
285  UCHAR  Reserved;
286  UCHAR  AudioStatus;
287  UCHAR  DataLength[2];
288} SUB_Q_HEADER, *PSUB_Q_HEADER;
289
290typedef struct _SUB_Q_MEDIA_CATALOG_NUMBER {
291  SUB_Q_HEADER  Header;
292  UCHAR  FormatCode;
293  UCHAR  Reserved[3];
294  UCHAR  Reserved1 : 7;
295  UCHAR  Mcval :1;
296  UCHAR  MediaCatalog[15];
297} SUB_Q_MEDIA_CATALOG_NUMBER, *PSUB_Q_MEDIA_CATALOG_NUMBER;
298
299typedef struct _SUB_Q_TRACK_ISRC {
300  SUB_Q_HEADER  Header;
301  UCHAR  FormatCode;
302  UCHAR  Reserved0;
303  UCHAR  Track;
304  UCHAR  Reserved1;
305  UCHAR  Reserved2 : 7;
306  UCHAR  Tcval : 1;
307  UCHAR  TrackIsrc[15];
308} SUB_Q_TRACK_ISRC, *PSUB_Q_TRACK_ISRC;
309
310typedef struct _SUB_Q_CURRENT_POSITION {
311  SUB_Q_HEADER  Header;
312  UCHAR  FormatCode;
313  UCHAR  Control : 4;
314  UCHAR  ADR : 4;
315  UCHAR  TrackNumber;
316  UCHAR  IndexNumber;
317  UCHAR  AbsoluteAddress[4];
318  UCHAR  TrackRelativeAddress[4];
319} SUB_Q_CURRENT_POSITION, *PSUB_Q_CURRENT_POSITION;
320
321typedef union _SUB_Q_CHANNEL_DATA {
322  SUB_Q_CURRENT_POSITION  CurrentPosition;
323  SUB_Q_MEDIA_CATALOG_NUMBER  MediaCatalog;
324  SUB_Q_TRACK_ISRC  TrackIsrc;
325} SUB_Q_CHANNEL_DATA, *PSUB_Q_CHANNEL_DATA;
326
327/* CDROM_AUDIO_CONTROL.LbaFormat constants */
328#define AUDIO_WITH_PREEMPHASIS            0x1
329#define DIGITAL_COPY_PERMITTED            0x2
330#define AUDIO_DATA_TRACK                  0x4
331#define TWO_FOUR_CHANNEL_AUDIO            0x8
332
333typedef struct _CDROM_AUDIO_CONTROL {
334	UCHAR  LbaFormat;
335	USHORT  LogicalBlocksPerSecond;
336} CDROM_AUDIO_CONTROL, *PCDROM_AUDIO_CONTROL;
337
338typedef struct _VOLUME_CONTROL {
339  UCHAR  PortVolume[4];
340} VOLUME_CONTROL, *PVOLUME_CONTROL;
341
342typedef enum _TRACK_MODE_TYPE {
343	YellowMode2,
344	XAForm2,
345	CDDA
346} TRACK_MODE_TYPE, *PTRACK_MODE_TYPE;
347
348typedef struct __RAW_READ_INFO {
349	LARGE_INTEGER  DiskOffset;
350	ULONG  SectorCount;
351	TRACK_MODE_TYPE  TrackMode;
352} RAW_READ_INFO, *PRAW_READ_INFO;
353
354#ifdef __cplusplus
355}
356#endif
357
358#endif /* _NTDDCDRM_ */
359