1
0
mirror of https://github.com/djhackersdev/bemanitools.git synced 2025-02-17 19:19:16 +01:00

util: Add OS module to get version information of Windows

Data we always need when things go wrong, log it on boot.
This commit is contained in:
icex2 2020-08-21 17:53:32 +02:00
parent 55c9f5a521
commit 7733912ae2
3 changed files with 156 additions and 0 deletions

View File

@ -13,6 +13,7 @@ src_util := \
mem.c \
msg-thread.c \
net.c \
os.c \
signal.c \
str.c \
thread.c \

130
src/main/util/os.c Normal file
View File

@ -0,0 +1,130 @@
#define LOG_MODULE "util-os"
#include <windows.h>
#include <versionhelpers.h>
#include <stdbool.h>
#include "util/log.h"
#include "util/os.h"
#include "util/str.h"
#define STATUS_SUCCESS (0x00000000)
typedef LONG NTSTATUS, *PNTSTATUS;
typedef NTSTATUS (WINAPI* RtlGetVersion_t)(PRTL_OSVERSIONINFOW);
static const char* human_readable_version(DWORD major, DWORD minor)
{
if (IsWindowsServer()) {
if (major == 5 && minor == 2) {
return "Windows Server 2003 (R2)";
} else if (major == 6 && minor == 0) {
return "Windows Server 2008";
} else if (major == 6 && minor == 1) {
return "Windows Server 2008 R2";
} else if (major == 6 && minor == 2) {
return "Windows Server 2012";
} else if (major == 6 && minor == 3) {
return "Windows Server 2012 R2";
} else if (major == 10 && minor == 0) {
return "Windows Server 2016/2019";
} else {
return "Unknown server version";
}
} else {
if (major == 5 && minor == 0) {
return "Windows 2000";
} else if (major == 5 && minor == 1) {
return "Windows XP";
} else if (major == 5 && minor == 2 ) {
return "Windows XP 64-bit";
} else if (major == 6 && minor == 0) {
return "Windows Vista";
} else if (major == 6 && minor == 1) {
return "Windows 7";
} else if (major == 6 && minor == 2) {
return "Windows 8";
} else if (major == 6 && minor == 3) {
return "Windows 8.1";
} else if (major == 10 && minor == 0) {
return "Windows 10";
} else {
return "Unknown client version";
}
}
}
static bool os_get_real_win_version(PRTL_OSVERSIONINFOW version)
{
HMODULE module;
RtlGetVersion_t rtl_get_version;
module = GetModuleHandleA("ntdll.dll");
if (!module) {
return false;
}
rtl_get_version = (RtlGetVersion_t) GetProcAddress(module, "RtlGetVersion");
if (!rtl_get_version) {
return false;
}
return rtl_get_version(version) == STATUS_SUCCESS;
}
bool os_version_get(struct os_version* version)
{
log_assert(version);
RTL_OSVERSIONINFOW rovi;
char* version_str;
const char* readable_version;
memset(&rovi, 0, sizeof(RTL_OSVERSIONINFOW));
rovi.dwOSVersionInfoSize = sizeof(rovi);
version_str = NULL;
if (!os_get_real_win_version(&rovi)) {
return false;
}
// Contains additional version info, e.g. "Service Pack 3" for XP
wstr_narrow(rovi.szCSDVersion, &version_str);
readable_version = human_readable_version(rovi.dwMajorVersion, rovi.dwMinorVersion);
strcpy(version->name, readable_version);
version->major = rovi.dwMajorVersion;
version->minor = rovi.dwMinorVersion;
version->build = rovi.dwBuildNumber;
version->platform_id = rovi.dwPlatformId;
strcpy(version->extension, version_str);
if (version_str) {
free(version_str);
}
return true;
}
void os_version_log()
{
struct os_version version;
if (!os_version_get(&version)) {
log_warning("Could not detect OS version");
} else {
log_info("OS version: %s - %d.%d.%d.%d - %s",
version.name,
version.major,
version.minor,
version.build,
version.platform_id,
version.extension);
}
}

25
src/main/util/os.h Normal file
View File

@ -0,0 +1,25 @@
#pragma once
#include <stdint.h>
struct os_version {
char name[128];
uint32_t major;
uint32_t minor;
uint32_t build;
uint32_t platform_id;
char extension[256];
};
/**
* Get the (real) version information of the Windows OS.
*
* @param verison Pointer to version structure. This will be filled in.
* @return true on success, false on failure.
*/
bool os_version_get(struct os_version* version);
/**
* Log the version information of the current Windows OS.
*/
void os_version_log();