Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >跟Google学写代码--Chromium/base--windows_version源码学习及应用

跟Google学写代码--Chromium/base--windows_version源码学习及应用

作者头像
程序员的酒和故事
发布于 2018-03-12 09:09:38
发布于 2018-03-12 09:09:38
1K0
举报

Chromium是一个伟大的、庞大的开源工程,很多值得我们学习的地方。 前面写道: 《跟Google学写代码–Chromium/base–stl_util源码学习及应用》

今天与大家分享的就是Chromium下base中的windows_version,对于你的win32应用程序一定会有很多的帮助。

1 定义version枚举

代码语言:rust
AI代码解释
复制
enum Version {
  VERSION_PRE_XP = 0,  // Not supported.
  VERSION_XP,
  VERSION_SERVER_2003, // Also includes XP Pro x64 and Server 2003 R2.
  VERSION_VISTA,       // Also includes Windows Server 2008.
  VERSION_WIN7,        // Also includes Windows Server 2008 R2.
  VERSION_WIN8,        // Also includes Windows Server 2012.
  VERSION_WIN8_1,      // Code named Windows Blue
  VERSION_WIN_LAST,    // Indicates error condition.};
代码语言:rust
AI代码解释
复制
enum VersionType {
  SUITE_HOME,
  SUITE_PROFESSIONAL,
  SUITE_SERVER,
  SUITE_LAST,
};

2 定义 OSInfo类 a. 通过BASE_EXPORT定义为导出类 b. 将OSInfo()和 ~OSInfo()声明为私有,即我们要的单例模式

代码语言:c#
AI代码解释
复制
class BASE_EXPORT OSInfo { public:  struct VersionNumber {    int major;    int minor;    int build;
  };  struct ServicePack {    int major;    int minor;
  };  enum WindowsArchitecture {
    X86_ARCHITECTURE,
    X64_ARCHITECTURE,
    IA64_ARCHITECTURE,
    OTHER_ARCHITECTURE,
  };  enum WOW64Status {
    WOW64_DISABLED,
    WOW64_ENABLED,
    WOW64_UNKNOWN,
  };  static OSInfo* GetInstance();

  Version version() const { return version_; }
  VersionNumber version_number() const { return version_number_; }
  VersionType version_type() const { return version_type_; }
  ServicePack service_pack() const { return service_pack_; }
  WindowsArchitecture architecture() const { return architecture_; }  int processors() const { return processors_; }
  size_t allocation_granularity() const { return allocation_granularity_; }
  WOW64Status wow64_status() const { return wow64_status_; }
  std::string processor_model_name();  static WOW64Status GetWOW64StatusForProcess(HANDLE process_handle); private:  OSInfo();
  ~OSInfo();

  Version version_;
  VersionNumber version_number_;
  VersionType version_type_;
  ServicePack service_pack_;
  WindowsArchitecture architecture_;  int processors_;
  size_t allocation_granularity_;
  WOW64Status wow64_status_;
  std::string processor_model_name_;

  DISALLOW_COPY_AND_ASSIGN(OSInfo);
};// Because this is by far the most commonly-requested value from the above// singleton, we add a global-scope accessor here as syntactic sugar.BASE_EXPORT Version GetVersion();

}  // namespace win}  // namespace base

3 GetInstance()的实现 这里用到了InterlockedCompareExchangePointer: Provides compiler intrinsic support for the Win32 Platform SDK InterlockedCompareExchangePointer function.

代码语言:c++
AI代码解释
复制
OSInfo* OSInfo::GetInstance() {  static OSInfo* info;  if (!info) {
    OSInfo* new_info = new OSInfo();    if (InterlockedCompareExchangePointer(        reinterpret_cast<PVOID*>(&info), new_info, NULL)) {      delete new_info;
    }
  }  return info;
}

这里补充一下,delete new_info后,最好把new_info置为nullptr。

4 获取WOW64状态的实现 最主要的是这行: GetProcAddress(GetModuleHandle(L”kernel32.dll”), “IsWow64Process”));

可以通过加载Kernel32来动态判断 当前操作系统32bit还是64bit。

代码语言:c++
AI代码解释
复制
OSInfo::WOW64Status OSInfo::GetWOW64StatusForProcess(HANDLE process_handle) {  typedef BOOL (WINAPI* IsWow64ProcessFunc)(HANDLE, PBOOL);
  IsWow64ProcessFunc is_wow64_process = reinterpret_cast<IsWow64ProcessFunc>(
      GetProcAddress(GetModuleHandle(L"kernel32.dll"), "IsWow64Process"));  if (!is_wow64_process)    return WOW64_DISABLED;
  BOOL is_wow64 = FALSE;  if (!(*is_wow64_process)(process_handle, &is_wow64))    return WOW64_UNKNOWN;  return is_wow64 ? WOW64_ENABLED : WOW64_DISABLED;
}

应用: 简单的使用:

