[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