[libdvdcss-devel] [PATCH 4/7] win32: Use proper handle instead of file descriptor to access devices
Jean-Baptiste Kempf
jb at videolan.org
Sun Nov 16 20:41:17 CET 2014
OK.
On 16 Nov, Diego Biurrun wrote :
> This also allows simplifying the Windows init code.
> ---
> src/device.c | 60 ++++++++++++++++++++++++---------------------------------
> src/libdvdcss.h | 6 +++++-
> 2 files changed, 30 insertions(+), 36 deletions(-)
>
> diff --git a/src/device.c b/src/device.c
> index 46ab121..8744810 100644
> --- a/src/device.c
> +++ b/src/device.c
> @@ -96,7 +96,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;
> }
> @@ -348,38 +348,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 = os2_seek;
> dvdcss->pf_read = os2_read;
> dvdcss->pf_readv = os2_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;
> @@ -397,9 +391,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
> @@ -449,19 +443,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;
> @@ -545,8 +537,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)
> @@ -605,9 +596,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;
> @@ -729,7 +719,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..6d7e267 100644
> --- a/src/libdvdcss.h
> +++ b/src/libdvdcss.h
> @@ -26,6 +26,10 @@
>
> #include <limits.h>
>
> +#ifdef WIN32
> +# include <windows.h>
> +#endif
> +
> #include "dvdcss/dvdcss.h"
> #include "css.h"
> #include "device.h"
> @@ -70,7 +74,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 */
> --
> 2.1.0
>
> _______________________________________________
> libdvdcss-devel mailing list
> libdvdcss-devel at videolan.org
> https://mailman.videolan.org/listinfo/libdvdcss-devel
--
With my kindest regards,
--
Jean-Baptiste Kempf
http://www.jbkempf.com/ - +33 672 704 734
Sent from my Electronic Device
More information about the libdvdcss-devel
mailing list