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. POJ-1125 Stockbroker Grapevine---Floyd应用

    题目链接: https://vjudge.net/problem/POJ-1125 题目大意: 股票经纪人要在一群人中散布一个谣言,而谣言只能在亲密的人中传递,题目各处了人与人之间的关系及传递谣言所用 ...

  2. hdu1005 Number Sequence---找循环节

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1005题目大意: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + ...

  3. asp.net core 六 Oracle ORM

         .netcore 中 Oracle ORM      在真正将项目移植到.netcore下,才发现会有很多问题,例如访问Oracle,问题出现的时间在2017年底          参考连接 ...

  4. win10 apache配置虚拟主机后localhost无法使用

    win10系统配置虚拟主机1.用记事本或Sublime Text打开httpd.confctrl + f 搜索httpd-vhosts.conf 将#Include conf/extra/httpd- ...

  5. eclipse下如何使用Hibernate反转工程生与数据库对应的实体类和映射文件(以MySQL为例)

    首先需要为eclipse添加对Hibernate的支持(也就是下载的Hibernate中的jar包),下载方法另查,这里不多做阐述. 想要使用反转工程,首先要下载Hibernate反转工程的插件Jbo ...

  6. JavaScript初探之AJAX的应用

    什么是 AJAX1. AJAX = 异步 JavaScript 和 XML. 2. AJAX 是一种用于创建快速动态网页的技术. 3. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步 ...

  7. javaIO操作之字节输出流--OutputStream

    OutputStream /** * <li>输出单个字节:public abstract void write(int b) throws IOException ; * <li& ...

  8. [LeetCode] Find K Closest Elements 寻找K个最近元素

    Given a sorted array, two integers k and x, find the k closest elements to x in the array. The resul ...

  9. position的static、relative、absolute、fixed、inherit

    网上有很多关于position的讲解,也有很多他们属性之间的比较,但是比较全面的讲解还是比较少,每次看完过段时间就忘了,所以今天参考了很多网上现有的资源,自己整理一下,写下这篇文章. position ...

  10. 手动导入xmpp后,再使用cocoapods的时候出现的问题

    最新的cocoapod导入xmpp的时候,会出现循环依赖,所以撸主选择了手动导入. 一开始还用的挺开心的,后来,使用cocoapods导入其他的框架,发现调用的时候总是报错. Undefined sy ...