Как получить информацию о бренде процессора в ARM64? - PullRequest
1 голос
/ 08 марта 2020

В Windows X86 марка процессора может запрашиваться с помощью функции cpuid intrinsi c. Вот пример кода:

#include <stdio.h>
#include <intrin.h>

int main(void)
{
    int cpubrand[4 * 3];

    __cpuid(&cpubrand[0], 0x80000002);
    __cpuid(&cpubrand[4], 0x80000003);
    __cpuid(&cpubrand[8], 0x80000004);

    char str[48];
    memset(str, 0, sizeof str);
    memcpy(str, cpubrand, sizeof cpubrand);
    printf("%s\n", str);
}

Какая альтернатива этому в Windows ARM64?

Ответы [ 2 ]

1 голос
/ 08 марта 2020

Также нельзя получить имя непосредственно из ЦП, но вы можете получить имя процессора из класса WMI Win32_Processor

Его можно получить, запустив wmic cpu get name в cmd или (Get-WmiObject Win32_Processor).Name в PowerShell. Получить его из C# также легко, что-то вроде

ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT Name FROM Win32_Processor")
foreach (ManagementObject mo in mos.Get())
{
    Console.WriteLine(mo["Name"]);
}

Однако сделать это из C намного сложнее. К счастью, подобный пример уже есть в этом ответе . Основная часть должна быть такой

BSTR query    = SysAllocString(L"SELECT Name FROM Win32_Processor");
hr = services->lpVtbl->ExecQuery(services, language, query, WBEM_FLAG_BIDIRECTIONAL, NULL, &results);
...
hr = result->lpVtbl->Get(result, L"Name", 0, &name, 0, 0);
SysFreeString(query);
0 голосов
/ 08 марта 2020

Хотя, вероятно, не ответ, который вы ищете (т. Е. Непосредственно запрашиваете ЦП), вы можете извлечь значение «ProcessorNameString» из реестра Windows, используя код, подобный следующему:

char answer[64] = "Error Reading CPU Name from Registry!", inBuffer[64] = "";
const char *csName = "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0";
HKEY hKey;  DWORD gotType, gotSize = 64;
if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, csName, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
    if (!RegQueryValueExA(hKey, "ProcessorNameString", nullptr, &gotType, (PBYTE)(inBuffer), &gotSize)) {
        if ((gotType == REG_SZ) && strlen(inBuffer)) strcpy(answer, inBuffer);
    }
    RegCloseKey(hKey);
}

Это (или должно ) дать вам имя процессора, которое видит система Windows! У меня нет доступа к ARM64 системе, поэтому я не могу должным образом протестировать ее, но в моей x64 системе я получаю следующую (правильную) строку: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz (что в точности равно ) 1012 *, который вернулся с помощью вызовов __cpuid() для получения «Брэндовой строки»).

Однако, как и вы, мне было бы очень интересно узнать, как сделать это напрямую то есть, как Windows O / S может получить эту информацию в системе ARM64?

...