网上有这种代码了,只是因为写的较早,有些地方写的不那么言简意赅,而且在XE后的版本中有问题(因为Unicode字符的关系)

下面是精简修改过的代码,只取第一块硬盘的序列号,Win7 + XE 测试通过。需要先安装JwApi函数库,因为有些结构体在库中有声明了

unit uGetHDSN;

interface

uses

Windows, JwaWinIoctl;

function GetIdeSerialNumber: AnsiString;

implementation

type

TIdSector = packed record

wGenConfig: USHORT;

wNumCyls: USHORT;

wReserved: USHORT;

wNumHeads: USHORT;

wBytesPerTrack: USHORT;

wBytesPerSector: USHORT;

wSectorsPerTrack: USHORT;

wVendorUnique: array [0 .. 2] of USHORT;

sSerialNumber: array [0 .. 19] of AnsiChar;

wBufferType: USHORT;

wBufferSize: USHORT;

wECCSize: USHORT;

sFirmwareRev: array [0 .. 7] of AnsiChar;

sModelNumber: array [0 .. 39] of AnsiChar;

wMoreVendorUnique: USHORT;

wDoubleWordIO: USHORT;

wCapabilities: USHORT;

wReserved1: USHORT;

wPIOTiming: USHORT;

wDMATiming: USHORT;

wBS: USHORT;

wNumCurrentCyls: USHORT;

wNumCurrentHeads: USHORT;

wNumCurrentSectorsPerTrack: USHORT;

ulCurrentSectorCapacity: ULONG;

wMultSectorStuff: USHORT;

ulTotalAddressableSectors: ULONG;

wSingleWordDMA: USHORT;

wMultiWordDMA: USHORT;

bReserved: array [0 .. 127] of Byte;

end;

PIdSector = ^TIdSector;

const

IDE_ATA_IDENTIFY = $EC;

function LittleToBig(Data: Word): Word;

asm

xchg ah, al

end;

function GetIdeSerialNumber: AnsiString;

var

hDevice: THandle;

Size, cbBytesReturned: DWORD;

SCIP: TSendCmdInParams;

SCOP: PSendCmdOutParams;

P: PWORD;

I: Integer;

begin

Result := '';

hDevice := CreateFile('\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or

FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);

if hDevice = INVALID_HANDLE_VALUE then

Exit;

Size := SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE - 1;

SCOP := AllocMem(Size);

SCIP.irDriveRegs.bCommandReg := IDE_ATA_IDENTIFY;

if DeviceIoControl(hDevice, SMART_RCV_DRIVE_DATA, @SCIP, SizeOf(TSendCmdInParams) - 1, SCOP, Size,

cbBytesReturned, nil) = False then

begin

FreeMem(SCOP);

CloseHandle(hDevice);

Exit;

end;

// 处理一下序列号在内存中的顺序

with PIdSector(@SCOP^.bBuffer[0])^ do

begin

SetLength(Result, Length(sSerialNumber));

P := @Result[1];

CopyMemory(P, @sSerialNumber[0], Length(sSerialNumber));

for I := 1 to Length(sSerialNumber) div 2 do

begin

P^ := LittleToBig(P^);

Inc(P);

end;

end;

FreeMem(SCOP);

end;

end.

