API得到Windows版本

/**
 * Windows Version
 *   https://msdn.microsoft.com/en-us/library/windows/desktop/dn481241(v=vs.85).aspx

 * In Windows 8.1 and Windows 10, the GetVersion and GetVersionEx functions have been deprecated.
 * In Windows 10, the VerifyVersionInfo function has also been deprecated.

 * Operating system Version number (Major.Minor)
 *
 *     Windows 10             6.4, 7.x, 10.0
 *     Windows 8.1            6.3
 *     Windows 8              6.2
 *     Windows 7              6.1
 *     Windows Server 2008 R2 6.1
 *     Windows Server 2008    6.0
 *     Windows Vista          6.0
 *     Windows Server 2003 R2 5.2
 *     Windows Server 2003    5.2
 *     Windows XP             5.1
 *     Windows 2000           5.0
 *     Windows NT40           4.0
 *     Windows NT35           3.0
 */
typedef enum OSWindowsVersion {
    OS_UNKNOWN  = 0,
    OS_WINNT35  = 35,
    OS_WINNT40  = 40,
    OS_WIN2000  = 50,
    OS_WINXP    = 51,
    OS_WIN2003	= 52,
    OS_WINXP64	= 52,
    OS_Vista    = 60,
    OS_WIN7     = 61,
    OS_WIN8     = 62,
    OS_WIN2012  = 62,
    OS_WIN8_1   = 63,
    OS_WIN10   = 100
} OSWindowsVersion;

OSWindowsVersion GetWindowsVersion();

// Author: cheungmine
// 20161205

BOOL GetNtdllVersion(DWORD *dwMajorVer, DWORD *dwMinorVer, DWORD *dwBuildNum)
{
    typedef void (WINAPI *PFN_RTLGETNTVERSIONNUMBERS)(DWORD*, DWORD*, DWORD*);

    HMODULE hNtdll = LoadLibrary("ntdll.dll");

    if (hNtdll) {
        PFN_RTLGETNTVERSIONNUMBERS pfnGetWinVer = (PFN_RTLGETNTVERSIONNUMBERS)
            GetProcAddress(hNtdll, "RtlGetNtVersionNumbers");

        if (pfnGetWinVer) {
            pfnGetWinVer(dwMajorVer, dwMinorVer, dwBuildNum);
            FreeLibrary(hNtdll);
            return TRUE;
        }

        FreeLibrary(hNtdll);
    }

    return FALSE;
}

OSWindowsVersion GetWindowsVersion()
{
    DWORD majorVer = 0;
    DWORD minorVer = 0;
    DWORD buildNum = 0;
    BOOL isNtVer = 0;

    OSVERSIONINFO info;
    OSWindowsVersion osVer = OS_UNKNOWN;

    SeZero(&info, sizeof(info));
    info.dwOSVersionInfoSize = sizeof(info);

    if (GetVersionEx(&info) && info.dwPlatformId == VER_PLATFORM_WIN32_NT) {
        switch (info.dwMajorVersion) {
        case 3:
            osVer = OS_WINNT35;
            break;

        case 4:
            osVer = OS_WINNT40;
            break;

        case 5:
            if (info.dwMinorVersion == 0) {
                osVer = OS_WIN2000;
            } else if (info.dwMinorVersion == 1) {
                osVer = OS_WINXP;
            } else if (info.dwMinorVersion >= 2) {
                osVer = OS_WIN2003;
            }
            break;

        case 6:
            if (info.dwMinorVersion == 0) {
                osVer = OS_Vista;
            } else if (info.dwMinorVersion == 1) {
                osVer = OS_WIN7;
            } else if (info.dwMinorVersion == 2) {
                // 8 or 8.1 or 10
                osVer = OS_WIN8;

                if (GetNtdllVersion(&majorVer, &minorVer, &buildNum)) {
                    if (majorVer == 6) {
                        if (minorVer == 3) {
                            osVer = OS_WIN8_1;
                        } else if (minorVer >= 4) {
                            osVer = OS_WIN10;
                        }
                    } else if (majorVer >= 7) {
                        osVer = OS_WIN10;
                    }
                }
            } else if (info.dwMinorVersion == 3) {
                osVer = OS_WIN8_1;
            } else if (info.dwMinorVersion >= 4) {
                osVer = OS_WIN10;
            }
            break;

        default:
            if (info.dwMajorVersion >= 7) {
                osVer = OS_WIN10;
            }
            break;
        }
    } else if (GetNtdllVersion(&majorVer, &minorVer, &buildNum)) {
        // should not run to this!!
        switch (majorVer) {
        case 3:
            osVer = OS_WINNT35;
            break;

        case 4:
            osVer = OS_WINNT40;
            break;

        case 5:
            if (minorVer == 0) {
                osVer = OS_WIN2000;
            } else if (minorVer == 1) {
                osVer = OS_WINXP;
            } else if (minorVer >= 2) {
                osVer = OS_WIN2003;
            }
            break;

        case 6:
            if (minorVer == 0) {
                osVer = OS_Vista;
            } else if (minorVer == 1) {
                osVer = OS_WIN7;
            } else if (minorVer == 2) {
                osVer = OS_WIN8;
            } else if (minorVer == 3) {
                osVer = OS_WIN8_1;
            } else if (minorVer >= 4) {
                osVer = OS_WIN10;
            }
            break;

        default:
            if (majorVer >= 7) {
                osVer = OS_WIN10;
            }
            break;
        }
    }

    return osVer;
}

