diff --git a/hal/halx86/generic/sysinfo.c b/hal/halx86/generic/sysinfo.c index 209fc8e1fc9..8e10a6c92f2 100644 --- a/hal/halx86/generic/sysinfo.c +++ b/hal/halx86/generic/sysinfo.c @@ -10,6 +10,9 @@ /* INCLUDES *******************************************************************/ #include +typedef unsigned int UINT; +#include + #define NDEBUG #include @@ -50,6 +53,47 @@ HaliHandlePCIConfigSpaceAccess(_In_ BOOLEAN IsRead, return STATUS_NOT_IMPLEMENTED; } +static +NTSTATUS +HaliQueryProcessorBrandString( + _Out_writes_(BrandStringLength) PCHAR BrandString, + _In_ ULONG BrandStringLength, + _Out_ PULONG ReturnedLength) +{ + CPUID_EXTENDED_FUNCTION_REGS ExtendedFunction; + union + { + INT AsInt[3 * 4]; + CHAR Chars[49]; + } BrandStringUnion; + + *ReturnedLength = sizeof(BrandStringUnion.Chars); + if (BrandStringLength < *ReturnedLength) + { + DPRINT1("HaliQueryProcessorBrandString: Buffer too small (%u < %u)\n", BrandStringLength, *ReturnedLength); + return STATUS_INFO_LENGTH_MISMATCH; + } + + /* Check if we can query the brand string */ + __cpuid(ExtendedFunction.AsInt32, CPUID_EXTENDED_FUNCTION); + if (ExtendedFunction.MaxLeaf < CPUID_BRAND_STRING3) + { + return STATUS_NOT_SUPPORTED; + } + + __cpuid(&BrandStringUnion.AsInt[0], CPUID_BRAND_STRING1); + __cpuid(&BrandStringUnion.AsInt[4], CPUID_BRAND_STRING2); + __cpuid(&BrandStringUnion.AsInt[8], CPUID_BRAND_STRING3); + BrandStringUnion.Chars[48] = '\0'; // Ensure null-termination + + /* Copy the brand string to the output buffer */ + RtlCopyMemory(BrandString, + BrandStringUnion.Chars, + sizeof(BrandStringUnion.Chars)); + + return STATUS_SUCCESS; +} + NTSTATUS NTAPI HaliQuerySystemInformation(IN HAL_QUERY_INFORMATION_CLASS InformationClass, @@ -102,7 +146,10 @@ HaliQuerySystemInformation(IN HAL_QUERY_INFORMATION_CLASS InformationClass, REPORT_THIS_CASE(HalQueryProfileSourceList); REPORT_THIS_CASE(HalInitLogInformation); REPORT_THIS_CASE(HalFrequencyInformation); - REPORT_THIS_CASE(HalProcessorBrandString); + case HalProcessorBrandString: + { + return HaliQueryProcessorBrandString((PCHAR)Buffer, BufferSize, ReturnedLength); + } REPORT_THIS_CASE(HalHypervisorInformation); REPORT_THIS_CASE(HalPlatformTimerInformation); REPORT_THIS_CASE(HalAcpiAuditInformation);