diff options
Diffstat (limited to 'src/libs/kdtools/kdsysinfo_win.cpp')
-rw-r--r-- | src/libs/kdtools/kdsysinfo_win.cpp | 222 |
1 files changed, 34 insertions, 188 deletions
diff --git a/src/libs/kdtools/kdsysinfo_win.cpp b/src/libs/kdtools/kdsysinfo_win.cpp index 10666c8e0..edeeb6879 100644 --- a/src/libs/kdtools/kdsysinfo_win.cpp +++ b/src/libs/kdtools/kdsysinfo_win.cpp @@ -1,28 +1,48 @@ /**************************************************************************** -** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved. ** -** This file is part of the KD Tools library. +** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB) +** Contact: http://www.qt-project.org/legal ** -** Licensees holding valid commercial KD Tools licenses may use this file in -** accordance with the KD Tools Commercial License Agreement provided with -** the Software. +** This file is part of the Qt Installer Framework. ** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. ** -** This file may be distributed and/or modified under the terms of the -** GNU Lesser General Public License version 2 and version 3 as published by the -** Free Software Foundation and appearing in the file LICENSE.LGPL included. +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** Contact info@kdab.com if any conditions of this licensing are not -** clear to you. +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. ** -**********************************************************************/ +** +** $QT_END_LICENSE$ +** +****************************************************************************/ #include "kdsysinfo.h" -#include "link.h" +#include <QLibrary> +#include <QStringList> #ifdef Q_CC_MINGW # ifndef _WIN32_WINNT @@ -34,16 +54,6 @@ #include <psapi.h> #include <tlhelp32.h> -#include <winnetwk.h> - -#ifndef Q_CC_MINGW -#pragma comment(lib, "mpr.lib") -#endif - -#include <QDebug> -#include <QDir> -#include <QLibrary> - const int KDSYSINFO_PROCESS_QUERY_LIMITED_INFORMATION = 0x1000; namespace KDUpdater { @@ -56,100 +66,6 @@ quint64 installedMemory() return quint64(status.ullTotalPhys); } -VolumeInfo updateVolumeSizeInformation(const VolumeInfo &info) -{ - ULARGE_INTEGER bytesTotal; - ULARGE_INTEGER freeBytesPerUser; - - VolumeInfo update = info; - if (GetDiskFreeSpaceExA(qPrintable(info.volumeDescriptor()), &freeBytesPerUser, &bytesTotal, NULL)) { - update.setSize(bytesTotal.QuadPart); - update.setAvailableSize(freeBytesPerUser.QuadPart); - } - return update; -} - -/*! - Returns a list of volume info objects that are mounted as network drive shares. -*/ -QList<VolumeInfo> networkVolumeInfosFromMountPoints() -{ - QList<VolumeInfo> volumes; - QFileInfoList drives = QDir::drives(); - foreach (const QFileInfo &drive, drives) { - const QString driveLetter = QDir::toNativeSeparators(drive.canonicalPath()); - const uint driveType = GetDriveTypeA(qPrintable(driveLetter)); - switch (driveType) { - case DRIVE_REMOTE: { - char buffer[1024] = ""; - DWORD bufferLength = 1024; - UNIVERSAL_NAME_INFOA *universalNameInfo = (UNIVERSAL_NAME_INFOA*) &buffer; - if (WNetGetUniversalNameA(qPrintable(driveLetter), UNIVERSAL_NAME_INFO_LEVEL, - LPVOID(universalNameInfo), &bufferLength) == NO_ERROR) { - VolumeInfo info; - info.setMountPath(driveLetter); - info.setVolumeDescriptor(QLatin1String(universalNameInfo->lpUniversalName)); - volumes.append(info); - } - } break; - - default: - break; - } - } - return volumes; -} - -/*! - 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(PTCHAR volumeGUID) -{ - QList<VolumeInfo> volumes; - DWORD bufferSize; - 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); - } - } - return volumes; -} - -QList<VolumeInfo> mountedVolumes() -{ - QList<VolumeInfo> tmp; - TCHAR volumeGUID[MAX_PATH + 1] = { 0 }; - HANDLE handle = FindFirstVolume(volumeGUID, MAX_PATH); - if (handle != INVALID_HANDLE_VALUE) { - tmp += localVolumeInfosFromMountPoints(volumeGUID); - while (FindNextVolume(handle, volumeGUID, MAX_PATH)) { - tmp += localVolumeInfosFromMountPoints(volumeGUID); - } - FindVolumeClose(handle); - } - tmp += networkVolumeInfosFromMountPoints(); - - QList<VolumeInfo> volumes; - while (!tmp.isEmpty()) // update volume size information - volumes.append(updateVolumeSizeInformation(tmp.takeFirst())); - return volumes; -} - struct EnumWindowsProcParam { QList<ProcessInfo> processes; @@ -228,74 +144,4 @@ QList<ProcessInfo> runningProcesses() return param.processes; } -bool CALLBACK TerminateAppEnum(HWND hwnd, LPARAM lParam) -{ - DWORD dwID; - GetWindowThreadProcessId(hwnd, &dwID); - - if (dwID == (DWORD)lParam) - PostMessage(hwnd, WM_CLOSE, 0, 0); - - return true; -} - -bool killProcess(const ProcessInfo &process, int msecs) -{ - DWORD dwTimeout = msecs; - if (msecs == -1) - dwTimeout = INFINITE; - - // If we can't open the process with PROCESS_TERMINATE rights, - // then we give up immediately. - HANDLE hProc = OpenProcess(SYNCHRONIZE | PROCESS_TERMINATE, FALSE, process.id); - - if (hProc == 0) - return false; - - // TerminateAppEnum() posts WM_CLOSE to all windows whose PID - // matches your process's. - EnumWindows((WNDENUMPROC)TerminateAppEnum, (LPARAM)process.id); - - // Wait on the handle. If it signals, great. If it times out, - // then you kill it. - bool returnValue = false; - if (WaitForSingleObject(hProc, dwTimeout) != WAIT_OBJECT_0) - returnValue = TerminateProcess(hProc, 0); - - CloseHandle(hProc) ; - - return returnValue; -} - -bool pathIsOnLocalDevice(const QString &path) -{ - if (!QFileInfo(path).exists()) - return false; - - if (path.startsWith(QLatin1String("\\\\"))) - return false; - - QDir dir(path); - do { - if (QFileInfo(dir, QString()).isSymLink()) { - QString currentPath = QFileInfo(dir, QString()).absoluteFilePath(); - return pathIsOnLocalDevice(Link(currentPath).targetPath()); - } - } while (dir.cdUp()); - - const UINT DRIVE_REMOTE_TYPE = 4; - if (path.contains(QLatin1Char(':'))) { - const QLatin1Char nullTermination('\0'); - // for example "c:\" - const QString driveSearchString = path.left(3) + nullTermination; - WCHAR wCharDriveSearchArray[4]; - driveSearchString.toWCharArray(wCharDriveSearchArray); - UINT type = GetDriveType(wCharDriveSearchArray); - if (type == DRIVE_REMOTE_TYPE) - return false; - } - - return true; -} - } // namespace KDUpdater |