Теоретически максимальная частота процессора доступна через KernelIoControl и управляющий код IOCTL_PROCESSOR_INFORMATION
На практике, однако, дело обстоит так: у меня Windows Mobile 2003 (ака Windows CE 4.2) возвращает в значение частоты 0.
Получается такой вывод:
Version: 1
Processor code: Intel(R)
Core Revision: 0
Processor name: PXA255
Processor Revision: 11520
Catalog number:
Vendor: INTEL
Instruction Set: 0
Clock speed: 0
Вот программа, которая сбрасывает сведения о процессоре в файл cpu_log.txt
// #include <pkfunks.h>
#include <windows.h>
#include <stdio.h>
unsigned int IOCTL_PROCESSOR_INFORMATION = 0x01010064;
typedef struct __PROCESSOR_INFO {
WORD wVersion;
WCHAR szProcessorCore[40];
WORD wCoreRevision;
WCHAR szProcessorName[40];
WORD wProcessorRevision;
WCHAR szCatalogNumber[100];
WCHAR szVendor[100];
DWORD dwInstructionSet;
DWORD dwClockSpeed;
} PROCESSOR_INFO, *PPROCESSOR_INFO;
KernelIoControl(DWORD dwCode, void *in, DWORD insize, void *out, DWORD outsize, DWORD *returned);
int get_maximum_cpu_speed(DWORD * p_dwSpeed, FILE * log)
{
DWORD nReturned;
PROCESSOR_INFO pinfo;
if (p_dwSpeed == NULL) return 0;
memset(&pinfo, 0, sizeof(pinfo));
pinfo.wVersion = 1;
if (!KernelIoControl(IOCTL_PROCESSOR_INFORMATION, NULL, 0, &pinfo, sizeof(pinfo), &nReturned)) {
return 0;
}
if (log != NULL)
{
fwprintf(log, L"Version: %d\n", pinfo.wVersion);
fwprintf(log, L"Processor code: %s\n", pinfo.szProcessorCore);
fwprintf(log, L"Core Revision: %d\n", pinfo.wCoreRevision);
fwprintf(log, L"Processor name: %s\n", pinfo.szProcessorName);
fwprintf(log, L"Processor Revision: %d\n", pinfo.wProcessorRevision);
fwprintf(log, L"Catalog number: %s\n", pinfo.szCatalogNumber);
fwprintf(log, L"Vendor: %s\n", pinfo.szVendor);
fwprintf(log, L"Instruction Set: %d\n", pinfo.dwInstructionSet);
fwprintf(log, L"Clock speed: %d\n", pinfo.dwClockSpeed);
}
*p_dwSpeed = pinfo.dwClockSpeed;
return 1;
}
int wmain()
{
unsigned int cpu = 0;
FILE * log = _wfopen(L"cpu_log.txt", L"w");
if (log == NULL) return 1;
if (!get_maximum_cpu_speed(&cpu, log))
{
fwprintf(log, L"Failed to get procesor information\n");
}
else
{
fwprintf(log, L"CPU speed %d\n", cpu);
}
fclose(log);
return 0;
}
Компилировал под VS 2005 с выключенной защитой от переполнения буфера (/GS-), исполнял на iPaq 2210