附上一段C++代码,希望把这段c++代码修改成delphi的。多谢各位大神~CString CGetCpuIDDlg::GetCPUID()
{
CString CPUID;
unsigned long s1,s2;
unsigned char vendor_id[]="------------";
char sel;
sel='1';
CString VernderID;
CString MyCpuID,CPUID1,CPUID2;
switch(sel)
{
case '1':
__asm{
xor eax,eax //eax=0:取Vendor信息
cpuid //取cpu id指令,可在Ring3级使用
mov dword ptr vendor_id,ebx
mov dword ptr vendor_id[+4],edx
mov dword ptr vendor_id[+8],ecx
}
VernderID.Format("%s-",vendor_id);
__asm{
mov eax,01h //eax=1:取CPU序列号
xor edx,edx
cpuid
mov s1,edx
mov s2,eax
}
CPUID1.Format("%08X%08X",s1,s2);
__asm{
mov eax,03h
xor ecx,ecx
xor edx,edx
cpuid
mov s1,edx
mov s2,ecx
}
CPUID2.Format("%08X%08X",s1,s2);
break;
case '2':
{
__asm{
mov ecx,119h
rdmsr
or eax,00200000h
wrmsr
}
}
AfxMessageBox("CPU id is disabled.");
break;
}
MyCpuID = CPUID1+CPUID2;
CPUID = MyCpuID;
return CPUID;
}
{
CString CPUID;
unsigned long s1,s2;
unsigned char vendor_id[]="------------";
char sel;
sel='1';
CString VernderID;
CString MyCpuID,CPUID1,CPUID2;
switch(sel)
{
case '1':
__asm{
xor eax,eax //eax=0:取Vendor信息
cpuid //取cpu id指令,可在Ring3级使用
mov dword ptr vendor_id,ebx
mov dword ptr vendor_id[+4],edx
mov dword ptr vendor_id[+8],ecx
}
VernderID.Format("%s-",vendor_id);
__asm{
mov eax,01h //eax=1:取CPU序列号
xor edx,edx
cpuid
mov s1,edx
mov s2,eax
}
CPUID1.Format("%08X%08X",s1,s2);
__asm{
mov eax,03h
xor ecx,ecx
xor edx,edx
cpuid
mov s1,edx
mov s2,ecx
}
CPUID2.Format("%08X%08X",s1,s2);
break;
case '2':
{
__asm{
mov ecx,119h
rdmsr
or eax,00200000h
wrmsr
}
}
AfxMessageBox("CPU id is disabled.");
break;
}
MyCpuID = CPUID1+CPUID2;
CPUID = MyCpuID;
return CPUID;
}
解决方案 »
- AdvStringGrid单元格如何添加图片,并且点击图片触发一个事件?
- 怎样判断edit.text符合yyyymm格式 请高手指教
- 关于dxdbgrid控件的TdxDBGridCheckColumn的问题
- 如何把text文件导入到SQL Server数据库中?
- 紧急讨教,事关毕业啊(送100分):delphi+oralce数据库,记录删除方面的一个问题。
- 我是新手,请帮我!!!关于power函数的
- 我要读大专,大家帮忙提点意见了@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- 帮忙up也送分:CORBA开发中,irep.exe的使用——长久的困惑!!
- 有谁编过PDA的程序?
- 邮件发送问题
- 怎么把16进制格式化到字符串啊?
- 程序共享tsocketconnection连接
Delphi编程 -- 使用CPUID指令获取CPU信息
unit CPU;interfaceuses Types;const //Version Information bitmask
BITMASK_ExtendedFamilyID=$0FF00000;
BITMASK_ExtendedModelID= $000F0000;
BITMASK_ProcessorType= $00003000;
BITMASK_FamilyID= $00000F00;
BITMASK_ModelID= $000000F0;
BITMASK_SteppingID= $0000000F; //Processor Type
ProcessorType_OriginalOEMProcessor= $00000000;
ProcessorType_IntelOverDriveProcessor= $00001000;
ProcessorType_DualProcessor= $00002000;
ProcessorType_IntelReserved= $00003000;type //register used in cpuid instruction
TCPUIDRegister=packed record
EAX:DWORD;
case Integer of
0://register
(
EBX:DWORD;
ECX:DWORD;
EDX:DWORD;
);
1://version information string
(
VIS1:array[1..4] of Char;
VIS2:array[1..4] of Char;
VIS3:array[1..4] of Char;
);
end; PCPUIDRegister=^TCPUIDRegister; //basic cupid information
TCPUIDBasicInformation=packed record
//EAX=0
HighestBasicProcessorInformationValue:Cardinal;
VendorIdentificationString:string[12];
//EAX=1
ExtendedFamileyID,
ExtendedModelID,
ProcessorType,
FamilyID,
ModelID,
SteppingID:DWORD;
end; PCPUIDBasicInformation=^TCPUIDBasicInformation; TCPUInfo=class
private
fSupportForCPUID:Boolean;
private
function CPUID(Value:DWORD):TCPUIDRegister;
function Get_CPUIDBasicInformation:TCPUIDBasicInformation;
public
constructor Create;
public
property SupportForCPUID:Boolean read fSupportForCPUID;
property CPUIDBasicInformation:TCPUIDBasicInformation read Get_CPUIDBasicInformation;
end;implementationuses Dialogs,SysUtils;{ TCPUInfo }function TCPUInfo.CPUID(Value:DWORD): TCPUIDRegister;
var
VEAX,VEBX,VECX,VEDX:DWORD;
begin
asm
pushad
mov eax,Value
cpuid
mov VEAX,eax
mov VEBX,ebx
mov VECX,ecx
mov VEDX,edx
popad
end;
with Result do
begin
EAX:=VEAX;
EBX:=VEBX;
ECX:=VECX;
EDX:=VEDX;
end;
end;constructor TCPUInfo.Create;
const
EF_ID:DWORD=$200000;
var
EFID:DWORD;
begin
fSupportForCPUID:=False;
asm
//save current register
pushad
//move old eflags to ebx
pushfd
pop eax
//move old eflags to ebx
mov ebx,eax
//revert EF_ID
xor eax,EF_ID
push eax
popfd
//move new eflags to eax
pushfd
pop eax
//test EF_ID
xor eax,ebx
mov EFID,eax
//restore register
popad
end;
if (EFID xor EF_ID)=0 then fSupportForCPUID:=True;
end;function TCPUInfo.Get_CPUIDBasicInformation: TCPUIDBasicInformation;
var
CPUIDRegister:TCPUIDRegister;
begin
CPUIDRegister:=CPUID(0);
with CPUIDRegister,Result do
begin
HighestBasicProcessorInformationValue:=EAX;
VendorIdentificationString:=VIS1+VIS3+VIS2;
end;
CPUIDRegister:=CPUID(1);
with CPUIDRegister,Result do
begin
ExtendedFamileyID:=EAX and BITMASK_ExtendedFamilyID;
ExtendedModelID:=EAX and BITMASK_ExtendedModelID;
ProcessorType:=EAX and BITMASK_ProcessorType;
FamilyID:=EAX and BITMASK_FamilyID;
ModelID:=EAX and BITMASK_ModelID;
SteppingID:=EAX and BITMASK_SteppingID;
end;
end;end.
Windows,
Messages,
SysUtils,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
ExtCtrls,
StdCtrls,
Buttons;
type
TDemoForm = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
GetButton: TBitBtn;
CloseButton: TBitBtn;
Bevel1: TBevel;
Label5: TLabel;
FLabel: TLabel;
MLabel: TLabel;
PLabel: TLabel;
SLabel: TLabel;
PValue: TLabel;
FValue: TLabel;
MValue: TLabel;
SValue: TLabel;
procedure GetButtonClick(Sender: TObject);
end;
var
DemoForm: TDemoForm;
implementation
{$R *.DFM}
const
ID_BIT = $200000; // EFLAGS ID bit
type
TCPUID = array[1..4] of Longint;
TVendor = array [0..11] of char;function IsCPUID_Available : Boolean; register;
asm
PUSHFD {direct access to flags no possible, only via stack}
POP EAX {flags to EAX}
MOV EDX,EAX {save current flags}
XOR EAX,ID_BIT {not ID bit}
PUSH EAX {onto stack}
POPFD {from stack to flags, with not ID bit}
PUSHFD {back to stack}
POP EAX {get back to EAX}
XOR EAX,EDX {check if ID bit affected}
JZ @exit {no, CPUID not availavle}
MOV AL,True {Result=True}
@exit:
end;function GetCPUID : TCPUID; assembler; register;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Resukt}
MOV EAX,1
DW $A20F {CPUID Command}
STOSD {CPUID[1]}
MOV EAX,EBX
STOSD {CPUID[2]}
MOV EAX,ECX
STOSD {CPUID[3]}
MOV EAX,EDX
STOSD {CPUID[4]}
POP EDI {Restore registers}
POP EBX
end;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;procedure TDemoForm.GetButtonClick(Sender: TObject);
var
CPUID : TCPUID;
I : Integer;
S : TVendor;
begin
for I := Low(CPUID) to High(CPUID) do CPUID := -1;
if IsCPUID_Available then begin
CPUID := GetCPUID;
Label1.Caption := ’CPUID[1] = ’ + IntToHex(CPUID[1],8);
Label2.Caption := ’CPUID[2] = ’ + IntToHex(CPUID[2],8);
Label3.Caption := ’CPUID[3] = ’ + IntToHex(CPUID[3],8);
Label4.Caption := ’CPUID[4] = ’ + IntToHex(CPUID[4],8);
PValue.Caption := IntToStr(CPUID[1] shr 12 and 3);
FValue.Caption := IntToStr(CPUID[1] shr 8 and $f);
MValue.Caption := IntToStr(CPUID[1] shr 4 and $f);
SValue.Caption := IntToStr(CPUID[1] and $f);
S := GetCPUVendor;
Label5.Caption := ’Vendor: ’ + S; end
else begin
Label5.Caption := ’CPUID not available’;
end;
end;end.