Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.01.23;
Скачать: [xml.tar.bz2];

Вниз

Программное определение типа процессора   Найти похожие ветки 

 
Abzetdin   (2002-12-07 13:10) [0]

Поржалуйста, подскажите програмно определить тип процессора?
Только не просто 486 ли 586, а более точно Pentium II/III/IV или Celeron т.е. SystemInfo() не годится.

Благодарю


 
Marser   (2002-12-07 16:58) [1]

Более точно стандартными средствами не удастся.Может в CMOS или ещё где.


 
Ich Hasse   (2002-12-07 17:27) [2]

1. Поддержка технологии 3DNow!

{$ifndef ver80} // так как будем использовать 32-битный регистр
function Get3DNowSupport: Boolean; assembler;
asm
push ebx
mov @Result, True
mov eax, $80000000
dw $A20F
cmp eax, $80000000
jbe @NOEXTENDED // 3DNow не поддерживается
mov eax, $80000001
dw $A20F
test edx, $80000000
jnz @EXIT // 3DNow поддерживается
@NOEXTENDED:
mov @Result, False
@EXIT:
pop ebx
end;
{$endif}


2. Производитель процессора

function GetCPUVendor : TVendor; assembler; register;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Result (TVendor)}
MOV EAX,0
DW $A20F {CPUID Command}
MOV EAX,EBX
XCHG EBX,ECX {save ECX result}
MOV ECX,4
@1:
STOSB
SHR EAX,8
LOOP @1
MOV EAX,EDX
MOV ECX,4
@2:
STOSB
SHR EAX,8
LOOP @2
MOV EAX,EBX
MOV ECX,4
@3:
STOSB
SHR EAX,8
LOOP @3
POP EDI {Restore registers}
POP EBX
end;


3. Тип процессора из реестра

function GetCPUType: string;
var
m_reg: TRegistry;
begin
m_reg:=TRegistry.Create;
m_reg.RootKey:=HKEY_LOCAL_MACHINE;
try
if m_reg.OpenKey("HARDWARE\DESCRIPTION\System\CentralProcessor\0", True) then
begin
try
Result:=m_reg.ReadString("Identifier");
except
Result:="Unknown";
end;
m_reg.CloseKey;
end;
finally
m_reg.Free;
end;
end;


4. Простой тип процессора

function GetCPUNumber: string;
var
Struc: _SYSTEM_INFO;
begin
GetSystemInfo(Struc);
Result:=IntToStr(Struc.dwNumberOfProcessors);
end;

function GetCPULevel: string;
var
Struc: _SYSTEM_INFO;
begin
GetSystemInfo(Struc);
Case Struc.wProcessorLevel of
3: Result:="Intel 80386";
4: Result:="Intel 80486";
5: Result:="Intel Pentium";
6: Result:="Intel Pentium II or better";
end;
end;


 
Ich Hasse   (2002-12-07 17:29) [3]

Вот все, что тебе может понадобиться... (надеюсь)

Может ты мне дашь ответ?
Почему весь белый свет
Обозлился на меня?
Для чего родился я?


 
rastochnik   (2002-12-07 17:47) [4]

используй com-объекты WMI - на msdn поиск по SWbemLocator, Win32_Processor - там инфы про процессор очень много



 
apay   (2002-12-07 21:39) [5]

от 80806 до 80486 -- cpuid.asm (в example-ах кажется tasm 5.0)
AMD процессоры старше 486 -- см. на сайте AMD, примеров всяких и программок полно)
Intel процессоры -- аналогично, но на сайте Intel.
за пол-часа все это можно спокойно скачать.

2 Ich Hasse
Поэтом быть не так легко,
Стихи и рифмы составлять словами,
Но им, поэтам, не дано
Понять всю красоту программы...

Вааще-то это не парнас, а форум программеров :))


 
TankMan   (2002-12-10 00:00) [6]

>> Ich Hasse
А что за TVendor?


 
bak   (2002-12-10 09:31) [7]

давненько лабал - могет разгребешь


procedure TForm1.Button8Click(Sender: TObject);
type
regconvert = record
bits0_7: Byte;
bits8_15: Byte;
bits16_23: Byte;
bits24_31: Byte;
end;
var
CPUInfo: TCpuInfo;
TEBX, TEDX, TECX: Cardinal;
TString: String;
VString: String;
begin
asm
MOV [CPUInfo.PType], 0
MOV [CPUInfo.Model], 0
MOV [CPUInfo.Stepping], 0
MOV [CPUInfo.Features], 0
// MOV [CPUInfo.Frequency_Info.Raw_Freq], 0
// MOV [CPUInfo.Frequency_Info.Norm_Freq], 0
// MOV [CPUInfo.Frequency_Info.In_Cycles], 0
// MOV [CPUInfo.Frequency_Info.Ex_Ticks], 0

push eax
push ebp
push ebx
push ecx
push edi
push edx
push esi

@@Check_80486:
MOV [CPUInfo.Family], 4
MOV TEBX, 0
MOV TEDX, 0
MOV TECX, 0
PUSHFD
POP EAX
MOV ECX, EAX
XOR EAX, 200000H
PUSH EAX
POPFD
PUSHFD
POP EAX
XOR EAX, ECX
JE @@DONE_CPU_TYPE

