diff --git a/dll/ntdll/def/ntdll.spec b/dll/ntdll/def/ntdll.spec index 793c3bb58da..033b8b434ae 100644 --- a/dll/ntdll/def/ntdll.spec +++ b/dll/ntdll/def/ntdll.spec @@ -902,7 +902,7 @@ @ stdcall RtlGetOwnerSecurityDescriptor(ptr ptr ptr) @ stdcall -stub -version=0x600+ RtlGetParentLocaleName(wstr long long long) @ stdcall RtlGetProcessHeaps(long ptr) -@ stub -version=0x600+ RtlGetProductInfo +@ stdcall -version=0x600+ RtlGetProductInfo(long long long long ptr) @ stdcall RtlGetSaclSecurityDescriptor(ptr ptr ptr ptr) @ stdcall RtlGetSecurityDescriptorRMControl(ptr ptr) @ stdcall RtlGetSetBootStatusData(ptr long long ptr long long) diff --git a/dll/ntdll/nt_0600/ntdll_vista.spec b/dll/ntdll/nt_0600/ntdll_vista.spec index 2eaebb54fcc..1b4072f2459 100644 --- a/dll/ntdll/nt_0600/ntdll_vista.spec +++ b/dll/ntdll/nt_0600/ntdll_vista.spec @@ -1,6 +1,7 @@ @ stdcall LdrRegisterDllNotification(long ptr ptr ptr) @ stdcall LdrUnregisterDllNotification(ptr) +@ stdcall RtlGetProductInfo(long long long long ptr) @ stdcall RtlInitializeConditionVariable(ptr) @ stdcall RtlWakeConditionVariable(ptr) @ stdcall RtlWakeAllConditionVariable(ptr) diff --git a/dll/win32/kernel32/kernel32.spec b/dll/win32/kernel32/kernel32.spec index ecd51f8447e..b89a28d9624 100644 --- a/dll/win32/kernel32/kernel32.spec +++ b/dll/win32/kernel32/kernel32.spec @@ -574,7 +574,7 @@ @ stdcall GetProcessVersion(long) @ stdcall GetProcessWorkingSetSize(long ptr ptr) @ stdcall GetProcessWorkingSetSizeEx(long ptr ptr long) -@ stub -version=0x600+ GetProductInfo +@ stdcall -version=0x600+ GetProductInfo(long long long long ptr) ntdll.RtlGetProductInfo @ stdcall GetProfileIntA(str str long) @ stdcall GetProfileIntW(wstr wstr long) @ stdcall GetProfileSectionA(str ptr long) diff --git a/dll/win32/kernel32/kernel32_vista/kernel32_vista.spec b/dll/win32/kernel32/kernel32_vista/kernel32_vista.spec index 58f2dc492f0..dd2eb0b9fec 100644 --- a/dll/win32/kernel32/kernel32_vista/kernel32_vista.spec +++ b/dll/win32/kernel32/kernel32_vista/kernel32_vista.spec @@ -65,3 +65,4 @@ @ stdcall GetSystemTimePreciseAsFileTime(ptr) kernel32.GetSystemTimeAsFileTime @ stdcall TrySubmitThreadpoolCallback(ptr ptr ptr) @ stdcall FreeLibraryWhenCallbackReturns(ptr ptr) ntdll_vista.TpCallbackUnloadDllOnCompletion +@ stdcall GetProductInfo(long long long long ptr) ntdll_vista.RtlGetProductInfo diff --git a/sdk/lib/rtl/CMakeLists.txt b/sdk/lib/rtl/CMakeLists.txt index c6afb4c3e0c..3a4ba08dbbb 100644 --- a/sdk/lib/rtl/CMakeLists.txt +++ b/sdk/lib/rtl/CMakeLists.txt @@ -19,6 +19,7 @@ list(APPEND RTL_WINE_SOURCE threadpool.c ) list(APPEND RTL_WINE_SOURCE_VISTA + product.c threadpool.c ) set_source_files_properties(threadpool.c PROPERTIES COMPILE_DEFINITIONS __WINESRC__) diff --git a/sdk/lib/rtl/product.c b/sdk/lib/rtl/product.c new file mode 100644 index 00000000000..98ff5808da3 --- /dev/null +++ b/sdk/lib/rtl/product.c @@ -0,0 +1,62 @@ +/* + * PROJECT: ReactOS runtime library (RTL) + * LICENSE: MIT (https://spdx.org/licenses/MIT) + * PURPOSE: Implementation of RtlGetProductInfo + * COPYRIGHT: Copyright 2026 Timo Kreuzer + */ + +/* INCLUDES *****************************************************************/ + +#include + +#define NDEBUG +#include + +BOOLEAN +WINAPI +RtlGetProductInfo( + _In_ ULONG OSMajorVersion, + _In_ ULONG OSMinorVersion, + _In_ ULONG SpMajorVersion, + _In_ ULONG SpMinorVersion, + _Out_ PULONG ReturnedProductType) +{ + if (ReturnedProductType == NULL) + { + return FALSE; + } + + if (OSMajorVersion < 6) + { + *ReturnedProductType = PRODUCT_UNDEFINED; + return FALSE; + } + + if (SharedUserData->NtProductType == NtProductWinNt) + { + if ((OSMajorVersion == 6) && (OSMinorVersion == 0)) + { + *ReturnedProductType = PRODUCT_BUSINESS; + } + else + { + *ReturnedProductType = PRODUCT_PROFESSIONAL; + } + return TRUE; + } + else if (SharedUserData->NtProductType == NtProductLanManNt) + { + *ReturnedProductType = PRODUCT_ENTERPRISE_SERVER; + return TRUE; + } + else if (SharedUserData->NtProductType == NtProductServer) + { + *ReturnedProductType = PRODUCT_STANDARD_SERVER; + return TRUE; + } + + *ReturnedProductType = PRODUCT_UNDEFINED; + return FALSE; +} + +/* EOF */