Форум: "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.008 c