@@Has_CPUID_Instruction:
MOV EAX, 0
DB 0FH
DB 0A2H

MOV TEBX, EBX
MOV TEDX, EDX
MOV TECX, ECX

MOV EAX, 1
DB 0FH
DB 0A2H

MOV [CPUInfo.Features], EDX

MOV ECX, EAX

AND EAX, 3000H
SHR EAX, 12
MOV [CPUInfo.PType], AL

MOV EAX, ECX

AND EAX, 0F00H
SHR EAX, 8
MOV [CPUInfo.Family], AL

MOV EAX, ECX

AND EAX, 00F0H
SHR EAX, 4
MOV [CPUInfo.MODEL], AL

MOV EAX, ECX

AND EAX, 000FH
MOV [CPUInfo.Stepping], AL

@@DONE_CPU_TYPE:

pop esi
pop edx
pop edi
pop ecx
pop ebx
pop ebp
pop eax
end;



 
bak   (2002-12-10 09:32) [8]

продолжение...



If (TEBX = 0) and (TEDX = 0) and (TECX = 0) and (CPUInfo.Family = 4) then
begin
CPUInfo.VendorIDString := "Unknown";
CPUInfo.Manufacturer := "Unknown";
CPUInfo.CPU_Name := "Generic 486";
end
else
begin
With regconvert(TEBX) do
begin
TString := CHR(bits0_7) + CHR(bits8_15) + CHR(bits16_23) + CHR(bits24_31);
end;
With regconvert(TEDX) do
begin
TString := TString + CHR(bits0_7) + CHR(bits8_15) + CHR(bits16_23) + CHR(bits24_31);
end;
With regconvert(TECX) do
begin
TString := TString + CHR(bits0_7) + CHR(bits8_15) + CHR(bits16_23) + CHR(bits24_31);
end;
VString := TString;
CPUInfo.VendorIDString := TString;
If (CPUInfo.VendorIDString = "GenuineIntel") then
begin
CPUInfo.Manufacturer := "Intel";
Case CPUInfo.Family of
4: Case CPUInfo.Model of
1: CPUInfo.CPU_Name := "Intel 486DX Processor";
2: CPUInfo.CPU_Name := "Intel 486SX Processor";
3: CPUInfo.CPU_Name := "Intel DX2 Processor";
4: CPUInfo.CPU_Name := "Intel 486 Processor";
5: CPUInfo.CPU_Name := "Intel SX2 Processor";
7: CPUInfo.CPU_Name := "Write-Back Enhanced Intel DX2 Processor";
8: CPUInfo.CPU_Name := "Intel DX4 Processor";
else CPUInfo.CPU_Name := "Intel 486 Processor";
end;
5: CPUInfo.CPU_Name := "Pentium";
6: Case CPUInfo.Model of
1: CPUInfo.CPU_Name := "Pentium Pro";
3: CPUInfo.CPU_Name := "Pentium II";
else CPUInfo.CPU_Name := Format("P6 (Model %d)", [CPUInfo.Model]);
end;
else CPUInfo.CPU_Name := Format("P%d", [CPUInfo.Family]);
end;
end
else if (CPUInfo.VendorIDString = "CyrixInstead") then
begin
CPUInfo.Manufacturer := "Cyrix";
Case CPUInfo.Family of
5: CPUInfo.CPU_Name := "Cyrix 6x86";
6: CPUInfo.CPU_Name := "Cyrix M2";
else CPUInfo.CPU_Name := Format("%dx86", [CPUInfo.Family]);
end;
end
else if (CPUInfo.VendorIDString = "AuthenticAMD") then
begin
CPUInfo.Manufacturer := "AMD";
Case CPUInfo.Family of
4: CPUInfo.CPU_Name := "Am486 or Am5x86";
5: Case CPUInfo.Model of
0: CPUInfo.CPU_Name := "AMD-K5 (Model 0)";
1: CPUInfo.CPU_Name := "AMD-K5 (Model 1)";
2: CPUInfo.CPU_Name := "AMD-K5 (Model 2)";
3: CPUInfo.CPU_Name := "AMD-K5 (Model 3)";
6: CPUInfo.CPU_Name := "AMD-K6";
else CPUInfo.CPU_Name := "Unknown AMD Model";
end;
else CPUInfo.CPU_Name := "Unknown AMD Chip";
end;
end
else
begin
CPUInfo.VendorIDString := TString;
CPUInfo.Manufacturer := "Unknown";
CPUInfo.CPU_Name := "Unknown";
end;
end;
// Result := CPUInfo;
Memo2.Clear;
Memo2.Lines.Add(CPUInfo.Manufacturer);
Memo2.Lines.Add(CPUInfo.CPU_Name);
end;

Тяжело мне самому
Баги исправлять,
Но надоело в форуме
Всем надоедать!



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.01.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.007 c
3-72165
Black Cat
2003-01-02 11:45
2003.01.23
ORA-04021 (таймаут операции блокировки)


1-72236
DmitryMN
2003-01-14 16:43
2003.01.23
Закрытие Excel из потока


3-72038
Gerry
2003-01-04 07:02
2003.01.23
Выборка


1-72178
Slider007
2003-01-13 22:47
2003.01.23
Тормоза в TListBox.


14-72514
Дмитрий К.К.
2003-01-05 06:35
2003.01.23
Именинники 5 января





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский