Add W32 mountpoint resolving based on the disc number figured by ipodpatcher / sansap...
authorbluebrother <bluebrother@a1c6a512-1295-4272-9138-f99709370657>
Sun, 29 Jun 2008 07:45:33 +0000 (29 07:45 +0000)
committerbluebrother <bluebrother@a1c6a512-1295-4272-9138-f99709370657>
Sun, 29 Jun 2008 07:45:33 +0000 (29 07:45 +0000)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17868 a1c6a512-1295-4272-9138-f99709370657

rbutil/rbutilqt/autodetection.cpp
rbutil/rbutilqt/utils.cpp
rbutil/rbutilqt/utils.h

index c356cc6..431cb02 100644 (file)
@@ -160,6 +160,9 @@ bool Autodetection::detect()
 #if !defined(Q_OS_WIN32)
         m_mountpoint = resolveMountPoint(ipod.diskname);
 #endif
+#if defined(Q_OS_WIN32)
+        m_mountpoint = getMountpointByDevice(ipod.diskname);
+#endif
         return true;
     }
 
@@ -169,7 +172,12 @@ bool Autodetection::detect()
     if(n == 1) {
         qDebug() << "Sansa found:" << sansa.targetname << "at" << sansa.diskname;
         m_device = QString("sansa%1").arg(sansa.targetname);
+#if !defined(Q_OS_WIN32)
         m_mountpoint = resolveMountPoint(sansa.diskname);
+#endif
+#if defined(Q_OS_WIN32)
+        m_mountpoint = getMountpointByDevice(sansa.diskname);
+#endif
         return true;
     }
 
index 236f28b..3e3a591 100644 (file)
  ****************************************************************************/
 
 #include "utils.h"
+#ifdef UNICODE
+#define _UNICODE
+#endif
 
 #include <QtCore>
 #include <QDebug>
 #include <cstdlib>
 #include <stdio.h>
 
+#if defined(Q_OS_WIN32)
+#include <windows.h>
+#include <tchar.h>
+#include <winioctl.h>
+#endif
+
 // recursive function to delete a dir with files
 bool recRmdir( const QString &dirName )
 {
@@ -90,4 +99,41 @@ QString resolvePathCase(QString path)
     return realpath;
 }
 
+#if defined(Q_OS_WIN32)
+QString getMountpointByDevice(int drive)
+{
+    QString result;
+    for(int letter = 'A'; letter <= 'Z'; letter++) {
+        DWORD written;
+        HANDLE h;
+        TCHAR uncpath[MAX_PATH];
+        UCHAR buffer[0x400];
+        PVOLUME_DISK_EXTENTS extents = (PVOLUME_DISK_EXTENTS)buffer;
+
+        _stprintf(uncpath, _TEXT("\\\\.\\%c:"), letter);
+        h = CreateFile(uncpath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
+                NULL, OPEN_EXISTING, 0, NULL);
+        if(h == INVALID_HANDLE_VALUE) {
+            qDebug() << "error getting extents for" << uncpath;
+            continue;
+        }
+        // get the extents
+        if(DeviceIoControl(h, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,
+                    NULL, 0, extents, sizeof(buffer), &written, NULL)) {
+            for(int a = 0; a < extents->NumberOfDiskExtents; a++) {
+                qDebug() << "Disk:" << extents->Extents[a].DiskNumber;
+                if(extents->Extents[a].DiskNumber == drive) {
+                    result = letter;
+                    qDebug("found: %c", letter);
+                    break;
+                }
+            }
+
+        }
+
+    }
+    return result;
+
+}
+#endif
 
index 19cdca9..904f590 100644 (file)
@@ -29,5 +29,9 @@
 bool recRmdir( const QString &dirName );
 QString resolvePathCase(QString path);
 
+#if defined(Q_OS_WIN32)
+QString getMountpointByDevice(int drive);
+#endif
+
 #endif