windows c语言 sata 序列号,【Delphi】获取IDE/SATA硬盘序列号相关推荐

  1. Linux下获取CPUID、硬盘序列号与MAC地址

    ioctl系统调用,具体的调用方法,请查看手册页 获取CPUID 按照网上提供的说明,CPUID并不是所有的Intel CPU都支持的.如果支持,汇编调用为:eax置0000_0003,调用cpuid ...

  2. linux获取机器cpuid地址函数,Linux下获取CPUID、硬盘序列号与MAC地址

    在很多系统软件的开发中,需要使用一些系统的唯一性信息.所以,得到主机的CPUID.硬盘序列号及网卡的MAC地址,就成个一件很重要的应用. 本人经过一番google即自己的钻研,基本上实现了这几个功能. ...

  3. Python获取硬件信息(硬盘序列号,CPU序列号)

    原文衔接 https://www.cnblogs.com/blog-rui/p/12108072.html pip install wmi pip install pywin32 import wmi ...

  4. Windows查询计算机设备序列号、MAC地址和硬盘序列号

    1 进入命令提示符 搜索cmd,以管理员身份打开命令提示符 2 查询设备序列号 输入命令 wmic bios get serialnumber 返回的字符串即为设备序列号(SerialNumber) ...

  5. java获取唯一序列号,Android 获取本机唯一序列号 和可变UUID方法

    UUID+设备号序列号 唯一识别码(不可变) private String getMyUUID(){ final TelephonyManager tm = (TelephonyManager) ge ...

  6. cpuid linux,Linux下获取CPUID、硬盘序列号与MAC地址(2)

    思路明确了,以下为实现代码: static int getdiskid (char *id, size_t max) { int fd; struct hd_driveid hid; FILE *fp ...

  7. xp计算机硬盘序列号,发表一个最简单的XP以上系统中获取CPUID、硬盘序列号、BIOS序列号等等的函数!(100分)...

    //uses ActiveX, ComObj; //这个函数使用了WMI,而且只获取第一个硬件/软件设置的信息. //用户可以根据需要自行修改. function GetWMIProperty(WMI ...

  8. linux c 获取 多个硬盘序列号_veket系统中使用GParted进行硬盘分区

    Veket Linux操作系统具备小巧,占用资源少,便携方便.安装方便,我们可以将其安装到电脑的硬盘,或者虚拟机中体验一把.如果家里有老式的闲置的电脑,将该系统安装到老式电脑,看看电影,上上网,使用下 ...

  9. 转另一个获取硬盘序列号的方法

    原谅转自:http://blog.sina.com.cn/s/blog_57dff12f0100d5so.html #define  DFP_GET_VERSION                   ...

  10. python获取本机 ip地址、mac地址(物理地址)、计算机名、硬盘序列号、CPU序列号、主板序列号、bios序列号、bios uuid号

    文章目录 python获取本机IP地址.mac地址(物理地址).计算机名 物理地址 计算机名.ip地址 硬盘序列号 CPU序列号 主板序列号 bios序列号 bios uuid号 python获取本机 ...

最新文章

  1. 梦断代码阅读笔记之一
  2. lwip 开发 sntp 与 tcp 不能同时工作的奇怪问题
  3. Python: max和min函数的高级使用
  4. 不容错过的8个持续集成工具
  5. 经典网页设计:10个响应式设计的国外购物网站
  6. 进入前端开发这个领域 ,请问如何进行系统的学习?
  7. JS使用XMLHttpRequest对象POST收发JSON格式数据
  8. 10-礼帽与黑帽操作
  9. 计算机组成原理随笔(一)
  10. PAT (Basic Level) Practice (中文)1022 D进制的A+B (20 分)
  11. 【CCCC】L3-021 神坛 (30分)计算几何+求三角形面积(极角排序)
  12. 游戏服务器信息未初始化,游戏服务器初始化
  13. 《编程之美》---求二叉树中节点的最大距离
  14. You need to use a Theme.AppCompat theme
  15. linux(ubantu)系统如何安装vim编辑器以及如何使用vim
  16. 好笑的GIF动态表情包怎么制作
  17. Microsoft edge视频(广告)加速播放
  18. Zuul网关拦截器配置
  19. edu邮箱怎么申请一个1T的onedrive
  20. 两化融合给企业带来的实际意义

热门文章

  1. 光线微弯传感器matlab仿真,光纤压力与位移传感特性
  2. 李宏毅深度学习HW2 收入预测 (logistic regression)
  3. matlab绘图颜色RGB
  4. 项目周例会会议纪要模板
  5. python解压并另存 .bz2文件的方法
  6. Java设计模式总结
  7. 国内大公司的开源项目一览表(包含mysql读写分离等)
  8. Robocode:基础知识及入门示例
  9. 利用Proteus 8.9运行stm32最简单的跑马灯程序
  10. 【李宏毅机器学习HW2】