summaryrefslogtreecommitdiffstats
path: root/rbutil/rbutilqt/autodetection.cpp
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2008-06-29 09:50:20 +0000
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2008-06-29 09:50:20 +0000
commit788d01ef7f35a44a38d34278e91f77e132f89860 (patch)
tree5e88a8017972ba486b7cd8e7e54d54fc7ffa3dee /rbutil/rbutilqt/autodetection.cpp
parent6f6fcfc3a8510d222981d856e81250561bcc5921 (diff)
downloadrockbox-788d01ef7f35a44a38d34278e91f77e132f89860.tar.gz
rockbox-788d01ef7f35a44a38d34278e91f77e132f89860.zip
Add w32 mountpoint resolving based on disc number correctly this time.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17873 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'rbutil/rbutilqt/autodetection.cpp')
-rw-r--r--rbutil/rbutilqt/autodetection.cpp55
1 files changed, 44 insertions, 11 deletions
diff --git a/rbutil/rbutilqt/autodetection.cpp b/rbutil/rbutilqt/autodetection.cpp
index 431cb0251e..7399907f15 100644
--- a/rbutil/rbutilqt/autodetection.cpp
+++ b/rbutil/rbutilqt/autodetection.cpp
@@ -39,8 +39,10 @@
#include <tchar.h>
#include <windows.h>
#include <setupapi.h>
+#include <winioctl.h>
#endif
#include "detect.h"
+#include "utils.h"
Autodetection::Autodetection(QObject* parent): QObject(parent)
{
@@ -157,14 +159,12 @@ bool Autodetection::detect()
if(n == 1) {
qDebug() << "Ipod found:" << ipod.modelstr << "at" << ipod.diskname;
m_device = ipod.targetname;
-#if !defined(Q_OS_WIN32)
m_mountpoint = resolveMountPoint(ipod.diskname);
-#endif
-#if defined(Q_OS_WIN32)
- m_mountpoint = getMountpointByDevice(ipod.diskname);
-#endif
return true;
}
+ else {
+ qDebug() << "ipodpatcher: no Ipod found." << n;
+ }
//try sansapatcher
struct sansa_t sansa;
@@ -172,14 +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;
}
+ else {
+ qDebug() << "sansapatcher: no Sansa found." << n;
+ }
if(m_mountpoint.isEmpty() && m_device.isEmpty() && m_errdev.isEmpty() && m_incompat.isEmpty())
return false;
@@ -256,8 +254,43 @@ QString Autodetection::resolveMountPoint(QString device)
mntinf++;
}
#endif
- return QString("");
+#if defined(Q_OS_WIN32)
+ QString result;
+ unsigned int driveno = device.replace(QRegExp("^.*([0-9]+)"), "\\1").toInt();
+
+ 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(unsigned int a = 0; a < extents->NumberOfDiskExtents; a++) {
+ qDebug() << "Disk:" << extents->Extents[a].DiskNumber;
+ if(extents->Extents[a].DiskNumber == driveno) {
+ result = letter;
+ qDebug("drive found for volume %i: %c", driveno, letter);
+ break;
+ }
+ }
+
+ }
+
+ }
+ return result + ":/";
+#endif
+ return QString("");
}