关于硬盘序号、主板信息、CPU ID

关于硬盘序号、主板信息、CPU ID,从大富翁上摘抄整理如下:

一、获取硬盘序列号:(遗失了出处,向作者致歉并表示感谢!)
//硬盘序列号的获取
function GetHDNum:PChar;stdcall;
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;
var
  hDevice : THandle;
  cbBytesReturned : DWORD;
  pInData : PSendCmdInParams;
  pOutData : Pointer; // PSendCmdOutParams
  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( '//./Scsi0:', 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
          //win98要 c:/windows/system/的smartvsd.vxd
          //copy to c:/windows/system/iosubsys
          //reboot your computer and ok
   hDevice := CreateFile( '//./SMARTVSD', 0, 0, nil , CREATE_NEW, 0, 0 );
   if hDevice=INVALID_HANDLE_VALUE then
     Exit;
   try
     pInData := PSendCmdInParams(@Buffer);
     pOutData := @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) );
    (PChar(@sSerialNumber)+SizeOf(sSerialNumber))^ := #0;
    Result := PChar(@sSerialNumber);
  end;
end;
 
二、获取cpuID的。
/
// (c) NPS, 1997        - Idea, realisation, adoptation IsCPUID_Available) //
//                        kvk@estpak.ee                                    //
// (c) Alex Abreu, 1997 - IsCPUID_Available source and idea                //
//                        simonet@bhnet.com.br                             //
/

interface

uses
  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[I] := -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.

三、获取主板信息及CPU ID的:
ID=1792473, 发贴富翁: fz97530, 发贴时间:2003-4-22 5:03:00unit MBCPUID;

interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,DsgnIntf;

type
  TMBCPUID = class(TComponent)
  private
   FAbout  : string;
    FMBinfo: string;
    FCPUID: string;

  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner:TComponent); override;
    procedure Loaded; override;
    destructor Destroy; override;
    procedure ShowAbout;
  published

  property About: string read FAbout write FAbout stored False;
  property GetMBinfo :string read FMBinfo;
  property GetCPUID :string read FCPUID ;
  { Published declarations }
  end;

procedure Register;

implementation
  const
 ID_BIT = $200000;   // EFLAGS ID bit
type
 TCPUID = array[1..4] of Longint;
     { Private declarations }
type
  TAboutProperty = class(TPropertyEditor)
  public
    procedure Edit; override;
    function GetAttributes: TPropertyAttributes; override;
    function GetValue:string; override;
  end;

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 GetCPUIDSN : 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;

procedure Register;
begin
  RegisterComponents('Samples', [TMBCPUID]);
  RegisterPropertyEditor (TypeInfo (String), TMBCPUID,
                         'About', TAboutProperty);
end;

constructor TMBCPUID.Create(AOwner:TComponent);
begin
  inherited Create(AOwner);
end;

procedure TMBCPUID.Loaded;
var
 CPUID : TCPUID;
 mbinf:Pchar;
 i:integer;
begin
  inherited Loaded;  { always call the inherited Loaded first! }
  FAbout:='读主板编号,CPUID控件,张阳制作,必属精品';
  if IsCPUID_Available then  CPUID:=GetCPUIDSN else begin
//早期CPU无ID
    CPUID[1] := 1528;
    CPUID[4] := 24682468;
  end;  
  FCPUID:=IntToHex((CPUID[1]+CPUID[4]),8);
  mbinf:=Pchar(Ptr($FEC71));
  for i:=11 to  LENGTH(string(mbinf)) do
    FMBinfo:=FMBinfo+mbinf[i];  //次编号前十一位是Bios升级日期,舍掉
end;

destructor TMBCPUID.Destroy;
begin
  inherited Destroy;
end;

procedure TAboutProperty.Edit;
begin
  TMBCPUID(GetComponent(0)).ShowAbout;
end;
function TAboutProperty.GetAttributes: TPropertyAttributes;
begin
  GetAttributes := [paDialog, paReadOnly];
end;

function TAboutProperty.GetValue: String;
begin
  GetValue := '(About)';
end;

procedure TMBCPUID.ShowAbout;
var
  msg : string;
const
  cr = chr (13);
begin
  msg  := '读主板编号,CPUID控件' + cr + 'FOR D4,D5,D6,CB4,CB5' + cr;
  msg  := msg + 'WIN9X/ME/NT/2K/XP' + cr + cr;
  msg  := msg + 'Copyright 2001 MoonSoft' + cr+'   张阳制作,必属精品!' + cr;
  msg  := msg + 'E-mail:cdlock@21cn.com' + cr;
  Application.Messagebox(pchar(msg ),'版本提示(最终版)',MB_OK );
end;
end.

以上摘录,本人未曾验证,仅供参考。。。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值