REACTOS RtlGetVersion 函数实现分析 RtlGetVersion 函数实现分析1. 概述RtlGetVersion是 Windows NT/ReactOS 操作系统中用于获取操作系统版本信息的核心函数。它是 RtlRun-Time Library的一部分提供用户态和内核态两种实现用于查询当前运行的操作系统版本、构建号、平台标识等信息。用途应用程序兼容性检测如版本检查系统信息收集条件性代码执行根据不同 Windows 版本执行不同逻辑版本欺骗用于应用程序兼容性调用路径应用程序 ├── GetVersion() / GetVersionEx() [kernel32.dll] └── RtlGetVersion() [ntdll.dll] └── NtQuerySystemInformation(SystemVersionInformation)2. 数据结构定义2.1 RTL_OSVERSIONINFOW标准版本信息结构[rtltypes.h:245-252](file:///d:/reactos/sdk/include/xdk/rtltypes.h#L245-L252)typedefstruct_OSVERSIONINFOW{ULONG dwOSVersionInfoSize;// 结构大小必须初始化ULONG dwMajorVersion;// 主版本号ULONG dwMinorVersion;// 次版本号ULONG dwBuildNumber;// 构建号ULONG dwPlatformId;// 平台标识WCHAR szCSDVersion[128];// CSD 版本字符串如 Service Pack 1}OSVERSIONINFOW,*POSVERSIONINFOW,*LPOSVERSIONINFOW,RTL_OSVERSIONINFOW,*PRTL_OSVERSIONINFOW;2.2 RTL_OSVERSIONINFOEXW扩展版本信息结构[rtltypes.h:268-279](file:///d:/reactos/sdk/include/xdk/rtltypes.h#L268-L279)typedefstruct_OSVERSIONINFOEXW{ULONG dwOSVersionInfoSize;// 结构大小必须初始化ULONG dwMajorVersion;// 主版本号ULONG dwMinorVersion;// 次版本号ULONG dwBuildNumber;// 构建号ULONG dwPlatformId;// 平台标识WCHAR szCSDVersion[128];// CSD 版本字符串USHORT wServicePackMajor;// 服务包主版本USHORT wServicePackMinor;// 服务包次版本USHORT wSuiteMask;// 套件掩码如 VER_SUITE_ENTERPRISEUCHAR wProductType;// 产品类型工作站/服务器/域控制器UCHAR wReserved;// 保留字段}OSVERSIONINFOEXW,*POSVERSIONINFOEXW,*LPOSVERSIONINFOEXW;2.3 字段说明字段类型说明dwOSVersionInfoSizeULONG调用前必须设置为sizeof(RTL_OSVERSIONINFOW)或sizeof(RTL_OSVERSIONINFOEXW)dwMajorVersionULONGWindows NT 版本号5Windows 2000/XP/Server 20036Vista/7/8/1010Windows 11dwMinorVersionULONG子版本号02000/Vista1XP/72838.1dwBuildNumberULONG操作系统构建号dwPlatformIdULONG平台标识VER_PLATFORM_WIN32_NT(2) Windows NTszCSDVersionWCHAR[128]服务包信息如LService Pack 1wServicePackMajorUSHORT服务包主版本号wServicePackMinorUSHORT服务包次版本号wSuiteMaskUSHORT操作系统套件标识如VER_SUITE_PERSONAL、VER_SUITE_ENTERPRISEwProductTypeUCHAR产品类型VER_NT_WORKSTATION(1)、VER_NT_SERVER(3)、VER_NT_DOMAIN_CONTROLLER(2)3. 用户态实现3.1 核心代码RtlGetVersion用户态实现[version.c:182-250](file:///d:/reactos/dll/ntdll/rtl/version.c#L182-L250)NTSTATUS NTAPIRtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation){SIZE_T Length;PPEB PebNtCurrentPeb();// 1. 参数验证检查结构大小是否有效if(lpVersionInformation-dwOSVersionInfoSize!sizeof(RTL_OSVERSIONINFOW)lpVersionInformation-dwOSVersionInfoSize!sizeof(RTL_OSVERSIONINFOEXW)){returnSTATUS_INVALID_PARAMETER;}// 2. 检查应用程序兼容性的有效版本版本欺骗{UINT EffectiveVersionRosGetProcessEffectiveVersion();if(EffectiveVersion){// 使用欺骗的版本号UINT Major(EffectiveVersion8)0xFF;UINT MinorEffectiveVersion0xFF;lpVersionInformation-dwMajorVersionMajor;lpVersionInformation-dwMinorVersionMinor;lpVersionInformation-dwBuildNumber(EffectiveVersion0x0601)?7600U:(ULONG)Peb-OSBuildNumber;lpVersionInformation-dwPlatformIdVER_PLATFORM_WIN32_NT;}else{// 使用真实版本号lpVersionInformation-dwMajorVersionPeb-OSMajorVersion;lpVersionInformation-dwMinorVersionPeb-OSMinorVersion;lpVersionInformation-dwBuildNumberPeb-OSBuildNumber;lpVersionInformation-dwPlatformIdPeb-OSPlatformId;}}// 3. 处理 CSD 版本字符串RtlZeroMemory(lpVersionInformation-szCSDVersion,sizeof(lpVersionInformation-szCSDVersion));if(Peb-CSDVersion.LengthPeb-CSDVersion.BufferPeb-CSDVersion.Buffer[0]!UNICODE_NULL){Lengthmin(wcslen(Peb-CSDVersion.Buffer),ARRAYSIZE(lpVersionInformation-szCSDVersion)-1);wcsncpy(lpVersionInformation-szCSDVersion,Peb-CSDVersion.Buffer,Length);}lpVersionInformation-szCSDVersion[Length]UNICODE_NULL;// 4. 如果是扩展结构填充额外字段if(lpVersionInformation-dwOSVersionInfoSizesizeof(RTL_OSVERSIONINFOEXW)){PRTL_OSVERSIONINFOEXW InfoEx(PRTL_OSVERSIONINFOEXW)lpVersionInformation;InfoEx-wServicePackMajor(Peb-OSCSDVersion8)0xFF;InfoEx-wServicePackMinorPeb-OSCSDVersion0xFF;InfoEx-wSuiteMaskSharedUserData-SuiteMask0xFFFF;InfoEx-wProductTypeSharedUserData-NtProductType;InfoEx-wReserved0;// ReactOS 特有产品类型覆盖SetRosSpecificInfo(InfoEx);}returnSTATUS_SUCCESS;}3.2 执行流程RtlGetVersion() ├── 参数验证检查 dwOSVersionInfoSize │ └── 无效则返回 STATUS_INVALID_PARAMETER │ ├── 版本欺骗检查 │ ├── RosGetProcessEffectiveVersion() ! 0 │ │ └── 使用欺骗版本号从 EffectiveVersion 提取 │ └── RosGetProcessEffectiveVersion() 0 │ └── 使用 PEB 中的真实版本号 │ ├── CSD 版本处理 │ ├── 清零 szCSDVersion │ ├── 从 Peb-CSDVersion 复制如果存在 │ └── 确保 NULL 终止 │ ├── 扩展结构处理RTL_OSVERSIONINFOEXW │ ├── 填充服务包信息从 Peb-OSCSDVersion 提取 │ ├── 填充套件掩码从 SharedUserData-SuiteMask │ ├── 填充产品类型从 SharedUserData-NtProductType │ └── ReactOS 特有SetRosSpecificInfo() 产品类型覆盖 │ └── 返回 STATUS_SUCCESS3.3 版本欺骗机制RosGetProcessEffectiveVersion()返回应用程序清单中声明的目标 Windows 版本如果应用程序包含compatibility清单声明支持特定 Windows 版本RtlGetVersion会返回该版本号而非真实系统版本这是 Windows 应用程序兼容性机制的一部分版本映射示例EffectiveVersion对应 Windows 版本构建号0x0500Windows 2000系统构建号0x0501Windows XP系统构建号0x0502Windows Server 2003系统构建号0x0600Windows Vista系统构建号0x0601Windows 776000x0602Windows 8系统构建号0x0603Windows 8.1系统构建号3.4 ReactOS 产品类型覆盖SetRosSpecificInfo()[version.c:24-79](file:///d:/reactos/dll/ntdll/rtl/version.c#L24-L79)staticVOID NTAPISetRosSpecificInfo(IN OUT PRTL_OSVERSIONINFOEXW VersionInformation){// 读取注册表HKLM\SYSTEM\CurrentControlSet\Control\ReactOS\Settings\Version\ReportAsWorkstation// 如果设置为非零值强制将产品类型报告为工作站VER_NT_WORKSTATION// 否则保持原始值if(g_ReportProductType0){VersionInformation-wProductTypeg_ReportProductType;}}用途解决兼容性问题参见 bug-reports CORE-6611 和 CORE-4620允许管理员强制将服务器版报告为工作站版。4. 内核态实现4.1 核心代码RtlGetVersion内核态实现[misc.c:39-64](file:///d:/reactos/ntoskrnl/rtl/misc.c#L39-L64)NTSTATUS NTAPIRtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation){PAGED_CODE();// 1. 填充基本版本信息lpVersionInformation-dwMajorVersionNtMajorVersion;lpVersionInformation-dwMinorVersionNtMinorVersion;lpVersionInformation-dwBuildNumberNtBuildNumber0x3FFF;lpVersionInformation-dwPlatformIdVER_PLATFORM_WIN32_NT;// 2. 如果是扩展结构填充额外字段if(lpVersionInformation-dwOSVersionInfoSizesizeof(RTL_OSVERSIONINFOEXW)){PRTL_OSVERSIONINFOEXW InfoEx(PRTL_OSVERSIONINFOEXW)lpVersionInformation;InfoEx-wServicePackMajor(USHORT)(CmNtCSDVersion8)0xFF;InfoEx-wServicePackMinor(USHORT)(CmNtCSDVersion0xFF);InfoEx-wSuiteMask(USHORT)(SharedUserData-SuiteMask0xFFFF);InfoEx-wProductTypeSharedUserData-NtProductType;InfoEx-wReserved0;}returnSTATUS_SUCCESS;}4.2 与用户态的差异特性用户态内核态版本来源PEB进程环境块全局变量NtMajorVersion 等版本欺骗支持EffectiveVersion不支持CSD 版本从 PEB-CSDVersion 读取不处理ReactOS 产品类型覆盖支持SetRosSpecificInfo不支持参数验证检查结构大小无验证构建号掩码无 0x3FFF4.3 内核版本来源全局变量定义[misc.c:19-21](file:///d:/reactos/ntoskrnl/rtl/misc.c#L19-L21)externULONG NtMajorVersion;externULONG NtMinorVersion;externULONG NtOSCSDVersion;这些全局变量在内核初始化时设置存储操作系统的实际版本号。5. 相关函数5.1 RtlGetNtProductType获取产品类型[version.c:105-125](file:///d:/reactos/dll/ntdll/rtl/version.c#L105-L125)BOOLEAN NTAPIRtlGetNtProductType(_Out_ PNT_PRODUCT_TYPE ProductType){*ProductTypeSharedUserData-NtProductType;// 支持 ReactOS 产品类型覆盖if(g_ReportProductType0){RTL_OSVERSIONINFOEXW ovi;ovi.dwOSVersionInfoSizesizeof(ovi);ovi.wProductType*ProductType;SetRosSpecificInfo(ovi);}if(g_ReportProductType0){*ProductTypeg_ReportProductType;}returnTRUE;}5.2 RtlGetNtVersionNumbers获取版本号[version.c:150-176](file:///d:/reactos/dll/ntdll/rtl/version.c#L150-L176)VOID NTAPIRtlGetNtVersionNumbers(OUT PULONG pMajorVersion,OUT PULONG pMinorVersion,OUT PULONG pBuildNumber){PPEB pPebNtCurrentPeb();// 兼容性确保至少返回 5.1Windows XPif(pMajorVersion)*pMajorVersionpPeb-OSMajorVersion5?5:pPeb-OSMajorVersion;if(pMinorVersion){if((pPeb-OSMajorVersion5)||((pPeb-OSMajorVersion5)(pPeb-OSMinorVersion1)))*pMinorVersion1;else*pMinorVersionpPeb-OSMinorVersion;}// Windows 风格的构建号高 4 位为 0xFif(pBuildNumber)*pBuildNumber(0xF0000000|pPeb-OSBuildNumber);}注意此函数确保返回至少 Windows XP5.1版本以兼容旧版 msvcrt.dll。5.3 RtlVerifyVersionInfo验证版本信息[sdk/lib/rtl/version.c:53-221](file:///d:/reactos/sdk/lib/rtl/version.c#L53-L221)NTSTATUS NTAPIRtlVerifyVersionInfo(IN PRTL_OSVERSIONINFOEXW VersionInfo,IN ULONG TypeMask,IN ULONGLONG ConditionMask)用于验证当前系统版本是否满足指定条件常用于兼容性检查。6. 数据来源6.1 PEB进程环境块用户态版本从 PEB 读取版本信息PEB 字段说明OSMajorVersion主版本号OSMinorVersion次版本号OSBuildNumber构建号OSPlatformId平台标识OSCSDVersion服务包版本高字节主版本低字节次版本CSDVersionCSD 版本字符串6.2 SharedUserData用户态和内核态都从 SharedUserData 读取SharedUserData 字段说明SuiteMask套件掩码NtProductType产品类型6.3 内核全局变量内核态从全局变量读取全局变量说明NtMajorVersion主版本号NtMinorVersion次版本号NtBuildNumber构建号CmNtCSDVersion服务包版本7. 调用示例7.1 用户态调用#includentdll.hRTL_OSVERSIONINFOEXW osvi;ZeroMemory(osvi,sizeof(osvi));osvi.dwOSVersionInfoSizesizeof(osvi);NTSTATUS statusRtlGetVersion((PRTL_OSVERSIONINFOW)osvi);if(NT_SUCCESS(status)){printf(Windows Version: %lu.%lu.%lu\n,osvi.dwMajorVersion,osvi.dwMinorVersion,osvi.dwBuildNumber);printf(Platform ID: %lu\n,osvi.dwPlatformId);printf(Product Type: %u\n,osvi.wProductType);printf(Suite Mask: 0x%04X\n,osvi.wSuiteMask);}7.2 内核态调用#includentoskrnl.hRTL_OSVERSIONINFOEXW osvi;ZeroMemory(osvi,sizeof(osvi));osvi.dwOSVersionInfoSizesizeof(osvi);NTSTATUS statusRtlGetVersion((PRTL_OSVERSIONINFOW)osvi);if(NT_SUCCESS(status)){DbgPrint(Kernel Version: %lu.%lu.%lu\n,osvi.dwMajorVersion,osvi.dwMinorVersion,osvi.dwBuildNumber);}8. 设计特点8.1 版本欺骗机制支持应用程序兼容性清单声明的目标版本通过RosGetProcessEffectiveVersion()实现兼容 Windows 的GetVersion()行为8.2 ReactOS 特有扩展产品类型覆盖通过注册表键ReportAsWorkstation控制解决特定应用程序兼容性问题8.3 双模式支持用户态从 PEB 读取支持版本欺骗内核态从全局变量读取无欺骗8.4 向后兼容性RtlGetNtVersionNumbers确保至少返回 5.1Windows XP支持旧版应用程序对版本号的依赖9. 总结9.1 函数架构┌─────────────────────────────────────────────────────────────┐ │ 用户态调用 │ │ RtlGetVersion() [ntdll.dll] │ │ ├── 参数验证 │ │ ├── 版本欺骗检查 (RosGetProcessEffectiveVersion) │ │ ├── 从 PEB 读取版本信息 │ │ ├── CSD 版本处理 │ │ ├── 扩展结构处理 │ │ └── ReactOS 产品类型覆盖 │ ├─────────────────────────────────────────────────────────────┤ │ 内核态调用 │ │ RtlGetVersion() [ntoskrnl.exe] │ │ ├── PAGED_CODE() │ │ ├── 从全局变量读取版本信息 │ │ └── 扩展结构处理 │ └─────────────────────────────────────────────────────────────┘9.2 核心数据流版本信息来源 ├── 用户态PEB进程环境块 │ ├── OSMajorVersion │ ├── OSMinorVersion │ ├── OSBuildNumber │ ├── OSPlatformId │ ├── OSCSDVersion │ └── CSDVersion └── 内核态全局变量 ├── NtMajorVersion ├── NtMinorVersion ├── NtBuildNumber └── CmNtCSDVersion 共同来源SharedUserData ├── SuiteMask └── NtProductType9.3 关键设计决策版本欺骗为了兼容旧版应用程序支持应用程序声明的目标版本PEB 缓存用户态版本信息缓存到 PEB避免每次调用都访问内核扩展结构通过dwOSVersionInfoSize区分基础和扩展版本信息ReactOS 扩展产品类型覆盖机制解决特定兼容性问题

相关新闻

最新新闻

英雄联盟效率工具League Akari:智能本地化助手的完整使用指南

英雄联盟效率工具League Akari:智能本地化助手的完整使用指南

英雄联盟效率工具League Akari:智能本地化助手的完整使用指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari是一款基…

2026/7/5 5:17:41
试了一圈 AI 生成视频后,我开始琢磨:能不能让 AI 先帮我找素材?借用素刀 ClipKnife 实现思路聊聊本地素材检索

试了一圈 AI 生成视频后,我开始琢磨:能不能让 AI 先帮我找素材?借用素刀 ClipKnife 实现思路聊聊本地素材检索

这两年 AI 视频真的太火了。 从“一句话生成一段视频”,到“输入 prompt 自动生成广告片”,再到各种看起来很炸裂的 Demo,几乎每天都能刷到。刚开始我也挺兴奋,觉得以后做视频是不是就不用到处找素材了,写一句话&#…

2026/7/5 5:17:41
如何在10分钟内搭建专属原神私服:KCN-GenshinServer完整指南

如何在10分钟内搭建专属原神私服:KCN-GenshinServer完整指南

如何在10分钟内搭建专属原神私服:KCN-GenshinServer完整指南 【免费下载链接】KCN-GenshinServer 基于GC制作的原神一键GUI多功能服务端。 项目地址: https://gitcode.com/gh_mirrors/kc/KCN-GenshinServer 想要拥有一个完全由你掌控的提瓦特大陆吗&#xff…

2026/7/5 5:17:41
2026年美容院清洁补水项目怎么定价?从体验价到会员复购的设计思路

2026年美容院清洁补水项目怎么定价?从体验价到会员复购的设计思路

美容院清洁补水项目定价,不能只看同行卖多少钱,也不能只靠低价引流。合理的定价要同时考虑设备成本、单次耗材、员工时间、项目体验、门店定位和复购路径。清洁补水可以做低价体验,但不能长期只卖低价,真正适合美容院经营的方式&a…

2026/7/5 5:17:41
如何快速提升英雄联盟竞技水平:League Akari 本地化效率工具完整指南

如何快速提升英雄联盟竞技水平:League Akari 本地化效率工具完整指南

如何快速提升英雄联盟竞技水平:League Akari 本地化效率工具完整指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否厌倦了…

2026/7/5 5:17:41
Pearcleaner:彻底告别macOS应用残留,让Mac重获新生的免费开源工具

Pearcleaner:彻底告别macOS应用残留,让Mac重获新生的免费开源工具

Pearcleaner:彻底告别macOS应用残留,让Mac重获新生的免费开源工具 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 你是否曾经在macOS…

2026/7/5 5:12:41

月新闻