diff options
Diffstat (limited to 'src/libs/kdtools/kdsysinfo_win.cpp')
-rw-r--r-- | src/libs/kdtools/kdsysinfo_win.cpp | 72 |
1 files changed, 44 insertions, 28 deletions
diff --git a/src/libs/kdtools/kdsysinfo_win.cpp b/src/libs/kdtools/kdsysinfo_win.cpp index 383f6dd8c..10666c8e0 100644 --- a/src/libs/kdtools/kdsysinfo_win.cpp +++ b/src/libs/kdtools/kdsysinfo_win.cpp @@ -24,12 +24,21 @@ #include "link.h" +#ifdef Q_CC_MINGW +# ifndef _WIN32_WINNT +# define _WIN32_WINNT 0x0501 +# endif +#endif + #include <windows.h> #include <psapi.h> #include <tlhelp32.h> #include <winnetwk.h> + +#ifndef Q_CC_MINGW #pragma comment(lib, "mpr.lib") +#endif #include <QDebug> #include <QDir> @@ -95,18 +104,26 @@ QList<VolumeInfo> networkVolumeInfosFromMountPoints() Returns a list of volume info objects based on the given \a volumeGUID. The function also solves mounted volume folder paths. It does not return any network drive shares. */ -QList<VolumeInfo> localVolumeInfosFromMountPoints(const QByteArray &volumeGUID) +QList<VolumeInfo> localVolumeInfosFromMountPoints(PTCHAR volumeGUID) { QList<VolumeInfo> volumes; DWORD bufferSize; - char volumeNames[1024] = ""; - if (GetVolumePathNamesForVolumeNameA(volumeGUID, volumeNames, ARRAYSIZE(volumeNames), &bufferSize)) { - QStringList mountedPaths = QString::fromLatin1(volumeNames, bufferSize).split(QLatin1Char(char(0)), - QString::SkipEmptyParts); + TCHAR volumeNames[MAX_PATH + 1] = { 0 }; + if (GetVolumePathNamesForVolumeName(volumeGUID, volumeNames, MAX_PATH, &bufferSize)) { + QStringList mountedPaths = +#ifdef UNICODE + QString::fromWCharArray(volumeNames, bufferSize).split(QLatin1Char(char(0)), QString::SkipEmptyParts); +#else + QString::fromLatin1(volumeNames, bufferSize).split(QLatin1Char(char(0)), QString::SkipEmptyParts); +#endif foreach (const QString &mountedPath, mountedPaths) { VolumeInfo info; info.setMountPath(mountedPath); +#ifdef UNICODE + info.setVolumeDescriptor(QString::fromWCharArray(volumeGUID)); +#else info.setVolumeDescriptor(QString::fromLatin1(volumeGUID)); +#endif volumes.append(info); } } @@ -116,11 +133,11 @@ QList<VolumeInfo> localVolumeInfosFromMountPoints(const QByteArray &volumeGUID) QList<VolumeInfo> mountedVolumes() { QList<VolumeInfo> tmp; - char volumeGUID[MAX_PATH] = ""; - HANDLE handle = FindFirstVolumeA(volumeGUID, ARRAYSIZE(volumeGUID)); + TCHAR volumeGUID[MAX_PATH + 1] = { 0 }; + HANDLE handle = FindFirstVolume(volumeGUID, MAX_PATH); if (handle != INVALID_HANDLE_VALUE) { tmp += localVolumeInfosFromMountPoints(volumeGUID); - while (FindNextVolumeA(handle, volumeGUID, ARRAYSIZE(volumeGUID))) { + while (FindNextVolume(handle, volumeGUID, MAX_PATH)) { tmp += localVolumeInfosFromMountPoints(volumeGUID); } FindVolumeClose(handle); @@ -148,44 +165,42 @@ QList<ProcessInfo> runningProcesses() HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (!snapshot) return param.processes; - PROCESSENTRY32 processStruct; - processStruct.dwSize = sizeof(PROCESSENTRY32); - bool foundProcess = Process32First(snapshot, &processStruct); - const DWORD bufferSize = 1024; - char driveBuffer[bufferSize]; + QStringList deviceList; + const DWORD bufferSize = 1024; + char buffer[bufferSize + 1] = { 0 }; if (QSysInfo::windowsVersion() <= QSysInfo::WV_5_2) { - DWORD size = GetLogicalDriveStringsA(bufferSize, driveBuffer); - deviceList = QString::fromLatin1(driveBuffer, size).split(QLatin1Char(char(0)), QString::SkipEmptyParts); + const DWORD size = GetLogicalDriveStringsA(bufferSize, buffer); + deviceList = QString::fromLatin1(buffer, size).split(QLatin1Char(char(0)), QString::SkipEmptyParts); } QLibrary kernel32(QLatin1String("Kernel32.dll")); kernel32.load(); - void *pQueryFullProcessImageNameA = kernel32.resolve("QueryFullProcessImageNameA"); + QueryFullProcessImageNamePtr pQueryFullProcessImageNamePtr = (QueryFullProcessImageNamePtr) kernel32 + .resolve("QueryFullProcessImageNameA"); QLibrary psapi(QLatin1String("Psapi.dll")); psapi.load(); - void *pGetProcessImageFileNamePtr = psapi.resolve("GetProcessImageFileNameA"); - QueryFullProcessImageNamePtr callPtr = (QueryFullProcessImageNamePtr) pQueryFullProcessImageNameA; - GetProcessImageFileNamePtr callPtrXp = (GetProcessImageFileNamePtr) pGetProcessImageFileNamePtr; + GetProcessImageFileNamePtr pGetProcessImageFileNamePtr = (GetProcessImageFileNamePtr) psapi + .resolve("GetProcessImageFileNameA"); + PROCESSENTRY32 processStruct; + processStruct.dwSize = sizeof(PROCESSENTRY32); + bool foundProcess = Process32First(snapshot, &processStruct); while (foundProcess) { HANDLE procHandle = OpenProcess(QSysInfo::windowsVersion() > QSysInfo::WV_5_2 - ? KDSYSINFO_PROCESS_QUERY_LIMITED_INFORMATION - : PROCESS_QUERY_INFORMATION, - false, - processStruct.th32ProcessID); - char buffer[1024]; - DWORD bufferSize = 1024; + ? KDSYSINFO_PROCESS_QUERY_LIMITED_INFORMATION : PROCESS_QUERY_INFORMATION, false, processStruct + .th32ProcessID); + bool succ = false; QString executablePath; - ProcessInfo info; + DWORD bufferSize = 1024; if (QSysInfo::windowsVersion() > QSysInfo::WV_5_2) { - succ = callPtr(procHandle, 0, buffer, &bufferSize); + succ = pQueryFullProcessImageNamePtr(procHandle, 0, buffer, &bufferSize); executablePath = QString::fromLatin1(buffer); } else if (pGetProcessImageFileNamePtr) { - succ = callPtrXp(procHandle, buffer, bufferSize); + succ = pGetProcessImageFileNamePtr(procHandle, buffer, bufferSize); executablePath = QString::fromLatin1(buffer); for (int i = 0; i < deviceList.count(); ++i) { executablePath.replace(QString::fromLatin1( "\\Device\\HarddiskVolume%1\\" ).arg(i + 1), @@ -196,6 +211,7 @@ QList<ProcessInfo> runningProcesses() if (succ) { const quint32 pid = processStruct.th32ProcessID; param.seenIDs.append(pid); + ProcessInfo info; info.id = pid; info.name = executablePath; param.processes.append(info); |