如何获得服务器的cpu全球唯一的id序列码?告诉我理论及方法!
解决方案 »
- 分享一下解决idhttpserver乱码的问题
- 急!急!急!急 !怎樣知道Hotmail在哪台電腦上上網
- treeview+dbgrid的问题!
- 急啊,在线等——关于Delphi下调用EXE文件的问题?(解决问题给100分)
- 请问有DXF转其他格式的控件吗?
- 如何用UDP把一台在上Internet的主机数据传到另一台通过代理服务器上网的计算机中?高手请赐教啊!
- 妈妈,女儿对不起你
- 怎样由TBitmap的变量获得一个windows结构BITMAP的变量?
- 怎样实现将一个文件拷贝到指定路径下?
- fastreport3 如何给设置的变量赋值!!急!!!
- 关于Indy中的TIdHTTP中ProxyParams的问题
- 简单的问题!
type
TCPUID = array[1..4] of Longint;function GetCPUID : TCPUID; assembler; register; //得到CPU序列号
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;
在 DELPHI 的代码编辑窗体中按 CTRL + SHIFT + G
动态产生方法:uses ole2;
var
G: TGUID;
UID: string;
begin
CoCreateGuid(G);
UID := GuidToString(G);
procedure TForm1.Button1Click(Sender: TObject);
var
R: array[0..19] of Char;
CpuID: Integer;
begin
FillChar(R, 20, 0);
asm
mov eax, 0
db 0fh, 0a2h
mov dword ptr R[0], ebx
mov dword ptr R[4], edx
mov dword ptr R[8], ecx
mov eax, 1
db 0fh, 0a2h // cpuid
mov CpuID, edx
end;
ShowMessage('CPU制造商为:' + R);
ShowMessage('序列号为:' + IntToStr(CpuID));
end;
unit CPUID;interfacetype
TCPUID = array[1..4] of Longint;
TCPUVendor = array[0..11] of Char;function GetCPUID: TCPUID; assembler; register;
function GetCPUVendor: TCPUVendor; assembler; register;implementationfunction 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: TCPUVendor; 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;end.
李 涛 ----很多软件可以判断所运行的电脑类型而自动做不同的处理。如PhotoShop5可以探测CPU是否有MMX支持而调用不同的处理函数,《金山词霸》发现有MMX支持会产生半透明的翻译提示,很多软件可以区分Intel,Cyrix,AMD的CPU... ----现在,且让我细细道来如何让你在自己的程序中取得CPU信息。 ----主要可利用CPUID汇编指令(机器码:0FHA2H,如果你的编译器不支持CPUID指令,只有emit机器码了)该指令可以被如下CPU识别 Intel 486 以 上 的CPU, Cyrix M1 以 上 的CPU, AMD Am486 以 上 的CPU
(1)取CPUOEM字符串,判断CPU厂商 先让EAX=0,再调用CPUID Inel 的CPU 将 返 回: EBX:756E6547H 'Genu' EDX:49656E69H 'ineI' ECX:6C65746EH 'ntel' EBX,EDX,ECX 将 连 成"GenuineIntel", 真 正 的Intel。 Cyrix 的CPU 将 返 回: EBX:43797269H EDX:78496E73H ECX:74656164H "CyrixInstead","Cyrix 来 代 替"。 AMD 的CPU 将 返 回: EBX:41757468H EDX:656E7469H ECX:63414D44H "AuthenticAMD", 可 信 的AMD。
----在Windows98中,用右键单击"我的电脑",选择"属性-常规"在计算机描述处就可看见CPUOEM字符串。 (2)CPU到底是几86,是否支持MMX 先让EAX=1,再调用CPUID EAX的8到11位就表明是几86 3 - 386 4 - i486 5 - Pentium 6 - Pentium Pro Pentium II 2 - Dual Processors EDX 的第0位:有无FPU EDX 的第23位:CPU是否支持IA MMX,很重要啊!如果你想用那57条新增的指令,先检查这一位吧,否则就等着看Windows的"该程序执行了非法指令,将被关闭"吧。 (3)专门检测是否P6架构 先让EAX=1,再调用CPUID 如果AL=1,就是PentiumPro或Pentium II (4)专门检测AMD的CPU信息 先 让EAX=80000001H, 再 调 用CPUID 如 果EAX=51H, 是AMD K5 如 果EAX=66H, 是K6 EDX 第0 位: 是 否 有FPU EDX 第23 位,CPU 是 否 支 持MMX,程序如下:是C++Builder的控制台程序,可以给出你的"心"的信息。如果把这个技术用于DLL中,便可以使VB程序也知道"心"的信息。 //------CPUID Instruction Demo Program------------
#include < conio.h >
#include < iostream.h >
#pragma hdrstop
//------------------------------------------------ #pragma inline
#pragma argsused int main(int argc, char **argv)
{
char OEMString[13];
int iEAXValue,iEBXValue,iECXValue,iEDXValue; _asm {
mov eax,0
cpuid
mov DWORD PTR OEMString,ebx
mov DWORD PTR OEMString+4,edx
mov DWORD PTR OEMString+8,ecx
mov BYTE PTR OEMString+12,0
} cout< < "This CPU 's OEM String is:"< < OEMString< < endl; _asm {
mov eax,1
cpuid
mov iEAXValue,eax
mov iEBXValue,ebx
mov iECXValue,ecx
mov iEDXValue,edx
} if(iEDXValue&0x800000)
cout < < "This is MMX CPU"< < endl;
else
cout < < "None MMX Support."< < endl; int iCPUFamily=(0xf00 & iEAXValue) > >8;
cout < < "CPU Family is:"< < iCPUFamily< < endl;
_asm{
mov eax,2
CPUID
} if(_AL==1)
cout < < "Pentium Pro or Pentium II Found"; getch(); return 0; }
谁能告诉我你们从什么地方得到获取cpu唯一吗的办法的啊?
关注。
zdcnow(磁效应) 为什么你产生的cpuid和 gwsr(咩咩) 产生的不一样呢?它的第四个数组元素和你的结果一样?为什么呢? 那是因为 CpuID 由四个整数组成. zdcnow(磁效应) 取的是最后一个值.
答 gardenyang(太阳雨)
hammer_shi(@农业专家@) 你的方法好像也不行啊,运行后我的showmessage就不能用了,如果不运行你的代码就正常,为什么啊?
我在WIN2000下测试通过能用.但有点总是,经过这样处理就行了.
TmpS1:= 'CPU制造商为:' + R;
SetLength(TmpS2, Length(TmpS1));
For I:=1 To Length(TmpS1) Do TmpS2[I]:= TmpS1[I];
Memo1.Lines.Add(TmpS2); TmpS1:= '序列号为:' + IntToHex(CpuID, 8);
Memo1.Lines.Add(TmpS1);