代码语言:c++
AI代码解释
复制
int main(int argc, char* argv[]) {  int version = base::win::OSInfo::GetInstance()->version();  std::cout << "VERSION_PRE_XP = 0," << std::endl;  std::cout << "VERSION_SERVER_2003 = 1," << std::endl;  std::cout << "VERSION_VISTA = 2," << std::endl;  std::cout << "VERSION_WIN7 = 3," << std::endl;  std::cout << "VERSION_WIN8 = 4," << std::endl;  std::cout << "VERSION_WIN8_1 = 5," << std::endl;  std::cout << "VERSION_WIN_LAST = 6," << std::endl;  std::cout << "My Windows Version is: " << version << std::endl << std::endl;  std::string processor_model_name = base::win::OSInfo::GetInstance()->processor_model_name();  std::cout << "My Processor Model Name is: " << processor_model_name << std::endl << std::endl;  int wow64_status = base::win::OSInfo::GetInstance()->wow64_status();  std::cout << "WOW64_DISABLED = 0," << std::endl;  std::cout << "WOW64_ENABLED = 1," << std::endl;  std::cout << "WOW64_UNKNOWN = 2," << std::endl;  std::cout << "My wow64_status is: " << wow64_status << std::endl << std::endl;




  base::win::OSInfo::VersionNumber version_number = base::win::OSInfo::GetInstance()->version_number();  std::cout << "My Version Number: " << std::endl;  std::cout << " major: " << version_number.major << std::endl;  std::cout << " minor: " << version_number.minor << std::endl;  std::cout << " build: " << version_number.build << std::endl;

  system("pause");  return 0;
}

输出结果:

代码语言:text
AI代码解释
复制
VERSION_PRE_XP = 0,VERSION_SERVER_2003 = 1,VERSION_VISTA = 2,VERSION_WIN7 = 3,VERSION_WIN8 = 4,VERSION_WIN8_1 = 5,VERSION_WIN_LAST = 6,
My Windows Version is: 5

My Processor Model Name is: Intel(R) Core(TM) i7-5500U CPU @ 2.40GHzWOW64_DISABLED = 0,WOW64_ENABLED = 1,WOW64_UNKNOWN = 2,
My wow64_status is: 1

My Version Number:
 major: 6
 minor: 2
 build: 9200

插曲 一个坑儿:

一个VS中有好几个工程,在运行我们想要运行的项目的时候,出现上图中的错误。

