各位老兄,我急需一个获取cpuid的程序,
我转贴了一位仁兄的代码,但我不知该如何让他返回一个id的字符值
procedure GetCpuInfo;
var R: array[0..19] of Char;
var CpuID: Integer;
begin
  FillChar(R, 20, 0);
  asm
    mov eax, 0
    db 0fh, 0a2h               // 其实就是cpuid汇编指令
    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;procedure TForm1.Button1Click(Sender: TObject);
begin
  GetCpuInfo;
end;
================
有别的好方法也行啊!!
另外,谁知道如何判断系统是98还是2000?主要是获取biosid的缘故!再
2000下不行,如果有好办法快告诉小弟吧!
急急急!!!!!

解决方案 »

  1.   

    cpuid和cpu序列号有什麽区分之处?
    要做加密的话应该提那个?
      

  2.   

    应该在主程序里也定义:
    var CpuID: Integer;procedure TForm1.Button1Click(Sender: TObject);
    begin
      GetCpuInfo;
    SHOWMESSAGE(INTTOSTR(CPUID));
    end;
      

  3.   

    多谢了,
    我再超级猛料中看了一则获取磁盘id的实例,但我提取出来却是空的,但也没报错信息,请帮忙给我看一下吧!另外,这个磁盘id是否是唯一的?磁盘格式化后,提取出来的还一样吗?
    事例如下:
    unit Unit_Main;
    interface
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls;
    type
    TSrbIoControl = packed record
    HeaderLength: ULONG;
    Signature: array[0..7] of Char;
    Timeout: ULONG;
    ControlCode: ULONG;
    ReturnCode: ULONG;
    Length: ULONG;
    end;
    SRB_IO_CONTROL = TSrbIoControl;
    PSrbIoControl = ^TSrbIoControl;
    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. Must be zero.
    end;
    IDEREGS = TIDERegs;
    PIDERegs = ^TIDERegs;
    TSendCmdInParams = packed record
    cBufferSize: DWORD;
    irDriveRegs: TIDERegs;
    bDriveNumber: Byte;
    bReserved: array[0..2] of Byte;
    dwReserved: array[0..3] of DWORD;
    bBuffer: array[0..0] of Byte;
    end;
    SENDCMDINPARAMS = TSendCmdInParams;
    PSendCmdInParams = ^TSendCmdInParams;
    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: ULONG;
    wMultSectorStuff: Word;
    ulTotalAddressableSectors: ULONG;
    wSingleWordDMA: Word;
    wMultiWordDMA: Word;
    bReserved: array[0..127] of Byte;
    end;
    PIdSector = ^TIdSector;
    const
    IDE_ID_FUNCTION = $EC;
    IDENTIFY_BUFFER_SIZE = 512;
    DFP_RECEIVE_DRIVE_DATA = $0007C088;
    IOCTL_SCSI_MINIPORT = $0004D008;
    IOCTL_SCSI_MINIPORT_IDENTIFY = $001B0501;
    DataSize = sizeof(TSendCmdInParams) - 1 + IDENTIFY_BUFFER_SIZE;
    BufferSize = SizeOf(SRB_IO_CONTROL) + DataSize;
    W9xBufferSize = IDENTIFY_BUFFER_SIZE + 16;
    type
    TForm_Main = class(TForm)
    Edit_HardDiskNumber: TEdit;
    Label1: TLabel;
    Button_Get: TButton;
    procedure Button_GetClick(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;
    var
    Form_Main: TForm_Main;
    implementation
    {$R *.dfm}
    function GetIdeDiskSerialNumber: string;
    type
    TSrbIoControl = packed record
    HeaderLength: ULONG;
    Signature: array[0..7] of Char;
    Timeout: ULONG;
    ControlCode: ULONG;
    ReturnCode: ULONG;
    Length: ULONG;
    end;
    SRB_IO_CONTROL = TSrbIoControl;
    PSrbIoControl = ^TSrbIoControl;
    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;
    IDEREGS = TIDERegs;
    PIDERegs = ^TIDERegs;
    TSendCmdInParams = packed record
    cBufferSize: DWORD; // Buffer size in bytes
    irDriveRegs: TIDERegs; // Structure with drive register values.
    bDriveNumber: Byte; // Physical drive number to send command to (0,1,2,3).
    bReserved: array[0..2] of Byte; // Reserved for future expansion.
    dwReserved: array[0..3] of DWORD; // For future use.
    bBuffer: array[0..0] of Byte; // Input buffer.
    end;
    SENDCMDINPARAMS = TSendCmdInParams;
    PSendCmdInParams = ^TSendCmdInParams;
    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: ULONG;
    wMultSectorStuff: Word;
    ulTotalAddressableSectors: ULONG;
    wSingleWordDMA: Word;
    wMultiWordDMA: Word;
    bReserved: array[0..127] of Byte;
    end;
    PIdSector = ^TIdSector;
    const
    IDE_ID_FUNCTION = $EC;
    IDENTIFY_BUFFER_SIZE = 512;
    DFP_RECEIVE_DRIVE_DATA = $0007C088;
    IOCTL_SCSI_MINIPORT = $0004D008;
    IOCTL_SCSI_MINIPORT_IDENTIFY = $001B0501;
    DataSize = sizeof(TSendCmdInParams) - 1 + IDENTIFY_BUFFER_SIZE;
    BufferSize = SizeOf(SRB_IO_CONTROL) + DataSize;
    W9xBufferSize = IDENTIFY_BUFFER_SIZE + 16;
    var
    hDevice: THandle;
    cbBytesReturned: DWORD;
    pInData: PSendCmdInParams;
    pOutData: Pointer; // PSendCmdInParams;
    Buffer: array[0..BufferSize - 1] of Byte;
    srbControl: TSrbIoControl absolute Buffer;
    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 := '';
    FillChar(Buffer, BufferSize, #0);
    if Win32Platform = VER_PLATFORM_WIN32_NT then
    begin // Windows NT, Windows 2000
    // Get SCSI port handle
    hDevice := CreateFile('\.:', GENERIC_READ or GENERIC_WRITE,
    FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
    if hDevice = INVALID_HANDLE_VALUE then Exit;
    try
    srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL);
    System.Move('SCSIDISK', srbControl.Signature, 8);
    srbControl.Timeout := 2;
    srbControl.Length := DataSize;
    srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY;
    pInData := PSendCmdInParams(PChar(@Buffer) + SizeOf(SRB_IO_CONTROL));
    pOutData := pInData;
    with pInData^ do
    begin
    cBufferSize := IDENTIFY_BUFFER_SIZE;
    bDriveNumber := 0;
    with irDriveRegs do
    begin
    bFeaturesReg := 0;
    bSectorCountReg := 1;
    bSectorNumberReg := 1;
    bCylLowReg := 0;
    bCylHighReg := 0;
    bDriveHeadReg := $A0;
    bCommandReg := IDE_ID_FUNCTION;
    end;
    end;
    if not DeviceIoControl(hDevice, IOCTL_SCSI_MINIPORT, @Buffer, BufferSize, @Buffer, BufferSize, cbBytesReturned, nil) then Exit;
    finally
    CloseHandle(hDevice);
    end;
    end
    else
    begin // Windows 95 OSR2, Windows 98
    hDevice := CreateFile('\.', 0, 0, nil, CREATE_NEW, 0, 0);
    if hDevice = INVALID_HANDLE_VALUE then Exit;
    try
    pInData := PSendCmdInParams(@Buffer);
    pOutData := PChar(@pInData^.bBuffer);
    with pInData^ do
    begin
    cBufferSize := IDENTIFY_BUFFER_SIZE;
    bDriveNumber := 0;
    with irDriveRegs do
    begin
    bFeaturesReg := 0;
    bSectorCountReg := 1;
    bSectorNumberReg := 1;
    bCylLowReg := 0;
    bCylHighReg := 0;
    bDriveHeadReg := $A0;
    bCommandReg := IDE_ID_FUNCTION;
    end;
    end;
    if not DeviceIoControl(hDevice, DFP_RECEIVE_DRIVE_DATA, pInData, SizeOf(TSendCmdInParams) - 1, pOutData, W9xBufferSize, cbBytesReturned, nil) then Exit;
    finally
    CloseHandle(hDevice);
    end;
    end;
    with PIdSector(PChar(pOutData) + 16)^ do
    begin
    ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber));
    SetString(Result, sSerialNumber, SizeOf(sSerialNumber));
    end;
    end;
    procedure TForm_Main.Button_GetClick(Sender: TObject);
    begin
    Edit_HardDiskNumber.Text := GetIdeDiskSerialNumber;
    end;
    end.