libaacs | branch: master | npzacs <[email protected]> | Mon Sep 27 19:28:26 2010 
+0300| [8063bb52572a51418e1a630d8bad8487f8bdb8e5] | committer: npzacs 

mmc_open()/mmc_close() for Win32

> http://git.videolan.org/gitweb.cgi/libaacs.git/?a=commit;h=8063bb52572a51418e1a630d8bad8487f8bdb8e5
---

 src/libaacs/mmc.c |   50 ++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 48 insertions(+), 2 deletions(-)

diff --git a/src/libaacs/mmc.c b/src/libaacs/mmc.c
index 4eea086..3b21471 100644
--- a/src/libaacs/mmc.c
+++ b/src/libaacs/mmc.c
@@ -41,13 +41,22 @@
 #include <linux/cdrom.h>
 #endif
 
+#if defined(_WIN32)
+#include <windows.h>
+#include <winsock.h>
+#endif
+
 /* define in CFLAGS to skip drive certificate checks */
 #ifndef PATCHED_DRIVE
 #define PATCHED_DRIVE 0
 #endif
 
 struct mmc {
-    int fd;
+#if defined(_WIN32)
+    HANDLE fd;
+#else
+    int    fd;
+#endif
     uint8_t host_priv_key[20], host_cert[92], host_nonce[20];
     uint8_t host_key_point[40];
 };
@@ -269,7 +278,7 @@ MMC *mmc_open(const char *path, const uint8_t 
*host_priv_key,
     if (host_nonce) memcpy(mmc->host_nonce, host_nonce, 20);
     if (host_key_point) memcpy(mmc->host_key_point, host_key_point, 40);
 
-#ifdef HAVE_MNTENT_H
+#if defined(HAVE_MNTENT_H)
 
     char *file_path = (char*)malloc(strlen(path) + 1);
     strcpy(file_path, path);
@@ -311,6 +320,36 @@ MMC *mmc_open(const char *path, const uint8_t 
*host_priv_key,
         X_FREE(mmc);
     }
 
+#elif defined(_WIN32)
+    char drive[] = { path[0], ':', '\\', 0 };
+    char volume[] = {'\\', '\\', '.', '\\', path[0], ':', 0};
+
+    DEBUG(DBG_MMC, "Opening Windows MMC drive %s... (%p)\n", drive, mmc);
+
+    UINT type = GetDriveType(drive);
+
+    if (type != DRIVE_CDROM) {
+        DEBUG(DBG_MMC, "Drive %s is not CD/DVD drive !\n", drive);
+        X_FREE(mmc);
+        return NULL;
+    }
+
+    mmc->fd = CreateFile(volume, GENERIC_READ | GENERIC_WRITE,
+                         FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+                         OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+    if (mmc->fd == INVALID_HANDLE_VALUE) {
+        mmc->fd = CreateFile(volume, GENERIC_READ,
+                             FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+                             OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+        if (mmc->fd == INVALID_HANDLE_VALUE) {
+            DEBUG(DBG_MMC, "Failed opening Windows MMC drive %s (%p)\n", 
volume, mmc);
+            X_FREE(mmc);
+            return NULL;
+        }
+    }
+
+    DEBUG(DBG_MMC, "Windows MMC drive %s opened (%p)\n", volume, mmc);
+
 #else
 
     DEBUG(DBG_MMC, "No MMC drive support !\n");
@@ -325,10 +364,17 @@ void mmc_close(MMC *mmc)
 {
     if (mmc) {
 
+#if defined(HAVE_LINUX_CDROM_H)
         if (mmc->fd >= 0) {
             close(mmc->fd);
         }
 
+#elif defined(_WIN32)
+        if (mmc->fd != INVALID_HANDLE_VALUE) {
+            CloseHandle(mmc->fd);
+        }
+#endif
+
         DEBUG(DBG_MMC, "Closed MMC drive (%p)\n", mmc);
 
         X_FREE(mmc);

_______________________________________________
libaacs-devel mailing list
[email protected]
http://mailman.videolan.org/listinfo/libaacs-devel

Reply via email to