| | |
| | | |
| | | namespace QWK { |
| | | |
| | | QString winErrorMessage(DWORD code) { |
| | | LPWSTR buf = nullptr; |
| | | if (::FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | |
| | | FORMAT_MESSAGE_IGNORE_INSERTS, |
| | | nullptr, code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), |
| | | reinterpret_cast<LPWSTR>(&buf), 0, nullptr) == 0) { |
| | | return {}; |
| | | } |
| | | const QString &errorText = QString::fromWCharArray(buf).trimmed(); |
| | | ::LocalFree(buf); |
| | | return errorText; |
| | | } |
| | | typedef NTSTATUS(WINAPI *RtlGetVersionPtr)(PRTL_OSVERSIONINFOW); |
| | | |
| | | QString winLastErrorMessage() { |
| | | return winErrorMessage(::GetLastError()); |
| | | RTL_OSVERSIONINFOW GetRealOSVersion() { |
| | | HMODULE hMod = GetModuleHandleW(L"ntdll.dll"); |
| | | if (hMod) { |
| | | auto fxPtr = reinterpret_cast<RtlGetVersionPtr>(GetProcAddress(hMod, "RtlGetVersion")); |
| | | if (fxPtr != nullptr) { |
| | | RTL_OSVERSIONINFOW rovi = {0}; |
| | | rovi.dwOSVersionInfoSize = sizeof(rovi); |
| | | if (0 == fxPtr(&rovi)) { |
| | | return rovi; |
| | | } |
| | | } |
| | | } |
| | | RTL_OSVERSIONINFOW rovi = {0}; |
| | | return rovi; |
| | | } |
| | | |
| | | } |