diff --git a/win32/CMakeLists.txt b/win32/CMakeLists.txt index 771c50a..a95058f 100644 --- a/win32/CMakeLists.txt +++ b/win32/CMakeLists.txt @@ -8,4 +8,4 @@ set(PLATFORM_SOURCES "win32.h" network.c hello.c "win32.c") add_executable(dicremote ${PLATFORM_SOURCES}) -target_link_libraries(dicremote dicremotecore ws2_32 iphlpapi) \ No newline at end of file +target_link_libraries(dicremote dicremotecore ws2_32 iphlpapi version) \ No newline at end of file diff --git a/win32/hello.c b/win32/hello.c index c95ae43..3d5a6fb 100644 --- a/win32/hello.c +++ b/win32/hello.c @@ -17,17 +17,49 @@ #include "../dicmote.h" #include "../endian.h" +#include "win32.h" #include +#include #include +#include DicPacketHello* GetHello() { - DicPacketHello* pkt_server_hello; + DicPacketHello* pkt_server_hello; + OSVERSIONINFOEX osvi; + SYSTEM_INFO sysinfo; + UINT verSize; + DWORD unused; + LPVOID verData; + VS_FIXEDFILEINFO* fileVerInfo; + + const char* win = "Windows"; + const char* w95 = "Windows 95"; + const char* w95osr = "Windows 95 OSR2"; + const char* w98 = "Windows 98"; + const char* w98se = "Windows 98 SE"; + const char* wme = "Windows Me"; + const char* wnt = "Windows NT"; + const char* w2k = "Windows 2000"; + const char* wxp = "Windows XP"; + const char* w2k3 = "Windows Server 2003"; + const char* whs = "Windows Home Server"; + const char* w2k3r2 = "Windows Server 2003 R2"; + const char* wvista = "Windows Vista"; + const char* w2k8 = "Windows Server 2008"; + const char* w2k8r2 = "Windows Server 2008 R2"; + const char* w7 = "Windows 7"; + const char* w2k12 = "Windows Server 2012"; + const char* w8 = "Windows 8"; + const char* w2k12r2 = "Windows Server 2012 R2"; + const char* w81 = "Windows 8.1"; + const char* w2k16 = "Windows Server 2016"; + const char* w10 = "Windows 10"; pkt_server_hello = malloc(sizeof(DicPacketHello)); - if(!pkt_server_hello) { return 0; } + if(!pkt_server_hello) return 0; memset(pkt_server_hello, 0, sizeof(DicPacketHello)); @@ -39,9 +71,235 @@ DicPacketHello* GetHello() strncpy(pkt_server_hello->application, DICMOTE_NAME, sizeof(DICMOTE_NAME)); strncpy(pkt_server_hello->version, DICMOTE_VERSION, sizeof(DICMOTE_VERSION)); pkt_server_hello->max_protocol = DICMOTE_PROTOCOL_MAX; - strncpy(pkt_server_hello->sysname, "Windows", 255); - strncpy(pkt_server_hello->release, "TODO", 255); - strncpy(pkt_server_hello->machine, "TODO", 255); + ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + + GetVersionEx((LPOSVERSIONINFOA)&osvi); + + if(osvi.dwPlatformId == VER_PLATFORM_WIN32s) + { + strncpy(pkt_server_hello->sysname, win, 255); + snprintf(pkt_server_hello->release, 255, "%d.%02d", osvi.dwMajorVersion, osvi.dwMinorVersion); + strncpy(pkt_server_hello->machine, "x86", 255); + + return pkt_server_hello; + } + + if(osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) + { + switch(osvi.dwMinorVersion) + { + case 0: + if(strlen(osvi.szCSDVersion) > 0) strncpy(pkt_server_hello->sysname, w95osr, 255); + else + strncpy(pkt_server_hello->sysname, w95, 255); + break; + case 10: + if(strlen(osvi.szCSDVersion) > 0) strncpy(pkt_server_hello->sysname, w98se, 255); + else + strncpy(pkt_server_hello->sysname, w98, 255); + break; + case 90: strncpy(pkt_server_hello->sysname, wme, 255); break; + default: strncpy(pkt_server_hello->sysname, win, 255); break; + } + + snprintf(pkt_server_hello->release, + 255, + "%d.%02d.%d", + osvi.dwMajorVersion, + osvi.dwMinorVersion, + osvi.dwBuildNumber & 0xFFFF); + strncpy(pkt_server_hello->machine, "x86", 255); + + return pkt_server_hello; + } + + ZeroMemory(&sysinfo, sizeof(SYSTEM_INFO)); + GetSystemInfo(&sysinfo); + + switch(sysinfo.wProcessorArchitecture) + { + case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64: + case PROCESSOR_ARCHITECTURE_IA32_ON_ARM64: + case PROCESSOR_ARCHITECTURE_INTEL: strncpy(pkt_server_hello->machine, "x86", 255); break; + case PROCESSOR_ARCHITECTURE_MIPS: strncpy(pkt_server_hello->machine, "mips", 255); break; + case PROCESSOR_ARCHITECTURE_ALPHA: + case PROCESSOR_ARCHITECTURE_ALPHA64: strncpy(pkt_server_hello->machine, "axp", 255); break; + case PROCESSOR_ARCHITECTURE_PPC: strncpy(pkt_server_hello->machine, "ppc", 255); break; + case PROCESSOR_ARCHITECTURE_SHX: strncpy(pkt_server_hello->machine, "sh", 255); break; + case PROCESSOR_ARCHITECTURE_ARM32_ON_WIN64: + case PROCESSOR_ARCHITECTURE_ARM: strncpy(pkt_server_hello->machine, "arm", 255); break; + case PROCESSOR_ARCHITECTURE_IA64: strncpy(pkt_server_hello->machine, "ia64", 255); break; + case PROCESSOR_ARCHITECTURE_MSIL: strncpy(pkt_server_hello->machine, "msil", 255); break; + case PROCESSOR_ARCHITECTURE_AMD64: strncpy(pkt_server_hello->machine, "x64", 255); break; + case PROCESSOR_ARCHITECTURE_ARM64: strncpy(pkt_server_hello->machine, "aarch64", 255); break; + default: strncpy(pkt_server_hello->machine, "unknown", 255); break; + } + + if(strlen(osvi.szCSDVersion) > 0) + snprintf(pkt_server_hello->release, + 255, + "%d.%d.%d (%s)", + osvi.dwMajorVersion, + osvi.dwMinorVersion * 10, + osvi.dwBuildNumber, + osvi.szCSDVersion); + else + snprintf(pkt_server_hello->release, + 255, + "%d.%d.%d", + osvi.dwMajorVersion, + osvi.dwMinorVersion * 10, + osvi.dwBuildNumber); + + if(osvi.dwMajorVersion < 5) + { + strncpy(pkt_server_hello->sysname, wnt, 255); + return pkt_server_hello; + } + + if(osvi.dwMajorVersion == 5) + { + if(osvi.dwMinorVersion == 0) + { + strncpy(pkt_server_hello->sysname, w2k, 255); + return pkt_server_hello; + } + + if(osvi.dwMinorVersion == 1) + { + strncpy(pkt_server_hello->sysname, wxp, 255); + return pkt_server_hello; + } + + if((osvi.wProductType == VER_NT_WORKSTATION) && + (sysinfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)) + { + strncpy(pkt_server_hello->sysname, wxp, 255); + return pkt_server_hello; + } + + if(osvi.wSuiteMask & VER_SUITE_WH_SERVER) + { + strncpy(pkt_server_hello->sysname, whs, 255); + return pkt_server_hello; + } + + if(GetSystemMetrics(SM_SERVERR2) == 0) + { + strncpy(pkt_server_hello->sysname, w2k3, 255); + return pkt_server_hello; + } + else + { + strncpy(pkt_server_hello->sysname, w2k3r2, 255); + return pkt_server_hello; + } + } + + if(osvi.dwMajorVersion == 6) + { + if(osvi.dwMinorVersion == 0) + { + if(osvi.wProductType == VER_NT_WORKSTATION) + { + strncpy(pkt_server_hello->sysname, wvista, 255); + return pkt_server_hello; + } + strncpy(pkt_server_hello->sysname, w2k8, 255); + return pkt_server_hello; + } + + if(osvi.dwMinorVersion == 1) + { + if(osvi.wProductType == VER_NT_WORKSTATION) + { + strncpy(pkt_server_hello->sysname, w7, 255); + return pkt_server_hello; + } + strncpy(pkt_server_hello->sysname, w2k8r2, 255); + return pkt_server_hello; + } + + if(osvi.dwMinorVersion == 2) + { + verSize = GetFileVersionInfoSizeA("kernel32.dll", &unused); + + if(verSize > 0) + { + verData = malloc(verSize); + + if(verData != NULL) + { + memset(verData, 0, verSize); + + if(GetFileVersionInfoA("kernel32.dll", 0, verSize, verData) && + VerQueryValueA(verData, "\\", (LPVOID*)&fileVerInfo, &verSize)) + { + osvi.dwMajorVersion = HIWORD(fileVerInfo->dwProductVersionMS); + osvi.dwMinorVersion = LOWORD(fileVerInfo->dwProductVersionMS); + osvi.dwBuildNumber = HIWORD(fileVerInfo->dwProductVersionLS); + + if(strlen(osvi.szCSDVersion) > 0) + snprintf(pkt_server_hello->release, + 255, + "%d.%d.%d (%s)", + osvi.dwMajorVersion, + osvi.dwMinorVersion * 10, + osvi.dwBuildNumber, + osvi.szCSDVersion); + else + snprintf(pkt_server_hello->release, + 255, + "%d.%d.%d", + osvi.dwMajorVersion, + osvi.dwMinorVersion * 10, + osvi.dwBuildNumber); + } + + free(verData); + } + } + + if(osvi.dwMajorVersion == 6) + { + if(osvi.dwMinorVersion == 2) + { + if(osvi.wProductType == VER_NT_WORKSTATION) + { + strncpy(pkt_server_hello->sysname, w2k12, 255); + return pkt_server_hello; + } + strncpy(pkt_server_hello->sysname, w8, 255); + return pkt_server_hello; + } + + if(osvi.dwMinorVersion == 3) + { + if(osvi.wProductType == VER_NT_WORKSTATION) + { + strncpy(pkt_server_hello->sysname, w2k12r2, 255); + return pkt_server_hello; + } + strncpy(pkt_server_hello->sysname, w81, 255); + return pkt_server_hello; + } + } + + if(osvi.dwMajorVersion == 10) + { + if(osvi.wProductType == VER_NT_WORKSTATION) + { + strncpy(pkt_server_hello->sysname, w2k16, 255); + return pkt_server_hello; + } + strncpy(pkt_server_hello->sysname, w10, 255); + return pkt_server_hello; + } + } + } + + strncpy(pkt_server_hello->sysname, wnt, 255); return pkt_server_hello; } diff --git a/win32/win32.h b/win32/win32.h index d88a4ca..52870f4 100644 --- a/win32/win32.h +++ b/win32/win32.h @@ -18,6 +18,21 @@ #ifndef DICREMOTE_WIN32_WIN32_H_ #define DICREMOTE_WIN32_WIN32_H_ +#define PROCESSOR_ARCHITECTURE_INTEL 0 +#define PROCESSOR_ARCHITECTURE_MIPS 1 +#define PROCESSOR_ARCHITECTURE_ALPHA 2 +#define PROCESSOR_ARCHITECTURE_PPC 3 +#define PROCESSOR_ARCHITECTURE_SHX 4 +#define PROCESSOR_ARCHITECTURE_ARM 5 +#define PROCESSOR_ARCHITECTURE_IA64 6 +#define PROCESSOR_ARCHITECTURE_ALPHA64 7 +#define PROCESSOR_ARCHITECTURE_MSIL 8 +#define PROCESSOR_ARCHITECTURE_AMD64 9 +#define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 10 +#define PROCESSOR_ARCHITECTURE_ARM64 12 +#define PROCESSOR_ARCHITECTURE_ARM32_ON_WIN64 13 +#define PROCESSOR_ARCHITECTURE_IA32_ON_ARM64 14 + typedef struct { SOCKET socket;