在dos下怎么取得CPU和硬盘分区的序列号吗?(150分)

  • 主题发起人 主题发起人 呆猫
  • 开始时间 开始时间
Pentium以后cpu新增CPUID指令(机器码0FH,0A 2H)来识别cpu的序列号.
我原来用的masm5.0好像还不支持,不知道delphi里怎么样?
 
如果在NT4.0下,可以用注册表:
HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/System/MultifunctionAdapter
下用数字命名的目录的最后一个下面有DiskController子目录,下面的以数字命名
的目录对应硬盘控制器,下面还有DiskPeripheral子目录,这个目录下还有以数字
命名的子目录,对应各磁盘,下面的Identifier项值对应磁盘的SN.每次NT启动时都
重新填写这个值,所以基本可以保证使用安全.我的一个程序就是用这种方法做的.
95下好象也应该有,但具体路径没有考证过.
下面是我的机器上的例子:
HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/System/MultifunctionAdapter/
2/DiskController/0/DiskPeripheral/0
^ ^ ^
这是多功能卡的 这是第一个磁盘 这是第一个磁盘
磁盘控制器编号 控制器

下有键名叫Identifier,类型为字符串,值3d06c81b-00000000-A

以上引自<a href="http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=95684">此处</a>lhz的发言
 
//haha
我的发言竟然被引用:) 这可是很难得的哟:) 值得庆贺 :)

不过呆猫兄大概想要DIR列出来的那个(XXXX-XXXX)Serial No.
这个序列号在磁盘的逻辑0扇区(用INT 25h/26h操作的那个),
具体位置我也不清除,但非常容易找出来的,用DIR+DiskEdit就
可以解决了.

另外请问茶叶蛋兄:EAX中放哪个值才能取得CPU的Serial NO?
Intel公开的EAX的参数没有这个值,只有几个检测型号和指令
兼容性的参数 :(
 
to lhz:
因为我用的masm5.0不支持,所以没用过,嘻嘻. *_^
还有一个原因,是我一直使用Cyrix的芯片,
用cpuid指令一律认为是486,我一气之下转用监测倍频了.
待我回家找找看.手头只有监测关于Cyrix芯片的主频的文章,
要不要?
 
哈哈,这个得问我了!CPUID号我可以取得,不过这个号只有种类,
INTEL在每种CPU上只有一个号(即型号,而没有象网卡那样的全局
节点号)。
分区序号:就是Volume Serial Number 3d2f-1112?
我也有现成的程序(C语言),CPUID也有程序(C语言)
想要的留下妹妹。
 
深度中有CPUID控件
 
对不起,昨天没找到.
也不打算找了(正在疯狂编程中).
我去深度看看
 
这儿:
type
TCPUID = array[1..4] of Longint;
TVendor = array [0..11] of char;

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.BitBtn1Click(Sender: TObject);
var
CPUID : TCPUID;
I : Integer;
S : TVendor;
begin
for I := Low(CPUID) to High(CPUID) do CPUID := -1;
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);
S := GetCPUVendor;
Label5.Caption := S;
end;
 
分区序号可用DOS中断调用,哪个中断号我忘了。
 
给你做个参考,在Win32x下完整的硬盘信息读取控件。
unit DiskInfo;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type string1 = string[1];
type string30 = string[30];

type
TDiskInfo = class(TComponent)
private
FSectorsPerCluster :DWORD; // holds the sectors per cluster
FBytesPerSector :DWORD; // holds the bytes per sector
FFreeClusters :DWORD; // holds the number of free clusters
FClusters :DWORD; // holds the total number of disk clusters
FDiskFreeSpace :DWORD; // holds the total free space
FTotalDiskSpace :DWORD; // holds total disk capacity
FDrive :string1;
FDriveType :string30;
FVolumeName :string;
FSerialNumber :string;
FFileSystemType :string;
function GetDriveTyp :string30;
procedure SetDrive(value:string1);
protected
{ Protected declarations }
public
constructor create(AOwner:TComponent); override;
published
{ Published declarations }
property Drive :string1 read FDrive write setdrive;
property SectorsPerCluster :DWORD read FSectorsPerCluster;
property BytesPerSector :DWORD read FBytesPerSector;
property FreeClusters :DWORD read FFreeClusters;
property Clusters :DWORD read FClusters;
property DiskFreeSpace :DWORD read FDiskFreeSpace;
property TotalDiskSpace :DWORD read FTotalDiskSpace;
property DriveType :string30 read GetDriveTyp;
property VolumeName :string read FVolumeName;
property SerialNumber :string read FSerialNumber;
property FileSystemType :string read FFileSystemType;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Smart', [TDiskInfo]);
end;

constructor TDiskInfo.create(AOwner:TComponent);
begin
inherited create(AOwner);
setdrive('C');
end;

procedure TDiskInfo.SetDrive(value:string1);
var fulldrive :string[3];
tmp_drive :array[0..2] of char;
Tmp_SectorsPerCluster, // holds the sectors per cluster
Tmp_BytesPerSector, // holds the bytes per sector
Tmp_FreeClusters, // holds the number of free clusters
Tmp_Clusters :DWORD; // holds the total number of disk clusters
VolName :array[0..255] of Char; // holds the volume name
SerialNumber :DWORD; // holds the serial number
MaxCLength :DWORD; // holds the maximum file component length
FileSysFlag :DWORD; // holds file system flags
FileSysName :array[0..255] of Char; // holds the name of the file system
begin
fdrive:=value;
fulldrive:=value + ':/';
strpcopy(tmp_drive,fulldrive);
if GetDiskFreeSpace(tmp_drive,Tmp_SectorsPerCluster,Tmp_BytesPerSector,
Tmp_FreeClusters,Tmp_Clusters) then
begin
FSectorsPerCluster:=Tmp_SectorsPerCluster;
FBytesPerSector:=Tmp_BytesPerSector;
FFreeClusters:=Tmp_FreeClusters;
FClusters:=Tmp_Clusters;
FDiskFreeSpace:=Tmp_FreeClusters*Tmp_BytesPerSector*Tmp_SectorsPerCluster;
FTotalDiskSpace:=Tmp_Clusters*Tmp_BytesPerSector*Tmp_SectorsPerCluster;
end;

{retrieve the volumn information}
GetVolumeInformation(tmp_drive, VolName, 255, @SerialNumber, MaxCLength,
FileSysFlag, FileSysName, 255);

FVolumeName:=VolName;
FSerialNumber:=IntToHex(SerialNumber,8);
FFileSystemType:=FileSysName;
end;

function TDiskInfo.GetDriveTyp :string30;
var fulldrive :string[3];
tmp_drive :array[0..2] of char;
begin
fulldrive:=fdrive + ':/';
strpcopy(tmp_drive,fulldrive);
{retrieve the drive type}
case GetDriveType(tmp_drive) of
DRIVE_UNKNOWN :result:='No Type Information';
DRIVE_NO_ROOT_DIR :result:='Root Directory does not exist';
DRIVE_REMOVABLE :result:='Removable';
DRIVE_FIXED :result:='Fixed';
DRIVE_REMOTE :result:='Remote';
DRIVE_CDROM :result:='CDROM';
DRIVE_RAMDISK :result:='RamDisk';
end;
end;

end.
 
多人接受答案了。
 

Similar threads

回复
0
查看
586
不得闲
回复
0
查看
793
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部