master
  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_SET_SPEED \
 80  CTL_CODE(IOCTL_CDROM_BASE, 0x0018, METHOD_BUFFERED, FILE_READ_ACCESS)
 81
 82#define IOCTL_CDROM_RESUME_AUDIO \
 83  CTL_CODE(IOCTL_CDROM_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS)
 84
 85#define IOCTL_CDROM_SEEK_AUDIO_MSF \
 86  CTL_CODE(IOCTL_CDROM_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
 87
 88#define IOCTL_CDROM_SET_VOLUME \
 89  CTL_CODE(IOCTL_CDROM_BASE, 0x000A, METHOD_BUFFERED, FILE_READ_ACCESS)
 90
 91#define IOCTL_CDROM_SIMBAD \
 92  CTL_CODE(IOCTL_CDROM_BASE, 0x1003, METHOD_BUFFERED, FILE_READ_ACCESS)
 93
 94#define IOCTL_CDROM_STOP_AUDIO \
 95  CTL_CODE(IOCTL_CDROM_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS)
 96
 97
 98#define MAXIMUM_NUMBER_TRACKS             100
 99#define MAXIMUM_CDROM_SIZE                804
100#define MINIMUM_CDROM_READ_TOC_EX_SIZE    2
101
102typedef struct _TRACK_DATA {
103  UCHAR  Reserved;
104  UCHAR  Control : 4;
105  UCHAR  Adr : 4;
106  UCHAR  TrackNumber;
107  UCHAR  Reserved1;
108  UCHAR  Address[4];
109} TRACK_DATA, *PTRACK_DATA;
110
111/* CDROM_DISK_DATA.DiskData flags */
112#define CDROM_DISK_AUDIO_TRACK            0x00000001
113#define CDROM_DISK_DATA_TRACK             0x00000002
114
115typedef struct _CDROM_DISK_DATA {
116  ULONG  DiskData;
117} CDROM_DISK_DATA, *PCDROM_DISK_DATA;
118
119typedef struct _CDROM_PLAY_AUDIO_MSF {
120  UCHAR  StartingM;
121  UCHAR  StartingS;
122  UCHAR  StartingF;
123  UCHAR  EndingM;
124  UCHAR  EndingS;
125  UCHAR  EndingF;
126} CDROM_PLAY_AUDIO_MSF, *PCDROM_PLAY_AUDIO_MSF;
127
128/* CDROM_READ_TOC_EX.Format constants */
129#define CDROM_READ_TOC_EX_FORMAT_TOC      0x00
130#define CDROM_READ_TOC_EX_FORMAT_SESSION  0x01
131#define CDROM_READ_TOC_EX_FORMAT_FULL_TOC 0x02
132#define CDROM_READ_TOC_EX_FORMAT_PMA      0x03
133#define CDROM_READ_TOC_EX_FORMAT_ATIP     0x04
134#define CDROM_READ_TOC_EX_FORMAT_CDTEXT   0x05
135
136typedef struct _CDROM_READ_TOC_EX {
137  UCHAR  Format : 4;
138  UCHAR  Reserved1 : 3;
139  UCHAR  Msf : 1;
140  UCHAR  SessionTrack;
141  UCHAR  Reserved2;
142  UCHAR  Reserved3;
143} CDROM_READ_TOC_EX, *PCDROM_READ_TOC_EX;
144
145typedef struct _CDROM_SEEK_AUDIO_MSF {
146  UCHAR  M;
147  UCHAR  S;
148  UCHAR  F;
149} CDROM_SEEK_AUDIO_MSF, *PCDROM_SEEK_AUDIO_MSF;
150
151/* CDROM_SUB_Q_DATA_FORMAT.Format constants */
152#define IOCTL_CDROM_SUB_Q_CHANNEL         0x00
153#define IOCTL_CDROM_CURRENT_POSITION      0x01
154#define IOCTL_CDROM_MEDIA_CATALOG         0x02
155#define IOCTL_CDROM_TRACK_ISRC            0x03
156
157typedef struct _CDROM_SUB_Q_DATA_FORMAT {
158  UCHAR Format;
159  UCHAR Track;
160} CDROM_SUB_Q_DATA_FORMAT, *PCDROM_SUB_Q_DATA_FORMAT;
161
162typedef struct _CDROM_TOC {
163  UCHAR  Length[2];
164  UCHAR  FirstTrack;
165  UCHAR  LastTrack;
166  TRACK_DATA  TrackData[MAXIMUM_NUMBER_TRACKS];
167} CDROM_TOC, *PCDROM_TOC;
168
169#define CDROM_TOC_SIZE sizeof(CDROM_TOC)
170
171typedef struct _CDROM_TOC_SESSION_DATA {
172  UCHAR Length[2];
173  UCHAR FirstCompleteSession;
174  UCHAR LastCompleteSession;
175  TRACK_DATA TrackData[1];
176} CDROM_TOC_SESSION_DATA, *PCDROM_TOC_SESSION_DATA;
177
178typedef struct _CDROM_TOC_ATIP_DATA_BLOCK {
179  UCHAR  CdrwReferenceSpeed : 3;
180  UCHAR  Reserved3 : 1;
181  UCHAR  WritePower : 3;
182  UCHAR  True1 : 1;
183  UCHAR  Reserved4 : 6;
184  UCHAR  UnrestrictedUse : 1;
185  UCHAR  Reserved5 : 1;
186  UCHAR  A3Valid : 1;
187  UCHAR  A2Valid : 1;
188  UCHAR  A1Valid : 1;
189  UCHAR  Reserved6 : 3;
190  UCHAR  IsCdrw : 1;
191  UCHAR  True2 : 1;
192  UCHAR  Reserved7;
193  UCHAR  LeadInMsf[3];
194  UCHAR  Reserved8;
195  UCHAR  LeadOutMsf[3];
196  UCHAR  Reserved9;
197  UCHAR  A1Values[3];
198  UCHAR  Reserved10;
199  UCHAR  A2Values[3];
200  UCHAR  Reserved11;
201  UCHAR  A3Values[3];
202  UCHAR  Reserved12;
203} CDROM_TOC_ATIP_DATA_BLOCK, *PCDROM_TOC_ATIP_DATA_BLOCK;
204
205typedef struct _CDROM_TOC_ATIP_DATA {
206  UCHAR  Length[2];
207  UCHAR  Reserved1;
208  UCHAR  Reserved2;
209  CDROM_TOC_ATIP_DATA_BLOCK  Descriptors[0];
210} CDROM_TOC_ATIP_DATA, *PCDROM_TOC_ATIP_DATA;
211
212/* CDROM_TOC_CD_TEXT_DATA_BLOCK.PackType constants */
213#define CDROM_CD_TEXT_PACK_ALBUM_NAME 0x80
214#define CDROM_CD_TEXT_PACK_PERFORMER  0x81
215#define CDROM_CD_TEXT_PACK_SONGWRITER 0x82
216#define CDROM_CD_TEXT_PACK_COMPOSER   0x83
217#define CDROM_CD_TEXT_PACK_ARRANGER   0x84
218#define CDROM_CD_TEXT_PACK_MESSAGES   0x85
219#define CDROM_CD_TEXT_PACK_DISC_ID    0x86
220#define CDROM_CD_TEXT_PACK_GENRE      0x87
221#define CDROM_CD_TEXT_PACK_TOC_INFO   0x88
222#define CDROM_CD_TEXT_PACK_TOC_INFO2  0x89
223#define CDROM_CD_TEXT_PACK_UPC_EAN    0x8e
224#define CDROM_CD_TEXT_PACK_SIZE_INFO  0x8f
225
226typedef struct _CDROM_TOC_CD_TEXT_DATA_BLOCK {
227  UCHAR  PackType;
228  UCHAR  TrackNumber : 7;
229  UCHAR  ExtensionFlag : 1;
230  UCHAR  SequenceNumber;
231  UCHAR  CharacterPosition : 4;
232  UCHAR  BlockNumber : 3;
233  UCHAR  Unicode : 1;
234  _ANONYMOUS_UNION union {
235    UCHAR  Text[12];
236    WCHAR  WText[6];
237  } DUMMYUNIONNAME;
238  UCHAR  CRC[2];
239} CDROM_TOC_CD_TEXT_DATA_BLOCK, *PCDROM_TOC_CD_TEXT_DATA_BLOCK;
240
241typedef struct _CDROM_TOC_CD_TEXT_DATA {
242  UCHAR  Length[2];
243  UCHAR  Reserved1;
244  UCHAR  Reserved2;
245  CDROM_TOC_CD_TEXT_DATA_BLOCK  Descriptors[0];
246} CDROM_TOC_CD_TEXT_DATA, *PCDROM_TOC_CD_TEXT_DATA;
247
248/* CDROM_TOC_FULL_TOC_DATA_BLOCK.Adr constants */
249#define ADR_NO_MODE_INFORMATION           0x0
250#define ADR_ENCODES_CURRENT_POSITION      0x1
251#define ADR_ENCODES_MEDIA_CATALOG         0x2
252#define ADR_ENCODES_ISRC                  0x3
253
254typedef struct _CDROM_TOC_FULL_TOC_DATA_BLOCK {
255  UCHAR  SessionNumber;
256  UCHAR  Control : 4;
257  UCHAR  Adr : 4;
258  UCHAR  Reserved1;
259  UCHAR  Point;
260  UCHAR  MsfExtra[3];
261  UCHAR  Zero;
262  UCHAR  Msf[3];
263} CDROM_TOC_FULL_TOC_DATA_BLOCK, *PCDROM_TOC_FULL_TOC_DATA_BLOCK;
264
265typedef struct _CDROM_TOC_FULL_TOC_DATA {
266  UCHAR  Length[2];
267  UCHAR  FirstCompleteSession;
268  UCHAR  LastCompleteSession;
269  CDROM_TOC_FULL_TOC_DATA_BLOCK  Descriptors[0];
270} CDROM_TOC_FULL_TOC_DATA, *PCDROM_TOC_FULL_TOC_DATA;
271
272typedef struct _CDROM_TOC_PMA_DATA {
273  UCHAR  Length[2];
274  UCHAR  Reserved1;
275  UCHAR  Reserved2;
276  CDROM_TOC_FULL_TOC_DATA_BLOCK  Descriptors[0];
277} CDROM_TOC_PMA_DATA, *PCDROM_TOC_PMA_DATA;
278
279/* SUB_Q_HEADER.AudioStatus constants */
280#define AUDIO_STATUS_NOT_SUPPORTED  0x00
281#define AUDIO_STATUS_IN_PROGRESS    0x11
282#define AUDIO_STATUS_PAUSED         0x12
283#define AUDIO_STATUS_PLAY_COMPLETE  0x13
284#define AUDIO_STATUS_PLAY_ERROR     0x14
285#define AUDIO_STATUS_NO_STATUS      0x15
286
287typedef struct _SUB_Q_HEADER {
288  UCHAR  Reserved;
289  UCHAR  AudioStatus;
290  UCHAR  DataLength[2];
291} SUB_Q_HEADER, *PSUB_Q_HEADER;
292
293typedef struct _SUB_Q_MEDIA_CATALOG_NUMBER {
294  SUB_Q_HEADER  Header;
295  UCHAR  FormatCode;
296  UCHAR  Reserved[3];
297  UCHAR  Reserved1 : 7;
298  UCHAR  Mcval :1;
299  UCHAR  MediaCatalog[15];
300} SUB_Q_MEDIA_CATALOG_NUMBER, *PSUB_Q_MEDIA_CATALOG_NUMBER;
301
302typedef struct _SUB_Q_TRACK_ISRC {
303  SUB_Q_HEADER  Header;
304  UCHAR  FormatCode;
305  UCHAR  Reserved0;
306  UCHAR  Track;
307  UCHAR  Reserved1;
308  UCHAR  Reserved2 : 7;
309  UCHAR  Tcval : 1;
310  UCHAR  TrackIsrc[15];
311} SUB_Q_TRACK_ISRC, *PSUB_Q_TRACK_ISRC;
312
313typedef struct _SUB_Q_CURRENT_POSITION {
314  SUB_Q_HEADER  Header;
315  UCHAR  FormatCode;
316  UCHAR  Control : 4;
317  UCHAR  ADR : 4;
318  UCHAR  TrackNumber;
319  UCHAR  IndexNumber;
320  UCHAR  AbsoluteAddress[4];
321  UCHAR  TrackRelativeAddress[4];
322} SUB_Q_CURRENT_POSITION, *PSUB_Q_CURRENT_POSITION;
323
324typedef union _SUB_Q_CHANNEL_DATA {
325  SUB_Q_CURRENT_POSITION  CurrentPosition;
326  SUB_Q_MEDIA_CATALOG_NUMBER  MediaCatalog;
327  SUB_Q_TRACK_ISRC  TrackIsrc;
328} SUB_Q_CHANNEL_DATA, *PSUB_Q_CHANNEL_DATA;
329
330/* CDROM_AUDIO_CONTROL.LbaFormat constants */
331#define AUDIO_WITH_PREEMPHASIS            0x1
332#define DIGITAL_COPY_PERMITTED            0x2
333#define AUDIO_DATA_TRACK                  0x4
334#define TWO_FOUR_CHANNEL_AUDIO            0x8
335
336typedef struct _CDROM_AUDIO_CONTROL {
337	UCHAR  LbaFormat;
338	USHORT  LogicalBlocksPerSecond;
339} CDROM_AUDIO_CONTROL, *PCDROM_AUDIO_CONTROL;
340
341typedef struct _VOLUME_CONTROL {
342  UCHAR  PortVolume[4];
343} VOLUME_CONTROL, *PVOLUME_CONTROL;
344
345typedef enum _TRACK_MODE_TYPE {
346	YellowMode2,
347	XAForm2,
348	CDDA
349} TRACK_MODE_TYPE, *PTRACK_MODE_TYPE;
350
351typedef struct __RAW_READ_INFO {
352	LARGE_INTEGER  DiskOffset;
353	ULONG  SectorCount;
354	TRACK_MODE_TYPE  TrackMode;
355} RAW_READ_INFO, *PRAW_READ_INFO;
356
357typedef enum _CDROM_SPEED_REQUEST {
358  CdromSetSpeed,
359  CdromSetStreaming
360} CDROM_SPEED_REQUEST, *PCDROM_SPEED_REQUEST;
361
362typedef enum _WRITE_ROTATION {
363  CdromDefaultRotation,
364  CdromCAVRotation
365} WRITE_ROTATION, *PWRITE_ROTATION;
366
367typedef struct _CDROM_SET_SPEED {
368  CDROM_SPEED_REQUEST  RequestType;
369  USHORT  ReadSpeed;
370  USHORT  WriteSpeed;
371  WRITE_ROTATION  RotationControl;
372} CDROM_SET_SPEED, *PCDROM_SET_SPEED;
373
374#ifdef __cplusplus
375}
376#endif
377
378#endif /* _NTDDCDRM_ */