ReactOS 0.4.17-dev-243-g1369312
RtlGetProductInfo.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS API tests
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Test for RtlGetProductInfo
5 * COPYRIGHT: Copyright 2026 Timo Kreuzer <timo.kreuzer@reactos.org>
6 */
7
8#include "precomp.h"
9
10typedef
14 _In_ ULONG OSMajorVersion,
15 _In_ ULONG OSMinorVersion,
16 _In_ ULONG SpMajorVersion,
17 _In_ ULONG SpMinorVersion,
18 _Out_ PULONG ReturnedProductType);
19
21
22void Test_Product_(ULONG Line, ULONG OSMajorVersion, ULONG OSMinorVersion, ULONG SpMajorVersion, ULONG SpMinorVersion, BOOLEAN ExpectedResult, ULONG ExpectedProductType)
23{
24 ULONG ProductType = 0xDEADBEEF;
26 Result = pRtlGetProductInfo(OSMajorVersion, OSMinorVersion, SpMajorVersion, SpMinorVersion, &ProductType);
27 ok_(__FILE__, Line)(Result == ExpectedResult, "RtlGetProductInfo wrong return value. Got %u, expected %u\n", Result, ExpectedResult);
28 ok_(__FILE__, Line)(ProductType == ExpectedProductType, "RtlGetProductInfo wrong product type. Got 0x%x, expected 0x%x\n", ProductType, ExpectedProductType);
29}
30#define Test_Product(OSMajorVersion, OSMinorVersion, SpMajorVersion, SpMinorVersion, ExpectedResult, ExpectedProductType) \
31 Test_Product_(__LINE__, OSMajorVersion, OSMinorVersion, SpMajorVersion, SpMinorVersion, ExpectedResult, ExpectedProductType)
32
33
35{
36 HINSTANCE hinst = GetModuleHandleW(L"ntdll.dll");
39 {
40 ok(GetNTVersion() < _WIN32_WINNT_VISTA, "RtlGetProductInfo missing on NT version 0x%lx\n", GetNTVersion());
41 skip("RtlGetProductInfo not found\n");
42 return;
43 }
44
45 /* Test invalid parameters */
48
49 /* Test invalid versions */
55
56 /* Get version information of the current OS */
59
60 /* Get the product type for the current OS version */
62 ULONG CurrentProductType = 0xDEADBEEF;
67 &CurrentProductType);
69 ok(CurrentProductType != PRODUCT_UNDEFINED, "CurrentProductType is PRODUCT_UNDEFINED\n");
70
71 /* Check if the result is reasonable */
72 switch (GetNTVersion())
73 {
74 case _WIN32_WINNT_VISTA: // Vista or Server 2008
75 ok((CurrentProductType == PRODUCT_STARTER) ||
76 (CurrentProductType == PRODUCT_HOME_BASIC) ||
77 (CurrentProductType == PRODUCT_HOME_PREMIUM) ||
78 (CurrentProductType == PRODUCT_BUSINESS) ||
79 (CurrentProductType == PRODUCT_ENTERPRISE) ||
80 (CurrentProductType == PRODUCT_ULTIMATE) ||
81 (CurrentProductType == PRODUCT_SERVER_FOUNDATION) ||
82 (CurrentProductType == PRODUCT_STANDARD_SERVER) ||
83 (CurrentProductType == PRODUCT_ENTERPRISE_SERVER),
84 "Unexpected product type for Vista: 0x%x\n", CurrentProductType);
85 break;
86
87 case _WIN32_WINNT_WIN7: // Windows 7 or Server 2008 R2
88 ok((CurrentProductType == PRODUCT_STARTER) ||
89 (CurrentProductType == PRODUCT_HOME_BASIC) ||
90 (CurrentProductType == PRODUCT_HOME_PREMIUM) ||
91 (CurrentProductType == PRODUCT_PROFESSIONAL) ||
92 (CurrentProductType == PRODUCT_ENTERPRISE) ||
93 (CurrentProductType == PRODUCT_ULTIMATE) ||
94 (CurrentProductType == PRODUCT_SERVER_FOUNDATION) ||
95 (CurrentProductType == PRODUCT_STANDARD_SERVER) ||
96 (CurrentProductType == PRODUCT_ENTERPRISE_SERVER),
97 "Unexpected product type for Windows 7: 0x%x\n", CurrentProductType);
98 break;
99
100 case _WIN32_WINNT_WIN8: // Windows 8 or Server 2012
101 ok((CurrentProductType == PRODUCT_CORE) ||
102 (CurrentProductType == PRODUCT_PROFESSIONAL) ||
103 (CurrentProductType == PRODUCT_PROFESSIONAL_WMC) ||
104 (CurrentProductType == PRODUCT_ENTERPRISE) ||
105 (CurrentProductType == PRODUCT_SERVER_FOUNDATION) ||
106 (CurrentProductType == PRODUCT_HOME_SERVER) || // Essentials
107 (CurrentProductType == PRODUCT_STANDARD_SERVER) ||
108 (CurrentProductType == PRODUCT_DATACENTER_SERVER),
109 "Unexpected product type for Windows 8: 0x%x\n", CurrentProductType);
110 break;
111
112 case _WIN32_WINNT_WINBLUE: // Windows 8.1 or Server 2012 R2
113 ok((CurrentProductType == PRODUCT_CORE) ||
114 (CurrentProductType == PRODUCT_PROFESSIONAL) ||
115 (CurrentProductType == PRODUCT_ENTERPRISE) ||
116 (CurrentProductType == PRODUCT_SERVER_FOUNDATION) ||
117 (CurrentProductType == PRODUCT_HOME_SERVER) || // Essentials
118 (CurrentProductType == PRODUCT_STANDARD_SERVER) ||
119 (CurrentProductType == PRODUCT_DATACENTER_SERVER),
120 "Unexpected product type for Windows 8.1: 0x%x\n", CurrentProductType);
121 break;
122
123 case _WIN32_WINNT_WIN10: // Windows 10 or Server 2016
124 default:
125 ok((CurrentProductType == PRODUCT_CORE) || // Home
126 (CurrentProductType == PRODUCT_PROFESSIONAL) ||
127 (CurrentProductType == PRODUCT_PRO_WORKSTATION) ||
128 (CurrentProductType == PRODUCT_EDUCATION) ||
129 (CurrentProductType == PRODUCT_PRO_FOR_EDUCATION) ||
130 (CurrentProductType == PRODUCT_ENTERPRISE) ||
131 (CurrentProductType == PRODUCT_IOTENTERPRISES) ||
132 (CurrentProductType == PRODUCT_ENTERPRISE_SERVER) ||
133 (CurrentProductType == PRODUCT_DATACENTER_SERVER),
134 "Unexpected product type for Windows 10: 0x%x\n", CurrentProductType);
135 break;
136 }
137
138 /* TODO: Fix this up for more versions as needed */
139 ULONG VistaProductType = CurrentProductType;
140 if (CurrentProductType == PRODUCT_PROFESSIONAL)
141 {
142 VistaProductType = PRODUCT_BUSINESS;
143 }
144
145 /* Test a few version values */
146 Test_Product(6, 0, 0, 0, TRUE, VistaProductType);
147 Test_Product(6, 1, 0, 0, TRUE, CurrentProductType);
148 Test_Product(6, 2, 0, 0, TRUE, CurrentProductType);
149 Test_Product(6, 3, 0, 0, TRUE, CurrentProductType);
150 Test_Product(6, 4, 0, 0, TRUE, CurrentProductType);
151 Test_Product(7, 0, 0, 0, TRUE, CurrentProductType);
152 Test_Product(10, 0, 0, 0, TRUE, CurrentProductType);
153 Test_Product(23, 212, 0, 0, TRUE, CurrentProductType);
154}
#define Test_Product(OSMajorVersion, OSMinorVersion, SpMajorVersion, SpMinorVersion, ExpectedResult, ExpectedProductType)
void Test_Product_(ULONG Line, ULONG OSMajorVersion, ULONG OSMinorVersion, ULONG SpMajorVersion, ULONG SpMinorVersion, BOOLEAN ExpectedResult, ULONG ExpectedProductType)
BOOLEAN WINAPI FN_RtlGetProductInfo(_In_ ULONG OSMajorVersion, _In_ ULONG OSMinorVersion, _In_ ULONG SpMajorVersion, _In_ ULONG SpMinorVersion, _Out_ PULONG ReturnedProductType)
FN_RtlGetProductInfo * pRtlGetProductInfo
unsigned char BOOLEAN
Definition: actypes.h:127
#define GetNTVersion()
Definition: apitest.h:17
#define ok_eq_bool(value, expected)
Definition: apitest.h:137
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
#define ok_(x1, x2)
Definition: atltest.h:61
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define GetProcAddress(x, y)
Definition: compat.h:753
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
BOOL WINAPI GetVersionExA(IN LPOSVERSIONINFOA lpVersionInformation)
Definition: version.c:69
#define L(x)
Definition: resources.c:13
static HINSTANCE hinst
Definition: edit.c:551
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define PRODUCT_EDUCATION
#define PRODUCT_HOME_BASIC
#define PRODUCT_HOME_PREMIUM
#define PRODUCT_STARTER
#define PRODUCT_CORE
#define PRODUCT_ENTERPRISE_SERVER
#define PRODUCT_BUSINESS
#define PRODUCT_PRO_WORKSTATION
#define PRODUCT_IOTENTERPRISES
#define PRODUCT_PROFESSIONAL_WMC
#define PRODUCT_PRO_FOR_EDUCATION
#define PRODUCT_UNDEFINED
#define PRODUCT_STANDARD_SERVER
#define PRODUCT_DATACENTER_SERVER
#define PRODUCT_HOME_SERVER
#define PRODUCT_ENTERPRISE
#define PRODUCT_ULTIMATE
#define PRODUCT_PROFESSIONAL
#define PRODUCT_SERVER_FOUNDATION
#define _WIN32_WINNT_WIN10
Definition: sdkddkver.h:32
#define _WIN32_WINNT_WINBLUE
Definition: sdkddkver.h:30
#define _WIN32_WINNT_WIN8
Definition: sdkddkver.h:29
#define _WIN32_WINNT_WIN7
Definition: sdkddkver.h:28
#define _WIN32_WINNT_VISTA
Definition: sdkddkver.h:25
OSVERSIONINFOEXW OsVersionInfo
Definition: setupcab.c:33
Definition: ncftp.h:79
ULONG dwMajorVersion
Definition: rtltypes.h:270
ULONG dwMinorVersion
Definition: rtltypes.h:271
ULONG dwOSVersionInfoSize
Definition: rtltypes.h:269
USHORT wServicePackMinor
Definition: rtltypes.h:276
USHORT wServicePackMajor
Definition: rtltypes.h:275
uint32_t * PULONG
Definition: typedefs.h:59
uint32_t ULONG
Definition: typedefs.h:59
#define WINAPI
Definition: msvc.h:6
NTSYSAPI BOOLEAN WINAPI RtlGetProductInfo(DWORD, DWORD, DWORD, DWORD, PDWORD)
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409