如果你不够细心,你就以为是库的版本不对,比如库是64位,而你运行的是32位程序。。。。。。 但是你看编译库的工程也是32位的,这时候就有点发蒙。。。。。 蓦然回首,你没有把想要运行的程序设置为启动项,而且把那个库的工程设置为了启动项。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-01-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 人生有味是多巴胺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
跟Google学写代码--Chromium/base--cpu源码学习及应用
Chromium是一个伟大的、庞大的开源工程,很多值得我们学习的地方。 前面写道: 《跟Google学写代码–Chromium/base–stl_util源码学习及应用》 《跟Google学写代码–Chromium/base–windows_version源码学习及应用》 今天分享cpu相关的操作。 先看看这个枚举: enum IntelMicroArchitecture { PENTIUM, SSE, SSE2, SSE3, SSSE3, SSE41
程序员的酒和故事
2018/03/12
1K0
windows平台下,c++获取cpu型号,读取注册表获取系统软硬件信息代码
http://blog.csdn.net/wangyaninglm/article/details/41940287
流川疯
2022/11/26
2.6K0
windows平台下,c++获取cpu型号,读取注册表获取系统软硬件信息代码
判断进程是32位还是64位(32、64位系统通用)
前端时间做进程信息采集的一个工具,测试提交上来一个 Bug,在 XP 上所有采集的进程均为 64 位,我当时挺差异的,难道微软的 API 有问题?后来看了一下 IsWow64Process 函数第二个参数在 MSDN 上的解释:
我与梦想有个约会
2023/10/21
6010
CMake 秘籍(二)
尽管 CMake 是跨平台的,在我们的项目中我们努力使源代码能够在不同平台、操作系统和编译器之间移植,但有时源代码并不完全可移植;例如,当使用依赖于供应商的扩展时,我们可能会发现有必要根据平台以略有不同的方式配置和/或构建代码。这对于遗留代码或交叉编译尤其相关,我们将在第十三章,替代生成器和交叉编译中回到这个话题。了解处理器指令集以针对特定目标平台优化性能也是有利的。本章提供了检测此类环境的食谱,并提供了如何实施此类解决方案的建议。
ApacheCN_飞龙
2024/05/16
1.1K0
【Chromium】Base库的最佳实践 - 进程和线程
Chromium是一个开源的浏览器项目,它提供了现代Web浏览器的许多功能。Chromium的base库是该项目的核心组件之一,为整个浏览器提供了基础的功能和工具。
lealc
2024/06/10
7130
【Chromium】Base库的最佳实践 - 进程和线程
跟Google学写代码--Chromium/base--stl_util源码学习及应用
Chromium是一个伟大的、庞大的开源工程,很多值得我们学习的地方。 今天与大家分享的就是Chromium下base中的stl_util,是对stl的补充,封装,更有利于我们的使用,完全可以移植到自己的C++工程项目中来。 1 释放STL内存 Clears internal memory of an STL object. 我们知道,vector的clear()方法式清除了vector中的内容,但是vector object所占的内存不会清除。 因此,std_util中有个这个方法: template<
程序员的酒和故事
2018/03/12
1.1K0
windows cuda安装_虚拟机 cuda
到 https://developer.nvidia.com/cuda-downloads (旧:URL )去下载。在安装的时候一定要自定义安装,否则将会安装很多无用的东西。安装的选项,可以选择不更新驱动程序。
全栈程序员站长
2022/09/21
2.6K0
windows cuda安装_虚拟机 cuda
【Chromium】如何提取Chromium的Base库(下)
本篇文章主要记录如何从Chromium中提取Base库,方便后续的学习和使用,同时抛砖引玉,希望带给各位一些启发和帮助。
lealc
2024/04/17
5200
【Chromium】如何提取Chromium的Base库(下)
26种对付反调试的方法
本文针对的是Windows操作系统中常用的防破0解及防逆向工程保护技术,即反调试方法,各种防逆向工程技术的主要目标是尽可能多的使逆变工具尽可能失效。
战神伽罗
2019/07/24
6K0
跟Google学写代码--Chromium工程中用到的C++11特性
Ttile 跟Google学写代码--Chromium工程中用到的C++11特性 Chromium是一个伟大的、庞大的开源工程,很多值得我们学习的地方。 《跟Google学写代码–Chromium/base–stl_util源码学习及应用》 《跟Google学写代码–Chromium/base–windows_version源码学习及应用》 《跟Google学写代码–Chromium/base–cpu源码学习及应用》 今天就与大家一起分享一下Chromium中所用到的C++11特性,有的是之前博客没介绍过
程序员的酒和故事
2018/03/12
1.4K0
C/C++ 遍历任务栏托盘图标
托盘图标,就是底部任务栏托盘,可以直接遍历,如果需要输出任务栏中的图片内容可使用如下方式。
王 瑞
2022/12/28
1.1K0
C/C++ 遍历任务栏托盘图标
【CMake教程】(二)CMake 通过CMakeLists.txt自动配置程序版本号
  本文主要讲述如何使用CMakeLists.txt,配置程序的版本号。程序在发布的时候需要对用的版本号,同时为了保证程序的兼容性,往往需要在程序中判断当前程序的版本。所以如果在编译过程中将版本号自动的传入程序中,就可以使程序更智能。
CNNer
2020/07/14
3.4K0
【CMake教程】(二)CMake 通过CMakeLists.txt自动配置程序版本号
windows内核提权,又一突破游戏进程保护的方法
当一个进程被保护的时候 比如无法获取其进程句柄权限 (OpenProcess) 或者无法获取内存读写访问权限的时候,则可以使用此方法来进行提权。
IBinary
2023/07/24
1.9K0
windows内核提权,又一突破游戏进程保护的方法
驱动里执行应用层代码之KeUserModeCallBack,支持64位win7(包括WOW64)
在驱动层(ring0)里执行应用层(ring3)代码,这是个老生常谈的技术,而且方法也挺多。
战神伽罗
2019/11/19
2.7K0
Windows提权方法汇总
Windows下服务的权限通常是SYSTEM。如果我们能够替换服务的启动程序为我们的恶意程序(如反弹shell),即相当于获得了SYSTEM权限,达到了提权的目的。 无引号服务路径有可能会导致这种情况的发生。 所谓无引号服务路径,就是服务启动程序的路径中包含了空格且未被引号包含起来。比如这样
ConsT27
2022/02/11
1.5K0
Windows提权方法汇总
规避检测(共五章):第一章
通常的主机中没有这样的文件和目录;但是,它们存在于特定的虚拟环境和沙箱中。如果存在此类项目,则可以检测到虚拟环境。
Creaper
2023/11/20
2790
规避检测(共五章):第一章
LSM-Tree - LevelDb 源码解析
在上一篇文章LSM-Tree - LevelDb了解和实现中介绍了LevelDb相关的数据结构和核心组件,LevelDB的核心读写部分,以及为什么在这个数据库中写入的速度要比读取的速度快上好几倍。
阿东
2022/05/18
7324
LSM-Tree - LevelDb 源码解析
Skywalking Php注册不上问题排查
Skywalking是一款分布式追踪应用,具体介绍可以参考 skywalking。
心平气和
2020/09/19
1.5K0
Skywalking Php注册不上问题排查
从转储lsass学习Windows安全
​ Access Token是描述进程或线程的安全上下文的对象。其中包括进程或线程关联的用户账户的身份和权限。
Nayon
2023/04/17
1.1K0
从转储lsass学习Windows安全
WinAPI之NtQueryInformationThread
在Windows操作系统的内核级编程和系统管理领域,NtQueryInformationThread 是一个非常强大且具有重要意义的函数。它允许开发者获取关于线程的各种详细信息,为深入理解系统线程的行为和状态提供了有力的工具。
lealc
2025/01/18
2120
WinAPI之NtQueryInformationThread
推荐阅读
相关推荐
跟Google学写代码--Chromium/base--cpu源码学习及应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档