summaryrefslogtreecommitdiffstats
path: root/src/libs/kdtools/kdsysinfo_win.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/kdtools/kdsysinfo_win.cpp')
-rw-r--r--src/libs/kdtools/kdsysinfo_win.cpp72
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);