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. Android:后台给button绑定onClick事件、当返回项目到手机页面时提示是否退出APP

    上一篇文章我们学习了android通过findViewById的方式查找控件,本章将了解button控件,及btton如何绑定控件. 通过android的ui设计工具设计一个登录页面: <Rel ...

  2. Http协议消息报头

    哎.不知道怎么写Http协议... 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议. HTTP基于TCP/IP通信协议来传递数据 ...

  3. matlab coder 工具箱使用教程

    之前一直听说matlab代码可以转C和C++代码,但是一直都没有时间尝试,最近闲着无聊,就想来试试如何转换,上网查了很多资料,照着做下去,发现都有一些问题,之后自己琢磨了很久,终于将一个很简单的例子给 ...

  4. [C#]设计模式-抽象工厂-创建型模式

    介绍了简单工厂与工厂方法之后,现在我们来看一下工厂三兄弟的最后一个 -- 抽象工厂. 那什么是抽象工厂呢? 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相 ...

  5. SpringMVC入门到精通(一)

    推荐一个很不错的学习博客 http://jinnianshilongnian.iteye.com/blog/1752171

  6. 利用 Scrapy 爬取知乎用户信息

    思路:通过获取知乎某个大V的关注列表和被关注列表,查看该大V和其关注用户和被关注用户的详细信息,然后通过层层递归调用,实现获取关注用户和被关注用户的关注列表和被关注列表,最终实现获取大量用户信息. 一 ...

  7. ActiveMQ笔记:源码分析

    本文对ActiveMQ的启动过程,以及BrokerService,TransportConnector和NetworkConnector等几个重要的模块的代码做一个简要的分析. 启动过程 如果要快速地 ...

  8. 十大面试难题解惑,看完秒杀一切 HR 面。程序员必读!

    最能体现求职者能力的就是面试,能不能拿到Offer,取决于你面试时的表现,只有有准备才能在面试过程中游刃有余. 小编收集了10个面试官最爱提的问题,虽然题目千变万化,但是万变不离其宗,只要掌握了答题的 ...

  9. [CQOI2013]新Nim游戏

    Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴 ...

  10. [USACO08JAN]haybale猜测Haybale Guessing

    题目描述 The cows, who always have an inferiority complex about their intelligence, have a new guessing ...