Files
aaruremote/win32/hello.c

306 lines
11 KiB
C
Raw Normal View History

/*
2020-03-01 05:44:49 +00:00
* This file is part of the Aaru Remote Server.
2020-01-03 17:42:13 +00:00
* Copyright (c) 2019-2020 Natalia Portillo.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
2020-03-01 05:46:10 +00:00
#include "../aaruremote.h"
#include "../endian.h"
2019-10-27 01:59:05 +01:00
#include "win32.h"
#include <malloc.h>
2019-10-27 01:59:05 +01:00
#include <stdio.h>
#include <string.h>
2019-10-27 01:59:05 +01:00
#include <windows.h>
2020-03-01 05:52:58 +00:00
AaruPacketHello* GetHello()
{
2020-03-01 05:52:58 +00:00
AaruPacketHello* pkt_server_hello;
2019-10-27 01:59:05 +01:00
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";
2020-03-01 05:52:58 +00:00
pkt_server_hello = malloc(sizeof(AaruPacketHello));
2019-10-27 01:59:05 +01:00
if(!pkt_server_hello) return 0;
2020-03-01 05:52:58 +00:00
memset(pkt_server_hello, 0, sizeof(AaruPacketHello));
2020-03-01 05:50:46 +00:00
pkt_server_hello->hdr.remote_id = htole32(AARUREMOTE_REMOTE_ID);
pkt_server_hello->hdr.packet_id = htole32(AARUREMOTE_PACKET_ID);
2020-03-01 05:52:58 +00:00
pkt_server_hello->hdr.len = htole32(sizeof(AaruPacketHello));
2020-03-01 05:50:46 +00:00
pkt_server_hello->hdr.version = AARUREMOTE_PACKET_VERSION;
pkt_server_hello->hdr.packet_type = AARUREMOTE_PACKET_TYPE_HELLO;
strncpy(pkt_server_hello->application, AARUREMOTE_NAME, sizeof(AARUREMOTE_NAME));
strncpy(pkt_server_hello->version, AARUREMOTE_VERSION, sizeof(AARUREMOTE_VERSION));
pkt_server_hello->max_protocol = AARUREMOTE_PROTOCOL_MAX;
2019-10-27 01:59:05 +01:00
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;
}