Some fixes and improvements to wow64fsredir_disable() function.
[MUtilities.git] / include / MUtils / OSSupport.h
blobb1d558ad35aadb94882a8dae77a1f373b2508af5
1 ///////////////////////////////////////////////////////////////////////////////
2 // MuldeR's Utilities for Qt
3 // Copyright (C) 2004-2019 LoRd_MuldeR <MuldeR2@GMX.de>
4 //
5 // This library is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU Lesser General Public
7 // License as published by the Free Software Foundation; either
8 // version 2.1 of the License, or (at your option) any later version.
9 //
10 // This library is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 // Lesser General Public License for more details.
15 // You should have received a copy of the GNU Lesser General Public
16 // License along with this library; if not, write to the Free Software
17 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 // http://www.gnu.org/licenses/lgpl-2.1.txt
20 //////////////////////////////////////////////////////////////////////////////////
22 /**
23 * @file
24 * @brief This file contains function that wrap OS-specific functionality in a platform-independent way
27 #pragma once
29 //MUtils
30 #include <MUtils/Global.h>
32 //Qt
33 #include <QString>
34 #include <QMap>
35 #include <QDate>
36 #include <QWidget>
38 //Forward declaration
39 class QFile;
41 ///////////////////////////////////////////////////////////////////////////////
43 /**
44 * \brief Global MUtils namespace
46 namespace MUtils
48 /**
49 * \brief MUtils OS-specific functions namespace
51 namespace OS
53 /**
54 * \brief OS version information namespace
56 namespace Version
58 /**
59 * \brief This enumeration specifies the type of the underlaying operating system
61 typedef enum
63 OS_UNKNOWN = 0, ///< Unknown operating system
64 OS_WINDOWS = 1 ///< Microsoft(R) Windows
66 os_type_t;
68 /**
69 * \brief This struct contains version information about the underlaying operating system. See `_os_version_t` for details!
71 typedef struct _os_version_t
73 unsigned int type; ///< The type of the underlaying operating system, as `os_type_t`
74 unsigned int versionMajor; ///< The *major* version of the underlaying operating system
75 unsigned int versionMinor; ///< The *minor* version of the underlaying operating system
76 unsigned int versionBuild; ///< The *build* number of the underlaying operating system
77 unsigned int versionSPack; ///< The *service pack* version of the underlaying operating system
78 bool overrideFlag;
80 MUTILS_API bool operator== (const _os_version_t &rhs) const;
81 MUTILS_API bool operator!= (const _os_version_t &rhs) const;
82 MUTILS_API bool operator> (const _os_version_t &rhs) const;
83 MUTILS_API bool operator>= (const _os_version_t &rhs) const;
84 MUTILS_API bool operator< (const _os_version_t &rhs) const;
85 MUTILS_API bool operator<= (const _os_version_t &rhs) const;
87 os_version_t;
89 //Known Windows NT versions
90 MUTILS_API extern const os_version_t WINDOWS_WIN2K; ///< \brief Operating system version constant \details Microsoft(R) Windows 2000
91 MUTILS_API extern const os_version_t WINDOWS_WINXP; ///< \brief Operating system version constant \details Microsoft(R) Windows XP
92 MUTILS_API extern const os_version_t WINDOWS_XPX64; ///< \brief Operating system version constant \details Microsoft(R) Windows XP x64-edition
93 MUTILS_API extern const os_version_t WINDOWS_VISTA; ///< \brief Operating system version constant \details Microsoft(R) Windows Vista
94 MUTILS_API extern const os_version_t WINDOWS_WIN70; ///< \brief Operating system version constant \details Microsoft(R) Windows 7
95 MUTILS_API extern const os_version_t WINDOWS_WIN80; ///< \brief Operating system version constant \details Microsoft(R) Windows 8
96 MUTILS_API extern const os_version_t WINDOWS_WIN81; ///< \brief Operating system version constant \details Microsoft(R) Windows 8.1
97 MUTILS_API extern const os_version_t WINDOWS_WN100; ///< \brief Operating system version constant \details Microsoft(R) Windows 10
99 //Unknown OS
100 MUTILS_API extern const os_version_t UNKNOWN_OPSYS; ///< \brief Operating system version constant \details Unknown operating system version
104 * \brief This enumeration specifies "known" folder identifiers
106 typedef enum
108 FOLDER_ROAMING_DATA = 0, ///< Application-specific data
109 FOLDER_LOCALAPPDATA = 1, ///< Local application data (non-roaming)
110 FOLDER_USER_PROFILE = 2, ///< The user's profile folder
111 FOLDER_PROGRAMFILES = 3, ///< Program files
112 FOLDER_SYSTEMFOLDER = 4, ///< System directory
113 FOLDER_SYSTROOT_DIR = 5 ///< System "root" directory
115 known_folder_t;
118 * \brief This enumeration specifies network connection types
120 typedef enum
122 NETWORK_TYPE_ERR = 0, ///< Network connection is unknown
123 NETWORK_TYPE_NON = 1, ///< Computer is **not** connected to a network
124 NETWORK_TYPE_YES = 2 ///< Computer *is* connected to a network
126 network_type_t;
129 * \brief This enumeration specifies drive types
131 typedef enum
133 DRIVE_TYPE_ERR = 0, ///< The drive type cannot be determined
134 DRIVE_TYPE_FDD = 1, ///< Floppy Drive, or Flash Card reader
135 DRIVE_TYPE_HDD = 2, ///< Hard Disk drive or Solid-State Drive
136 DRIVE_TYPE_NET = 3, ///< Remote/Network drive
137 DRIVE_TYPE_OPT = 4, ///< Optical disk srive, e.g. CD or DVD
138 DRIVE_TYPE_RAM = 5 ///< RAM disk
140 drive_type_t;
142 //System message
143 MUTILS_API void system_message_nfo(const wchar_t *const title, const wchar_t *const text);
144 MUTILS_API void system_message_wrn(const wchar_t *const title, const wchar_t *const text);
145 MUTILS_API void system_message_err(const wchar_t *const title, const wchar_t *const text);
147 //CLI Arguments
148 typedef QMap<QString,QString> ArgumentMap;
149 MUTILS_API const QStringList crack_command_line(const QString &command_line = QString());
150 MUTILS_API const ArgumentMap &arguments(void);
152 //Copy file
153 typedef bool (*progress_callback_t)(const double &progress, void *const userData);
154 MUTILS_API bool copy_file(const QString &sourcePath, const QString &outputPath, const bool &overwrite = true, const progress_callback_t callback = NULL, void *const userData = NULL);
156 //Get file version
157 MUTILS_API bool get_file_version(const QString fileName, quint16 *const major = NULL, quint16 *const minor = NULL, quint16 *const patch = NULL, quint16 *const build = NULL);
159 //Get the OS version
160 MUTILS_API const Version::os_version_t &os_version(void);
161 MUTILS_API const char *os_friendly_name(const MUtils::OS::Version::os_version_t &os_version);
162 MUTILS_API const bool &running_on_wine(void);
164 //Get known Folder
165 MUTILS_API const QString &known_folder(known_folder_t folder_id);
167 //Current Date & Time
168 MUTILS_API QDate current_date(void);
169 MUTILS_API quint64 current_file_time(void);
171 //Check for process elevation
172 MUTILS_API bool is_elevated(bool *bIsUacEnabled = NULL);
173 MUTILS_API bool user_is_admin(void);
176 * \brief Check the network status
178 * Checks whether the computer is *currently* connected to a network. Note that an existing network connection does **not** necessarily imply actual Internet access!
180 * \return The function returns the current network status as a `OS::network_type_t` value.
182 MUTILS_API int network_status(void);
184 //Message handler
185 MUTILS_API bool handle_os_message(const void *const message, long *result);
188 * \brief Suspend calling thread
190 * This function suspends the calling thread. The thread will give up its current time-slice and enter "sleeping" state. The thread will remain in "sleeping" for the specified duration. After the specified duration has elapsed, the thread will be resumed.
192 * Note that it depends on the operating system's scheduling decisions, when the thread will actually be allowed to execute again! While the thread is still in "sleeping" state, it can **not** be selected for execution by the operating system's scheduler. Once the thread is *no* longer in "sleeping" state, i.e. the specified period has elapsed, the thread *can* be selected for execution by the operating system's scheduler again - but this does **not** need to happen *immediately*! The scheduler decides which thread is allowed to execute next, taking into consideration thread priorities.
194 * \param duration The amount of time that the thread will be suspended, in milliseconds. A value of **0** means that the thread will *not* actually enter "sleeping" state, but it will still give up its current time-slice!
196 MUTILS_API void sleep_ms(const size_t &duration);
198 //Is executable/library file?
199 MUTILS_API bool is_executable_file(const QString &path);
200 MUTILS_API bool is_library_file(const QString &path);
202 //Shutdown & Hibernation
203 MUTILS_API bool is_hibernation_supported(void);
204 MUTILS_API bool shutdown_computer(const QString &message, const unsigned long timeout, const bool forceShutdown, const bool hibernate);
206 //Free diskspace
207 MUTILS_API bool free_diskspace(const QString &path, quint64 &freeSpace);
210 * \brief Detect drive type
212 * This function detetcs the type of the drive to which the given path is pointing.
214 * \param path The path to the drive whose type is to be detected. On the Windows platform, only the drive letter is relevant.
216 * \param fast_seeking Pointer to a variable that will be set to TRUE, if the drive supports "fast" seeking (e.g. SSD or similar device), or to FALSE otherwise. This parameter is optional and may be NULL.
218 * \return The function returns the type of the drive as a `OS::drive_type_t` value. In case of error, the value `DRIVE_TYPE_ERR` will be returned.
220 MUTILS_API drive_type_t get_drive_type(const QString &path, bool *fast_seeking = NULL);
222 //Shell open
223 MUTILS_API bool shell_open(const QWidget *parent, const QString &url, const bool explore = false);
224 MUTILS_API bool shell_open(const QWidget *parent, const QString &url, const QString &parameters, const QString &directory, const bool explore = false);
226 //Open media file
227 MUTILS_API bool open_media_file(const QString &mediaFilePath);
229 //Process priority
230 MUTILS_API bool change_process_priority(const int priority);
231 MUTILS_API bool change_process_priority(const QProcess *proc, const int priority);
233 //Process ID
234 MUTILS_API quint32 process_id(void);
235 MUTILS_API quint32 process_id(const QProcess *const proc);
237 //Thread ID
238 MUTILS_API quint32 thread_id(void);
239 MUTILS_API quint32 thread_id(const QProcess *const proc);
241 //Suspend or resume processv
242 MUTILS_API bool suspend_process(const QProcess *proc, const bool suspend);
244 //System timer resolution
245 MUTILS_API bool setup_timer_resolution(const quint32 &interval = 1);
246 MUTILS_API bool reset_timer_resolution(const quint32 &interval = 1);
248 //Set file time
249 MUTILS_API bool set_file_time(const QFile &file, const QDateTime &created = QDateTime(), const QDateTime &modified = QDateTime(), const QDateTime &accessed = QDateTime());
250 MUTILS_API bool set_file_time(const QString &path, const QDateTime &created = QDateTime(), const QDateTime &modified = QDateTime(), const QDateTime &accessed = QDateTime());
252 //Keyboard support
253 MUTILS_API bool check_key_state_esc(void);
255 //Shell notification
256 MUTILS_API void shell_change_notification(void);
258 //Get file path from descriptor
259 MUTILS_API QString get_file_path(const int &fd);
261 //WOW64 redirection
262 MUTILS_API bool wow64fsredir_disable(uintptr_t &oldValue);
263 MUTILS_API bool wow64fsredir_revert (const uintptr_t oldValue);
265 //Environment variables
266 MUTILS_API QString get_envvar(const QString &name);
267 MUTILS_API bool set_envvar(const QString &name, const QString &value);
269 //NULL device
270 MUTILS_API const QLatin1String &null_device(void);
272 //Check if debugger is present
273 MUTILS_API void check_debugger(void);
275 //Error handling
276 MUTILS_API void fatal_exit(const wchar_t* const errorMessage);
280 ///////////////////////////////////////////////////////////////////////////////