Module: wine Branch: master Commit: 72422be6d212cccaee7df23d3d4ae1394d1c2c02 URL: https://gitlab.winehq.org/wine/wine/-/commit/72422be6d212cccaee7df23d3d4ae13...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Mar 14 17:30:24 2023 +0100
ntdll: Implement the SystemProcessorBrandString query.
---
dlls/ntdll/tests/info.c | 27 ++++++++++++++++++++++++++- dlls/ntdll/unix/system.c | 29 +++++++++++++++++++++++++++++ dlls/wow64/system.c | 1 + 3 files changed, 56 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c index 2cd76a8c87e..e7e560a64b8 100644 --- a/dlls/ntdll/tests/info.c +++ b/dlls/ntdll/tests/info.c @@ -304,7 +304,7 @@ static void test_query_basic(void) static void test_query_cpu(void) { NTSTATUS status; - ULONG len; + ULONG len, buffer[16]; SYSTEM_CPU_INFORMATION sci, sci2, sci3;
memset(&sci, 0xcc, sizeof(sci)); @@ -373,6 +373,31 @@ static void test_query_cpu(void) sci.MaximumProcessors, sci3.MaximumProcessors ); ok( sci.ProcessorFeatureBits == sci3.ProcessorFeatureBits, "ProcessorFeatureBits differs %lx / %lx\n", sci.ProcessorFeatureBits, sci3.ProcessorFeatureBits ); + + len = 0xdeadbeef; + status = pNtQuerySystemInformation( SystemProcessorBrandString, buffer, sizeof(buffer), &len ); + if (status != STATUS_NOT_SUPPORTED) + { + ok( !status, "SystemProcessorBrandString failed %lx\n", status ); + ok( len == 49, "wrong len %lu\n", len ); + trace( "got %s len %u\n", debugstr_a( (char *)buffer ), lstrlenA( (char *)buffer )); + + len = 0xdeadbeef; + status = pNtQuerySystemInformation( SystemProcessorBrandString, buffer, 49, &len ); + ok( !status, "SystemProcessorBrandString failed %lx\n", status ); + ok( len == 49, "wrong len %lu\n", len ); + + len = 0xdeadbeef; + status = pNtQuerySystemInformation( SystemProcessorBrandString, buffer, 48, &len ); + ok( status == STATUS_INFO_LENGTH_MISMATCH, "SystemProcessorBrandString failed %lx\n", status ); + ok( len == 49, "wrong len %lu\n", len ); + + len = 0xdeadbeef; + status = pNtQuerySystemInformation( SystemProcessorBrandString, (char *)buffer + 1, 49, &len ); + ok( status == STATUS_DATATYPE_MISALIGNMENT, "SystemProcessorBrandString failed %lx\n", status ); + ok( len == 0xdeadbeef, "wrong len %lu\n", len ); + } + else skip( "SystemProcessorBrandString is not supported\n" ); }
static void test_query_performance(void) diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c index dd652a29f21..cb00336e884 100644 --- a/dlls/ntdll/unix/system.c +++ b/dlls/ntdll/unix/system.c @@ -229,6 +229,7 @@ struct smbios_chassis_args #define RSMB 0x52534D42
SYSTEM_CPU_INFORMATION cpu_info = { 0 }; +static char cpu_name[49]; static SYSTEM_LOGICAL_PROCESSOR_INFORMATION *logical_proc_info; static unsigned int logical_proc_info_len, logical_proc_info_alloc_len; static SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *logical_proc_info_ex; @@ -325,6 +326,22 @@ static inline BOOL have_sse_daz_mode(void) #endif }
+static void get_cpuid_name( char *buffer ) +{ + unsigned int regs[4]; + + do_cpuid( 0x80000002, 0, regs ); + memcpy( buffer, regs, sizeof(regs) ); + buffer += sizeof(regs); + do_cpuid( 0x80000003, 0, regs ); + memcpy( buffer, regs, sizeof(regs) ); + buffer += sizeof(regs); + do_cpuid( 0x80000004, 0, regs ); + memcpy( buffer, regs, sizeof(regs) ); + buffer += sizeof(regs); + *buffer = 0; +} + static void get_cpuinfo( SYSTEM_CPU_INFORMATION *info ) { unsigned int regs[4], regs2[4], regs3[4]; @@ -399,6 +416,7 @@ static void get_cpuinfo( SYSTEM_CPU_INFORMATION *info ) if (regs2[3] & (1 << 27)) info->ProcessorFeatureBits |= CPU_FEATURE_TSC; if (regs2[3] & (1u << 31)) info->ProcessorFeatureBits |= CPU_FEATURE_3DNOW; } + if (regs[0] >= 0x80000004) get_cpuid_name( cpu_name ); } else if (regs[1] == GENU && regs[3] == INEI && regs[2] == NTEL) { @@ -420,6 +438,7 @@ static void get_cpuinfo( SYSTEM_CPU_INFORMATION *info ) if (regs2[3] & (1 << 20)) info->ProcessorFeatureBits |= CPU_FEATURE_NX; if (regs2[3] & (1 << 27)) info->ProcessorFeatureBits |= CPU_FEATURE_TSC; } + if (regs[0] >= 0x80000004) get_cpuid_name( cpu_name ); } else { @@ -3157,6 +3176,16 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class, break; }
+ case SystemProcessorBrandString: /* 105 */ + if (!cpu_name[0]) return STATUS_NOT_SUPPORTED; + if ((ULONG_PTR)info & 3) return STATUS_DATATYPE_MISALIGNMENT; + len = sizeof(cpu_name); + if (size >= len) + memcpy( info, cpu_name, len ); + else + ret = STATUS_INFO_LENGTH_MISMATCH; + break; + case SystemKernelDebuggerInformationEx: /* 149 */ { SYSTEM_KERNEL_DEBUGGER_INFORMATION_EX skdi; diff --git a/dlls/wow64/system.c b/dlls/wow64/system.c index c5c1563afc2..28a5a994174 100644 --- a/dlls/wow64/system.c +++ b/dlls/wow64/system.c @@ -330,6 +330,7 @@ NTSTATUS WINAPI wow64_NtQuerySystemInformation( UINT *args ) case SystemCodeIntegrityInformation: /* SYSTEM_CODEINTEGRITY_INFORMATION */ case SystemKernelDebuggerInformationEx: /* SYSTEM_KERNEL_DEBUGGER_INFORMATION_EX */ case SystemCpuSetInformation: /* SYSTEM_CPU_SET_INFORMATION */ + case SystemProcessorBrandString: /* char[] */ case SystemWineVersionInformation: /* char[] */ return NtQuerySystemInformation( class, ptr, len, retlen );