function GetHDSerialNumber: LongInt;
{$IFDEF WIN32}
var
pdw : pDWord;
mc, fl : dword;
{$ENDIF}
begin
{$IfDef WIN32}
New(pdw);
GetVolumeInformation(nil,nil,0,pdw,mc,fl,nil,0);
Result := pdw^;
dispose(pdw);
{$ELSE}
Result := GetWinFlags;
{$ENDIF}
end;
{$IFDEF WIN32}
var
pdw : pDWord;
mc, fl : dword;
{$ENDIF}
begin
{$IfDef WIN32}
New(pdw);
GetVolumeInformation(nil,nil,0,pdw,mc,fl,nil,0);
Result := pdw^;
dispose(pdw);
{$ELSE}
Result := GetWinFlags;
{$ENDIF}
end;
我找到的程序基本上都是在DOS下RUN.不清楚在windows9X与2000下能否實現.
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:[email protected]' + cr;
Application.Messagebox(pchar(msg ),'版本提示(最终版)',MB_OK );
end;end.
http://www.applevb.com/lib/diskio.rar
VC源码
http://www.applevb.com/DiskID.rar
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, IoCtl,
StdCtrls;type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure DirectIdentify;
procedure PrintIdSectorInfo(IdSector: TIdSector);
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.DirectIdentify;
var
hDevice: THandle;
rc: DWORD;
nIdSectorSize: LongInt;
aIdBuffer: array[0..IDENTIFY_BUFFER_SIZE - 1] of Byte;
IdSector: TIdSector absolute aIdBuffer;
begin
FillChar(aIdBuffer, SizeOf(aIdBuffer), #0);
hDevice := GetPhysicalDriveHandle(0, GENERIC_READ or GENERIC_WRITE);
{$IFDEF debug}
OutputDebugString(PChar('GetPhysicalDriveHandle return ' + IntToHex(hDevice, 8)));
{$ENDIF}
OutputDebugString(PChar('GetPhysicalDriveHandle return ' + IntToHex(hDevice, 8))); if hDevice = INVALID_HANDLE_VALUE then
begin
rc := GetLastError;
// WriteLn('Error on GetPhysicalDeviceHandle (errcode=', rc, '): ', SysErrorMessage(rc));
Memo1.Lines.Add('Error on GetPhysicalDeviceHandle (errcode=' + SysErrorMessage(rc));
end
else
try
if not SmartIdentifyDirect(hDevice, 0, IDE_ID_FUNCTION, IdSector, nIdSectorSize) then
begin
rc := GetLastError;
Memo1.Lines.Add('SMART Identify command failed (errcode=' + string(rc));
// WriteLn('SMART Identify command failed (errcode=', rc, '):');
// WriteLn(SysErrorMessage(rc));
Memo1.Lines.Add(SysErrorMessage(rc));
end
else
begin
// WriteLn('SMART IDENTIFY command is completed successfully.');
Memo1.Lines.Add('Smart Identift command is completed successfully.');
PrintIdSectorInfo(IdSector);
// WriteLn;
Memo1.Lines.Add('');
end;
finally
CloseHandle(hDevice);
end;
end;procedure TForm1.PrintIdSectorInfo(IdSector: TIdSector);
var
szOutBuffer: array[0..40] of Char;
begin
{$IFDEF debug}
OutputDebugString('PrintIdSectorInfo');
{$ENDIF} with IdSector do
begin
ChangeByteOrder(sModelNumber, SizeOf(sModelNumber)); // Change the WORD array to a BYTE array
szOutBuffer[SizeOf(sModelNumber)] := #0;
StrLCopy(szOutBuffer, sModelNumber, SizeOf(sModelNumber));
// WriteLn('Model number: ', szOutBuffer);
Memo1.Lines.Add('Model number:' + szOutBuffer);
ChangeByteOrder(sFirmwareRev, SizeOf(sFirmwareRev));
szOutBuffer[SizeOf(sFirmwareRev)] := #0;
StrLCopy(szOutBuffer, sFirmwareRev, SizeOf(sFirmwareRev));
// WriteLn('Firmware rev: ', szOutBuffer);
Memo1.Lines.Add('Firmware rev: ' + szOutBuffer); ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber));
szOutBuffer[SizeOf(sSerialNumber)] := #0;
StrLCopy(szOutBuffer, sSerialNumber, SizeOf(sSerialNumber));
// WriteLn('Serial number: ', szOutBuffer);
Memo1.Lines.Add('Serial number: ' + szOutBuffer);
end;
// WriteLn;
Memo1.Lines.Add('');
{$IFDEF debug}
OutputDebugString('PrintIdSectorInfo end');
{$ENDIF}
end;procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Clear;
Memo1.Lines.Add('-------------------------Get Hard Disk Infomation--------------------------');
DirectIdentify;
end;end.
来点简单的;