社区
VFP
帖子详情
如何获得硬盘的序列号,
zhaoshaom
2005-04-25 08:47:27
如何获得硬盘的序列号,用于注册软件呢,有谁作过这个东西.
...全文
87
3
打赏
收藏
如何获得硬盘的序列号,
如何获得硬盘的序列号,用于注册软件呢,有谁作过这个东西.
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
lencon
2005-04-26
打赏
举报
回复
program ScsiSN;
{$APPTYPE CONSOLE}
uses
Windows, SysUtils;
//-------------------------------------------------------------
function GetDeviceHandle( sDeviceName : String ) : THandle;
begin
Result := CreateFile( PChar('\\.\'+sDeviceName),
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_EXISTING, 0, 0 )
end;
//-------------------------------------------------------------
function ScsiHddSerialNumber( DeviceHandle : THandle ) : String;
{$ALIGN ON}
type
TScsiPassThrough = record
Length : Word;
ScsiStatus : Byte;
PathId : Byte;
TargetId : Byte;
Lun : Byte;
CdbLength : Byte;
SenseInfoLength : Byte;
DataIn : Byte;
DataTransferLength : ULONG;
TimeOutValue : ULONG;
DataBufferOffset : DWORD;
SenseInfoOffset : ULONG;
Cdb : Array[0..15] of Byte;
end;
TScsiPassThroughWithBuffers = record
spt : TScsiPassThrough;
bSenseBuf : Array[0..31] of Byte;
bDataBuf : Array[0..191] of Byte;
end;
{ALIGN OFF}
var dwReturned : DWORD;
len : DWORD;
Buffer : Array[0..255] of Byte;
sptwb : TScsiPassThroughWithBuffers absolute Buffer;
begin
Result := '';
FillChar(Buffer,SizeOf(Buffer),#0);
with sptwb.spt do
begin
Length := SizeOf(TScsiPassThrough);
CdbLength := 6; // CDB6GENERIC_LENGTH
SenseInfoLength := 24;
DataIn := 1; // SCSI_IOCTL_DATA_IN
DataTransferLength := 192;
TimeOutValue := 2;
DataBufferOffset := PChar(@sptwb.bDataBuf)-PChar(@sptwb);
SenseInfoOffset := PChar(@sptwb.bSenseBuf)-PChar(@sptwb);
Cdb[0] := $12; // OperationCode := SCSIOP_INQUIRY;
Cdb[1] := $01; // Flags := CDB_INQUIRY_EVPD; Vital product data
Cdb[2] := $80; // PageCode Unit serial number
Cdb[4] := 192; // AllocationLength
end;
len := sptwb.spt.DataBufferOffset+sptwb.spt.DataTransferLength;
if DeviceIoControl( DeviceHandle, $0004d004, @sptwb, SizeOf(TScsiPassThrough), @sptwb, len, dwReturned, nil )
and ((PChar(@sptwb.bDataBuf)+1)^=#$80)
then
SetString( Result, PChar(@sptwb.bDataBuf)+4,
Ord((PChar(@sptwb.bDataBuf)+3)^) );
end;
//=============================================================
var
hDevice : THandle = 0;
sSerNum, sDeviceName : String;
begin
sDeviceName := ParamStr(1);
if sDeviceName='' then
begin
WriteLn;
WriteLn('Display SCSI-2 device serial number.');
WriteLn;
WriteLn('Using:');
WriteLn;
if Win32Platform=VER_PLATFORM_WIN32_NT then // Windows NT/2000
WriteLn(' ScsiSN PhysicalDrive0')
else
WriteLn(' ScsiSN C:');
WriteLn(' ScsiSN Cdrom0');
WriteLn(' ScsiSN Tape0');
WriteLn;
Exit;
end;
hDevice := GetDeviceHandle(sDeviceName);
if hDevice=INVALID_HANDLE_VALUE then
WriteLn('Error on GetDeviceHandle: ',SysErrorMessage(GetLastError))
else
try
sSerNum := ScsiHddSerialNumber(hDevice);
if sSerNum='' then
WriteLn('Error on DeviceIoControl: ',
SysErrorMessageGetLastError))
else
WriteLn('Device '+sDeviceName
+' serial number = "',sSerNum,'"');
finally
CloseHandle(hDevice);
end;
end.
--------------------------------------------------------------------------------
获取光盘序列号
uses MMSystem, MPlayer;
procedure TForm1.Button1Click(Sender: TObject);
var
mp : TMediaPlayer;
msp : TMCI_INFO_PARMS;
MediaString : array[0..255] of char;
ret : longint;
begin
mp := TMediaPlayer.Create(nil);
mp.Visible := false;
mp.Parent := Application.MainForm;
mp.Shareable := true;
mp.DeviceType := dtCDAudio;
mp.FileName := 'D:';
mp.Open;
Application.ProcessMessages;
FillChar(MediaString, sizeof(MediaString), #0);
FillChar(msp, sizeof(msp), #0);
msp.lpstrReturn := @MediaString;
msp.dwRetSize := 255;
ret := mciSendCommand(Mp.DeviceId,
MCI_INFO,
MCI_INFO_MEDIA_IDENTITY,
longint(@msp));
if Ret <> 0 then begin
MciGetErrorString(ret, @MediaString, sizeof(MediaString));
Memo1.Lines.Add(StrPas(MediaString));
end else
Memo1.Lines.Add(StrPas(MediaString));
mp.Close;
Application.ProcessMessages;
mp.free;
end;
end.
dfwxj
2005-04-26
打赏
举报
回复
好象在QQ上已经发送给你了吧?
对的,就是上面这个函数
?getidesn() &&取第一道主盘序列号 或:?getidesn(0)
?getidesn(1) &&取第一道从盘序列号
?getidesn(2) &&取第二道主盘序列号
?getidesn(3) &&取第二道从盘序列号
十豆三
2005-04-26
打赏
举报
回复
这是转自 清风 版主的一段代码:
取得硬盘序列号的自定义函数.
*-----------------------------------
?GETIDESN()
FUNC getidesn
PARA m.i
IF PARA()=0
m.i=0
ENDI
ON ERRO RETU ''
*-- 功 能:取得系统所有硬盘参数
*-- 外部函数 - 取得当前平台和操作系统的版本信息
DECLARE INTEGER GetVersionEx IN kernel32.DLL STRING
*-- 外部函数 - 打开对象
DECLARE INTEGER CreateFile IN kernel32.DLL STRING,INTEGER,INTEGER,STRING,INTEGER,INTEGER,INTEGER
*-- 外部函数 - 关闭一个对象
DECLARE INTEGER CloseHandle IN kernel32.DLL INTEGER
*-- 外部函数 - 向设备发送控制代码。返回非零值表示成功,返回零失败
DECLARE INTEGER DeviceIoControl IN Kernel32.DLL INTEGER,INTEGER,STRING,INTEGER,STRING @,INTEGER,INTEGER @,INTEGER
*-- 定义变量
LOCAL M.hDevice,M.bIDCmd,M.lpOutBuffer,M.lpBytesReturned,M.bDfpDriveMap
*-- 操作系统版本
m.lpVersionInformation = DecToAscii(148,4)+REPLICATE(CHR(0),144)
IF GetVersionEx(@M.lpVersionInformation) = 0
RETURN ''
ENDIF
m.dwPlatformId = AsciiToDec(SUBSTR(M.lpVersionInformation,17,4))
STORE 0 TO M.hDevice,M.bDfpDriveMap
*-- 获得用于 SMART IOCTL 的句柄
DO CASE
CASE M.dwPlatformId = 1
*-- 环境 Windows 95/98/Me
m.hDevice = CreateFile("\\.\SMARTVSD",0,0,0,1,0,0)
CASE M.dwPlatformId = 2
*-- 环境 Windows NT/2000/XP
m.hDevice = CreateFile("\\.\PhysicalDrive"+STR(M.i,1),0xC0000000,3,0,3,0,0)
OTHERWISE
*-- 本程序不能运行的环境
RETURN ''
ENDCASE
IF M.hDevice = -1
RETU ''
ENDIF
*-- 获得 SMART IOCTL 版本信息
m.VersionParams = REPLICATE(CHR(0),24)
IF DeviceIoControl(M.hDevice,0x74080,0,0,@M.VersionParams,LEN(M.VersionParams),@M.lpBytesReturned,0) = 0
RETU ''
ENDIF
*-- 如果是 IDE 驱动器就发出命令
IF BITAND(AsciiToDec(SUBSTR(M.VersionParams,4,1)),1) = 1
*-- 定义数据接收缓冲区
m.OutCmd = REPLICATE(CHR(0),4)+REPLICATE(CHR(0),13)
*-- 判断是否允许执行 SMART 命令
IF BITAND(AsciiToDec(SUBSTR(M.VersionParams,4,1)),0x10) = 0
*-- 为执行 SMART 命令设置数据结构
m.scip = REPLICATE(CHR(0),4)+CHR(0xD8)+CHR(0)+CHR(0)+CHR(0x4F)+CHR(0xC2)+CHR(0xA0)+CHR(0xB0)+CHR(0)+CHR(M.i)+REPLICATE(CHR(0),19)
*-- 向驱动器发送 0xD8 命令
IF DeviceIoControl(M.hDevice,0x7c084,@M.scip,LEN(M.scip),@M.OutCmd,LEN(M.OutCmd)-1,@M.lpBytesReturned,0) # 0
*-- 设置驱动器映射标志
m.bDfpDriveMap = BITOR(M.bDfpDriveMap,1)
ELSE
RETU ''
ENDIF
ENDIF
*-- 获得本机 IDE 驱动器的扇区ID。ATAPI 驱动器则使用 0xA1 命令,其余使用 0xEC 命令。
m.bIDCmd = IIF( BITAND(AsciiToDec(SUBSTR(M.VersionParams,4,1)),1)=1,0xEC,0xA1)
*-- 设置数据结构
m.scip = DecToAscii(512,4)+REPLICATE(CHR(0),5)+CHR(0xA0)+CHR(M.bIDCmd)+CHR(0)+CHR(M.i)+REPLICATE(CHR(0),19)
*-- 读取驱动器参数
m.lpOutBuffer = M.OutCmd + REPLICATE(CHR(0),512)
IF DeviceIoControl(M.hDevice,0x7c088,@M.scip,LEN(M.scip),@M.lpOutBuffer,LEN(M.lpOutBuffer)-1,@M.lpBytesReturned,0) # 0
m.szOutBuffer = REPLICATE(CHR(0),41)
ELSE
RETU ''
ENDIF
ENDIF
*-- 关闭 SMART
CloseHandle(M.hDevice)
RETURN AsciiToString(SUBSTR(M.lpOutBuffer,37,20))
*-- 将ASCII字符串转换成十进制数
PROCEDURE AsciiToDec
LPARAMETER Bytes
LOCAL ln_i,ln_j
m.ln_j = 0
FOR M.ln_i = LEN(M.Bytes) TO 1 STEP -1
m.ln_j = M.ln_j * 256 + ASC(SUBSTR(M.Bytes,M.ln_i,1))
ENDFOR
RETURN M.ln_j
*-- 将十进制数转换成ASCII字符串
PROCEDURE DecToAscii
LPARAMETER tn_i,tn_j
LOCAL lc_i,ln_i
m.lc_i = ''
FOR M.ln_i = 1 TO M.tn_j
m.lc_i = M.lc_i + CHR(MOD(M.tn_i,256))
m.tn_i = INT(M.tn_i / 256)
ENDFOR
RETURN M.lc_i
*-- 将低位字节在前的字符串恢复正常
PROCEDURE AsciiToString
LPARAMETER tc_i
LOCAL lc_i,ln_i
m.lc_i = ''
FOR M.ln_i = 1 TO LEN(M.tc_i) STEP 2
m.lc_i = M.lc_i + SUBSTR(M.tc_i,M.ln_i+1,1) + SUBSTR(M.tc_i,M.ln_i,1)
ENDFOR
RETURN M.lc_i
引用api
获得
硬盘
序列号
.txt
引用api
获得
硬盘
序列号
获得
硬盘
序列号
delphi源码
获得
硬盘
序列号
delphi源码 //
获得
硬盘
序列号
function GetIdeSerialNumber() : PChar; stdcall; const IDENTIFY_BUFFER_SIZE = 512; type 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;
Excel公式入门实战视频课程【你学得会】
所谓的公式是人们在研究自然界物与物之间时发现的一些联系,并通过一定的方式表达出来的一种表达方法。而这里我们所说的Excel公式一般是指计算公式,包括常用的四则运算和函数的使用。通过这些运算,我们能从普通数据中得到计算结果以满足分析需求。从而进一步推敲具体的实施方案。杨老师通过《Excel公式实战视频课程【你学得会】》的课程教你如何使用Excel公式来处理数据。
Delphi在下获取
硬盘
序列号
Delphi在Win9xNT下获取
硬盘
物理
序列号
ASP编程
获得
硬盘
序列号
ASP编程
获得
硬盘
序列号
,很不错的一段代码,值得大家珍藏
VFP
2,722
社区成员
29,108
社区内容
发帖
与我相关
我的任务
VFP
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
复制链接
扫一扫
分享
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章