[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.eu — http://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