首页
论坛
专栏
课程

[原创]C/C++ 实现获取Windows操作系统版本信息

2019-7-12 01:01 3606

[原创]C/C++ 实现获取Windows操作系统版本信息

2019-7-12 01:01
3606
用的win10  1903,但使用GetVersionEx等等的WindowsAPI函数一直没成功,函数被否认,后使用VersionHelpers.h成功了,代码如下,但win8.1和win10的兼容一直没搞定,待定吧
#include <windows.h>
#include <stdio.h>
#include <VersionHelpers.h>

int __cdecl wmain(	__in int argc,	__in_ecount(argc) PCWSTR argv[])
{
	UNREFERENCED_PARAMETER(argc);
	UNREFERENCED_PARAMETER(argv);

	// XP或者更高级的版本
	if (IsWindowsXPOrGreater())
	{
		printf("XPOrGreater (XP或者更高级的版本)\n");
	}

	// XP SP1 或者更高级的版本
	if (IsWindowsXPSP1OrGreater())
	{
		printf("XPSP1OrGreater (XP SP1 或者更高级的版本)\n");
	}

	// XP SP2 或者更高级的版本
	if (IsWindowsXPSP2OrGreater())
	{
		printf("XPSP2OrGreater (XP SP2 或者更高级的版本)\n");
	}

	// XP SP3 或者更高级的版本
	if (IsWindowsXPSP3OrGreater())
	{
		printf("XPSP3OrGreater (XP SP3 或者更高级的版本)\n");
	}

	// Vista 或者更高级的版本
	if (IsWindowsVistaOrGreater())
	{
		printf("VistaOrGreater (Vista 或者更高级的版本)\n");
	}

	// Vista SP1 或者更高级的版本
	if (IsWindowsVistaSP1OrGreater())
	{
		printf("VistaSP1OrGreater(Vista SP1 或者更高级的版本)\n");
	}

	// Vista SP2 或者更高级的版本
	if (IsWindowsVistaSP2OrGreater())
	{
		printf("VistaSP2OrGreater (Vista SP2 或者更高级的版本)\n");
	}

	// Win7 或者更高级的版本
	if (IsWindows7OrGreater())
	{
		printf("Windows7OrGreater (Win7 或者更高级的版本)\n");
	}

	// Win7 SP1 或者更高级的版本
	if (IsWindows7SP1OrGreater())
	{
		printf("Windows7SP1OrGreater (Win7 SP1 或者更高级的版本)\n");
	}

	// Win8 或者更高级的版本
	if (IsWindows8OrGreater())
	{
		printf("Windows8OrGreater (Win8 或者更高级的版本)\n");
	}

	// Win8.1 或者更高级的版本
	if (IsWindows8Point1OrGreater())
	{
		printf("Windows8Point1OrGreater (Win8.1 或者更高级的版本)\n");
	}

	// Win10 或者更高级的版本
	if (IsWindows10OrGreater())
	{
		printf("Windows10OrGreater (Win10 或者更高级的版本)\n");
	}

	// 是服务器端操作系统还是客户端操作系统
	if (IsWindowsServer())
	{
		printf("Server (服务器)\n");
	}
	else
	{
		printf("Client (客户端)\n");
	}
}



[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最新回复 (14)
Dstlemoner 2019-7-12 04:36
2
0
我记得前阵看雪有个逆向病毒的文章,逆到了判断系统版本的逻辑。  你可以去找找。。。感觉那个病毒写的很简洁。
最后于 2019-7-12 05:57 被Dstlemoner编辑 ,原因:
aqtata 2 2019-7-12 09:00
3
0
微软不希望开发者知道系统版本号。当然他还是提供了兼容方案,看这里
https://docs.microsoft.com/en-us/windows/win32/sysinfo/targeting-your-application-at-windows-8-1
最后于 2019-7-12 09:00 被aqtata编辑 ,原因:
Tennn 5 2019-7-12 09:33
4
0
哪用得着这么麻烦啊 直接PEB读取
猪会被杀掉 1 2019-7-12 11:02
5
0
RtlGetVersion
TopC 2019-7-12 14:17
6
0
kernel32.dll 的详细信息
StriveXjun 2019-7-12 14:29
7
0
Tennn 哪用得着这么麻烦啊 直接PEB读取
正规软件还是最好不要用peb取,用RtlGetVersion 最靠谱
hhkqqs 2019-7-12 16:49
8
0
这个头文件的函数太臃肿了,直接拿到buildnumber比较十几个值就知道是那个版本的系统了
VirtualCC 2019-7-12 19:22
9
0
这样子嘛

#include<Windows.h>
#include<stdio.h>

int main()
{
	uintptr_t PEB;
	int OsBuildNumber;
#ifdef _WIN64
	PEB = __readgsqword(0x60);
	OsBuildNumber = *((INT *)(PEB + 0x120));
#else
	PEB = __readfsdword(0x30);
	OsBuildNumber = *((INT *)(PEB + 0xAC));
#endif // _WIN64
	switch (OsBuildNumber)
	{
	case 17134:
		printf("Win10 1803\n");
		break;
	case 17763:
		printf("Win10 1809\n");
		break;
	case 18362:
		printf("Win10 1903\n");
		break;
	case 15063:
		printf("Win10 1703\n");
		break;
	case 16299:
		printf("Win10 1709\n");
		break;
	// ........Other Windows OS Version
	default:
		break;
	}
	printf("OsBuildNumber: %d", OsBuildNumber);
	getchar();
}

HadesW 1 2019-7-12 20:04
10
0
Tennn 5 2019-7-13 17:20
11
0
StriveXjun 正规软件还是最好不要用peb取,用RtlGetVersion 最靠谱
为什么会有这种的说法……
猪会被杀掉 1 2019-7-13 22:56
12
0
Tennn 为什么会有这种的说法……
PEB不是相当于KPROCESS嘛,各种偏移。而这个API是公开的,易用也方便维护。我的看法。
賈可 2019-7-26 13:49
13
0
RtlGetVersion 和 GetVersionEx 没区别,不靠谱。
StriveXjun 2019-8-29 18:09
14
0
賈可 RtlGetVersion 和 GetVersionEx 没区别,不靠谱。
自己没用过就别下结论。 去win8.1以上的系统用用就知道了。
softhacker 2019-8-30 10:10
15
0
你这代码写了跟没写一样,XP就是XP,还 “或更高版本”,跟没说一样嘛,我做过此功能,但是你一般的方法8.1及之后的版本默认都是8.1,你要特殊处理,方法较多,有种是修改manifest文件
游客
登录 | 注册 方可回帖
返回