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. Java-NIO(六):Channel聚集(gather)写入与分散(scatter)读取

    Channel聚集(gather)写入: 聚集写入( Gathering Writes)是指将多个 Buffer 中的数据“聚集”到 Channel. 特别注意:按照缓冲区的顺序,写入 positio ...

  2. Batch训练的反向传播过程

    Batch训练的反向传播过程 本文试图通过Softmax理解Batch训练的反向传播过程 采用的网络包含一层全连接和一层softmax,具体网络如下图所示: 交叉熵成本函数: \[L = - \fra ...

  3. C#之IComparable用法,实现List<T>.sort()排序

    这篇文章主要介绍了C#的一些基础知识,主要是IComparable用法,实现List<T>.sort()排序,非常的实用,这里推荐给大家.   List<T>.sort()可以 ...

  4. 【PYTHON】三级菜单

    # Author: Stephen Yuan area_range = { '广东省': { '广州市': { '海珠区': ['全区总面积90.40平方公里', '2015年,海珠区生产总值达到14 ...

  5. Vue2.0父子组件之间的双向数据绑定问题解决方案

    对于vue 1.0项目代码,如果把vue换成vue 2.0,那么之后项目代码就完全奔溃不能运行,vue 2.0在父子组件数据绑定的变化(不再支持双向绑定)颠覆了1.0的约定,很遗憾. 解决方案只有两种 ...

  6. [SDOI 2015]序列统计

    Description 题库链接 给出集合 \(S\) ,元素都是小于 \(M\) 的非负整数.问能够生成出多少个长度为 \(N\) 的数列 \(A\) ,数列中的每个数都属于集合 \(S\) ,并且 ...

  7. [ZJOI 2010]count 数字计数

    Description 题库链接 问你 \([l,r]\) 区间内所有整数中各个数码出现了多少次. \(1\leq a\leq b\leq 10^{12}\) Solution 数位 \(DP\) . ...

  8. WISCO信息组NOIP模拟赛-部落冲突

    传送门 首先肯定考虑树剖,这里没有要求区间加,所以可以用树状数组维护,不会卡常的 这里是边权,可以转化为点权:让每条边连接的较深的节点的点权等于边权即可,然后计算的时候减去lca #include&l ...

  9. [POJ]1279: Art Gallery

    题目大意:有一个N边形展馆,问展馆内有多少地方可以看到所有墙壁.(N<=1500) 思路:模板题,半平面交求出多边形的核后计算核的面积. #include<cstdio> #incl ...

  10. SPOJ NSUBSTR

    You are given a string S which consists of 250000 lowercase latin letters at most. We define F(x) as ...