bcb 如何读取硬盘序列号
根据给定的信息,本文将详细解释如何在BCB(Borland C++ Builder)环境中实现硬盘序列号的读取功能。此过程涉及底层硬件访问、操作系统API调用以及特定的数据结构处理。 ### BCB环境介绍 BCB是Borland公司开发的一款用于Windows平台的应用程序开发工具。它支持多种编程语言,特别是C++。与Delphi类似,BCB提供了丰富的组件库和编译器工具链,便于快速构建高性能的应用程序。 ### 目标:获取硬盘序列号 硬盘序列号是存储设备上独一无二的标识符,常用于系统管理和硬件识别。在本例中,我们将通过调用`GetIdeDiskSerialNumber()`函数来实现这一目标。该函数利用了Windows API和其他辅助结构来完成硬盘序列号的读取。 ### 使用的API及数据结构 为了实现上述目标,我们需要了解并使用以下API和数据结构: 1. **TSrbIoControl** 结构体: - `HeaderLength`: 头部长度。 - `Signature`: 签名数组。 - `Timeout`: 超时时间。 - `ControlCode`: 控制代码。 - `ReturnCode`: 返回代码。 - `Length`: 数据长度。 2. **TIDERegs** 结构体: - `bFeaturesReg`: 特性寄存器。 - `bSectorCountReg`: 扇区计数寄存器。 - `bSectorNumberReg`: 扇区编号寄存器。 - `bCylLowReg`: 柱面低位寄存器。 - `bCylHighReg`: 柱面高位寄存器。 - `bDriveHeadReg`: 驱动/磁头寄存器。 - `bCommandReg`: 命令寄存器。 - `bReserved`: 保留字段。 3. **TSendCmdInParams** 结构体: - `cBufferSize`: 缓冲区大小。 - `irDriveRegs`: IDE寄存器。 - `bDriveNumber`: 驱动器编号。 - `bReserved`: 保留字段。 - `dwReserved`: 保留字段。 - `bBuffer`: 缓冲区。 4. **TIdSector** 结构体: - `wGenConfig`: 通用配置。 - `wNumCyls`: 柱面数量。 - `wReserved`: 保留字段。 - `wNumHeads`: 磁头数量。 - `wBytesPerTrack`: 每磁道字节数。 - `wBytesPerSector`: 每扇区字节数。 - `wSectorsPerTrack`: 每磁道扇区数。 - `wVendorUnique`: 厂商特定数据。 - `sSerialNumber`: 序列号。 - `wBufferType`: 缓冲区类型。 - `wBufferSize`: 缓冲区大小。 - `wECCSize`: ECC大小。 - `sFirmwareRev`: 固件版本。 - `sModelNumber`: 型号编号。 - `wMoreVendorUnique`: 更多厂商特定数据。 - `wDoubleWordIO`: 双字I/O。 - `wCapabilities`: 能力。 - `wReserved1`: 保留字段。 - `wPIOTiming`: PIO定时。 - `wDMATiming`: DMA定时。 - `wBS`: BS。 - `wNumCurrentCyls`: 当前柱面数。 - `wNumCurrentHeads`: 当前磁头数。 - `wNumCurrentSectorsPerTrack`: 当前每磁道扇区数。 - `ulCurrentSectorCapacity`: 当前扇区容量。 - `wMultSectorStuff`: 多扇区数据。 - `ulTotalAddressableSectors`: 总可寻址扇区数。 - `wSingleWordDMA`: 单字DMA。 - `wMultiWordDMA`: 多字DMA。 - `bReserved`: 保留字段。 ### 实现步骤 1. **初始化结构体**: - 创建`TSrbIoControl`、`TIDERegs`和`TSendCmdInParams`实例,并根据需要填充这些结构体。 2. **设置IDE命令**: - 在`TIDERegs`结构体中的`bCommandReg`字段设置IDE命令码,通常为`IDE_ID_FUNCTION`。 3. **发送IO控制请求**: - 使用`IOCTL_SCSI_MINIPORT`或`IOCTL_SCSI_MINIPORT_IDENTIFY`向操作系统发送IO控制请求,传递之前准备好的`TSrbIoControl`和`TSendCmdInParams`结构体。 4. **处理返回结果**: - 获取操作系统的返回结果,其中包含了硬盘信息,包括序列号等。 - 通过`TIdSector`结构体解析这些信息,特别关注`sSerialNumber`字段。 ### 示例代码片段 下面提供了一个简化的示例代码,展示了如何定义相关结构体以及调用必要的函数: ```pascal function GetIdeDiskSerialNumber: string; var SrbIoControl: TSrbIoControl; SendCmdInParams: TSendCmdInParams; IdSector: TIdSector; begin // 初始化结构体 FillChar(SrbIoControl, SizeOf(SrbIoControl), 0); FillChar(SendCmdInParams, SizeOf(SendCmdInParams), 0); // 设置控制代码 SrbIoControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY; // 设置IDE命令 SendCmdInParams.irDriveRegs.bCommandReg := IDE_ID_FUNCTION; // 发送IO控制请求 DeviceIoControl(hDevice, SrbIoControl.ControlCode, @SendCmdInParams, SizeOf(SendCmdInParams), @IdSector, IDENTIFY_BUFFER_SIZE, nil, nil); // 提取序列号 Result := IdSector.sSerialNumber; end; ``` ### 总结 通过以上介绍和示例代码,我们了解了如何在BCB环境下利用Windows API获取硬盘序列号的过程。需要注意的是,此类操作涉及到底层硬件访问,可能会对系统稳定性产生影响,因此在实际应用中需谨慎处理。此外,不同硬件和驱动程序的具体实现可能有所差异,开发者在实践中还需根据实际情况调整代码。
使用函数
GetIdeDiskSerialNumber();//返回硬盘号。
具体的Unit2.pas文件。
unit unit2;
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
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;
剩余6页未读,继续阅读
- new_BCBER2013-05-22是DELPHI的啊
- luyang83172014-07-22好像不能用 不过还是谢谢分享
- LngDotin2014-02-12Delphi 的,在 BCB 中 File → Include Unit Hdr... 无法加入,不知为什么?
- Lizhan022012-04-17我刚下载了,发现获取不到硬盘的序列号,令人失望
- hslx_2012-08-01好像在WIN7、windows2003很多情况下不能正确的获取序列号。
- 粉丝: 2
- 资源: 11
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助