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. flask 操作mysql的两种方式-sqlalchemy操作

    flask 操作mysql的两种方式-sqlalchemy操作 二.ORM sqlalchemy操作 #coding=utf-8 # model.py from app import db class ...

  2. Windows下使用PSCP从Linux下载或上传文件

    1. 先下载putty包,然后解压 https://the.earth.li/~sgtatham/putty/latest/w64/putty.zip 2. 下载Linux文件到当前目录 PSCP.e ...

  3. 创建类似于Oracle中decode的函数

    -- 创建类似于Oracle中decode的函数create or replace function decode(variadic p_decode_list text[])returns text ...

  4. 【django之modelform】

    一.什么是modelform ModelForm顾名思义就Form和Django的Model数据库模型结合体,可以简单.方便得对数据库进行增加.编辑操作和验证标签的生成: 举例说明: 比如我们的数据库 ...

  5. java处理大文本方案

    转载自:http://langgufu.iteye.com/blog/2107023 java处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的Io类, ...

  6. [原创]手把手教你写网络爬虫(5):PhantomJS实战

    手把手教你写网络爬虫(5) 作者:拓海 摘要:从零开始写爬虫,初学者的速成指南! 封面: 大家好!从今天开始,我要与大家一起打造一个属于我们自己的分布式爬虫平台,同时也会对涉及到的技术进行详细介绍.大 ...

  7. [BZOJ]1093 最大半连通子图(ZJOI2007)

    挺有意思的一道图论. Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:∀u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v ...

  8. 勤拂拭软件Android开发之旅(1) 之 Android 开发环境搭建

    勤拂拭软件工作室原创出品,欢迎转载,欢迎交流. 转载请注明原文:http://www.cnblogs.com/wangleiblog/p/6019063.html 勤拂拭软件Android开发之旅目录 ...

  9. [Project] Simulate HTTP Post Request to obtain data from Web Page by using Python Scrapy Framework

    1. Background Though it's always difficult to give child a perfect name, parent never give up trying ...

  10. list,tuple,dict,set的使用方法

    list   list是一种有序的集合,可以随时添加和删除其中的元素 classmates = ['Michael', 'Bob', 'Tracy'] len()函数可以获得list元素的个数.lis ...