kernel32 的 GetVersionExA/W
2018-02-13 23:09
393 查看
今天接到一个问题,说Kernel32 模块的 GetVersionEx 获取系统版本不准确,
然后让我查查什么原因,
我当时就想,它不准,就用ntdll的 RtlGetVersion 阿,或者 RtlGetNtVersionNumbers,这不都行么,
那就看看为什么会出现 kernel32 的函数出现问题吧,
其实挺简单的,梳理一下调用过程
环境 Win10 x64 16299,
调用kernel32 的 GetVersionExW 会走到 kernelbase的 GetVersionExW ,
然后再调用ntdll的 RtlGetVersion,最后再经过一堆计算,返回,
其实经过分析,获取的系统信息,在 RtlGetVersion 这一步返回的时候,还是正确的,
但是后续的时候就出了问题了。具体是什么问题,
其实,Win10 在 kernelbase里面硬编码写了几个东西,导致这里出问题了,
它到底写了什么,看下面ida截图
这是 kernelbase 里面的函数,前面可以一笔带过,都是正确的,
直到v1 = v2(); 调用结束之后,开始来问题了,
其实,如果不调用 v1 = v2(); 的话也不会出问题,
只要调用了这个函数,那么必然v1会变成1,因为我们的PC电脑几乎都是intel系列,几乎就没有非小端的,
只有移动端平台、ARM平台系列才有大端,所以这里必然返回是1(其实那个函数内部也是就一句话,return 1;),
那么如果这里返回1的话,就必然走 if (v3) 的 else 路,所以调用必然出错。
就是这么简单。
然后让我查查什么原因,
我当时就想,它不准,就用ntdll的 RtlGetVersion 阿,或者 RtlGetNtVersionNumbers,这不都行么,
那就看看为什么会出现 kernel32 的函数出现问题吧,
其实挺简单的,梳理一下调用过程
环境 Win10 x64 16299,
调用kernel32 的 GetVersionExW 会走到 kernelbase的 GetVersionExW ,
然后再调用ntdll的 RtlGetVersion,最后再经过一堆计算,返回,
其实经过分析,获取的系统信息,在 RtlGetVersion 这一步返回的时候,还是正确的,
但是后续的时候就出了问题了。具体是什么问题,
其实,Win10 在 kernelbase里面硬编码写了几个东西,导致这里出问题了,
它到底写了什么,看下面ida截图
这是 kernelbase 里面的函数,前面可以一笔带过,都是正确的,
直到v1 = v2(); 调用结束之后,开始来问题了,
其实,如果不调用 v1 = v2(); 的话也不会出问题,
只要调用了这个函数,那么必然v1会变成1,因为我们的PC电脑几乎都是intel系列,几乎就没有非小端的,
只有移动端平台、ARM平台系列才有大端,所以这里必然返回是1(其实那个函数内部也是就一句话,return 1;),
那么如果这里返回1的话,就必然走 if (v3) 的 else 路,所以调用必然出错。
就是这么简单。
相关文章推荐
- Tips:error C4996: 'GetVersionExA': 被声明为已否决
- error C4996: ‘GetVersionExA': 被声明为已否决
- how to get redhat version
- Docker问题(Get http:///var/run/docker.sock/v1.20/version:dial unix /var/run/docker.sock: no such file)
- 解决Eclipse出现failed to get the required adt version from sdkversion问题的方法
- 使用VS2013,编译提示"GetVersion"被声明为否决的
- Declare Function GetVersion Lib "kernel32" Alias "GetVersion" () As Long
- VC中“GetVersionExW函数被声明为已否决”的问题?
- 利用WinAPI(GetFileVersionInfo)获取文件版本信息
- 问题:version `GLIBCXX_3.4.9' not found (required by apt-get)
- Cannot get property 'compileSdkVersion' on extra properties extension as it does not exist问题解决
- How to get the oracle server version?
- Windows API ——GetVersionEx——获取操作系统版本信息
- [笔记] How to get the versionCode and versionName of your app
- VSS Get Latest Version 没有提示recursive的对话框解决
- Android:极光推送集成注意要点——解决:Get sdk version fail![获取sdk版本失败!]解决方案
- Android项目使用AFinal框架中的FinalDB模块时报错java.lang.NoSuchMethodException: getSerialVersionUID []的解决方法
- Get Linux Version
- Could not get unknown property 'ANDROID_BUILD_SDK_VERSION' 解决方法
- mac eclipse报错:failed to get the required adt version number from the sdk的解决办法