[libdvdcss-devel] win32: Use proper handle instead of file descriptor to access devices
[email protected] (Diego Biurrun) Sun, 16 Nov 2014 22:53:02 +0100 (CET)
| Newsgroups | gmane.comp.video.videolan.libdvdcss,gmane.comp.video.videolan.libdvdcss.devel |
|---|---|
| Message-ID | <[email protected]> |
libdvdcss | branch: master | Diego Biurrun <[email protected]> | Sun Nov 16 18:36:39 2014 +0100| [1b4e3f9e1c4e7b53cce59b802f95f6400ba641dd] | committer: Diego Biurrun win32: Use proper handle instead of file descriptor to access devices This also allows simplifying the Windows init code. > http://git.videolan.org/gitweb.cgi/libdvdcss.git/?a=commit;h=1b4e3f9e1c4e7b53cce59b802f95f6400ba641dd --- src/device.c | 60 +++++++++++++++++++++++-------------------------------- src/libdvdcss.h | 7 ++++++- 2 files changed, 31 insertions(+), 36 deletions(-) diff --git a/src/device.c b/src/device.c index 6148f4a..da4ecc4 100644 --- a/src/device.c +++ b/src/device.c @@ -92,7 +92,7 @@ static int os2_open ( dvdcss_t, const char * ); int dvdcss_use_ioctls( dvdcss_t dvdcss ) { #if defined( WIN32 ) - if( dvdcss->b_file ) + if( dvdcss->p_handle ) { return 0; } @@ -344,38 +344,32 @@ int dvdcss_open_device ( dvdcss_t dvdcss ) print_debug( dvdcss, "opening target `%s'", psz_device ); #if defined( WIN32 ) - dvdcss->b_file = 1; - /* If device is "X:" or "X:\", we are not actually opening a file. */ - if (psz_device[0] && psz_device[1] == ':' && - (!psz_device[2] || (psz_device[2] == '\\' && !psz_device[3]))) - dvdcss->b_file = 0; - - /* Initialize readv temporary buffer */ + dvdcss->p_handle = NULL; dvdcss->p_readv_buffer = NULL; dvdcss->i_readv_buf_size = 0; +#endif /* defined( WIN32 ) */ - if( !dvdcss->b_file ) +#if defined( WIN32 ) || defined( __OS2__ ) + /* If device is "X:" or "X:\", we are not actually opening a file. */ + if( psz_device[0] && psz_device[1] == ':' && + ( !psz_device[2] || ( psz_device[2] == '\\' && !psz_device[3] ) ) ) { +#if defined( WIN32 ) print_debug( dvdcss, "using Win2K API for access" ); dvdcss->pf_seek = win2k_seek; dvdcss->pf_read = win2k_read; dvdcss->pf_readv = win2k_readv; return win2k_open( dvdcss, psz_device ); - } - else #elif defined( __OS2__ ) - /* If device is "X:" or "X:\", we are not actually opening a file. */ - if( psz_device[0] && psz_device[1] == ':' && - ( !psz_device[2] || ( psz_device[2] == '\\' && !psz_device[3] ) ) ) - { print_debug( dvdcss, "using OS/2 API for access" ); dvdcss->pf_seek = libc_seek; dvdcss->pf_read = libc_read; dvdcss->pf_readv = libc_readv; return os2_open( dvdcss, psz_device ); +#endif /* ! ( defined( WIN32 ) || defined( __OS2__ ) ) */ } else -#endif +#endif /* defined( WIN32 ) || defined( __OS2__ ) */ { print_debug( dvdcss, "using libc for access" ); dvdcss->pf_seek = libc_seek; @@ -393,9 +387,9 @@ int dvdcss_close_device ( dvdcss_t dvdcss ) dvdcss->p_readv_buffer = NULL; dvdcss->i_readv_buf_size = 0; - if( !dvdcss->b_file ) + if( dvdcss->p_handle ) { - CloseHandle( (HANDLE) dvdcss->i_fd ); + CloseHandle( dvdcss->p_handle ); } else #endif @@ -445,19 +439,17 @@ static int win2k_open ( dvdcss_t dvdcss, const char *psz_device ) * won't send back the right result). * (See Microsoft Q241374: Read and Write Access Required for SCSI * Pass Through Requests) */ - dvdcss->i_fd = (int) - CreateFile( psz_dvd, GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, OPEN_EXISTING, - FILE_FLAG_RANDOM_ACCESS, NULL ); + dvdcss->p_handle = CreateFile( psz_dvd, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, + FILE_FLAG_RANDOM_ACCESS, NULL ); - if( (HANDLE) dvdcss->i_fd == INVALID_HANDLE_VALUE ) - dvdcss->i_fd = (int) - CreateFile( psz_dvd, GENERIC_READ, FILE_SHARE_READ, - NULL, OPEN_EXISTING, - FILE_FLAG_RANDOM_ACCESS, NULL ); + if( dvdcss->p_handle == INVALID_HANDLE_VALUE ) + dvdcss->p_handle = CreateFile( psz_dvd, GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, + FILE_FLAG_RANDOM_ACCESS, NULL ); - if( (HANDLE) dvdcss->i_fd == INVALID_HANDLE_VALUE ) + if( dvdcss->p_handle == INVALID_HANDLE_VALUE ) { print_error( dvdcss, "failed opening device" ); return -1; @@ -541,8 +533,7 @@ static int win2k_seek( dvdcss_t dvdcss, int i_blocks ) li_seek.QuadPart = (LONGLONG)i_blocks * DVDCSS_BLOCK_SIZE; - li_seek.LowPart = SetFilePointer( (HANDLE) dvdcss->i_fd, - li_seek.LowPart, + li_seek.LowPart = SetFilePointer( dvdcss->p_handle, li_seek.LowPart, &li_seek.HighPart, FILE_BEGIN ); if( (li_seek.LowPart == INVALID_SET_FILE_POINTER) && GetLastError() != NO_ERROR) @@ -601,9 +592,8 @@ static int win2k_read ( dvdcss_t dvdcss, void *p_buffer, int i_blocks ) { DWORD i_bytes; - if( !ReadFile( (HANDLE) dvdcss->i_fd, p_buffer, - i_blocks * DVDCSS_BLOCK_SIZE, - &i_bytes, NULL ) ) + if( !ReadFile( dvdcss->p_handle, p_buffer,i_blocks * DVDCSS_BLOCK_SIZE, + &i_bytes, NULL ) ) { dvdcss->i_pos = -1; return -1; @@ -725,7 +715,7 @@ static int win2k_readv ( dvdcss_t dvdcss, const struct iovec *p_iovec, if( i_blocks_total <= 0 ) return 0; - if( !ReadFile( (HANDLE)dvdcss->i_fd, dvdcss->p_readv_buffer, + if( !ReadFile( dvdcss->p_handle, dvdcss->p_readv_buffer, i_blocks_total, &i_bytes, NULL ) ) { /* The read failed... too bad. diff --git a/src/libdvdcss.h b/src/libdvdcss.h index 31c15bc..5f6cb3e 100644 --- a/src/libdvdcss.h +++ b/src/libdvdcss.h @@ -26,6 +26,11 @@ #include <limits.h> +#ifdef WIN32 +# include "config.h" +# include <windows.h> +#endif + #include "dvdcss/dvdcss.h" #include "css.h" #include "device.h" @@ -70,7 +75,7 @@ struct dvdcss_s int b_debug; #ifdef WIN32 - int b_file; + HANDLE p_handle; char * p_readv_buffer; int i_readv_buf_size; #endif /* WIN32 */ _______________________________________________ libdvdcss-devel mailing list [email protected] https://mailman.videolan.org/listinfo/libdvdcss-devel