如何调用GetVolumeInformation获得磁盘序列号

putinit 2003-04-10 02:02:32
如何在VFP中调用GetVolumeInformation获得磁盘序列号
并用此序列号做所编软件的注册码?
...全文
411 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eastunfail 2003-06-12
  • 打赏
  • 举报
回复
嗯,用GetVolumeInformation得到的不是磁盘序列好,而是卷标序列号,格式化后就会改变的。
erp2 2003-06-12
  • 打赏
  • 举报
回复
看看下面的控件吧取所有电脑硬件的序列号码:
http://www.csdn.net/cnshare/soft/15/15890.shtm
mac地址只要不是人为改,应该是全世界唯一的。
不过这个版本只能在delphi6.0下使用。
ahjoe 2003-04-10
  • 打赏
  • 举报
回复
网上一搜一大把。
wbgigi 2003-04-10
  • 打赏
  • 举报
回复
Delphi中是这样的,vfp当中就不清楚了。呵呵
unit hdid;

interface

uses
windows, controls,sysutils,forms;
//, graphics, dialogs, classes, messages,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
thdidform = class(tform)
private
{ private declarations }
public

{ public declarations }
end;

var
hdidform: thdidform;
function getidediskserialnumber : string;

implementation

{$r *.dfm}
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;

function getidediskserialnumber : string;

var
hdevice : thandle;
cbbytesreturned : dword;
pindata : psendcmdinparams;
poutdata : pointer; // psendcmdoutparams
buffer : array[0..buffersize-1] of byte;
srbcontrol : tsrbiocontrol absolute buffer;
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
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));
setstring(result,sserialnumber,sizeof(sserialnumber));
end;
end;

end.

//win98要 c:\windows\system\的smartvsd.vxd
//copy to c:\windows\system\iosubsys
//reboot your computer and ok
//2000 and nt do not need
得到硬盘物理序号:

hdsn:=trim(getidediskserialnumber);

putinit 2003-04-10
  • 打赏
  • 举报
回复
有做过的么?

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