[libdvdcss-devel] win32: Use proper handle instead of file descriptor to access devices

Diego Elio Pettenò flameeyes at flameeyes.eu
Mon Nov 17 03:33:49 CET 2014


Wait, this breaks ABI for win64 doesn't it?
Diego Elio Pettenò — Flameeyes
flameeyes at flameeyes.euhttp://blog.flameeyes.eu/


On 16 November 2014 21:53, Diego Biurrun <git at videolan.org> wrote:
> libdvdcss | branch: master | Diego Biurrun <diego at biurrun.de> | 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
> libdvdcss-devel at videolan.org
> https://mailman.videolan.org/listinfo/libdvdcss-devel


More information about the libdvdcss-devel mailing list