我只是说说而已,刚才看了一下,发现我的思维已经落伍了 双核CPU的CPU ID每次都会变的,很麻烦 还是换一个比较稳定的东西比较好 不过还是给出代码吧type TCPUID = array[1..4] of Longint; TVendor = array [0..11] of char;
function GetCPUID: TCPUID; assembler; register; function GetCPUInfo: string;
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 GetCPUInfo:String; var CPUID:TCPUID; begin CPUID:=GetCPUID; Result:=IntToHex(CPUID[1],8)+IntToHex(CPUID[2],8)+IntToHex(CPUID[3],8)+IntToHex(CPUID[4],8); end;
获得CPU 的 IDfunction GetCpuId:longint;assembler;register; var temp:longint; begin asm PUSH EBX PUSH EDI MOV EDI,EAX MOV EAX,1 DW $A20F MOV TEMP,EDX POP EDI POP EBX end; result:=temp; end;
//获得硬盘序列号 function GetIdeSerialNumber: pchar; const IDENTIFY_BUFFER_SIZE = 512; type TIDERegs = packed record bFeaturesReg: BYTE; // Used for specifying SMART "commands". bSectorCountReg: BYTE; // IDE sector count register bSectorNumberReg: BYTE; // IDE sector number register bCylLowReg: BYTE; // IDE low order cylinder value bCylHighReg: BYTE; // IDE high order cylinder value bDriveHeadReg: BYTE; // IDE drive/head register bCommandReg: BYTE; // Actual IDE command. bReserved: BYTE; // reserved for future use. Must be zero. end; TSendCmdInParams = packed record // Buffer size in bytes cBufferSize: DWORD; // Structure with drive register values. irDriveRegs: TIDERegs; // Physical drive number to send command to (0,1,2,3). bDriveNumber: BYTE; bReserved: array[0..2] of Byte; dwReserved: array[0..3] of DWORD; bBuffer: array[0..0] of Byte; // Input buffer. end; TIdSector = packed record wGenConfig: Word; wNumCyls: Word; wReserved: Word; wNumHeads: Word; wBytesPerTrack: Word; wBytesPerSector: Word; wSectorsPerTrack: Word; wVendorUnique: array[0..2] of Word; sSerialNumber: array[0..19] of CHAR; wBufferType: Word; wBufferSize: Word; wECCSize: Word; sFirmwareRev: array[0..7] of Char; sModelNumber: array[0..39] of Char; wMoreVendorUnique: Word; wDoubleWordIO: Word; wCapabilities: Word; wReserved1: Word; wPIOTiming: Word; wDMATiming: Word; wBS: Word; wNumCurrentCyls: Word; wNumCurrentHeads: Word; wNumCurrentSectorsPerTrack: Word; ulCurrentSectorCapacity: DWORD; wMultSectorStuff: Word; ulTotalAddressableSectors: DWORD; wSingleWordDMA: Word; wMultiWordDMA: Word; bReserved: array[0..127] of BYTE; end; PIdSector = ^TIdSector; TDriverStatus = packed record // 驱动器返回的错误代码,无错则返回0 bDriverError: Byte; // IDE出错寄存器的内容,只有当bDriverError 为 SMART_IDE_ERROR 时有效 bIDEStatus: Byte; bReserved: array[0..1] of Byte; dwReserved: array[0..1] of DWORD; end; TSendCmdOutParams = packed record // bBuffer的大小 cBufferSize: DWORD; // 驱动器状态 DriverStatus: TDriverStatus; // 用于保存从驱动器读出的数据的缓冲区,实际长度由cBufferSize决定 bBuffer: array[0..0] of BYTE; end; var hDevice: Thandle; cbBytesReturned: DWORD; SCIP: TSendCmdInParams; aIdOutCmd: array[0..(SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE - 1) - 1] of Byte; IdOutCmd: TSendCmdOutParams absolute aIdOutCmd; procedure ChangeByteOrder(var Data; Size: Integer); var ptr: Pchar; i: Integer; c: Char; begin ptr := @Data; for I := 0 to (Size shr 1) - 1 do begin c := ptr^; ptr^ := (ptr + 1)^; (ptr + 1)^ := c; Inc(ptr, 2); end; end; begin Result := ''; // 如果出错则返回空串 if SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then begin // Windows NT, Windows 2000 // 提示! 改变名称可适用于其它驱动器,如第二个驱动器: '\\.\PhysicalDrive1\' hDevice := CreateFile('\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); end else // Version Windows 95 OSR2, Windows 98 hDevice := CreateFile('\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0); if hDevice = INVALID_HANDLE_VALUE then Exit; try FillChar(SCIP, SizeOf(TSendCmdInParams) - 1, #0); FillChar(aIdOutCmd, SizeOf(aIdOutCmd), #0); cbBytesReturned := 0; // Set up data structures for IDENTIFY command. with SCIP do begin cBufferSize := IDENTIFY_BUFFER_SIZE; // bDriveNumber := 0; with irDriveRegs do begin bSectorCountReg := 1; bSectorNumberReg := 1; // if Win32Platform=VER_PLATFORM_WIN32_NT then bDriveHeadReg := $A0 // else bDriveHeadReg := $A0 or ((bDriveNum and 1) shl 4); bDriveHeadReg := $A0; bCommandReg := $EC; end; end; if not DeviceIoControl(hDevice, $0007C088, @SCIP, SizeOf(TSendCmdInParams) - 1, @aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil) then Exit; finally CloseHandle(hDevice); end; with PIdSector(@IdOutCmd.bBuffer)^ do begin ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber)); (Pchar(@sSerialNumber) + SizeOf(sSerialNumber))^ := #0; Result := Pchar(@sSerialNumber); end; end;
function GetHardDiskSerial(Drive: string): string;
var VolumeSerialNumber: DWORD;
MaximumComponentLength: DWORD;
FileSystemFlags: DWORD;
begin
if Drive[Length(Drive)]=':' then Drive := Drive + '\';
GetVolumeInformation(PChar(Drive), nil, 0, @VolumeSerialNumber, MaximumComponentLength, FileSystemFlags, nil, 0);
Result := IntToHex(HiWord(VolumeSerialNumber), 4) + '-' + IntToHex(LoWord(VolumeSerialNumber), 4);
end;
刚发现这里有源码的下载,楼主可以去看看
unit URegCode;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,adodb,inifiles,Registry;
type
TRegCode=class
private
Sec:Array[1..126] of integer;
FComputerID: String;
FSoftRegID: String;
function GetSecretCode: String;
Function GetHDID:String;
Function GetCpuID:String;
function GetSelfID: String;
protected
Function GetSourceCode:String;
Function ChangeSourceToDesign(Source:string):string;
Function SecretChar(SC:Char):char;
//Function GetSecretCode:String
public
property SecretCode:String read GetSecretCode;
property SelfID:String Read GetSelfID;
property ComputerID:String read FComputerID write FComputerID;
property SoftRegID:String read FSoftRegID write FSoftRegID;
constructor create;
Function Softreg:Boolean;
function CheckReg:Boolean;
end;
implementation
{ TRegCode }
function TRegCode.ChangeSourceToDesign(Source: string): string;
var
iTemp:integer;
Sresult,Stemp:string;
SC:char;
begin
For Itemp:=1 to Length(source) do
begin
SC:=Source[iTemp];
Sresult:=Sresult+SecretChar(SC);
end;
Stemp:=Sresult[3]+Sresult[2]+Sresult[7]+Sresult[9]
+Sresult[14]+Sresult[1]+Sresult[7]+Sresult[4]
+Sresult[11]+Sresult[5]+Sresult[8]+Sresult[15]
+Sresult[12]+Sresult[6]+Sresult[10]+Sresult[15]
+Sresult[16]+Sresult[2]+Sresult[1]+Sresult[12];
result:=Stemp;end;
function TRegCode.CheckReg: Boolean;
var
stemp,Stemp1,RTemp,RTemp1:string;
myreg:TRegistry;
begin
stemp:=GetSourceCode;
Stemp1:=ChangeSourceToDesign(stemp);
myreg:=TRegistry.Create;
myreg.RootKey:=HKEY_LOCAL_MACHINE;
myreg.OpenKey('\SOFTWARE\Microsoft\Windows\IE',true);
RTemp:=Myreg.ReadString('ID');
RTemp1:=Myreg.ReadString('default');
if (Stemp=RTemp) and (STemp1=RTemp1) then
result:=true
else
result:=false;
end;
constructor TRegCode.create;
begin
sec[1]:=5; sec[2]:=7; sec[3]:=7; sec[4]:=6; sec[5]:=1; sec[6]:=1; sec[7]:=0;
sec[8]:=5; sec[9]:=6; sec[10]:=3; sec[11]:=6; sec[12]:=4; sec[13]:=8; sec[14]:=3;
sec[15]:=0; sec[16]:=5; sec[17]:=3; sec[18]:=3; sec[19]:=4; sec[20]:=3; sec[21]:=7;
sec[22]:=8; sec[23]:=9; sec[24]:=4; sec[25]:=2; sec[26]:=0; sec[27]:=4; sec[28]:=0;
sec[29]:=8; sec[30]:=4; sec[31]:=9; sec[32]:=6; sec[33]:=2; sec[34]:=2; sec[35]:=4;
sec[36]:=2; sec[37]:=7; sec[38]:=6; sec[39]:=8; sec[40]:=0; sec[41]:=7; sec[42]:=7;
sec[43]:=3; sec[44]:=5; sec[45]:=4; sec[46]:=3; sec[47]:=0; sec[48]:=2; sec[49]:=4;
sec[50]:=9; sec[51]:=9; sec[52]:=5; sec[53]:=3; sec[54]:=2; sec[55]:=8; sec[56]:=3;
sec[57]:=0; sec[58]:=5; sec[59]:=3; sec[60]:=7; sec[61]:=5; sec[62]:=0; sec[63]:=1;
sec[64]:=3; sec[65]:=2; sec[66]:=4; sec[67]:=9; sec[68]:=3; sec[69]:=0; sec[70]:=9;
sec[71]:=6; sec[72]:=8; sec[73]:=4; sec[74]:=4; sec[75]:=8; sec[76]:=3; sec[77]:=0;
sec[78]:=1; sec[79]:=4; sec[80]:=7; sec[81]:=4; sec[82]:=1; sec[83]:=6; sec[84]:=0;
sec[85]:=8; sec[86]:=7; sec[87]:=6; sec[88]:=8; sec[89]:=0; sec[90]:=0; sec[91]:=4;
sec[92]:=8; sec[93]:=3; sec[94]:=9; sec[95]:=1; sec[96]:=8; sec[97]:=1; sec[98]:=2;
sec[99]:=8; sec[100]:=3; sec[101]:=8; sec[102]:=7; sec[103]:=1; sec[104]:=9;
sec[105]:=3; sec[106]:=7; sec[107]:=4; sec[108]:=7; sec[109]:=5; sec[110]:=5;
sec[111]:=2; sec[112]:=2; sec[113]:=1; sec[114]:=8; sec[115]:=1; sec[116]:=5;
sec[117]:=8; sec[118]:=7; sec[119]:=6; sec[120]:=3; sec[121]:=3; sec[122]:=5;
sec[123]:=7; sec[124]:=4; sec[125]:=6; sec[126]:=5;
end;
function TRegCode.GetSecretCode: String;
begin
if FComputerID<>'' then
result:=ChangeSourceToDesign(FComputerID)
else
result:='';end;
function TRegCode.GetSelfID: String;
begin
result:=GetSourceCode;
end;
function TRegCode.GetSourceCode: String;
begin
result:=GetHDID+GetCpuID;
end;
function TRegCode.SecretChar(SC: Char): char;
var
itemp:integer;
begin
itemp:=ord(SC);
case iTemp of
48..57:
begin
iTemp:=Itemp+Sec[iTemp];
if itemp>57 then
itemp:=itemp-10;
end; 65..90:
begin
iTemp:=Itemp+Sec[iTemp];
if itemp>90 then
itemp:=itemp-26;
end;
97..122:
begin
iTemp:=Itemp+Sec[iTemp];
if itemp>122 then
itemp:=itemp-26;
end;
end;
result:=char(itemp);end;
function TRegCode.Softreg: Boolean;
var
Stemp,stemp1:string;
myreg:TRegistry;
begin
STemp:=GetSourceCode;
Stemp1:=ChangeSourceToDesign(STemp);
if (Stemp1=FSoftRegID) then
begin
myreg:=TRegistry.Create;
myreg.RootKey:=HKEY_LOCAL_MACHINE;
myreg.OpenKey('\SOFTWARE\Microsoft\Windows\IE',true);
myreg.WriteString('default',stemp1);
myreg.WriteString('ID',stemp);
MessageDlg('注册成功!', mtInformation,
[mbOk], 0);
result:=true;
//写入注册表
end
else
begin
MessageDlg('注册失败!', mtInformation,
[mbOk], 0);
result:=false;
end;
end;
end.
在Uses中加入UregCode
procedure TForm1.Button1Click(Sender: TObject);
var
my:TRegCode;
begin
my:=TRegCode.create;
label1.Caption:=my.SelfID;
end;procedure TForm1.Button2Click(Sender: TObject);
var
my:TRegCode;
begin
my:=TRegCode.create;
my.ComputerID :=label1.Caption;
edit2.Text:=my.SecretCode;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
my:TRegCode;
begin
my:=TRegCode.create;
my.SoftRegID:=edit1.Text;
if my.Softreg =true then
begin
//进入程序主界面
end;
end;procedure TForm1.Button4Click(Sender: TObject);
begin
application.Terminate;
end;
再后面并没有定义啊?
双核CPU的CPU ID每次都会变的,很麻烦
还是换一个比较稳定的东西比较好
不过还是给出代码吧type
TCPUID = array[1..4] of Longint;
TVendor = array [0..11] of char;
function GetCPUID: TCPUID; assembler; register;
function GetCPUInfo: string;
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 GetCPUInfo:String;
var
CPUID:TCPUID;
begin
CPUID:=GetCPUID;
Result:=IntToHex(CPUID[1],8)+IntToHex(CPUID[2],8)+IntToHex(CPUID[3],8)+IntToHex(CPUID[4],8);
end;
var
temp:longint;
begin
asm
PUSH EBX
PUSH EDI
MOV EDI,EAX
MOV EAX,1
DW $A20F
MOV TEMP,EDX
POP EDI
POP EBX
end;
result:=temp;
end;
function GetIdeSerialNumber: pchar;
const IDENTIFY_BUFFER_SIZE = 512;
type
TIDERegs = packed record
bFeaturesReg: BYTE; // Used for specifying SMART "commands".
bSectorCountReg: BYTE; // IDE sector count register
bSectorNumberReg: BYTE; // IDE sector number register
bCylLowReg: BYTE; // IDE low order cylinder value
bCylHighReg: BYTE; // IDE high order cylinder value
bDriveHeadReg: BYTE; // IDE drive/head register
bCommandReg: BYTE; // Actual IDE command.
bReserved: BYTE; // reserved for future use. Must be zero.
end;
TSendCmdInParams = packed record
// Buffer size in bytes
cBufferSize: DWORD;
// Structure with drive register values.
irDriveRegs: TIDERegs;
// Physical drive number to send command to (0,1,2,3).
bDriveNumber: BYTE;
bReserved: array[0..2] of Byte;
dwReserved: array[0..3] of DWORD;
bBuffer: array[0..0] of Byte; // Input buffer.
end;
TIdSector = packed record
wGenConfig: Word;
wNumCyls: Word;
wReserved: Word;
wNumHeads: Word;
wBytesPerTrack: Word;
wBytesPerSector: Word;
wSectorsPerTrack: Word;
wVendorUnique: array[0..2] of Word;
sSerialNumber: array[0..19] of CHAR;
wBufferType: Word;
wBufferSize: Word;
wECCSize: Word;
sFirmwareRev: array[0..7] of Char;
sModelNumber: array[0..39] of Char;
wMoreVendorUnique: Word;
wDoubleWordIO: Word;
wCapabilities: Word;
wReserved1: Word;
wPIOTiming: Word;
wDMATiming: Word;
wBS: Word;
wNumCurrentCyls: Word;
wNumCurrentHeads: Word;
wNumCurrentSectorsPerTrack: Word;
ulCurrentSectorCapacity: DWORD;
wMultSectorStuff: Word;
ulTotalAddressableSectors: DWORD;
wSingleWordDMA: Word;
wMultiWordDMA: Word;
bReserved: array[0..127] of BYTE;
end;
PIdSector = ^TIdSector;
TDriverStatus = packed record
// 驱动器返回的错误代码,无错则返回0
bDriverError: Byte;
// IDE出错寄存器的内容,只有当bDriverError 为 SMART_IDE_ERROR 时有效
bIDEStatus: Byte;
bReserved: array[0..1] of Byte;
dwReserved: array[0..1] of DWORD;
end;
TSendCmdOutParams = packed record
// bBuffer的大小
cBufferSize: DWORD;
// 驱动器状态
DriverStatus: TDriverStatus;
// 用于保存从驱动器读出的数据的缓冲区,实际长度由cBufferSize决定
bBuffer: array[0..0] of BYTE;
end;
var
hDevice: Thandle;
cbBytesReturned: DWORD;
SCIP: TSendCmdInParams;
aIdOutCmd: array[0..(SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE - 1) - 1] of Byte;
IdOutCmd: TSendCmdOutParams absolute aIdOutCmd;
procedure ChangeByteOrder(var Data; Size: Integer);
var
ptr: Pchar;
i: Integer;
c: Char;
begin
ptr := @Data;
for I := 0 to (Size shr 1) - 1 do begin
c := ptr^;
ptr^ := (ptr + 1)^;
(ptr + 1)^ := c;
Inc(ptr, 2);
end;
end;
begin
Result := ''; // 如果出错则返回空串
if SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then begin // Windows NT, Windows 2000
// 提示! 改变名称可适用于其它驱动器,如第二个驱动器: '\\.\PhysicalDrive1\'
hDevice := CreateFile('\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
end else // Version Windows 95 OSR2, Windows 98
hDevice := CreateFile('\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0);
if hDevice = INVALID_HANDLE_VALUE then Exit;
try
FillChar(SCIP, SizeOf(TSendCmdInParams) - 1, #0);
FillChar(aIdOutCmd, SizeOf(aIdOutCmd), #0);
cbBytesReturned := 0;
// Set up data structures for IDENTIFY command.
with SCIP do begin
cBufferSize := IDENTIFY_BUFFER_SIZE;
// bDriveNumber := 0;
with irDriveRegs do begin
bSectorCountReg := 1;
bSectorNumberReg := 1;
// if Win32Platform=VER_PLATFORM_WIN32_NT then bDriveHeadReg := $A0
// else bDriveHeadReg := $A0 or ((bDriveNum and 1) shl 4);
bDriveHeadReg := $A0;
bCommandReg := $EC;
end;
end;
if not DeviceIoControl(hDevice, $0007C088, @SCIP, SizeOf(TSendCmdInParams) - 1,
@aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil) then Exit;
finally
CloseHandle(hDevice);
end;
with PIdSector(@IdOutCmd.bBuffer)^ do begin
ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber));
(Pchar(@sSerialNumber) + SizeOf(sSerialNumber))^ := #0;
Result := Pchar(@sSerialNumber);
end;
end;
楼主看看吧