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