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

Diego Biurrun diego at biurrun.de
Sun Nov 16 20:37:11 CET 2014


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



More information about the libdvdcss-devel mailing list