Re: [libdvdcss-devel] win32: Use proper handle instead of file descriptor to access devices
Diego Elio Pettenò <[email protected]> Mon, 17 Nov 2014 02:33:49 +0000
| Newsgroups | gmane.comp.video.videolan.libdvdcss,gmane.comp.video.videolan.libdvdcss.devel |
|---|---|
| Message-ID | <CAHcsgXRF+OwOR-YrabXikOQFU_-cB18+ZutOwf-OJ6TCq6ZjOQ@mail.gmail.com> |
Wait, this breaks ABI for win64 doesn't it? Diego Elio Pettenò — Flameeyes [email protected] — http://blog.flameeyes.eu/ On 16 November 2014 21:53, Diego Biurrun <[email protected]> wrote: > 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 _______________________________________________ libdvdcss-devel mailing list [email protected] https://mailman.videolan.org/listinfo/libdvdcss-devel