API得到Windows版本的更多相关文章

  1. 史上最详细Windows版本搭建安装React Native环境配置 转载,比官网的靠谱亲测可用

    史上最详细Windows版本搭建安装React Native环境配置   2016/01/29 |  React Native技术文章 |  Sky丶清|  95条评论 |  33530 views ...

  2. hiredis的各种windows版本

    hiredis的各种windows版本(金庆的专栏 2016.12)hiredis 是内存数据库 redis 的客户端C库, 不支持Windows.hiredis的Windows移植版本有许多:des ...

  3. 如何下载 Nginx (windows 版本)并且简单的使用

    官网地址:http://nginx.org/ 进到官网 我这里下载的是 稳定版的 windows版本. 开始我们的简单测试 步骤一:找到nginx的压缩包,(随意找个地方)解压 步骤二:进入conf文 ...

  4. 获取windows版本信息的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 个人不建议用 GetVersion 或GetVersionEx 之类的 API 来获取系统版本号.注意微软也说过,这个 ...

  5. FFmpeg笔记:使用MSVC工具链编译Windows版本静态库、动态库

    2019年3月开始,为了将音视频编解码功能集成到Cocos2d-x中,开始接触到FFmpeg: 当时开发环境还在Mac下,编译FFmpeg相比现在用Windows平台要方便的多: 最近,公司内部有个U ...

  6. 史上最全Windows版本搭建安装React Native环境配置

    史上最全Windows版本搭建安装React Native环境配置 配置过React Native 环境的都知道,在Windows React Native环境配置有很多坑要跳,为了帮助新手快速无误的 ...

  7. C#更改文件访问权限所有者(适用于各个Windows版本)

    前面也提到了,前段时间在做Online Judge系统,在正式上线前有几个比较老的版本,其中第一个版本使用ACL来控制权限以确保安全(但是这个版本完全建立在IIS上,所以这样做是没效果的),遇到了一些 ...

  8. 怎样快速免费获取Windows版本的ZBrush

    ZBrush是一款专业的3D绘制软件及数字雕刻软件,随着3D技术的不断进步,ZBrush也是越来越受到业内欢迎,在世界拥有了众多的粉丝和爱好者.相信很多用户对软件的体验就是从使用的版本开始的,本文就教 ...

  9. cmd命令行查看windows版本

    1.ver命令不显示sp几 C:\>ver Microsoft Windows XP [Version 5.1.2600] C:\> 08: C:\Users\Administrator& ...

随机推荐

  1. [C#].Net Core 获取 HttpContext.Current 以及 AsyncLocal 与 ThreadLocal

    在 DotNetCore 当中不再像 MVC5 那样可以通过 HttpContext.Current 来获取到当前请求的上下文. 不过微软提供了一个 IHttpContextAccessor 来让我们 ...

  2. [LeetCode] Delete and Earn 删除与赚取

    Given an array nums of integers, you can perform operations on the array. In each operation, you pic ...

  3. Java入门之JDK的安装和环境变量的配置

    Java的版本 1. Java SEjava se 以前称为J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Java 应用程序.Java SE是基础包,但是也包含了支持 Jav ...

  4. 阿里云在RSAC 2018上宣布 将在西雅图建立安全实验室

    日前,2018年度的RSA Conference全球信息安全大会在美国加州旧金山市召开.作为全球三大云计算服务商之一,阿里云携3款全新安全产品亮相,并宣布今年将在西雅图设立全新的安全实验室,整合全球安 ...

  5. jdk 动态代理源码分析

    闲来无事,撸撸源码 使用方法 直接看代码吧.. package com.test.demo.proxy; import java.lang.reflect.InvocationHandler; imp ...

  6. 想进大厂,想收获高薪offer,资深猎头告诉你怎么做......

    其实吧,面试官面试的时候主要就看三个方面:现在能力如何,未来潜力如何,人品如何. 第一个因素是最重要的,因为后面两个因素有太多的人为判断因素,无法量化.所谓的面试准备,"现在能力如何&quo ...

  7. [SHOI2017]相逢是问候

    Description 信息将你我连结.B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以 分为两种:0 l r表示将第l个到第r个数(al,al+1,...,a ...

  8. bzoj 1488: [HNOI2009]图的同构

    Description 求两两互不同构的含n个点的简单图有多少种. 简单图是关联一对顶点的无向边不多于一条的不含自环的图. a图与b图被认为是同构的是指a图的顶点经过一定的重新标号以后,a图的顶点集和 ...

  9. bzoj4830 hnoi2017 抛硬币

    题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到 SSR,让他非常怀疑人生.勤勉的小 A ...

  10. bzoj4710: [Jsoi2011]分特产 组合+容斥

    4710: [Jsoi2011]分特产 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 289  Solved: 198[Submit][Status] ...