1 /*****************************************************************************
2  * ioctl.h: DVD ioctl replacement function
3  *****************************************************************************
4  * Copyright (C) 1999-2001 VideoLAN
5  *
6  * Authors: Sam Hocevar <sam@zoy.org>
7  *
8  * libdvdcss is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * libdvdcss is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with libdvdcss; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21  *****************************************************************************/
22 
23 #ifndef DVDCSS_IOCTL_H
24 #define DVDCSS_IOCTL_H
25 
26 #include <stdint.h>
27 
28 int ioctl_ReadCopyright     ( int, int, int * );
29 int ioctl_ReadDiscKey       ( int, const int *, uint8_t * );
30 int ioctl_ReadTitleKey      ( int, const int *, int, uint8_t * );
31 int ioctl_ReportAgid        ( int, int * );
32 int ioctl_ReportChallenge   ( int, const int *, uint8_t * );
33 int ioctl_ReportKey1        ( int, const int *, uint8_t * );
34 int ioctl_ReportASF         ( int, int * );
35 int ioctl_InvalidateAgid    ( int, int * );
36 int ioctl_SendChallenge     ( int, const int *, const uint8_t * );
37 int ioctl_SendKey2          ( int, const int *, const uint8_t * );
38 int ioctl_ReportRPC         ( int, int *, int *, int * );
39 
40 #define DVD_DISCKEY_SIZE 2048
41 
42 /*****************************************************************************
43  * Common macros, OS-specific
44  *****************************************************************************/
45 #if defined( __HAIKU__ )
46 #define INIT_RDC( TYPE, SIZE ) \
47     raw_device_command rdc = { 0 }; \
48     uint8_t p_buffer[ (SIZE)+1 ]; \
49     rdc.data = (char *)p_buffer; \
50     rdc.data_length = (SIZE); \
51     BeInitRDC( &rdc, (TYPE) );
52 #elif defined( SOLARIS_USCSI )
53 #define INIT_USCSI( TYPE, SIZE ) \
54     struct uscsi_cmd sc = { 0 }; \
55     union scsi_cdb rs_cdb; \
56     uint8_t p_buffer[ (SIZE)+1 ]; \
57     sc.uscsi_cdb = (caddr_t)&rs_cdb; \
58     sc.uscsi_bufaddr = (caddr_t)p_buffer; \
59     sc.uscsi_buflen = (SIZE); \
60     SolarisInitUSCSI( &sc, (TYPE) );
61 #elif defined( DARWIN_DVD_IOCTL )
62 #define INIT_DVDIOCTL( DKDVD_TYPE, BUFFER_TYPE, FORMAT ) \
63     DKDVD_TYPE dvd = { 0 }; \
64     BUFFER_TYPE dvdbs = { 0 }; \
65     dvd.format = FORMAT; \
66     dvd.buffer = &dvdbs; \
67     dvd.bufferLength = sizeof(dvdbs);
68 #elif defined( __QNXNTO__ )
69 #define INIT_CPT( TYPE, SIZE ) \
70     CAM_PASS_THRU * p_cpt = { 0 }; \
71     uint8_t * p_buffer; \
72     int structSize = sizeof( CAM_PASS_THRU ) + (SIZE); \
73     p_cpt = (CAM_PASS_THRU *) malloc ( structSize ); \
74     p_buffer = (uint8_t *) p_cpt + sizeof( CAM_PASS_THRU ); \
75       p_cpt->cam_data_ptr = sizeof( CAM_PASS_THRU ); \
76       p_cpt->cam_dxfer_len = (SIZE); \
77     QNXInitCPT( p_cpt, (TYPE) );
78 #elif defined( __OS2__ )
79 #define INIT_SSC( TYPE, SIZE ) \
80     struct OS2_ExecSCSICmd sdc = { 0 }; \
81     uint8_t p_buffer[ (SIZE) + 1 ] = { 0 }; \
82     unsigned long ulParamLen; \
83     unsigned long ulDataLen; \
84     sdc.data_length = (SIZE); \
85     ulParamLen = sizeof(sdc); \
86     OS2InitSDC( &sdc, (TYPE) )
87 #endif
88 
89 /*****************************************************************************
90  * Additional types, OpenBSD-specific
91  *****************************************************************************/
92 #if defined( HAVE_OPENBSD_DVD_STRUCT )
93 typedef union dvd_struct dvd_struct;
94 typedef union dvd_authinfo dvd_authinfo;
95 #endif
96 
97 /*****************************************************************************
98  * Various DVD I/O tables
99  *****************************************************************************/
100 /* The generic packet command opcodes for CD/DVD Logical Units,
101  * From Table 57 of the SFF8090 Ver. 3 (Mt. Fuji) draft standard. */
102 #define GPCMD_READ_DVD_STRUCTURE 0xad
103 #define GPCMD_REPORT_KEY         0xa4
104 #define GPCMD_SEND_KEY           0xa3
105  /* DVD struct types */
106 #define DVD_STRUCT_PHYSICAL      0x00
107 #define DVD_STRUCT_COPYRIGHT     0x01
108 #define DVD_STRUCT_DISCKEY       0x02
109 #define DVD_STRUCT_BCA           0x03
110 #define DVD_STRUCT_MANUFACT      0x04
111  /* Key formats */
112 #define DVD_REPORT_AGID          0x00
113 #define DVD_REPORT_CHALLENGE     0x01
114 #define DVD_SEND_CHALLENGE       0x01
115 #define DVD_REPORT_KEY1          0x02
116 #define DVD_SEND_KEY2            0x03
117 #define DVD_REPORT_TITLE_KEY     0x04
118 #define DVD_REPORT_ASF           0x05
119 #define DVD_SEND_RPC             0x06
120 #define DVD_REPORT_RPC           0x08
121 #define DVDCSS_INVALIDATE_AGID   0x3f
122 
123 /*****************************************************************************
124  * Win32-ioctl-specific
125  *****************************************************************************/
126 #if defined( _WIN32 )
127 
128 #define _WIN32_LEAN_AND_MEAN
129 #include <windows.h>
130 #include <winioctl.h>
131 
132 #define IOCTL_DVD_START_SESSION         CTL_CODE(FILE_DEVICE_DVD, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS)
133 #define IOCTL_DVD_READ_KEY              CTL_CODE(FILE_DEVICE_DVD, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS)
134 #define IOCTL_DVD_SEND_KEY              CTL_CODE(FILE_DEVICE_DVD, 0x0402, METHOD_BUFFERED, FILE_READ_ACCESS)
135 #define IOCTL_DVD_END_SESSION           CTL_CODE(FILE_DEVICE_DVD, 0x0403, METHOD_BUFFERED, FILE_READ_ACCESS)
136 #define IOCTL_DVD_GET_REGION            CTL_CODE(FILE_DEVICE_DVD, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS)
137 #define IOCTL_DVD_SEND_KEY2             CTL_CODE(FILE_DEVICE_DVD, 0x0406, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
138 #define IOCTL_DVD_READ_STRUCTURE        CTL_CODE(FILE_DEVICE_DVD, 0x0450, METHOD_BUFFERED, FILE_READ_ACCESS)
139 #define IOCTL_SCSI_PASS_THROUGH_DIRECT  CTL_CODE(FILE_DEVICE_CONTROLLER, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
140 
141 #define DVD_CHALLENGE_KEY_LENGTH        (12 + sizeof(DVD_COPY_PROTECT_KEY))
142 #define DVD_BUS_KEY_LENGTH              (8 + sizeof(DVD_COPY_PROTECT_KEY))
143 #define DVD_TITLE_KEY_LENGTH            (8 + sizeof(DVD_COPY_PROTECT_KEY))
144 #define DVD_DISK_KEY_LENGTH             (2048 + sizeof(DVD_COPY_PROTECT_KEY))
145 #define DVD_RPC_KEY_LENGTH              (sizeof(DVD_RPC_KEY) + sizeof(DVD_COPY_PROTECT_KEY))
146 #define DVD_ASF_LENGTH                  (sizeof(DVD_ASF) + sizeof(DVD_COPY_PROTECT_KEY))
147 
148 #define DVD_COPYRIGHT_MASK              0x00000040
149 #define DVD_NOT_COPYRIGHTED             0x00000000
150 #define DVD_COPYRIGHTED                 0x00000040
151 
152 #define DVD_SECTOR_PROTECT_MASK         0x00000020
153 #define DVD_SECTOR_NOT_PROTECTED        0x00000000
154 #define DVD_SECTOR_PROTECTED            0x00000020
155 
156 #define SCSI_IOCTL_DATA_OUT             0
157 #define SCSI_IOCTL_DATA_IN              1
158 
159 typedef ULONG DVD_SESSION_ID, *PDVD_SESSION_ID;
160 
161 typedef enum DVD_STRUCTURE_FORMAT {
162     DvdPhysicalDescriptor,
163     DvdCopyrightDescriptor,
164     DvdDiskKeyDescriptor,
165     DvdBCADescriptor,
166     DvdManufacturerDescriptor,
167     DvdMaxDescriptor
168 } DVD_STRUCTURE_FORMAT, *PDVD_STRUCTURE_FORMAT;
169 
170 typedef struct DVD_READ_STRUCTURE {
171     LARGE_INTEGER BlockByteOffset;
172     DVD_STRUCTURE_FORMAT Format;
173     DVD_SESSION_ID SessionId;
174     UCHAR LayerNumber;
175 } DVD_READ_STRUCTURE, *PDVD_READ_STRUCTURE;
176 
177 typedef struct DVD_COPYRIGHT_DESCRIPTOR {
178     UCHAR CopyrightProtectionType;
179     UCHAR RegionManagementInformation;
180     USHORT Reserved;
181 } DVD_COPYRIGHT_DESCRIPTOR, *PDVD_COPYRIGHT_DESCRIPTOR;
182 
183 typedef enum
184 {
185     DvdChallengeKey = 0x01,
186     DvdBusKey1,
187     DvdBusKey2,
188     DvdTitleKey,
189     DvdAsf,
190     DvdSetRpcKey = 0x6,
191     DvdGetRpcKey = 0x8,
192     DvdDiskKey = 0x80,
193     DvdInvalidateAGID = 0x3f
194 } DVD_KEY_TYPE;
195 
196 typedef struct DVD_COPY_PROTECT_KEY
197 {
198     ULONG KeyLength;
199     DVD_SESSION_ID SessionId;
200     DVD_KEY_TYPE KeyType;
201     ULONG KeyFlags;
202     union
203     {
204         struct
205         {
206             ULONG FileHandle;
207             ULONG Reserved;   // used for NT alignment
208         };
209         LARGE_INTEGER TitleOffset;
210     } Parameters;
211     UCHAR KeyData[0];
212 } DVD_COPY_PROTECT_KEY, *PDVD_COPY_PROTECT_KEY;
213 
214 typedef struct DVD_ASF
215 {
216     UCHAR Reserved0[3];
217     UCHAR SuccessFlag:1;
218     UCHAR Reserved1:7;
219 } DVD_ASF, * PDVD_ASF;
220 
221 typedef struct DVD_RPC_KEY
222 {
223     UCHAR UserResetsAvailable:3;
224     UCHAR ManufacturerResetsAvailable:3;
225     UCHAR TypeCode:2;
226     UCHAR RegionMask;
227     UCHAR RpcScheme;
228     UCHAR Reserved2[1];
229 } DVD_RPC_KEY, * PDVD_RPC_KEY;
230 
231 typedef struct SCSI_PASS_THROUGH_DIRECT
232 {
233     USHORT Length;
234     UCHAR ScsiStatus;
235     UCHAR PathId;
236     UCHAR TargetId;
237     UCHAR Lun;
238     UCHAR CdbLength;
239     UCHAR SenseInfoLength;
240     UCHAR DataIn;
241     ULONG DataTransferLength;
242     ULONG TimeOutValue;
243     PVOID DataBuffer;
244     ULONG SenseInfoOffset;
245     UCHAR Cdb[16];
246 } SCSI_PASS_THROUGH_DIRECT, *PSCSI_PASS_THROUGH_DIRECT;
247 
248 #endif /* defined( _WIN32 ) */
249 
250 /*****************************************************************************
251  * OS/2-ioctl-specific
252  *****************************************************************************/
253 #if defined( __OS2__ )
254 
255 #define CDROMDISK_EXECMD      0x7A
256 
257 #define EX_DIRECTION_IN       0x01
258 #define EX_PLAYING_CHK        0x02
259 
260 #pragma pack(1)
261 
262 struct OS2_ExecSCSICmd
263 {
264     unsigned long   id_code;      // 'CD01'
265     unsigned short  data_length;  // length of the Data Packet
266     unsigned short  cmd_length;   // length of the Command Buffer
267     unsigned short  flags;        // flags
268     unsigned char   command[16];  // Command Buffer for SCSI command
269 
270 } OS2_ExecSCSICmd;
271 
272 #pragma pack()
273 
274 #endif /* defined( __OS2__ ) */
275 
276 #endif /* DVDCSS_IOCTL_H */
277