| | |
| | | |
| | | 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; |
| | | static RTL_OSVERSIONINFOW GetRealOSVersionImpl() { |
| | | HMODULE hMod = ::GetModuleHandleW(L"ntdll.dll"); |
| | | using RtlGetVersionPtr = NTSTATUS(WINAPI *)(PRTL_OSVERSIONINFOW); |
| | | auto pRtlGetVersion = |
| | | reinterpret_cast<RtlGetVersionPtr>(::GetProcAddress(hMod, "RtlGetVersion")); |
| | | RTL_OSVERSIONINFOW rovi{}; |
| | | rovi.dwOSVersionInfoSize = sizeof(rovi); |
| | | pRtlGetVersion(&rovi); |
| | | return rovi; |
| | | } |
| | | |
| | | QString winLastErrorMessage() { |
| | | return winErrorMessage(::GetLastError()); |
| | | namespace Private { |
| | | |
| | | RTL_OSVERSIONINFOW GetRealOSVersion() { |
| | | static const auto result = GetRealOSVersionImpl(); |
| | | return result; |
| | | } |
| | | |
| | | } |
| | | |
| | | } |