diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2023-04-30 17:57:02 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2023-04-30 17:57:02 -0400 |
commit | 74315872e5104396feb90c1155adbc20bf6ee78c (patch) | |
tree | b43cb2ccb7dd3bc2e005a0236550e94a3ce095b2 /win.c | |
parent | f511688f83dc0386216f9ef097d88ea44cb160a6 (diff) | |
download | whatami-74315872e5104396feb90c1155adbc20bf6ee78c.tar.gz |
Diffstat (limited to 'win.c')
-rw-r--r-- | win.c | 119 |
1 files changed, 119 insertions, 0 deletions
@@ -0,0 +1,119 @@ +#if defined(_MSC_VER) || defined(__MINGW32__) +#include "common.h" +#include <VersionHelpers.h> + +static OSVERSIONINFO get_os_version_info() { + static OSVERSIONINFO osinfo; + static int cached = 0; + if (cached) { + return osinfo; + } + memset(&osinfo, 0, sizeof(OSVERSIONINFOA)); + osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); + GetVersionExA((OSVERSIONINFOA *) &osinfo); + cached = 1; + return osinfo; +} + +int uname(struct utsname *buf) { + char value[255] = {0}; + unsigned long size; + + memset(buf, 0, sizeof(struct utsname)); + size = sizeof(value) - 1; + strcpy_s(buf->sysname, sizeof(buf->sysname) - 1, "Win" BITSUFFIX); + GetComputerNameEx(ComputerNameDnsFullyQualified, value, &size); + strcpy_s(buf->nodename, sizeof(buf->nodename) - 1, value); + + SYSTEM_INFO sysinfo; + GetNativeSystemInfo(&sysinfo); + switch (sysinfo.wProcessorArchitecture) { + case PROCESSOR_AMD_X8664: + case PROCESSOR_ARCHITECTURE_AMD64: + strcpy_s(buf->machine, sizeof(buf->machine) - 1, "x86_64"); + break; + case PROCESSOR_ARCHITECTURE_ARM64: + strcpy_s(buf->machine, sizeof(buf->machine) - 1, "arm64"); + break; + case PROCESSOR_ARCHITECTURE_UNKNOWN: + default: + strcpy_s(buf->machine, sizeof(buf->machine) - 1, "unknown"); + break; + } + + OSVERSIONINFO osinfo; + memset(&osinfo, 0, sizeof(OSVERSIONINFOA)); + osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); + GetVersionExA((OSVERSIONINFOA *) &osinfo); + sprintf_s(buf->release, sizeof(buf->release) - 1, "%lu.%lu", osinfo.dwMajorVersion, osinfo.dwMinorVersion); + sprintf_s(buf->version, sizeof(buf->release) - 1, "build %lu", osinfo.dwBuildNumber); + return 0; +} + +int get_sys_os_dist(char **name, char **version) { + char lversion[255]; + OSVERSIONINFO osinfo; + osinfo = get_os_version_info(); + + if (IsWindows10OrGreater()) { + strcpy_s(lversion, sizeof(lversion) - 1, "Windows 10"); + } else if (IsWindows8OrGreater()) { + strcpy_s(lversion, sizeof(lversion) - 1, "Windows 8"); + } else if (IsWindows7OrGreater()) { + strcpy_s(lversion, sizeof(lversion) - 1, "Windows 7"); + } else if (IsWindowsVistaOrGreater()) { + strcpy_s(lversion, sizeof(lversion) - 1, "Windows Vista"); + } else if (IsWindowsXPOrGreater()) { + strcpy_s(lversion, sizeof(lversion) - 1, "Windows XP"); + } else if (IsWindowsServer()) { + strcpy_s(lversion, sizeof(lversion) - 1, "Windows Server"); + } else if (osinfo.dwMajorVersion == 5 && osinfo.dwMinorVersion == 0) { + strcpy_s(lversion, sizeof(lversion) - 1, "Windows 2000"); + } else if (osinfo.dwMajorVersion == 4 && osinfo.dwMinorVersion == 0 && osinfo.dwPlatformId == VER_PLATFORM_WIN32_NT) { + strcpy_s(lversion, sizeof(lversion) - 1, "Windows NT 4.0"); + } else if (osinfo.dwMajorVersion == 4 && osinfo.dwMinorVersion == 90 && osinfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { + strcpy_s(lversion, sizeof(lversion) - 1, "Windows ME"); + } else if (osinfo.dwMajorVersion == 4 && osinfo.dwMinorVersion == 10 && osinfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { + strcpy_s(lversion, sizeof(lversion) - 1, "Windows 98"); + } else { + strcpy_s(lversion, sizeof(lversion) - 1, "Windows"); + } + + *name = _strdup("Microsoft"); + *version = _strdup(lversion); + return 0; +} + +ssize_t get_sys_memory() { + MEMORYSTATUSEX buf; + buf.dwLength = sizeof(buf); + GlobalMemoryStatusEx(&buf); + return (ssize_t) buf.ullTotalPhys / 1024; +} + +struct Block_Device **get_block_devices(size_t *total) { + struct Block_Device **device; + char buf[256] = {0}; + DWORD len; + + // Each drive name record is 4 bytes (e.g. "C:\\0") + len = GetLogicalDriveStringsA(sizeof(buf) - 1, buf); + if (!len) { + return NULL; + } + + size_t device_count; + device_count = len / 4; + device = calloc(device_count + 1, sizeof(**device)); + for (DWORD i = 0, j = 0; strlen(&buf[j]) != 0 && i < device_count; i++) { + device[i] = calloc(1, sizeof(*device[0])); + device[i]->model = _strdup("Unnamed"); + device[i]->path = _strdup(&buf[j]); + GetDiskFreeSpaceExA(device[i]->path, NULL, (PULARGE_INTEGER) &device[i]->size, NULL); + device[i]->size /= 1024; + j += 4; + } + *total = device_count; + return device; +} +#endif // _WINDOWS
\ No newline at end of file |