VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1055|回复: 4

[分享] [转]C++ 获取系统版本号

[复制链接]
20_avatar_middle
最佳答案
4 
在线会员 发表于 2020-3-17 17:51:06 | 显示全部楼层 |阅读模式
原文:https://www.cnblogs.com/Bachelor/p/11290159.html

因用到系统版本号,区别对待。

    // 5.0 Windows 2000";
    // 5.1 Windows XP";
    // 5.2 Windows 2003";
    // 6.0 Windows Vista";
    // 6.1 Windows 7";
    // 6.2 Windows 8";
    // 6.3 Windows 8.1";
    // 10.0 Windows 10";
    //其他版本


方法1:

此方法是测下来 XP、win7、win10都通过的方法。
  1. DWORD Major,Minor,Build;
  2. void GetOSVersion1()
  3. {
  4.     _asm
  5.     {
  6.         pushad
  7.         mov ebx, fs:[0x18]; get self pointer from TEB
  8.         mov eax, fs:[0x30]; get pointer to PEB / database
  9.         mov ebx, [eax + 0A8h]; get OSMinorVersion
  10.         mov eax, [eax + 0A4h]; get OSMajorVersion
  11.         mov Minor, ebx
  12.         mov Major, eax
  13.         popad
  14.     }
  15.     Build = 0;
  16. }
复制代码


方法2:
  1. DWORD Major,Minor,Build;

  2. typedef NTSTATUS(WINAPI* _NtQueryInformationProcess)
  3. (_In_ HANDLE ProcessHandle, _In_ PROCESSINFOCLASS ProcessInformationClass,
  4.     _Out_ PVOID ProcessInformation, _In_ ULONG ProcessInformationLength, _Out_opt_ PULONG ReturnLength);
  5. _NtQueryInformationProcess NtQueryInformationProcess_;

  6. DWORD GetProcessPEBAddress(HANDLE hProc)
  7. {
  8.     PROCESS_BASIC_INFORMATION peb;
  9.     DWORD tmp;
  10.     NtQueryInformationProcess_ = (_NtQueryInformationProcess)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQueryInformationProcess");
  11.     NtQueryInformationProcess_(hProc, ProcessBasicInformation, &peb, sizeof(PROCESS_BASIC_INFORMATION), &tmp);
  12.     return (DWORD)peb.PebBaseAddress;
  13. }

  14. void GetOSVersionByHandle(HANDLE handle)
  15. {
  16.     DWORD pebAddress = GetProcessPEBAddress(handle);
  17.     DWORD OSMajorVersionAddress = pebAddress + 0x0a4;
  18.     DWORD OSMinorVersionAddress = pebAddress + 0x0a8;
  19.     DWORD OSBuildNumberAddress = pebAddress + 0x0ac;
  20.     ReadProcessMemory(handle, (void*)OSMajorVersionAddress, &Major, sizeof(Major), 0);
  21.     ReadProcessMemory(handle, (void*)OSMinorVersionAddress, &Minor, sizeof(Minor), 0);
  22.     ReadProcessMemory(handle, (void*)OSBuildNumberAddress, &Build, sizeof(Build), 0);
  23. }


  24. void GetOSVersion2()
  25. {
  26.     HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
  27.     GetOSVersionByHandle(handle);
  28. }
复制代码


方法3:
GetVersionEx在win10版本以后,已经失效。
  1. DWORD Major,Minor,Build;

  2. void GetOSVersion3()
  3. {
  4.     OSVERSIONINFO osvi;                    //定义OSVERSIONINFO数据结构对象
  5.     memset(&osvi, 0, sizeof(OSVERSIONINFO));        //开空间
  6.     osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);    //定义大小
  7.     GetVersionEx(&osvi);                    //获得版本信息

  8.     Major = osvi.dwMajorVersion;
  9.     Minor = osvi.dwMinorVersion;
  10.     Build = osvi.dwBuildNumber;
  11. }
复制代码






上一篇:今日一贴!内核下结束其它进程!
下一篇:c++服务器一般用啥框架
84_avatar_middle
最佳答案
8 
在线会员 发表于 2020-3-17 18:44:34 | 显示全部楼层
系统版本号 分不出系统了, win2008 win2012server 那些呢
58_avatar_middle
最佳答案
58 
online_vip 发表于 2020-3-17 21:12:06 | 显示全部楼层
谢谢楼主分享。
77_avatar_middle
最佳答案
2 
在线会员 发表于 2020-6-28 01:49:31 | 显示全部楼层
这个不错,学习学习
07_avatar_middle
最佳答案
0 
在线会员 发表于 2021-12-6 19:34:06 | 显示全部楼层
谢谢楼主分享。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-6-4 22:16

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表