Mercurial > mplayer.hg
annotate libmpdvdkit2/ioctl.c @ 8732:450015fb59e6
FreeBSD fix
author | nexus |
---|---|
date | Fri, 03 Jan 2003 12:14:34 +0000 |
parents | 0211de3039eb |
children | c932c17042bf |
rev | line source |
---|---|
7027 | 1 /***************************************************************************** |
2 * ioctl.c: DVD ioctl replacement function | |
3 ***************************************************************************** | |
4 * Copyright (C) 1999-2001 VideoLAN | |
5 * $Id$ | |
6 * | |
7 * Authors: Markus Kuespert <ltlBeBoy@beosmail.com> | |
8 * Samuel Hocevar <sam@zoy.org> | |
9 * Jon Lech Johansen <jon-vl@nanocrew.net> | |
10 * Håkan Hjort <d95hjort@dtek.chalmers.se> | |
11 * Eugenio Jarosiewicz <ej0@cise.ufl.edu> | |
12 * David Siebörger <drs-videolan@rucus.ru.ac.za> | |
13 * Alex Strelnikov <lelik@os2.ru> | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
14 * Gildas Bazin <gbazin@netcourrier.com> |
7027 | 15 * |
16 * This program is free software; you can redistribute it and/or modify | |
17 * it under the terms of the GNU General Public License as published by | |
18 * the Free Software Foundation; either version 2 of the License, or | |
19 * (at your option) any later version. | |
20 * | |
21 * This program is distributed in the hope that it will be useful, | |
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
24 * GNU General Public License for more details. | |
25 * | |
26 * You should have received a copy of the GNU General Public License | |
27 * along with this program; if not, write to the Free Software | |
28 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. | |
29 *****************************************************************************/ | |
30 | |
31 /***************************************************************************** | |
32 * Preamble | |
33 *****************************************************************************/ | |
34 #include "config.h" | |
35 | |
36 #include <stdio.h> | |
37 | |
38 #include <string.h> /* memcpy(), memset() */ | |
39 #include <sys/types.h> | |
40 | |
41 #if defined( WIN32 ) | |
8142 | 42 # undef DATADIR /* clashes with /usr/include/w32api/objidl.h */ |
7027 | 43 # include <windows.h> |
44 # include <winioctl.h> | |
45 #elif defined ( SYS_OS2 ) | |
46 # define INCL_DOSFILEMGR | |
47 # define INCL_DOSDEVICES | |
48 # define INCL_DOSDEVIOCTL | |
49 # define INCL_DOSERRORS | |
50 # include <os2.h> | |
51 # include <sys/ioctl.h> | |
52 #else | |
53 # include <netinet/in.h> | |
54 # include <sys/ioctl.h> | |
55 #endif | |
56 | |
57 #ifdef DVD_STRUCT_IN_SYS_CDIO_H | |
58 # include <sys/cdio.h> | |
59 #endif | |
60 #ifdef DVD_STRUCT_IN_SYS_DVDIO_H | |
61 # include <sys/dvdio.h> | |
62 #endif | |
63 #ifdef DVD_STRUCT_IN_LINUX_CDROM_H | |
64 # include <linux/cdrom.h> | |
65 #endif | |
66 #ifdef DVD_STRUCT_IN_DVD_H | |
67 # include <dvd.h> | |
68 #endif | |
69 #ifdef DVD_STRUCT_IN_BSDI_DVDIOCTL_DVD_H | |
70 # include "bsdi_dvd.h" | |
71 #endif | |
72 #ifdef SYS_BEOS | |
73 # include <malloc.h> | |
74 # include <scsi.h> | |
75 #endif | |
76 #ifdef HPUX_SCTL_IO | |
77 # include <sys/scsi.h> | |
78 #endif | |
79 #ifdef SOLARIS_USCSI | |
8575 | 80 # include <dlfcn.h> |
7027 | 81 # include <unistd.h> |
82 # include <stropts.h> | |
83 # include <sys/scsi/scsi_types.h> | |
84 # include <sys/scsi/impl/uscsi.h> | |
8575 | 85 # include <sys/smedia.h> |
7027 | 86 #endif |
87 #ifdef DARWIN_DVD_IOCTL | |
88 # include <IOKit/storage/IODVDMediaBSDClient.h> | |
89 #endif | |
90 #ifdef __QNXNTO__ | |
91 # include <sys/mman.h> | |
92 # include <sys/dcmd_cam.h> | |
93 #endif | |
94 | |
95 #include "common.h" | |
96 | |
97 #include "ioctl.h" | |
98 | |
99 /***************************************************************************** | |
100 * Local prototypes, BeOS specific | |
101 *****************************************************************************/ | |
102 #if defined( SYS_BEOS ) | |
103 static void BeInitRDC ( raw_device_command *, int ); | |
104 #endif | |
105 | |
106 /***************************************************************************** | |
107 * Local prototypes, HP-UX specific | |
108 *****************************************************************************/ | |
109 #if defined( HPUX_SCTL_IO ) | |
110 static void HPUXInitSCTL ( struct sctl_io *sctl_io, int i_type ); | |
111 #endif | |
112 | |
113 /***************************************************************************** | |
114 * Local prototypes, Solaris specific | |
115 *****************************************************************************/ | |
116 #if defined( SOLARIS_USCSI ) | |
117 static void SolarisInitUSCSI( struct uscsi_cmd *p_sc, int i_type ); | |
8575 | 118 static int SolarisSendUSCSI( int fd, struct uscsi_cmd *p_sc ); |
7027 | 119 #endif |
120 | |
121 /***************************************************************************** | |
122 * Local prototypes, win32 (aspi) specific | |
123 *****************************************************************************/ | |
124 #if defined( WIN32 ) | |
125 static void WinInitSSC ( struct SRB_ExecSCSICmd *, int ); | |
126 static int WinSendSSC ( int, struct SRB_ExecSCSICmd * ); | |
127 #endif | |
128 | |
129 /***************************************************************************** | |
130 * Local prototypes, QNX specific | |
131 *****************************************************************************/ | |
132 #if defined( __QNXNTO__ ) | |
133 static void QNXInitCPT ( CAM_PASS_THRU *, int ); | |
134 #endif | |
135 | |
136 /***************************************************************************** | |
137 * Local prototypes, OS2 specific | |
138 *****************************************************************************/ | |
139 #if defined( SYS_OS2 ) | |
140 static void OS2InitSDC( struct OS2_ExecSCSICmd *, int ); | |
141 #endif | |
142 | |
143 /***************************************************************************** | |
144 * ioctl_ReadCopyright: check whether the disc is encrypted or not | |
145 *****************************************************************************/ | |
146 int ioctl_ReadCopyright( int i_fd, int i_layer, int *pi_copyright ) | |
147 { | |
148 int i_ret; | |
149 | |
150 #if defined( HAVE_LINUX_DVD_STRUCT ) | |
151 dvd_struct dvd; | |
152 | |
153 memset( &dvd, 0, sizeof( dvd ) ); | |
154 dvd.type = DVD_STRUCT_COPYRIGHT; | |
155 dvd.copyright.layer_num = i_layer; | |
156 | |
157 i_ret = ioctl( i_fd, DVD_READ_STRUCT, &dvd ); | |
158 | |
159 *pi_copyright = dvd.copyright.cpst; | |
160 | |
161 #elif defined( HAVE_BSD_DVD_STRUCT ) | |
162 struct dvd_struct dvd; | |
163 | |
164 memset( &dvd, 0, sizeof( dvd ) ); | |
165 dvd.format = DVD_STRUCT_COPYRIGHT; | |
166 dvd.layer_num = i_layer; | |
167 | |
168 i_ret = ioctl( i_fd, DVDIOCREADSTRUCTURE, &dvd ); | |
169 | |
170 *pi_copyright = dvd.cpst; | |
171 | |
172 #elif defined( SYS_BEOS ) | |
173 INIT_RDC( GPCMD_READ_DVD_STRUCTURE, 8 ); | |
174 | |
175 rdc.command[ 6 ] = i_layer; | |
176 rdc.command[ 7 ] = DVD_STRUCT_COPYRIGHT; | |
177 | |
178 i_ret = ioctl( i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) ); | |
179 | |
180 *pi_copyright = p_buffer[ 4 ]; | |
181 | |
182 #elif defined( HPUX_SCTL_IO ) | |
183 INIT_SCTL_IO( GPCMD_READ_DVD_STRUCTURE, 8 ); | |
184 | |
185 sctl_io.cdb[ 6 ] = i_layer; | |
186 sctl_io.cdb[ 7 ] = DVD_STRUCT_COPYRIGHT; | |
187 | |
188 i_ret = ioctl( i_fd, SIOC_IO, &sctl_io ); | |
189 | |
190 *pi_copyright = p_buffer[ 4 ]; | |
191 | |
192 #elif defined( SOLARIS_USCSI ) | |
193 INIT_USCSI( GPCMD_READ_DVD_STRUCTURE, 8 ); | |
194 | |
195 rs_cdb.cdb_opaque[ 6 ] = i_layer; | |
196 rs_cdb.cdb_opaque[ 7 ] = DVD_STRUCT_COPYRIGHT; | |
197 | |
8575 | 198 i_ret = SolarisSendUSCSI(i_fd, &sc); |
7027 | 199 |
200 if( i_ret < 0 || sc.uscsi_status ) { | |
201 i_ret = -1; | |
202 } | |
203 | |
204 *pi_copyright = p_buffer[ 4 ]; | |
205 /* s->copyright.rmi = p_buffer[ 5 ]; */ | |
206 | |
207 #elif defined( DARWIN_DVD_IOCTL ) | |
208 INIT_DVDIOCTL( dk_dvd_read_structure_t, DVDCopyrightInfo, | |
209 kDVDStructureFormatCopyrightInfo ); | |
210 | |
211 dvd.layer = i_layer; | |
212 | |
213 i_ret = ioctl( i_fd, DKIOCDVDREADSTRUCTURE, &dvd ); | |
214 | |
215 *pi_copyright = dvdbs.copyrightProtectionSystemType; | |
216 | |
217 #elif defined( WIN32 ) | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
218 if( WIN2K ) /* NT/2k/XP */ |
7027 | 219 { |
220 DWORD tmp; | |
221 u8 p_buffer[ 8 ]; | |
222 SCSI_PASS_THROUGH_DIRECT sptd; | |
223 | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
224 /* When using IOCTL_DVD_READ_STRUCTURE and |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
225 DVD_COPYRIGHT_DESCRIPTOR, CopyrightProtectionType |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
226 seems to be always 6 ??? |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
227 To work around this M$ bug we try to send a raw scsi command |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
228 instead (if we've got enough privileges to do so). */ |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
229 |
7027 | 230 memset( &sptd, 0, sizeof( sptd ) ); |
231 memset( &p_buffer, 0, sizeof( p_buffer ) ); | |
232 | |
233 sptd.Length = sizeof( SCSI_PASS_THROUGH_DIRECT ); | |
234 sptd.CdbLength = 12; | |
235 sptd.DataIn = SCSI_IOCTL_DATA_IN; | |
236 sptd.DataTransferLength = 8; | |
237 sptd.TimeOutValue = 2; | |
238 sptd.DataBuffer = p_buffer; | |
239 sptd.Cdb[ 0 ] = GPCMD_READ_DVD_STRUCTURE; | |
240 sptd.Cdb[ 6 ] = i_layer; | |
241 sptd.Cdb[ 7 ] = DVD_STRUCT_COPYRIGHT; | |
242 sptd.Cdb[ 8 ] = (8 >> 8) & 0xff; | |
243 sptd.Cdb[ 9 ] = 8 & 0xff; | |
244 | |
245 i_ret = DeviceIoControl( (HANDLE) i_fd, | |
246 IOCTL_SCSI_PASS_THROUGH_DIRECT, | |
247 &sptd, sizeof( SCSI_PASS_THROUGH_DIRECT ), | |
248 &sptd, sizeof( SCSI_PASS_THROUGH_DIRECT ), | |
249 &tmp, NULL ) ? 0 : -1; | |
250 | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
251 if( i_ret == 0 ) |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
252 { |
7027 | 253 *pi_copyright = p_buffer[ 4 ]; |
254 } | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
255 } |
7027 | 256 else |
257 { | |
258 INIT_SSC( GPCMD_READ_DVD_STRUCTURE, 8 ); | |
259 | |
260 ssc.CDBByte[ 6 ] = i_layer; | |
261 ssc.CDBByte[ 7 ] = DVD_STRUCT_COPYRIGHT; | |
262 | |
263 i_ret = WinSendSSC( i_fd, &ssc ); | |
264 | |
265 *pi_copyright = p_buffer[ 4 ]; | |
266 } | |
267 | |
268 #elif defined( __QNXNTO__ ) | |
269 | |
270 INIT_CPT( GPCMD_READ_DVD_STRUCTURE, 8 ); | |
271 | |
272 p_cpt->cam_cdb[ 6 ] = i_layer; | |
273 p_cpt->cam_cdb[ 7 ] = DVD_STRUCT_COPYRIGHT; | |
274 | |
275 i_ret = devctl(i_fd, DCMD_CAM_PASS_THRU, p_cpt, structSize, NULL); | |
276 | |
277 *pi_copyright = p_buffer[4]; | |
278 | |
279 #elif defined( SYS_OS2 ) | |
280 INIT_SSC( GPCMD_READ_DVD_STRUCTURE, 8 ); | |
281 | |
282 sdc.command[ 6 ] = i_layer; | |
283 sdc.command[ 7 ] = DVD_STRUCT_COPYRIGHT; | |
284 | |
285 i_ret = DosDevIOCtl(i_fd, IOCTL_CDROMDISK, CDROMDISK_EXECMD, | |
286 &sdc, sizeof(sdc), &ulParamLen, | |
287 p_buffer, sizeof(p_buffer), &ulDataLen); | |
288 | |
289 *pi_copyright = p_buffer[ 4 ]; | |
290 | |
291 #else | |
292 # error "DVD ioctls are unavailable on this system" | |
293 | |
294 #endif | |
295 return i_ret; | |
296 } | |
297 | |
298 /***************************************************************************** | |
299 * ioctl_ReadDiscKey: get the disc key | |
300 *****************************************************************************/ | |
301 int ioctl_ReadDiscKey( int i_fd, int *pi_agid, u8 *p_key ) | |
302 { | |
303 int i_ret; | |
304 | |
305 #if defined( HAVE_LINUX_DVD_STRUCT ) | |
306 dvd_struct dvd; | |
307 | |
308 memset( &dvd, 0, sizeof( dvd ) ); | |
309 dvd.type = DVD_STRUCT_DISCKEY; | |
310 dvd.disckey.agid = *pi_agid; | |
311 memset( dvd.disckey.value, 0, DVD_DISCKEY_SIZE ); | |
312 | |
313 i_ret = ioctl( i_fd, DVD_READ_STRUCT, &dvd ); | |
314 | |
315 if( i_ret < 0 ) | |
316 { | |
317 return i_ret; | |
318 } | |
319 | |
320 memcpy( p_key, dvd.disckey.value, DVD_DISCKEY_SIZE ); | |
321 | |
322 #elif defined( HAVE_BSD_DVD_STRUCT ) | |
323 struct dvd_struct dvd; | |
324 | |
325 memset( &dvd, 0, sizeof( dvd ) ); | |
326 dvd.format = DVD_STRUCT_DISCKEY; | |
327 dvd.agid = *pi_agid; | |
328 memset( dvd.data, 0, DVD_DISCKEY_SIZE ); | |
329 | |
330 i_ret = ioctl( i_fd, DVDIOCREADSTRUCTURE, &dvd ); | |
331 | |
332 if( i_ret < 0 ) | |
333 { | |
334 return i_ret; | |
335 } | |
336 | |
337 memcpy( p_key, dvd.data, DVD_DISCKEY_SIZE ); | |
338 | |
339 #elif defined( SYS_BEOS ) | |
340 INIT_RDC( GPCMD_READ_DVD_STRUCTURE, DVD_DISCKEY_SIZE + 4 ); | |
341 | |
342 rdc.command[ 7 ] = DVD_STRUCT_DISCKEY; | |
343 rdc.command[ 10 ] = *pi_agid << 6; | |
344 | |
345 i_ret = ioctl( i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) ); | |
346 | |
347 if( i_ret < 0 ) | |
348 { | |
349 return i_ret; | |
350 } | |
351 | |
352 memcpy( p_key, p_buffer + 4, DVD_DISCKEY_SIZE ); | |
353 | |
354 #elif defined( HPUX_SCTL_IO ) | |
355 INIT_SCTL_IO( GPCMD_READ_DVD_STRUCTURE, DVD_DISCKEY_SIZE + 4 ); | |
356 | |
357 sctl_io.cdb[ 7 ] = DVD_STRUCT_DISCKEY; | |
358 sctl_io.cdb[ 10 ] = *pi_agid << 6; | |
359 | |
360 i_ret = ioctl( i_fd, SIOC_IO, &sctl_io ); | |
361 | |
362 if( i_ret < 0 ) | |
363 { | |
364 return i_ret; | |
365 } | |
366 | |
367 memcpy( p_key, p_buffer + 4, DVD_DISCKEY_SIZE ); | |
368 | |
369 #elif defined( SOLARIS_USCSI ) | |
370 INIT_USCSI( GPCMD_READ_DVD_STRUCTURE, DVD_DISCKEY_SIZE + 4 ); | |
371 | |
372 rs_cdb.cdb_opaque[ 7 ] = DVD_STRUCT_DISCKEY; | |
373 rs_cdb.cdb_opaque[ 10 ] = *pi_agid << 6; | |
374 | |
8575 | 375 i_ret = SolarisSendUSCSI( i_fd, &sc ); |
7027 | 376 |
377 if( i_ret < 0 || sc.uscsi_status ) | |
378 { | |
379 i_ret = -1; | |
380 return i_ret; | |
381 } | |
382 | |
383 memcpy( p_key, p_buffer + 4, DVD_DISCKEY_SIZE ); | |
384 | |
385 #elif defined( DARWIN_DVD_IOCTL ) | |
386 INIT_DVDIOCTL( dk_dvd_read_structure_t, DVDDiscKeyInfo, | |
387 kDVDStructureFormatDiscKeyInfo ); | |
388 | |
389 dvd.grantID = *pi_agid; | |
390 | |
391 i_ret = ioctl( i_fd, DKIOCDVDREADSTRUCTURE, &dvd ); | |
392 | |
393 memcpy( p_key, dvdbs.discKeyStructures, DVD_DISCKEY_SIZE ); | |
394 | |
395 #elif defined( WIN32 ) | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
396 if( WIN2K ) /* NT/2k/XP */ |
7027 | 397 { |
398 DWORD tmp; | |
399 u8 buffer[DVD_DISK_KEY_LENGTH]; | |
400 PDVD_COPY_PROTECT_KEY key = (PDVD_COPY_PROTECT_KEY) &buffer; | |
401 | |
402 memset( &buffer, 0, sizeof( buffer ) ); | |
403 | |
404 key->KeyLength = DVD_DISK_KEY_LENGTH; | |
405 key->SessionId = *pi_agid; | |
406 key->KeyType = DvdDiskKey; | |
407 key->KeyFlags = 0; | |
408 | |
409 i_ret = DeviceIoControl( (HANDLE) i_fd, IOCTL_DVD_READ_KEY, key, | |
410 key->KeyLength, key, key->KeyLength, &tmp, NULL ) ? 0 : -1; | |
411 | |
412 if( i_ret < 0 ) | |
413 { | |
414 return i_ret; | |
415 } | |
416 | |
417 memcpy( p_key, key->KeyData, DVD_DISCKEY_SIZE ); | |
418 } | |
419 else | |
420 { | |
421 INIT_SSC( GPCMD_READ_DVD_STRUCTURE, DVD_DISCKEY_SIZE + 4 ); | |
422 | |
423 ssc.CDBByte[ 7 ] = DVD_STRUCT_DISCKEY; | |
424 ssc.CDBByte[ 10 ] = *pi_agid << 6; | |
425 | |
426 i_ret = WinSendSSC( i_fd, &ssc ); | |
427 | |
428 if( i_ret < 0 ) | |
429 { | |
430 return i_ret; | |
431 } | |
432 | |
433 memcpy( p_key, p_buffer + 4, DVD_DISCKEY_SIZE ); | |
434 } | |
435 | |
436 #elif defined( __QNXNTO__ ) | |
437 | |
438 INIT_CPT( GPCMD_READ_DVD_STRUCTURE, DVD_DISCKEY_SIZE + 4 ); | |
439 | |
440 p_cpt->cam_cdb[ 7 ] = DVD_STRUCT_DISCKEY; | |
441 p_cpt->cam_cdb[ 10 ] = *pi_agid << 6; | |
442 | |
443 i_ret = devctl(i_fd, DCMD_CAM_PASS_THRU, p_cpt, structSize, NULL); | |
444 | |
445 memcpy( p_key, p_buffer + 4, DVD_DISCKEY_SIZE ); | |
446 | |
447 #elif defined ( SYS_OS2 ) | |
448 INIT_SSC( GPCMD_READ_DVD_STRUCTURE, DVD_DISCKEY_SIZE + 4 ); | |
449 | |
450 sdc.command[ 7 ] = DVD_STRUCT_DISCKEY; | |
451 sdc.command[ 10 ] = *pi_agid << 6; | |
452 | |
453 i_ret = DosDevIOCtl(i_fd, IOCTL_CDROMDISK, CDROMDISK_EXECMD, | |
454 &sdc, sizeof(sdc), &ulParamLen, | |
455 p_buffer, sizeof(p_buffer), &ulDataLen); | |
456 | |
457 if( i_ret < 0 ) | |
458 { | |
459 return i_ret; | |
460 } | |
461 | |
462 memcpy( p_key, p_buffer + 4, DVD_DISCKEY_SIZE ); | |
463 | |
464 #else | |
465 # error "DVD ioctls are unavailable on this system" | |
466 | |
467 #endif | |
468 return i_ret; | |
469 } | |
470 | |
471 /***************************************************************************** | |
472 * ioctl_ReadTitleKey: get the title key | |
473 *****************************************************************************/ | |
474 int ioctl_ReadTitleKey( int i_fd, int *pi_agid, int i_pos, u8 *p_key ) | |
475 { | |
476 int i_ret; | |
477 | |
478 #if defined( HAVE_LINUX_DVD_STRUCT ) | |
479 dvd_authinfo auth_info; | |
480 | |
481 memset( &auth_info, 0, sizeof( auth_info ) ); | |
482 auth_info.type = DVD_LU_SEND_TITLE_KEY; | |
483 auth_info.lstk.agid = *pi_agid; | |
484 auth_info.lstk.lba = i_pos; | |
485 | |
486 i_ret = ioctl( i_fd, DVD_AUTH, &auth_info ); | |
487 | |
488 memcpy( p_key, auth_info.lstk.title_key, DVD_KEY_SIZE ); | |
489 | |
490 #elif defined( HAVE_BSD_DVD_STRUCT ) | |
491 struct dvd_authinfo auth_info; | |
492 | |
493 memset( &auth_info, 0, sizeof( auth_info ) ); | |
494 auth_info.format = DVD_REPORT_TITLE_KEY; | |
495 auth_info.agid = *pi_agid; | |
496 auth_info.lba = i_pos; | |
497 | |
498 i_ret = ioctl( i_fd, DVDIOCREPORTKEY, &auth_info ); | |
499 | |
500 memcpy( p_key, auth_info.keychal, DVD_KEY_SIZE ); | |
501 | |
502 #elif defined( SYS_BEOS ) | |
503 INIT_RDC( GPCMD_REPORT_KEY, 12 ); | |
504 | |
505 rdc.command[ 2 ] = ( i_pos >> 24 ) & 0xff; | |
506 rdc.command[ 3 ] = ( i_pos >> 16 ) & 0xff; | |
507 rdc.command[ 4 ] = ( i_pos >> 8 ) & 0xff; | |
508 rdc.command[ 5 ] = ( i_pos ) & 0xff; | |
509 rdc.command[ 10 ] = DVD_REPORT_TITLE_KEY | (*pi_agid << 6); | |
510 | |
511 i_ret = ioctl( i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) ); | |
512 | |
513 memcpy( p_key, p_buffer + 5, DVD_KEY_SIZE ); | |
514 | |
515 #elif defined( HPUX_SCTL_IO ) | |
516 INIT_SCTL_IO( GPCMD_REPORT_KEY, 12 ); | |
517 | |
518 sctl_io.cdb[ 2 ] = ( i_pos >> 24 ) & 0xff; | |
519 sctl_io.cdb[ 3 ] = ( i_pos >> 16 ) & 0xff; | |
520 sctl_io.cdb[ 4 ] = ( i_pos >> 8 ) & 0xff; | |
521 sctl_io.cdb[ 5 ] = ( i_pos ) & 0xff; | |
522 sctl_io.cdb[ 10 ] = DVD_REPORT_TITLE_KEY | (*pi_agid << 6); | |
523 | |
524 i_ret = ioctl( i_fd, SIOC_IO, &sctl_io ); | |
525 | |
526 memcpy( p_key, p_buffer + 5, DVD_KEY_SIZE ); | |
527 | |
528 #elif defined( SOLARIS_USCSI ) | |
529 INIT_USCSI( GPCMD_REPORT_KEY, 12 ); | |
530 | |
531 rs_cdb.cdb_opaque[ 2 ] = ( i_pos >> 24 ) & 0xff; | |
532 rs_cdb.cdb_opaque[ 3 ] = ( i_pos >> 16 ) & 0xff; | |
533 rs_cdb.cdb_opaque[ 4 ] = ( i_pos >> 8 ) & 0xff; | |
534 rs_cdb.cdb_opaque[ 5 ] = ( i_pos ) & 0xff; | |
535 rs_cdb.cdb_opaque[ 10 ] = DVD_REPORT_TITLE_KEY | (*pi_agid << 6); | |
536 | |
8575 | 537 i_ret = SolarisSendUSCSI( i_fd, &sc ); |
7027 | 538 |
539 if( i_ret < 0 || sc.uscsi_status ) | |
540 { | |
541 i_ret = -1; | |
542 } | |
543 | |
544 /* Do we want to return the cp_sec flag perhaps? */ | |
545 /* a->lstk.cpm = (buf[ 4 ] >> 7) & 1; */ | |
546 /* a->lstk.cp_sec = (buf[ 4 ] >> 6) & 1; */ | |
547 /* a->lstk.cgms = (buf[ 4 ] >> 4) & 3; */ | |
548 | |
549 memcpy( p_key, p_buffer + 5, DVD_KEY_SIZE ); | |
550 | |
551 #elif defined( DARWIN_DVD_IOCTL ) | |
552 INIT_DVDIOCTL( dk_dvd_report_key_t, DVDTitleKeyInfo, | |
553 kDVDKeyFormatTitleKey ); | |
554 | |
555 dvd.address = i_pos; | |
556 dvd.grantID = *pi_agid; | |
557 dvd.keyClass = kDVDKeyClassCSS_CPPM_CPRM; | |
558 | |
559 i_ret = ioctl( i_fd, DKIOCDVDREPORTKEY, &dvd ); | |
560 | |
561 memcpy( p_key, dvdbs.titleKeyValue, DVD_KEY_SIZE ); | |
562 | |
563 #elif defined( WIN32 ) | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
564 if( WIN2K ) /* NT/2k/XP */ |
7027 | 565 { |
566 DWORD tmp; | |
567 u8 buffer[DVD_BUS_KEY_LENGTH]; | |
568 PDVD_COPY_PROTECT_KEY key = (PDVD_COPY_PROTECT_KEY) &buffer; | |
569 | |
570 memset( &buffer, 0, sizeof( buffer ) ); | |
571 | |
572 key->KeyLength = DVD_TITLE_KEY_LENGTH; | |
573 key->SessionId = *pi_agid; | |
574 key->KeyType = DvdTitleKey; | |
575 key->KeyFlags = 0; | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
576 key->Parameters.TitleOffset.QuadPart = (LONGLONG) i_pos * |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
577 2048 /*DVDCSS_BLOCK_SIZE*/; |
7027 | 578 |
579 i_ret = DeviceIoControl( (HANDLE) i_fd, IOCTL_DVD_READ_KEY, key, | |
580 key->KeyLength, key, key->KeyLength, &tmp, NULL ) ? 0 : -1; | |
581 | |
582 memcpy( p_key, key->KeyData, DVD_KEY_SIZE ); | |
583 } | |
584 else | |
585 { | |
586 INIT_SSC( GPCMD_REPORT_KEY, 12 ); | |
587 | |
588 ssc.CDBByte[ 2 ] = ( i_pos >> 24 ) & 0xff; | |
589 ssc.CDBByte[ 3 ] = ( i_pos >> 16 ) & 0xff; | |
590 ssc.CDBByte[ 4 ] = ( i_pos >> 8 ) & 0xff; | |
591 ssc.CDBByte[ 5 ] = ( i_pos ) & 0xff; | |
592 ssc.CDBByte[ 10 ] = DVD_REPORT_TITLE_KEY | (*pi_agid << 6); | |
593 | |
594 i_ret = WinSendSSC( i_fd, &ssc ); | |
595 | |
596 memcpy( p_key, p_buffer + 5, DVD_KEY_SIZE ); | |
597 } | |
598 | |
599 #elif defined( __QNXNTO__ ) | |
600 | |
601 INIT_CPT( GPCMD_REPORT_KEY, 12 ); | |
602 | |
603 p_cpt->cam_cdb[ 2 ] = ( i_pos >> 24 ) & 0xff; | |
604 p_cpt->cam_cdb[ 3 ] = ( i_pos >> 16 ) & 0xff; | |
605 p_cpt->cam_cdb[ 4 ] = ( i_pos >> 8 ) & 0xff; | |
606 p_cpt->cam_cdb[ 5 ] = ( i_pos ) & 0xff; | |
607 p_cpt->cam_cdb[ 10 ] = DVD_REPORT_TITLE_KEY | (*pi_agid << 6); | |
608 | |
609 i_ret = devctl(i_fd, DCMD_CAM_PASS_THRU, p_cpt, structSize, NULL); | |
610 | |
611 memcpy( p_key, p_buffer + 5, DVD_KEY_SIZE ); | |
612 | |
613 #elif defined( SYS_OS2 ) | |
614 INIT_SSC( GPCMD_REPORT_KEY, 12 ); | |
615 | |
616 sdc.command[ 2 ] = ( i_pos >> 24 ) & 0xff; | |
617 sdc.command[ 3 ] = ( i_pos >> 16 ) & 0xff; | |
618 sdc.command[ 4 ] = ( i_pos >> 8 ) & 0xff; | |
619 sdc.command[ 5 ] = ( i_pos ) & 0xff; | |
620 sdc.command[ 10 ] = DVD_REPORT_TITLE_KEY | (*pi_agid << 6); | |
621 | |
622 i_ret = DosDevIOCtl(i_fd, IOCTL_CDROMDISK, CDROMDISK_EXECMD, | |
623 &sdc, sizeof(sdc), &ulParamLen, | |
624 p_buffer, sizeof(p_buffer), &ulDataLen); | |
625 | |
626 memcpy( p_key, p_buffer + 5, DVD_KEY_SIZE ); | |
627 | |
628 #else | |
629 # error "DVD ioctls are unavailable on this system" | |
630 | |
631 #endif | |
632 | |
633 return i_ret; | |
634 } | |
635 | |
636 | |
637 /***************************************************************************** | |
638 * ioctl_ReportAgid: get AGID from the drive | |
639 *****************************************************************************/ | |
640 int ioctl_ReportAgid( int i_fd, int *pi_agid ) | |
641 { | |
642 int i_ret; | |
643 | |
644 #if defined( HAVE_LINUX_DVD_STRUCT ) | |
645 dvd_authinfo auth_info; | |
646 | |
647 memset( &auth_info, 0, sizeof( auth_info ) ); | |
648 auth_info.type = DVD_LU_SEND_AGID; | |
649 auth_info.lsa.agid = *pi_agid; | |
650 | |
651 i_ret = ioctl( i_fd, DVD_AUTH, &auth_info ); | |
652 | |
653 *pi_agid = auth_info.lsa.agid; | |
654 | |
655 #elif defined( HAVE_BSD_DVD_STRUCT ) | |
656 struct dvd_authinfo auth_info; | |
657 | |
658 memset( &auth_info, 0, sizeof( auth_info ) ); | |
659 auth_info.format = DVD_REPORT_AGID; | |
660 auth_info.agid = *pi_agid; | |
661 | |
662 i_ret = ioctl( i_fd, DVDIOCREPORTKEY, &auth_info ); | |
663 | |
664 *pi_agid = auth_info.agid; | |
665 | |
666 #elif defined( SYS_BEOS ) | |
667 INIT_RDC( GPCMD_REPORT_KEY, 8 ); | |
668 | |
669 rdc.command[ 10 ] = DVD_REPORT_AGID | (*pi_agid << 6); | |
670 | |
671 i_ret = ioctl( i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) ); | |
672 | |
673 *pi_agid = p_buffer[ 7 ] >> 6; | |
674 | |
675 #elif defined( HPUX_SCTL_IO ) | |
676 INIT_SCTL_IO( GPCMD_REPORT_KEY, 8 ); | |
677 | |
678 sctl_io.cdb[ 10 ] = DVD_REPORT_AGID | (*pi_agid << 6); | |
679 | |
680 i_ret = ioctl( i_fd, SIOC_IO, &sctl_io ); | |
681 | |
682 *pi_agid = p_buffer[ 7 ] >> 6; | |
683 | |
684 #elif defined( SOLARIS_USCSI ) | |
685 INIT_USCSI( GPCMD_REPORT_KEY, 8 ); | |
686 | |
687 rs_cdb.cdb_opaque[ 10 ] = DVD_REPORT_AGID | (*pi_agid << 6); | |
688 | |
8575 | 689 i_ret = SolarisSendUSCSI( i_fd, &sc ); |
7027 | 690 |
691 if( i_ret < 0 || sc.uscsi_status ) | |
692 { | |
693 i_ret = -1; | |
694 } | |
695 | |
696 *pi_agid = p_buffer[ 7 ] >> 6; | |
697 | |
698 #elif defined( DARWIN_DVD_IOCTL ) | |
699 INIT_DVDIOCTL( dk_dvd_report_key_t, DVDAuthenticationGrantIDInfo, | |
700 kDVDKeyFormatAGID_CSS ); | |
701 | |
702 dvd.grantID = *pi_agid; | |
703 dvd.keyClass = kDVDKeyClassCSS_CPPM_CPRM; | |
704 | |
705 i_ret = ioctl( i_fd, DKIOCDVDREPORTKEY, &dvd ); | |
706 | |
707 *pi_agid = dvdbs.grantID; | |
708 | |
709 #elif defined( WIN32 ) | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
710 if( WIN2K ) /* NT/2k/XP */ |
7027 | 711 { |
712 ULONG id; | |
713 DWORD tmp; | |
714 | |
715 i_ret = DeviceIoControl( (HANDLE) i_fd, IOCTL_DVD_START_SESSION, | |
716 &tmp, 4, &id, sizeof( id ), &tmp, NULL ) ? 0 : -1; | |
717 | |
718 *pi_agid = id; | |
719 } | |
720 else | |
721 { | |
722 INIT_SSC( GPCMD_REPORT_KEY, 8 ); | |
723 | |
724 ssc.CDBByte[ 10 ] = DVD_REPORT_AGID | (*pi_agid << 6); | |
725 | |
726 i_ret = WinSendSSC( i_fd, &ssc ); | |
727 | |
728 *pi_agid = p_buffer[ 7 ] >> 6; | |
729 } | |
730 | |
731 #elif defined( __QNXNTO__ ) | |
732 | |
733 INIT_CPT( GPCMD_REPORT_KEY, 8 ); | |
734 | |
735 p_cpt->cam_cdb[ 10 ] = DVD_REPORT_AGID | (*pi_agid << 6); | |
736 | |
737 i_ret = devctl(i_fd, DCMD_CAM_PASS_THRU, p_cpt, structSize, NULL); | |
738 | |
739 *pi_agid = p_buffer[ 7 ] >> 6; | |
740 | |
741 #elif defined( SYS_OS2 ) | |
742 INIT_SSC( GPCMD_REPORT_KEY, 8 ); | |
743 | |
744 sdc.command[ 10 ] = DVD_REPORT_AGID | (*pi_agid << 6); | |
745 | |
746 i_ret = DosDevIOCtl(i_fd, IOCTL_CDROMDISK, CDROMDISK_EXECMD, | |
747 &sdc, sizeof(sdc), &ulParamLen, | |
748 p_buffer, sizeof(p_buffer), &ulDataLen); | |
749 | |
750 *pi_agid = p_buffer[ 7 ] >> 6; | |
751 | |
752 #else | |
753 # error "DVD ioctls are unavailable on this system" | |
754 | |
755 #endif | |
756 return i_ret; | |
757 } | |
758 | |
759 /***************************************************************************** | |
760 * ioctl_ReportChallenge: get challenge from the drive | |
761 *****************************************************************************/ | |
762 int ioctl_ReportChallenge( int i_fd, int *pi_agid, u8 *p_challenge ) | |
763 { | |
764 int i_ret; | |
765 | |
766 #if defined( HAVE_LINUX_DVD_STRUCT ) | |
767 dvd_authinfo auth_info; | |
768 | |
769 memset( &auth_info, 0, sizeof( auth_info ) ); | |
770 auth_info.type = DVD_LU_SEND_CHALLENGE; | |
771 auth_info.lsc.agid = *pi_agid; | |
772 | |
773 i_ret = ioctl( i_fd, DVD_AUTH, &auth_info ); | |
774 | |
775 memcpy( p_challenge, auth_info.lsc.chal, DVD_CHALLENGE_SIZE ); | |
776 | |
777 #elif defined( HAVE_BSD_DVD_STRUCT ) | |
778 struct dvd_authinfo auth_info; | |
779 | |
780 memset( &auth_info, 0, sizeof( auth_info ) ); | |
781 auth_info.format = DVD_REPORT_CHALLENGE; | |
782 auth_info.agid = *pi_agid; | |
783 | |
784 i_ret = ioctl( i_fd, DVDIOCREPORTKEY, &auth_info ); | |
785 | |
786 memcpy( p_challenge, auth_info.keychal, DVD_CHALLENGE_SIZE ); | |
787 | |
788 #elif defined( SYS_BEOS ) | |
789 INIT_RDC( GPCMD_REPORT_KEY, 16 ); | |
790 | |
791 rdc.command[ 10 ] = DVD_REPORT_CHALLENGE | (*pi_agid << 6); | |
792 | |
793 i_ret = ioctl( i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) ); | |
794 | |
795 memcpy( p_challenge, p_buffer + 4, DVD_CHALLENGE_SIZE ); | |
796 | |
797 #elif defined( HPUX_SCTL_IO ) | |
798 INIT_SCTL_IO( GPCMD_REPORT_KEY, 16 ); | |
799 | |
800 sctl_io.cdb[ 10 ] = DVD_REPORT_CHALLENGE | (*pi_agid << 6); | |
801 | |
802 i_ret = ioctl( i_fd, SIOC_IO, &sctl_io ); | |
803 | |
804 memcpy( p_challenge, p_buffer + 4, DVD_CHALLENGE_SIZE ); | |
805 | |
806 #elif defined( SOLARIS_USCSI ) | |
807 INIT_USCSI( GPCMD_REPORT_KEY, 16 ); | |
808 | |
809 rs_cdb.cdb_opaque[ 10 ] = DVD_REPORT_CHALLENGE | (*pi_agid << 6); | |
810 | |
8575 | 811 i_ret = SolarisSendUSCSI( i_fd, &sc ); |
7027 | 812 |
813 if( i_ret < 0 || sc.uscsi_status ) | |
814 { | |
815 i_ret = -1; | |
816 } | |
817 | |
818 memcpy( p_challenge, p_buffer + 4, DVD_CHALLENGE_SIZE ); | |
819 | |
820 #elif defined( DARWIN_DVD_IOCTL ) | |
821 INIT_DVDIOCTL( dk_dvd_report_key_t, DVDChallengeKeyInfo, | |
822 kDVDKeyFormatChallengeKey ); | |
823 | |
824 dvd.grantID = *pi_agid; | |
825 | |
826 i_ret = ioctl( i_fd, DKIOCDVDREPORTKEY, &dvd ); | |
827 | |
828 memcpy( p_challenge, dvdbs.challengeKeyValue, DVD_CHALLENGE_SIZE ); | |
829 | |
830 #elif defined( WIN32 ) | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
831 if( WIN2K ) /* NT/2k/XP */ |
7027 | 832 { |
833 DWORD tmp; | |
834 u8 buffer[DVD_CHALLENGE_KEY_LENGTH]; | |
835 PDVD_COPY_PROTECT_KEY key = (PDVD_COPY_PROTECT_KEY) &buffer; | |
836 | |
837 memset( &buffer, 0, sizeof( buffer ) ); | |
838 | |
839 key->KeyLength = DVD_CHALLENGE_KEY_LENGTH; | |
840 key->SessionId = *pi_agid; | |
841 key->KeyType = DvdChallengeKey; | |
842 key->KeyFlags = 0; | |
843 | |
844 i_ret = DeviceIoControl( (HANDLE) i_fd, IOCTL_DVD_READ_KEY, key, | |
845 key->KeyLength, key, key->KeyLength, &tmp, NULL ) ? 0 : -1; | |
846 | |
847 if( i_ret < 0 ) | |
848 { | |
849 return i_ret; | |
850 } | |
851 | |
852 memcpy( p_challenge, key->KeyData, DVD_CHALLENGE_SIZE ); | |
853 } | |
854 else | |
855 { | |
856 INIT_SSC( GPCMD_REPORT_KEY, 16 ); | |
857 | |
858 ssc.CDBByte[ 10 ] = DVD_REPORT_CHALLENGE | (*pi_agid << 6); | |
859 | |
860 i_ret = WinSendSSC( i_fd, &ssc ); | |
861 | |
862 memcpy( p_challenge, p_buffer + 4, DVD_CHALLENGE_SIZE ); | |
863 } | |
864 | |
865 #elif defined( __QNXNTO__ ) | |
866 | |
867 INIT_CPT( GPCMD_REPORT_KEY, 16 ); | |
868 | |
869 p_cpt->cam_cdb[ 10 ] = DVD_REPORT_CHALLENGE | (*pi_agid << 6); | |
870 | |
871 i_ret = devctl(i_fd, DCMD_CAM_PASS_THRU, p_cpt, structSize, NULL); | |
872 | |
873 memcpy( p_challenge, p_buffer + 4, DVD_CHALLENGE_SIZE ); | |
874 | |
875 #elif defined( SYS_OS2 ) | |
876 INIT_SSC( GPCMD_REPORT_KEY, 16 ); | |
877 | |
878 sdc.command[ 10 ] = DVD_REPORT_CHALLENGE | (*pi_agid << 6); | |
879 | |
880 i_ret = DosDevIOCtl(i_fd, IOCTL_CDROMDISK, CDROMDISK_EXECMD, | |
881 &sdc, sizeof(sdc), &ulParamLen, | |
882 p_buffer, sizeof(p_buffer), &ulDataLen); | |
883 | |
884 memcpy( p_challenge, p_buffer + 4, DVD_CHALLENGE_SIZE ); | |
885 | |
886 #else | |
887 # error "DVD ioctls are unavailable on this system" | |
888 | |
889 #endif | |
890 return i_ret; | |
891 } | |
892 | |
893 /***************************************************************************** | |
894 * ioctl_ReportASF: get ASF from the drive | |
895 *****************************************************************************/ | |
896 int ioctl_ReportASF( int i_fd, int *pi_remove_me, int *pi_asf ) | |
897 { | |
898 int i_ret; | |
899 | |
900 #if defined( HAVE_LINUX_DVD_STRUCT ) | |
901 dvd_authinfo auth_info; | |
902 | |
903 memset( &auth_info, 0, sizeof( auth_info ) ); | |
904 auth_info.type = DVD_LU_SEND_ASF; | |
905 auth_info.lsasf.asf = *pi_asf; | |
906 | |
907 i_ret = ioctl( i_fd, DVD_AUTH, &auth_info ); | |
908 | |
909 *pi_asf = auth_info.lsasf.asf; | |
910 | |
911 #elif defined( HAVE_BSD_DVD_STRUCT ) | |
912 struct dvd_authinfo auth_info; | |
913 | |
914 memset( &auth_info, 0, sizeof( auth_info ) ); | |
915 auth_info.format = DVD_REPORT_ASF; | |
916 auth_info.asf = *pi_asf; | |
917 | |
918 i_ret = ioctl( i_fd, DVDIOCREPORTKEY, &auth_info ); | |
919 | |
920 *pi_asf = auth_info.asf; | |
921 | |
922 #elif defined( SYS_BEOS ) | |
923 INIT_RDC( GPCMD_REPORT_KEY, 8 ); | |
924 | |
925 rdc.command[ 10 ] = DVD_REPORT_ASF; | |
926 | |
927 i_ret = ioctl( i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) ); | |
928 | |
929 *pi_asf = p_buffer[ 7 ] & 1; | |
930 | |
931 #elif defined( HPUX_SCTL_IO ) | |
932 INIT_SCTL_IO( GPCMD_REPORT_KEY, 8 ); | |
933 | |
934 sctl_io.cdb[ 10 ] = DVD_REPORT_ASF; | |
935 | |
936 i_ret = ioctl( i_fd, SIOC_IO, &sctl_io ); | |
937 | |
938 *pi_asf = p_buffer[ 7 ] & 1; | |
939 | |
940 #elif defined( SOLARIS_USCSI ) | |
941 INIT_USCSI( GPCMD_REPORT_KEY, 8 ); | |
942 | |
943 rs_cdb.cdb_opaque[ 10 ] = DVD_REPORT_ASF; | |
944 | |
8575 | 945 i_ret = SolarisSendUSCSI( i_fd, &sc ); |
7027 | 946 |
947 if( i_ret < 0 || sc.uscsi_status ) | |
948 { | |
949 i_ret = -1; | |
950 } | |
951 | |
952 *pi_asf = p_buffer[ 7 ] & 1; | |
953 | |
954 #elif defined( DARWIN_DVD_IOCTL ) | |
955 INIT_DVDIOCTL( dk_dvd_report_key_t, DVDAuthenticationSuccessFlagInfo, | |
956 kDVDKeyFormatASF ); | |
957 | |
958 i_ret = ioctl( i_fd, DKIOCDVDREPORTKEY, &dvd ); | |
959 | |
960 *pi_asf = dvdbs.successFlag; | |
961 | |
962 #elif defined( WIN32 ) | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
963 if( WIN2K ) /* NT/2k/XP */ |
7027 | 964 { |
965 DWORD tmp; | |
966 u8 buffer[DVD_ASF_LENGTH]; | |
967 PDVD_COPY_PROTECT_KEY key = (PDVD_COPY_PROTECT_KEY) &buffer; | |
968 | |
969 memset( &buffer, 0, sizeof( buffer ) ); | |
970 | |
971 key->KeyLength = DVD_ASF_LENGTH; | |
972 key->KeyType = DvdAsf; | |
973 key->KeyFlags = 0; | |
974 | |
975 ((PDVD_ASF)key->KeyData)->SuccessFlag = *pi_asf; | |
976 | |
977 i_ret = DeviceIoControl( (HANDLE) i_fd, IOCTL_DVD_READ_KEY, key, | |
978 key->KeyLength, key, key->KeyLength, &tmp, NULL ) ? 0 : -1; | |
979 | |
980 if( i_ret < 0 ) | |
981 { | |
982 return i_ret; | |
983 } | |
984 | |
985 *pi_asf = ((PDVD_ASF)key->KeyData)->SuccessFlag; | |
986 } | |
987 else | |
988 { | |
989 INIT_SSC( GPCMD_REPORT_KEY, 8 ); | |
990 | |
991 ssc.CDBByte[ 10 ] = DVD_REPORT_ASF; | |
992 | |
993 i_ret = WinSendSSC( i_fd, &ssc ); | |
994 | |
995 *pi_asf = p_buffer[ 7 ] & 1; | |
996 } | |
997 | |
998 #elif defined( __QNXNTO__ ) | |
999 | |
1000 INIT_CPT( GPCMD_REPORT_KEY, 8 ); | |
1001 | |
1002 p_cpt->cam_cdb[ 10 ] = DVD_REPORT_ASF; | |
1003 | |
1004 i_ret = devctl(i_fd, DCMD_CAM_PASS_THRU, p_cpt, structSize, NULL); | |
1005 | |
1006 *pi_asf = p_buffer[ 7 ] & 1; | |
1007 | |
1008 #elif defined( SYS_OS2 ) | |
1009 INIT_SSC( GPCMD_REPORT_KEY, 8 ); | |
1010 | |
1011 sdc.command[ 10 ] = DVD_REPORT_ASF; | |
1012 | |
1013 i_ret = DosDevIOCtl(i_fd, IOCTL_CDROMDISK, CDROMDISK_EXECMD, | |
1014 &sdc, sizeof(sdc), &ulParamLen, | |
1015 p_buffer, sizeof(p_buffer), &ulDataLen); | |
1016 | |
1017 *pi_asf = p_buffer[ 7 ] & 1; | |
1018 | |
1019 #else | |
1020 # error "DVD ioctls are unavailable on this system" | |
1021 | |
1022 #endif | |
1023 return i_ret; | |
1024 } | |
1025 | |
1026 /***************************************************************************** | |
1027 * ioctl_ReportKey1: get the first key from the drive | |
1028 *****************************************************************************/ | |
1029 int ioctl_ReportKey1( int i_fd, int *pi_agid, u8 *p_key ) | |
1030 { | |
1031 int i_ret; | |
1032 | |
1033 #if defined( HAVE_LINUX_DVD_STRUCT ) | |
1034 dvd_authinfo auth_info; | |
1035 | |
1036 memset( &auth_info, 0, sizeof( auth_info ) ); | |
1037 auth_info.type = DVD_LU_SEND_KEY1; | |
1038 auth_info.lsk.agid = *pi_agid; | |
1039 | |
1040 i_ret = ioctl( i_fd, DVD_AUTH, &auth_info ); | |
1041 | |
1042 memcpy( p_key, auth_info.lsk.key, DVD_KEY_SIZE ); | |
1043 | |
1044 #elif defined( HAVE_BSD_DVD_STRUCT ) | |
1045 struct dvd_authinfo auth_info; | |
1046 | |
1047 memset( &auth_info, 0, sizeof( auth_info ) ); | |
1048 auth_info.format = DVD_REPORT_KEY1; | |
1049 auth_info.agid = *pi_agid; | |
1050 | |
1051 i_ret = ioctl( i_fd, DVDIOCREPORTKEY, &auth_info ); | |
1052 | |
1053 memcpy( p_key, auth_info.keychal, DVD_KEY_SIZE ); | |
1054 | |
1055 #elif defined( SYS_BEOS ) | |
1056 INIT_RDC( GPCMD_REPORT_KEY, 12 ); | |
1057 | |
1058 rdc.command[ 10 ] = DVD_REPORT_KEY1 | (*pi_agid << 6); | |
1059 | |
1060 i_ret = ioctl( i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) ); | |
1061 | |
1062 memcpy( p_key, p_buffer + 4, DVD_KEY_SIZE ); | |
1063 | |
1064 #elif defined( HPUX_SCTL_IO ) | |
1065 INIT_SCTL_IO( GPCMD_REPORT_KEY, 12 ); | |
1066 | |
1067 sctl_io.cdb[ 10 ] = DVD_REPORT_KEY1 | (*pi_agid << 6); | |
1068 | |
1069 i_ret = ioctl( i_fd, SIOC_IO, &sctl_io ); | |
1070 | |
1071 memcpy( p_key, p_buffer + 4, DVD_KEY_SIZE ); | |
1072 | |
1073 #elif defined( SOLARIS_USCSI ) | |
1074 INIT_USCSI( GPCMD_REPORT_KEY, 12 ); | |
1075 | |
1076 rs_cdb.cdb_opaque[ 10 ] = DVD_REPORT_KEY1 | (*pi_agid << 6); | |
1077 | |
8575 | 1078 i_ret = SolarisSendUSCSI( i_fd, &sc ); |
7027 | 1079 |
1080 if( i_ret < 0 || sc.uscsi_status ) | |
1081 { | |
1082 i_ret = -1; | |
1083 } | |
1084 | |
1085 memcpy( p_key, p_buffer + 4, DVD_KEY_SIZE ); | |
1086 | |
1087 #elif defined( DARWIN_DVD_IOCTL ) | |
1088 INIT_DVDIOCTL( dk_dvd_report_key_t, DVDKey1Info, | |
1089 kDVDKeyFormatKey1 ); | |
1090 | |
1091 dvd.grantID = *pi_agid; | |
1092 | |
1093 i_ret = ioctl( i_fd, DKIOCDVDREPORTKEY, &dvd ); | |
1094 | |
1095 memcpy( p_key, dvdbs.key1Value, DVD_KEY_SIZE ); | |
1096 | |
1097 #elif defined( WIN32 ) | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
1098 if( WIN2K ) /* NT/2k/XP */ |
7027 | 1099 { |
1100 DWORD tmp; | |
1101 u8 buffer[DVD_BUS_KEY_LENGTH]; | |
1102 PDVD_COPY_PROTECT_KEY key = (PDVD_COPY_PROTECT_KEY) &buffer; | |
1103 | |
1104 memset( &buffer, 0, sizeof( buffer ) ); | |
1105 | |
1106 key->KeyLength = DVD_BUS_KEY_LENGTH; | |
1107 key->SessionId = *pi_agid; | |
1108 key->KeyType = DvdBusKey1; | |
1109 key->KeyFlags = 0; | |
1110 | |
1111 i_ret = DeviceIoControl( (HANDLE) i_fd, IOCTL_DVD_READ_KEY, key, | |
1112 key->KeyLength, key, key->KeyLength, &tmp, NULL ) ? 0 : -1; | |
1113 | |
1114 memcpy( p_key, key->KeyData, DVD_KEY_SIZE ); | |
1115 } | |
1116 else | |
1117 { | |
1118 INIT_SSC( GPCMD_REPORT_KEY, 12 ); | |
1119 | |
1120 ssc.CDBByte[ 10 ] = DVD_REPORT_KEY1 | (*pi_agid << 6); | |
1121 | |
1122 i_ret = WinSendSSC( i_fd, &ssc ); | |
1123 | |
1124 memcpy( p_key, p_buffer + 4, DVD_KEY_SIZE ); | |
1125 } | |
1126 | |
1127 #elif defined( __QNXNTO__ ) | |
1128 | |
1129 INIT_CPT( GPCMD_REPORT_KEY, 12 ); | |
1130 | |
1131 p_cpt->cam_cdb[ 10 ] = DVD_REPORT_KEY1 | (*pi_agid << 6); | |
1132 | |
1133 i_ret = devctl(i_fd, DCMD_CAM_PASS_THRU, p_cpt, structSize, NULL); | |
1134 | |
1135 memcpy( p_key, p_buffer + 4, DVD_KEY_SIZE ); | |
1136 | |
1137 #elif defined( SYS_OS2 ) | |
1138 INIT_SSC( GPCMD_REPORT_KEY, 12 ); | |
1139 | |
1140 sdc.command[ 10 ] = DVD_REPORT_KEY1 | (*pi_agid << 6); | |
1141 | |
1142 i_ret = DosDevIOCtl(i_fd, IOCTL_CDROMDISK, CDROMDISK_EXECMD, | |
1143 &sdc, sizeof(sdc), &ulParamLen, | |
1144 p_buffer, sizeof(p_buffer), &ulDataLen); | |
1145 | |
1146 memcpy( p_key, p_buffer + 4, DVD_KEY_SIZE ); | |
1147 | |
1148 #else | |
1149 # error "DVD ioctls are unavailable on this system" | |
1150 | |
1151 #endif | |
1152 return i_ret; | |
1153 } | |
1154 | |
1155 /***************************************************************************** | |
1156 * ioctl_InvalidateAgid: invalidate the current AGID | |
1157 *****************************************************************************/ | |
1158 int ioctl_InvalidateAgid( int i_fd, int *pi_agid ) | |
1159 { | |
1160 int i_ret; | |
1161 | |
1162 #if defined( HAVE_LINUX_DVD_STRUCT ) | |
1163 dvd_authinfo auth_info; | |
1164 | |
1165 memset( &auth_info, 0, sizeof( auth_info ) ); | |
1166 auth_info.type = DVD_INVALIDATE_AGID; | |
1167 auth_info.lsa.agid = *pi_agid; | |
1168 | |
1169 i_ret = ioctl( i_fd, DVD_AUTH, &auth_info ); | |
1170 | |
1171 #elif defined( HAVE_BSD_DVD_STRUCT ) | |
1172 struct dvd_authinfo auth_info; | |
1173 | |
1174 memset( &auth_info, 0, sizeof( auth_info ) ); | |
1175 auth_info.format = DVD_INVALIDATE_AGID; | |
1176 auth_info.agid = *pi_agid; | |
1177 | |
1178 i_ret = ioctl( i_fd, DVDIOCREPORTKEY, &auth_info ); | |
1179 | |
1180 #elif defined( SYS_BEOS ) | |
1181 INIT_RDC( GPCMD_REPORT_KEY, 0 ); | |
1182 | |
1183 rdc.command[ 10 ] = DVD_INVALIDATE_AGID | (*pi_agid << 6); | |
1184 | |
1185 i_ret = ioctl( i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) ); | |
1186 | |
1187 #elif defined( HPUX_SCTL_IO ) | |
1188 INIT_SCTL_IO( GPCMD_REPORT_KEY, 0 ); | |
1189 | |
1190 sctl_io.cdb[ 10 ] = DVD_INVALIDATE_AGID | (*pi_agid << 6); | |
1191 | |
1192 i_ret = ioctl( i_fd, SIOC_IO, &sctl_io ); | |
1193 | |
1194 #elif defined( SOLARIS_USCSI ) | |
1195 INIT_USCSI( GPCMD_REPORT_KEY, 0 ); | |
1196 | |
1197 rs_cdb.cdb_opaque[ 10 ] = DVD_INVALIDATE_AGID | (*pi_agid << 6); | |
1198 | |
8575 | 1199 i_ret = SolarisSendUSCSI( i_fd, &sc ); |
7027 | 1200 |
1201 if( i_ret < 0 || sc.uscsi_status ) | |
1202 { | |
1203 i_ret = -1; | |
1204 } | |
1205 | |
1206 #elif defined( DARWIN_DVD_IOCTL ) | |
1207 INIT_DVDIOCTL( dk_dvd_send_key_t, DVDAuthenticationGrantIDInfo, | |
1208 kDVDKeyFormatAGID_Invalidate ); | |
1209 | |
1210 dvd.grantID = *pi_agid; | |
1211 | |
1212 i_ret = ioctl( i_fd, DKIOCDVDSENDKEY, &dvd ); | |
1213 | |
1214 #elif defined( WIN32 ) | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
1215 if( WIN2K ) /* NT/2k/XP */ |
7027 | 1216 { |
1217 DWORD tmp; | |
1218 | |
1219 i_ret = DeviceIoControl( (HANDLE) i_fd, IOCTL_DVD_END_SESSION, | |
1220 pi_agid, sizeof( *pi_agid ), NULL, 0, &tmp, NULL ) ? 0 : -1; | |
1221 } | |
1222 else | |
1223 { | |
1224 #if defined( __MINGW32__ ) | |
1225 INIT_SSC( GPCMD_REPORT_KEY, 0 ); | |
1226 #else | |
1227 INIT_SSC( GPCMD_REPORT_KEY, 1 ); | |
1228 | |
1229 ssc.SRB_BufLen = 0; | |
1230 ssc.CDBByte[ 8 ] = 0; | |
1231 ssc.CDBByte[ 9 ] = 0; | |
1232 #endif | |
1233 | |
1234 ssc.CDBByte[ 10 ] = DVD_INVALIDATE_AGID | (*pi_agid << 6); | |
1235 | |
1236 i_ret = WinSendSSC( i_fd, &ssc ); | |
1237 } | |
1238 | |
1239 #elif defined( __QNXNTO__ ) | |
1240 | |
1241 INIT_CPT( GPCMD_REPORT_KEY, 0 ); | |
1242 | |
1243 p_cpt->cam_cdb[ 10 ] = DVD_INVALIDATE_AGID | (*pi_agid << 6); | |
1244 | |
1245 i_ret = devctl(i_fd, DCMD_CAM_PASS_THRU, p_cpt, structSize, NULL); | |
1246 | |
1247 #elif defined( SYS_OS2 ) | |
1248 INIT_SSC( GPCMD_REPORT_KEY, 1 ); | |
1249 | |
1250 sdc.data_length = 0; | |
1251 sdc.command[ 8 ] = 0; | |
1252 sdc.command[ 9 ] = 0; | |
1253 | |
1254 sdc.command[ 10 ] = DVD_INVALIDATE_AGID | (*pi_agid << 6); | |
1255 | |
1256 i_ret = DosDevIOCtl(i_fd, IOCTL_CDROMDISK, CDROMDISK_EXECMD, | |
1257 &sdc, sizeof(sdc), &ulParamLen, | |
1258 NULL, 0, &ulDataLen); | |
1259 #else | |
1260 # error "DVD ioctls are unavailable on this system" | |
1261 | |
1262 #endif | |
1263 return i_ret; | |
1264 } | |
1265 | |
1266 /***************************************************************************** | |
1267 * ioctl_SendChallenge: send challenge to the drive | |
1268 *****************************************************************************/ | |
1269 int ioctl_SendChallenge( int i_fd, int *pi_agid, u8 *p_challenge ) | |
1270 { | |
1271 int i_ret; | |
1272 | |
1273 #if defined( HAVE_LINUX_DVD_STRUCT ) | |
1274 dvd_authinfo auth_info; | |
1275 | |
1276 memset( &auth_info, 0, sizeof( auth_info ) ); | |
1277 auth_info.type = DVD_HOST_SEND_CHALLENGE; | |
1278 auth_info.hsc.agid = *pi_agid; | |
1279 | |
1280 memcpy( auth_info.hsc.chal, p_challenge, DVD_CHALLENGE_SIZE ); | |
1281 | |
1282 return ioctl( i_fd, DVD_AUTH, &auth_info ); | |
1283 | |
1284 #elif defined( HAVE_BSD_DVD_STRUCT ) | |
1285 struct dvd_authinfo auth_info; | |
1286 | |
1287 memset( &auth_info, 0, sizeof( auth_info ) ); | |
1288 auth_info.format = DVD_SEND_CHALLENGE; | |
1289 auth_info.agid = *pi_agid; | |
1290 | |
1291 memcpy( auth_info.keychal, p_challenge, DVD_CHALLENGE_SIZE ); | |
1292 | |
1293 return ioctl( i_fd, DVDIOCSENDKEY, &auth_info ); | |
1294 | |
1295 #elif defined( SYS_BEOS ) | |
1296 INIT_RDC( GPCMD_SEND_KEY, 16 ); | |
1297 | |
1298 rdc.command[ 10 ] = DVD_SEND_CHALLENGE | (*pi_agid << 6); | |
1299 | |
1300 p_buffer[ 1 ] = 0xe; | |
1301 memcpy( p_buffer + 4, p_challenge, DVD_CHALLENGE_SIZE ); | |
1302 | |
1303 return ioctl( i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) ); | |
1304 | |
1305 #elif defined( HPUX_SCTL_IO ) | |
1306 INIT_SCTL_IO( GPCMD_SEND_KEY, 16 ); | |
1307 | |
1308 sctl_io.cdb[ 10 ] = DVD_SEND_CHALLENGE | (*pi_agid << 6); | |
1309 | |
1310 p_buffer[ 1 ] = 0xe; | |
1311 memcpy( p_buffer + 4, p_challenge, DVD_CHALLENGE_SIZE ); | |
1312 | |
1313 return ioctl( i_fd, SIOC_IO, &sctl_io ); | |
1314 | |
1315 #elif defined( SOLARIS_USCSI ) | |
1316 INIT_USCSI( GPCMD_SEND_KEY, 16 ); | |
1317 | |
1318 rs_cdb.cdb_opaque[ 10 ] = DVD_SEND_CHALLENGE | (*pi_agid << 6); | |
1319 | |
1320 p_buffer[ 1 ] = 0xe; | |
1321 memcpy( p_buffer + 4, p_challenge, DVD_CHALLENGE_SIZE ); | |
1322 | |
8575 | 1323 if( SolarisSendUSCSI( i_fd, &sc ) < 0 || sc.uscsi_status ) |
7027 | 1324 { |
1325 return -1; | |
1326 } | |
1327 | |
1328 return 0; | |
1329 | |
1330 #elif defined( DARWIN_DVD_IOCTL ) | |
1331 INIT_DVDIOCTL( dk_dvd_send_key_t, DVDChallengeKeyInfo, | |
1332 kDVDKeyFormatChallengeKey ); | |
1333 | |
1334 dvd.grantID = *pi_agid; | |
1335 dvd.keyClass = kDVDKeyClassCSS_CPPM_CPRM; | |
1336 | |
1337 dvdbs.dataLength[ 1 ] = 0xe; | |
1338 memcpy( dvdbs.challengeKeyValue, p_challenge, DVD_CHALLENGE_SIZE ); | |
1339 | |
1340 i_ret = ioctl( i_fd, DKIOCDVDSENDKEY, &dvd ); | |
1341 | |
1342 #elif defined( WIN32 ) | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
1343 if( WIN2K ) /* NT/2k/XP */ |
7027 | 1344 { |
1345 DWORD tmp; | |
1346 u8 buffer[DVD_CHALLENGE_KEY_LENGTH]; | |
1347 PDVD_COPY_PROTECT_KEY key = (PDVD_COPY_PROTECT_KEY) &buffer; | |
1348 | |
1349 memset( &buffer, 0, sizeof( buffer ) ); | |
1350 | |
1351 key->KeyLength = DVD_CHALLENGE_KEY_LENGTH; | |
1352 key->SessionId = *pi_agid; | |
1353 key->KeyType = DvdChallengeKey; | |
1354 key->KeyFlags = 0; | |
1355 | |
1356 memcpy( key->KeyData, p_challenge, DVD_CHALLENGE_SIZE ); | |
1357 | |
1358 return DeviceIoControl( (HANDLE) i_fd, IOCTL_DVD_SEND_KEY, key, | |
1359 key->KeyLength, key, key->KeyLength, &tmp, NULL ) ? 0 : -1; | |
1360 } | |
1361 else | |
1362 { | |
1363 INIT_SSC( GPCMD_SEND_KEY, 16 ); | |
1364 | |
1365 ssc.CDBByte[ 10 ] = DVD_SEND_CHALLENGE | (*pi_agid << 6); | |
1366 | |
1367 p_buffer[ 1 ] = 0xe; | |
1368 memcpy( p_buffer + 4, p_challenge, DVD_CHALLENGE_SIZE ); | |
1369 | |
1370 return WinSendSSC( i_fd, &ssc ); | |
1371 } | |
1372 | |
1373 #elif defined( __QNXNTO__ ) | |
1374 | |
1375 INIT_CPT( GPCMD_SEND_KEY, 16 ); | |
1376 | |
1377 p_cpt->cam_cdb[ 10 ] = DVD_SEND_CHALLENGE | (*pi_agid << 6); | |
1378 | |
1379 p_buffer[ 1 ] = 0xe; | |
1380 memcpy( p_buffer + 4, p_challenge, DVD_CHALLENGE_SIZE ); | |
1381 | |
1382 i_ret = devctl(i_fd, DCMD_CAM_PASS_THRU, p_cpt, structSize, NULL); | |
1383 | |
1384 #elif defined( SYS_OS2 ) | |
1385 INIT_SSC( GPCMD_SEND_KEY, 16 ); | |
1386 | |
1387 sdc.command[ 10 ] = DVD_SEND_CHALLENGE | (*pi_agid << 6); | |
1388 | |
1389 p_buffer[ 1 ] = 0xe; | |
1390 memcpy( p_buffer + 4, p_challenge, DVD_CHALLENGE_SIZE ); | |
1391 | |
1392 return DosDevIOCtl(i_fd, IOCTL_CDROMDISK, CDROMDISK_EXECMD, | |
1393 &sdc, sizeof(sdc), &ulParamLen, | |
1394 p_buffer, sizeof(p_buffer), &ulDataLen); | |
1395 | |
1396 #else | |
1397 # error "DVD ioctls are unavailable on this system" | |
1398 | |
1399 #endif | |
1400 return i_ret; | |
1401 } | |
1402 | |
1403 /***************************************************************************** | |
1404 * ioctl_SendKey2: send the second key to the drive | |
1405 *****************************************************************************/ | |
1406 int ioctl_SendKey2( int i_fd, int *pi_agid, u8 *p_key ) | |
1407 { | |
1408 int i_ret; | |
1409 | |
1410 #if defined( HAVE_LINUX_DVD_STRUCT ) | |
1411 dvd_authinfo auth_info; | |
1412 | |
1413 memset( &auth_info, 0, sizeof( auth_info ) ); | |
1414 auth_info.type = DVD_HOST_SEND_KEY2; | |
1415 auth_info.hsk.agid = *pi_agid; | |
1416 | |
1417 memcpy( auth_info.hsk.key, p_key, DVD_KEY_SIZE ); | |
1418 | |
1419 return ioctl( i_fd, DVD_AUTH, &auth_info ); | |
1420 | |
1421 #elif defined( HAVE_BSD_DVD_STRUCT ) | |
1422 struct dvd_authinfo auth_info; | |
1423 | |
1424 memset( &auth_info, 0, sizeof( auth_info ) ); | |
1425 auth_info.format = DVD_SEND_KEY2; | |
1426 auth_info.agid = *pi_agid; | |
1427 | |
1428 memcpy( auth_info.keychal, p_key, DVD_KEY_SIZE ); | |
1429 | |
1430 return ioctl( i_fd, DVDIOCSENDKEY, &auth_info ); | |
1431 | |
1432 #elif defined( SYS_BEOS ) | |
1433 INIT_RDC( GPCMD_SEND_KEY, 12 ); | |
1434 | |
1435 rdc.command[ 10 ] = DVD_SEND_KEY2 | (*pi_agid << 6); | |
1436 | |
1437 p_buffer[ 1 ] = 0xa; | |
1438 memcpy( p_buffer + 4, p_key, DVD_KEY_SIZE ); | |
1439 | |
1440 return ioctl( i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) ); | |
1441 | |
1442 #elif defined( HPUX_SCTL_IO ) | |
1443 INIT_SCTL_IO( GPCMD_SEND_KEY, 12 ); | |
1444 | |
1445 sctl_io.cdb[ 10 ] = DVD_SEND_KEY2 | (*pi_agid << 6); | |
1446 | |
1447 p_buffer[ 1 ] = 0xa; | |
1448 memcpy( p_buffer + 4, p_key, DVD_KEY_SIZE ); | |
1449 | |
1450 return ioctl( i_fd, SIOC_IO, &sctl_io ); | |
1451 | |
1452 #elif defined( SOLARIS_USCSI ) | |
1453 INIT_USCSI( GPCMD_SEND_KEY, 12 ); | |
1454 | |
1455 rs_cdb.cdb_opaque[ 10 ] = DVD_SEND_KEY2 | (*pi_agid << 6); | |
1456 | |
1457 p_buffer[ 1 ] = 0xa; | |
1458 memcpy( p_buffer + 4, p_key, DVD_KEY_SIZE ); | |
1459 | |
8575 | 1460 if( SolarisSendUSCSI( i_fd, &sc ) < 0 || sc.uscsi_status ) |
7027 | 1461 { |
1462 return -1; | |
1463 } | |
1464 | |
1465 return 0; | |
1466 | |
1467 #elif defined( DARWIN_DVD_IOCTL ) | |
1468 INIT_DVDIOCTL( dk_dvd_send_key_t, DVDKey2Info, | |
1469 kDVDKeyFormatKey2 ); | |
1470 | |
1471 dvd.grantID = *pi_agid; | |
1472 dvd.keyClass = kDVDKeyClassCSS_CPPM_CPRM; | |
1473 | |
1474 dvdbs.dataLength[ 1 ] = 0xa; | |
1475 memcpy( dvdbs.key2Value, p_key, DVD_KEY_SIZE ); | |
1476 | |
1477 i_ret = ioctl( i_fd, DKIOCDVDSENDKEY, &dvd ); | |
1478 | |
1479 #elif defined( WIN32 ) | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
1480 if( WIN2K ) /* NT/2k/XP */ |
7027 | 1481 { |
1482 DWORD tmp; | |
1483 u8 buffer[DVD_BUS_KEY_LENGTH]; | |
1484 PDVD_COPY_PROTECT_KEY key = (PDVD_COPY_PROTECT_KEY) &buffer; | |
1485 | |
1486 memset( &buffer, 0, sizeof( buffer ) ); | |
1487 | |
1488 key->KeyLength = DVD_BUS_KEY_LENGTH; | |
1489 key->SessionId = *pi_agid; | |
1490 key->KeyType = DvdBusKey2; | |
1491 key->KeyFlags = 0; | |
1492 | |
1493 memcpy( key->KeyData, p_key, DVD_KEY_SIZE ); | |
1494 | |
1495 return DeviceIoControl( (HANDLE) i_fd, IOCTL_DVD_SEND_KEY, key, | |
1496 key->KeyLength, key, key->KeyLength, &tmp, NULL ) ? 0 : -1; | |
1497 } | |
1498 else | |
1499 { | |
1500 INIT_SSC( GPCMD_SEND_KEY, 12 ); | |
1501 | |
1502 ssc.CDBByte[ 10 ] = DVD_SEND_KEY2 | (*pi_agid << 6); | |
1503 | |
1504 p_buffer[ 1 ] = 0xa; | |
1505 memcpy( p_buffer + 4, p_key, DVD_KEY_SIZE ); | |
1506 | |
1507 return WinSendSSC( i_fd, &ssc ); | |
1508 } | |
1509 | |
1510 #elif defined( __QNXNTO__ ) | |
1511 | |
1512 INIT_CPT( GPCMD_SEND_KEY, 12 ); | |
1513 | |
1514 p_cpt->cam_cdb[ 10 ] = DVD_SEND_KEY2 | (*pi_agid << 6); | |
1515 | |
1516 p_buffer[ 1 ] = 0xa; | |
1517 memcpy( p_buffer + 4, p_key, DVD_KEY_SIZE ); | |
1518 | |
1519 i_ret = devctl(i_fd, DCMD_CAM_PASS_THRU, p_cpt, structSize, NULL); | |
1520 | |
1521 #elif defined( SYS_OS2 ) | |
1522 INIT_SSC( GPCMD_SEND_KEY, 12 ); | |
1523 | |
1524 sdc.command[ 10 ] = DVD_SEND_KEY2 | (*pi_agid << 6); | |
1525 | |
1526 p_buffer[ 1 ] = 0xa; | |
1527 memcpy( p_buffer + 4, p_key, DVD_KEY_SIZE ); | |
1528 | |
1529 return DosDevIOCtl(i_fd, IOCTL_CDROMDISK, CDROMDISK_EXECMD, | |
1530 &sdc, sizeof(sdc), &ulParamLen, | |
1531 p_buffer, sizeof(p_buffer), &ulDataLen); | |
1532 | |
1533 #else | |
1534 # error "DVD ioctls are unavailable on this system" | |
1535 | |
1536 #endif | |
1537 return i_ret; | |
1538 } | |
1539 | |
1540 /***************************************************************************** | |
1541 * ioctl_ReportRPC: get RPC status for the drive | |
1542 *****************************************************************************/ | |
1543 int ioctl_ReportRPC( int i_fd, int *p_type, int *p_mask, int *p_scheme ) | |
1544 { | |
1545 int i_ret; | |
1546 | |
1547 #if defined( HAVE_LINUX_DVD_STRUCT ) && defined( DVD_LU_SEND_RPC_STATE ) | |
1548 dvd_authinfo auth_info; | |
1549 | |
1550 memset( &auth_info, 0, sizeof( auth_info ) ); | |
1551 auth_info.type = DVD_LU_SEND_RPC_STATE; | |
1552 | |
1553 i_ret = ioctl( i_fd, DVD_AUTH, &auth_info ); | |
1554 | |
1555 *p_type = auth_info.lrpcs.type; | |
1556 *p_mask = auth_info.lrpcs.region_mask; | |
1557 *p_scheme = auth_info.lrpcs.rpc_scheme; | |
1558 | |
1559 #elif defined( HAVE_LINUX_DVD_STRUCT ) | |
1560 /* FIXME: OpenBSD doesn't know this */ | |
1561 i_ret = -1; | |
1562 | |
1563 #elif defined( HAVE_BSD_DVD_STRUCT ) | |
1564 struct dvd_authinfo auth_info; | |
1565 | |
1566 memset( &auth_info, 0, sizeof( auth_info ) ); | |
1567 auth_info.format = DVD_REPORT_RPC; | |
1568 | |
1569 i_ret = ioctl( i_fd, DVDIOCREPORTKEY, &auth_info ); | |
1570 | |
1571 *p_type = auth_info.reg_type; | |
1572 *p_mask = auth_info.region; // ?? | |
1573 *p_scheme = auth_info.rpc_scheme; | |
1574 | |
1575 #elif defined( SYS_BEOS ) | |
1576 INIT_RDC( GPCMD_REPORT_KEY, 8 ); | |
1577 | |
1578 rdc.command[ 10 ] = DVD_REPORT_RPC; | |
1579 | |
1580 i_ret = ioctl( i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) ); | |
1581 | |
1582 *p_type = p_buffer[ 4 ] >> 6; | |
1583 *p_mask = p_buffer[ 5 ]; | |
1584 *p_scheme = p_buffer[ 6 ]; | |
1585 | |
1586 #elif defined( HPUX_SCTL_IO ) | |
1587 INIT_SCTL_IO( GPCMD_REPORT_KEY, 8 ); | |
1588 | |
1589 sctl_io.cdb[ 10 ] = DVD_REPORT_RPC; | |
1590 | |
1591 i_ret = ioctl( i_fd, SIOC_IO, &sctl_io ); | |
1592 | |
1593 *p_type = p_buffer[ 4 ] >> 6; | |
1594 *p_mask = p_buffer[ 5 ]; | |
1595 *p_scheme = p_buffer[ 6 ]; | |
1596 | |
1597 #elif defined( SOLARIS_USCSI ) | |
1598 INIT_USCSI( GPCMD_REPORT_KEY, 8 ); | |
1599 | |
1600 rs_cdb.cdb_opaque[ 10 ] = DVD_REPORT_RPC; | |
1601 | |
8575 | 1602 i_ret = SolarisSendUSCSI( i_fd, &sc ); |
7027 | 1603 |
1604 if( i_ret < 0 || sc.uscsi_status ) | |
1605 { | |
1606 i_ret = -1; | |
1607 } | |
1608 | |
1609 *p_type = p_buffer[ 4 ] >> 6; | |
1610 *p_mask = p_buffer[ 5 ]; | |
1611 *p_scheme = p_buffer[ 6 ]; | |
1612 | |
1613 #elif defined( DARWIN_DVD_IOCTL ) | |
1614 INIT_DVDIOCTL( dk_dvd_report_key_t, DVDRegionPlaybackControlInfo, | |
1615 kDVDKeyFormatRegionState ); | |
1616 | |
1617 dvd.keyClass = kDVDKeyClassCSS_CPPM_CPRM; | |
1618 | |
1619 i_ret = ioctl( i_fd, DKIOCDVDREPORTKEY, &dvd ); | |
1620 | |
1621 *p_type = dvdbs.typeCode; | |
1622 *p_mask = dvdbs.driveRegion; | |
1623 *p_scheme = dvdbs.rpcScheme; | |
1624 | |
1625 #elif defined( WIN32 ) | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
1626 if( WIN2K ) /* NT/2k/XP */ |
7027 | 1627 { |
1628 DWORD tmp; | |
1629 u8 buffer[ DVD_REGION_LENGTH ]; | |
1630 PDVD_REGION region = (PDVD_REGION) &buffer; | |
1631 | |
1632 memset( &buffer, 0, sizeof( buffer ) ); | |
1633 | |
1634 i_ret = DeviceIoControl( (HANDLE) i_fd, IOCTL_DVD_GET_REGION, NULL, 0, | |
1635 region, DVD_REGION_LENGTH, &tmp, NULL ) ? 0 : -1; | |
1636 | |
1637 /* Someone who has the headers should correct all this. */ | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
1638 /* Use the IOCTL_SCSI_PASS_THROUGH_DIRECT so we get the real |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
1639 * values of theses entities? */ |
7027 | 1640 if(region->SystemRegion != 0) { |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
1641 *p_type = region->ResetCount > 1 ? 1 : 3 - region->ResetCount; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
1642 *p_mask = 0xff ^ (1 << (region->SystemRegion - 1)); |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
1643 *p_scheme = 1; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
1644 } |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
1645 else |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
1646 { |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
1647 *p_type = 0; /* ?? */ |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
1648 *p_mask = 0xff; |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
1649 *p_scheme = 1; /* ?? */ |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
1650 } |
7027 | 1651 } |
1652 else | |
1653 { | |
1654 INIT_SSC( GPCMD_REPORT_KEY, 8 ); | |
1655 | |
1656 ssc.CDBByte[ 10 ] = DVD_REPORT_RPC; | |
1657 | |
1658 i_ret = WinSendSSC( i_fd, &ssc ); | |
1659 | |
1660 *p_type = p_buffer[ 4 ] >> 6; | |
1661 *p_mask = p_buffer[ 5 ]; | |
1662 *p_scheme = p_buffer[ 6 ]; | |
1663 } | |
1664 | |
1665 #elif defined( __QNXNTO__ ) | |
1666 | |
1667 INIT_CPT( GPCMD_REPORT_KEY, 8 ); | |
1668 | |
1669 p_cpt->cam_cdb[ 10 ] = DVD_REPORT_RPC; | |
1670 | |
1671 i_ret = devctl(i_fd, DCMD_CAM_PASS_THRU, p_cpt, structSize, NULL); | |
1672 | |
1673 *p_type = p_buffer[ 4 ] >> 6; | |
1674 *p_mask = p_buffer[ 5 ]; | |
1675 *p_scheme = p_buffer[ 6 ]; | |
1676 | |
1677 #elif defined( SYS_OS2 ) | |
1678 INIT_SSC( GPCMD_REPORT_KEY, 8 ); | |
1679 | |
1680 sdc.command[ 10 ] = DVD_REPORT_RPC; | |
1681 | |
1682 i_ret = DosDevIOCtl(i_fd, IOCTL_CDROMDISK, CDROMDISK_EXECMD, | |
1683 &sdc, sizeof(sdc), &ulParamLen, | |
1684 p_buffer, sizeof(p_buffer), &ulDataLen); | |
1685 | |
1686 *p_type = p_buffer[ 4 ] >> 6; | |
1687 *p_mask = p_buffer[ 5 ]; | |
1688 *p_scheme = p_buffer[ 6 ]; | |
1689 | |
1690 #else | |
1691 # error "DVD ioctls are unavailable on this system" | |
1692 | |
1693 #endif | |
1694 return i_ret; | |
1695 } | |
1696 | |
1697 /* Local prototypes */ | |
1698 | |
1699 #if defined( SYS_BEOS ) | |
1700 /***************************************************************************** | |
1701 * BeInitRDC: initialize a RDC structure for the BeOS kernel | |
1702 ***************************************************************************** | |
1703 * This function initializes a BeOS raw device command structure for future | |
1704 * use, either a read command or a write command. | |
1705 *****************************************************************************/ | |
1706 static void BeInitRDC( raw_device_command *p_rdc, int i_type ) | |
1707 { | |
1708 memset( p_rdc->data, 0, p_rdc->data_length ); | |
1709 | |
1710 switch( i_type ) | |
1711 { | |
1712 case GPCMD_SEND_KEY: | |
1713 /* leave the flags to 0 */ | |
1714 break; | |
1715 | |
1716 case GPCMD_READ_DVD_STRUCTURE: case GPCMD_REPORT_KEY: | |
1717 p_rdc->flags = B_RAW_DEVICE_DATA_IN; break; } | |
1718 | |
1719 p_rdc->command[ 0 ] = i_type; | |
1720 | |
1721 p_rdc->command[ 8 ] = (p_rdc->data_length >> 8) & 0xff; | |
1722 p_rdc->command[ 9 ] = p_rdc->data_length & 0xff; | |
1723 p_rdc->command_length = 12; | |
1724 | |
1725 p_rdc->sense_data = NULL; | |
1726 p_rdc->sense_data_length = 0; | |
1727 | |
1728 p_rdc->timeout = 1000000; | |
1729 } | |
1730 #endif | |
1731 | |
1732 #if defined( HPUX_SCTL_IO ) | |
1733 /***************************************************************************** | |
1734 * HPUXInitSCTL: initialize a sctl_io structure for the HP-UX kernel | |
1735 ***************************************************************************** | |
1736 * This function initializes a HP-UX command structure for future | |
1737 * use, either a read command or a write command. | |
1738 *****************************************************************************/ | |
1739 static void HPUXInitSCTL( struct sctl_io *sctl_io, int i_type ) | |
1740 { | |
1741 memset( sctl_io->data, 0, sctl_io->data_length ); | |
1742 | |
1743 switch( i_type ) | |
1744 { | |
1745 case GPCMD_SEND_KEY: | |
1746 /* leave the flags to 0 */ | |
1747 break; | |
1748 | |
1749 case GPCMD_READ_DVD_STRUCTURE: | |
1750 case GPCMD_REPORT_KEY: | |
1751 sctl_io->flags = SCTL_READ; | |
1752 break; | |
1753 } | |
1754 | |
1755 sctl_io->cdb[ 0 ] = i_type; | |
1756 | |
1757 sctl_io->cdb[ 8 ] = (sctl_io->data_length >> 8) & 0xff; | |
1758 sctl_io->cdb[ 9 ] = sctl_io->data_length & 0xff; | |
1759 sctl_io->cdb_length = 12; | |
1760 | |
1761 sctl_io->max_msecs = 1000000; | |
1762 } | |
1763 #endif | |
1764 | |
1765 #if defined( SOLARIS_USCSI ) | |
1766 /***************************************************************************** | |
1767 * SolarisInitUSCSI: initialize a USCSICMD structure for the Solaris kernel | |
1768 ***************************************************************************** | |
1769 * This function initializes a Solaris userspace scsi command structure for | |
1770 * future use, either a read command or a write command. | |
1771 *****************************************************************************/ | |
1772 static void SolarisInitUSCSI( struct uscsi_cmd *p_sc, int i_type ) | |
1773 { | |
1774 union scsi_cdb *rs_cdb; | |
1775 memset( p_sc->uscsi_cdb, 0, sizeof( union scsi_cdb ) ); | |
1776 memset( p_sc->uscsi_bufaddr, 0, p_sc->uscsi_buflen ); | |
1777 | |
1778 switch( i_type ) | |
1779 { | |
1780 case GPCMD_SEND_KEY: | |
1781 p_sc->uscsi_flags = USCSI_ISOLATE | USCSI_WRITE; | |
1782 break; | |
1783 | |
1784 case GPCMD_READ_DVD_STRUCTURE: | |
1785 case GPCMD_REPORT_KEY: | |
1786 p_sc->uscsi_flags = USCSI_ISOLATE | USCSI_READ; | |
1787 break; | |
1788 } | |
1789 | |
1790 rs_cdb = (union scsi_cdb *)p_sc->uscsi_cdb; | |
1791 | |
1792 rs_cdb->scc_cmd = i_type; | |
1793 | |
1794 rs_cdb->cdb_opaque[ 8 ] = (p_sc->uscsi_buflen >> 8) & 0xff; | |
1795 rs_cdb->cdb_opaque[ 9 ] = p_sc->uscsi_buflen & 0xff; | |
1796 p_sc->uscsi_cdblen = 12; | |
1797 | |
1798 USCSI_TIMEOUT( p_sc, 15 ); | |
1799 } | |
8575 | 1800 |
1801 /***************************************************************************** | |
1802 * SolarisSendUSCSI: send a USCSICMD structure to the Solaris kernel | |
1803 * for execution | |
1804 ***************************************************************************** | |
1805 * When available, this function uses the function smedia_uscsi_cmd() | |
1806 * from solaris' libsmedia library (solaris 9 or newer) to execute the | |
1807 * USCSI command. smedia_uscsi_cmd() allows USCSI commands for | |
1808 * non-root users on removable media devices on solaris 9; sending the | |
1809 * USCSI command directly to the device using the USCSICMD ioctl fails | |
1810 * with an EPERM error on solaris 9. | |
1811 * | |
1812 * The code will fall back to the USCSICMD ioctl method, when | |
1813 * libsmedia.so is not available or does not export the | |
1814 * smedia_uscsi_cmd() function (on solaris releases upto and including | |
1815 * solaris 8). Fortunatelly, on these old releases non-root users are | |
1816 * allowed to perform USCSICMD ioctls on removable media devices. | |
1817 *****************************************************************************/ | |
1818 static int SolarisSendUSCSI( int i_fd, struct uscsi_cmd *p_sc ) { | |
1819 void *sm_hdl; | |
1820 static int initialized; | |
1821 static void* (*sm_get_handle)(int32_t); | |
1822 static int (*sm_release_handle)(void*); | |
1823 static int (*sm_uscsi_cmd)(void*, struct uscsi_cmd *); | |
1824 | |
1825 if (!initialized) | |
1826 { | |
1827 void *smedia_lib; | |
1828 | |
1829 smedia_lib = dlopen("libsmedia.so", RTLD_NOW); | |
1830 if (smedia_lib) { | |
1831 sm_get_handle = dlsym(smedia_lib, "smedia_get_handle"); | |
1832 sm_release_handle = dlsym(smedia_lib, "smedia_release_handle"); | |
1833 sm_uscsi_cmd = dlsym(smedia_lib, "smedia_uscsi_cmd"); | |
1834 } | |
1835 initialized = 1; | |
1836 } | |
1837 | |
1838 if (sm_get_handle && sm_uscsi_cmd && sm_release_handle | |
1839 && (sm_hdl = sm_get_handle(i_fd))) | |
1840 { | |
1841 int i_ret = sm_uscsi_cmd(sm_hdl, p_sc); | |
1842 sm_release_handle(sm_hdl); | |
1843 return i_ret; | |
1844 } | |
1845 | |
1846 return ioctl( i_fd, USCSICMD, p_sc ); | |
1847 } | |
7027 | 1848 #endif |
1849 | |
1850 #if defined( WIN32 ) | |
1851 /***************************************************************************** | |
1852 * WinInitSSC: initialize a ssc structure for the win32 aspi layer | |
1853 ***************************************************************************** | |
1854 * This function initializes a ssc raw device command structure for future | |
1855 * use, either a read command or a write command. | |
1856 *****************************************************************************/ | |
1857 static void WinInitSSC( struct SRB_ExecSCSICmd *p_ssc, int i_type ) | |
1858 { | |
1859 memset( p_ssc->SRB_BufPointer, 0, p_ssc->SRB_BufLen ); | |
1860 | |
1861 switch( i_type ) | |
1862 { | |
1863 case GPCMD_SEND_KEY: | |
1864 p_ssc->SRB_Flags = SRB_DIR_OUT; | |
1865 break; | |
1866 | |
1867 case GPCMD_READ_DVD_STRUCTURE: | |
1868 case GPCMD_REPORT_KEY: | |
1869 p_ssc->SRB_Flags = SRB_DIR_IN; | |
1870 break; | |
1871 } | |
1872 | |
1873 p_ssc->SRB_Cmd = SC_EXEC_SCSI_CMD; | |
1874 p_ssc->SRB_Flags |= SRB_EVENT_NOTIFY; | |
1875 | |
1876 p_ssc->CDBByte[ 0 ] = i_type; | |
1877 | |
1878 p_ssc->CDBByte[ 8 ] = (u8)(p_ssc->SRB_BufLen >> 8) & 0xff; | |
1879 p_ssc->CDBByte[ 9 ] = (u8) p_ssc->SRB_BufLen & 0xff; | |
1880 p_ssc->SRB_CDBLen = 12; | |
1881 | |
1882 p_ssc->SRB_SenseLen = SENSE_LEN; | |
1883 } | |
1884 | |
1885 /***************************************************************************** | |
1886 * WinSendSSC: send a ssc structure to the aspi layer | |
1887 *****************************************************************************/ | |
1888 static int WinSendSSC( int i_fd, struct SRB_ExecSCSICmd *p_ssc ) | |
1889 { | |
1890 HANDLE hEvent = NULL; | |
1891 struct w32_aspidev *fd = (struct w32_aspidev *) i_fd; | |
1892 | |
1893 hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); | |
1894 if( hEvent == NULL ) | |
1895 { | |
1896 return -1; | |
1897 } | |
1898 | |
1899 p_ssc->SRB_PostProc = hEvent; | |
1900 p_ssc->SRB_HaId = LOBYTE( fd->i_sid ); | |
1901 p_ssc->SRB_Target = HIBYTE( fd->i_sid ); | |
1902 | |
1903 ResetEvent( hEvent ); | |
1904 if( fd->lpSendCommand( (void*) p_ssc ) == SS_PENDING ) | |
1905 WaitForSingleObject( hEvent, INFINITE ); | |
1906 | |
1907 CloseHandle( hEvent ); | |
1908 | |
1909 return p_ssc->SRB_Status == SS_COMP ? 0 : -1; | |
1910 } | |
1911 #endif | |
1912 | |
1913 #if defined( __QNXNTO__ ) | |
1914 /***************************************************************************** | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
1915 * QNXInitCPT: initialize a CPT structure for QNX Neutrino |
7027 | 1916 ***************************************************************************** |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
1917 * This function initializes a cpt command structure for future use, |
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
1918 * either a read command or a write command. |
7027 | 1919 *****************************************************************************/ |
1920 static void QNXInitCPT( CAM_PASS_THRU * p_cpt, int i_type ) | |
1921 { | |
1922 switch( i_type ) | |
1923 { | |
1924 case GPCMD_SEND_KEY: | |
1925 p_cpt->cam_flags = CAM_DIR_OUT; | |
1926 break; | |
1927 | |
1928 case GPCMD_READ_DVD_STRUCTURE: | |
1929 case GPCMD_REPORT_KEY: | |
1930 p_cpt->cam_flags = CAM_DIR_IN; | |
1931 break; | |
1932 } | |
1933 | |
1934 p_cpt->cam_cdb[0] = i_type; | |
1935 | |
1936 p_cpt->cam_cdb[ 8 ] = (p_cpt->cam_dxfer_len >> 8) & 0xff; | |
1937 p_cpt->cam_cdb[ 9 ] = p_cpt->cam_dxfer_len & 0xff; | |
1938 p_cpt->cam_cdb_len = 12; | |
1939 | |
8637
0211de3039eb
update libdvdcss in libmpdvdkit to latest version (1.2.4)
arpi
parents:
8575
diff
changeset
|
1940 p_cpt->cam_timeout = CAM_TIME_DEFAULT; |
7027 | 1941 } |
1942 #endif | |
1943 | |
1944 #if defined( SYS_OS2 ) | |
1945 /***************************************************************************** | |
1946 * OS2InitSDC: initialize a SDC structure for the Execute SCSI-command | |
1947 ***************************************************************************** | |
1948 * This function initializes a OS2 'execute SCSI command' structure for | |
1949 * future use, either a read command or a write command. | |
1950 *****************************************************************************/ | |
1951 static void OS2InitSDC( struct OS2_ExecSCSICmd *p_sdc, int i_type ) | |
1952 { | |
1953 switch( i_type ) | |
1954 { | |
1955 case GPCMD_SEND_KEY: | |
1956 p_sdc->flags = 0; | |
1957 break; | |
1958 | |
1959 case GPCMD_READ_DVD_STRUCTURE: | |
1960 case GPCMD_REPORT_KEY: | |
1961 p_sdc->flags = EX_DIRECTION_IN; | |
1962 break; | |
1963 } | |
1964 | |
1965 p_sdc->command[ 0 ] = i_type; | |
1966 p_sdc->command[ 8 ] = (p_sdc->data_length >> 8) & 0xff; | |
1967 p_sdc->command[ 9 ] = p_sdc->data_length & 0xff; | |
1968 p_sdc->id_code = 0x31304443; // 'CD01' | |
1969 p_sdc->cmd_length = 12; | |
1970 } | |
1971 #endif |