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
