Delphi_读取硬盘的物理序列号
计算机编号、硬盘序列号和Mac地址查询方法3篇
计算机编号、硬盘序列号和Mac地址查询方法第一篇:计算机编号查询方法计算机编号,也被称为计算机名或主机名,是一组标识计算机的字符或数字组合。
计算机编号的作用是保证在联网场景中,多个计算机能够准确地识别彼此,从而实现数据传输和通信等操作。
在Windows操作系统中,计算机编号可以通过以下方法查询:1. 点击“开始”菜单,选择“计算机”或“此电脑”选项。
在打开的窗口中,右键单击鼠标,选择“属性”菜单。
2. 在弹出的窗口中,可以看到计算机的基本信息,包括计算机名称、计算机描述、工作组、操作系统等信息。
其中,计算机名称即为计算机编号或主机名。
另外,如果计算机属于某个局域网,也可以通过以下方法查询计算机编号:1. 打开“控制面板”,选择“网络和共享中心”或“网络和Internet”选项。
2. 点击“查看计算机名、域和工作组设置”选项,在打开的窗口中可以看到计算机名称或主机名以及工作组等信息。
以上方法适用于Windows操作系统。
对于其他操作系统,如Linux和macOS等,查询计算机编号的方法可能会有所不同,需要根据具体系统版本进行查询。
第二篇:硬盘序列号查询方法硬盘序列号,也被称为硬盘ID,是一组标识硬盘的字符串或数字组合。
硬盘序列号的作用是在多个硬盘中准确区分每个硬盘的身份,以便进行硬盘管理、数据备份和恢复等操作。
在Windows操作系统中,查询硬盘序列号的方法如下:1. 打开“计算机管理”,选择“存储”菜单,点击“磁盘管理”选项。
2. 在磁盘列表中,找到要查询硬盘序列号的硬盘,右键单击鼠标,选择“属性”菜单。
3. 在弹出的窗口中,选择“详细信息”选项卡,在“物理驱动器”一栏中可以看到硬盘序列号。
另外,也可以通过命令行查询硬盘序列号。
具体方法如下:1. 打开命令提示符,输入“wmic diskdrive get serialnumber”,按回车键。
2. 等待片刻,系统会自动查询显示当前硬盘的序列号信息。
基于VFP的U盘物理序列号与盘符的获取
利 益 保护 有 机 结 合 .寻 找一 条 灵 活 有 效 的解 决 途 径 ,无 疑 具 有
较 好 的应 用 市 场 。 鉴 于 U 盘 也 具 有 机 器 硬 件 的 一 些 惟 一 性 标 识 ,且 价 位 逐渐 走 低 。因 此 ,用 U 盘 替代 上 述 方 案 不 失 为一 良 策 。经 过 大 量 的实 验 ,给 出 了 一 种 基 于 V s a F x r 境 的 U i l o Po环 u 盘物 理 序 列 号 与盘 符 的析 出方 法 1 2 1 ,从 而 克 服 了前 面各 种 方 法
性 较 好 ,可适 用 于 Wid w 82 0 / PV s / n o s /0 0X / i a 7各 种 版 本 ,而 9 t
WMI 法 简 单 .但 在 Wi o sX 以下 环 境 中使 用 时 ,需 安 装 方 n w P d
相 应 插 件 由于 注 册 表 包 含 了 Wid w 在 运 行 期 间不 断 引 用 的 信 息 , no s
析 ,注 册 表 中 :
HKE L Y OCAL MACHl \ Y TE Cu r n C n r l e k e - NE S S Mk re t o to S t r S vc s Di kE u ie k s \ n m
盘 的上 述 解 决 方 案 虽 不 难 寻 觅 .但 大 多 源 于 U 盘 的 逻 辑 序 列
‘
^
^ ‘一
- ・
、
_ .
…
…
±
a
…
自 ∞
…
实用第 一 智慧 密集
… … … … … .
基于 i P的 U 盘物理序列号 与盘 符 的获取 VF
虚拟机中获取硬盘序列号的方法
虚拟机中获取硬盘序列号的方法随着虚拟化技术的不断发展,虚拟机已经成为现代化企业中运行应用程序的标准环境。
在一些特定场景下,比如多租户环境中,获取硬盘序列号有时是必须的。
因此,本文将介绍在虚拟机中获取硬盘序列号的几种方法。
方法一:使用命令行在Windows操作系统下,获取硬盘序列号的最简单方法是使用命令行工具。
步骤如下所述:1.按下“Win+R”快捷键,打开运行窗口;2.输入“cmd”并点击“确定”,打开命令行窗口;3.在命令行窗口中输入“wmic diskdrive get serialnumber”,按下回车;4.等待一段时间,输出硬盘序列号信息。
1.打开终端,输入命令“sudo hdparm -I /dev/sda”;2.在输出信息中查找Serial Number项,即硬盘序列号。
注意:在第二步中,/dev/sda为硬盘设备的路径,在某些虚拟机中可能需要根据实际情况进行修改。
方法二:利用WMI查询WMI(Windows管理信息)是Windows操作系统中的一种方式,它提供了一种方便的方式来管理本地和远程计算机。
可以使用WMI查询获取包括硬盘序列号在内的各种信息。
步骤如下:1.打开PowerShell或命令行窗口;2.在命令行窗口中输入“Get-WmiObject Win32_DiskDrive | Format-List SerialNumber”,或在PowerShell中输入“Get-WmiObject Win32_DiskDrive |Select-Object SerialNumber”。
方法三:查看注册表Windows操作系统的注册表中存储了大量的硬件和软件相关信息,包括硬盘序列号。
步骤如下:1.打开注册表编辑器,方式为“Win+R”快捷键后输入“regedit”;2.在注册表编辑器中,浏览到REG_HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\IDE\下,找到对应的IDE控制器;3.在IDE控制器项下,找到对应的硬盘设备。
硬盘物理序列号的得到方法_hemfanings
网址或邮箱: (选填)
内 容:插入表情▼ 闪光字
验证码: 请点击后输入四位验证码,字母不区分大小写
看不清?
取消回复", , 48)
For Each objItem In colItems
MsgValue = MsgValue & vbCrLf & "主板=" & objItem.SerialNumber
Next
MsgValue = MsgValue & vbCrLf & "硬盘 = " & objItem.SerialNumber
Next
'获取主板序列号
Set colItems = objWMIService.ExecQuery("Select * from
'获取CPU ID
Set colItems = objWMIService.ExecQuery("Select * from
Win32_Processor", , 48)
For Each objItem In colItems
•DELPHI中读取硬盘的物理序列号 •C++ 硬盘物理序列号
•获取硬盘物理序列号 •取得硬盘物理和逻辑序列号
•VB 利用硬盘物理序列号进行软件... •初步实现系统级拦截应用程序取硬...
48)
For Each objItem In colItems
MsgValue = MsgValue & vbCrLf & "BIOS= " & objItem.SerialNumber
硬盘序列号获取的实际操作
硬盘序列号是基本常识,然后我就学习及深入的研究硬盘序列号,在这里和大家一起探讨硬盘序列号的使用方法,希望对大家有用。
要获取硬盘序列号,需要访问注册表.实际操作如下,建立一个新的窗体,在上面添加一个标签Label1,一个按钮command1,实现:按下按钮,在标签上显示硬盘序列号.
代码:
namespace monPrj {
#region how use this?
/*
string sVol = getvol.GetVolOf("C");
*/
#endregion
public class getvol{
[DllImport("kernel32.dll")]
End Type
Private Sub Command1_Click()
Dim x As DRIVER_INFO_OK
Dim i As Long
If IsWinNT = 1 Then
i = ReadPhysicalDriveInNT(ByVal 0, ByVal VarPtr(x), ByVal 256)
Private Declare Function ReadPhysicalDriveInNT Lib "DiskID.DLL" (driveID As Long, buffer As Long, bufLen As Long) As Long
Private Type DRIVER_INFO_OK
SerialNum: LongInt;
VolLabel: Packed Array [0..10] of Char;
FileSysType: Packed Array [0..7] of Char;
Delphi编程中磁盘的操作
的变化 , 来确定软盘或光盘是否更换过。 恰
好, idw P中提供了Gto m ifra Wno s A I eVl enom — u tn i 函数来获取软盘、 o 硬盘和光盘的卷标号, 为我们实现此项功能提供了方便。 函数原型:
B 0 G t ou lfr a in O L e Vlmeno m to (
3 在T om 定义中增加一个 新的函数 . fr l 声明信息, 定义_个变量。 如下:
t p ye
To m =casT o m f r l ls(F r )
器卷标名称缓冲区的首址。 不需要时, 设为
n 。
3 no m Nm s e 指定存 放驱 动器卷 . Vl e a ei : u z
检测软盘是否发生变化。
1 建 立一个 新工程 。 .
用D lh编制应用程序时, e i p 经常需要对 存储设备 , 如软盘、 硬盘、光盘等进行各种 各样的操作, 如磁盘的变化检测 , 磁盘的容 量检测等。 用Wnห้องสมุดไป่ตู้o s A I 使 id w P函数进行这类
2 在 窗体 F r 1 . o m 中添 加两个 L b l a e组
图
8 8
2O 年3 06 月
维普资讯
LEA
p , 2 d od 1 p :w r
N
G园
Fe Sae re pc完成。
函数 原 型 :
B O G t ik re p c ( O L e Ds Fe S ae L C S R IRo Pt N m . P T T p o ta h a e L D O D IS c o seC ut r P w R p e t rP r lse . L D 0 D IB t s eS c o. P w R p y e P re t r
获得硬盘的物理序列号
Private Const SMART_SAVE_ATTRIBUTE_VALUES As Long = &HD3
Private Const SMART_EXECUTE_OFFLINE_IMMEDIATE As Long = &HD4 ' ATA4
Private Const DFP_SEND_DRIVE_COMMAND As Long = &H7C084
Private Const DFP_RECEIVE_DRIVE_DATA As Long = &H7C088
Private Type GETVERSIONOUTPARAMS
bVersion As Byte ' Binary driver version.
dwReserved(1) As Long ' Reserved for future expansion.
End Type
Private Const SMART_NO_ERROR As Long = 0 ' No error
Private Const SMART_IDE_ERROR As Long = 1 ' Error from IDE controller
Private Const SMART_INVALID_FLAG As Long = 2 ' Invalid command flag
Private Const SMART_INVALID_COMMAND As Long = 3 ' Invalid command byte
delphi文件读取的基本方法
delphi文件读取的基本方法delphi文件读取的基本方法Delphi同Object Pascal一样支持三种文件类型,即:文本文件、记录文件、无类型文件。
6.1.1文本文件文本文件类型的变量用如下方法声明:varTextFileVar: Text ;文本文件是以行为单位进行读、写操作的。
由于每一行长度不一定相同,不能计算出给定行在文件中的确切位置,因而只能顺序地读写。
而且文本文件只能单独为读或写而打开,在一个打开的文本文件上同时进行读、写操作是不允许的。
6.1.1.1文本文件的打开、关闭文本文件的打开需要两个步骤:(1). 文件变量与文件名关联;(2). 初始化读写。
关联文件变量与文件名调用AssignFile标准过程:AssignFile ( TextFileVar , FileName ) ;FileName 既可以是全路径名,也可以仅是文件名。
对于后者系统将在当前目录下查找。
AssignFile是Delphi新提供的一个函数,其功能等价于Object Pascal中的Assign。
而Assign在Delphi中更多地被用作一个方法名。
初始化读写有三种方式:1. Reset : 为读打开文件并把文件指针移动到文件首;2. Rewrite : 为写创建一个新文件;3. Append : 为写打开存在的文件并把文件指针定位在文件尾。
当使用Reset或Append过程而文件不存在时将会引发一个I/O 异常。
有关I/O异常的处理请参看本章例程和第十二章中的介绍。
文件的关闭很简单,只须调用CloseFile过程即可。
虽然Delphi应用程序在退出时会自动关闭所有打开的文件,但自己动手关闭文件可以确保释放文件句柄,并使程序的可移植性增强。
为保持兼容,Delphi也允许用户用Assign建立关联,Close关闭文件。
6.1.1.2文本文件的读写从文本文件中读取信息用Read、Readln两个标准过程。
windows 上获取硬盘序列号的方法
windows 上获取硬盘序列号的方法在Windows操作系统上,获取硬盘序列号的方法相对简单。
硬盘序列号是硬盘的一个独特标识符,通常用于识别硬盘的生产厂家、型号等信息。
下面将详细介绍如何在Windows上获取硬盘序列号。
一、方法步骤1. 打开“运行”对话框,可以通过按下Win+R组合键或者在开始菜单中搜索“运行”来打开。
2. 在“运行”对话框中输入“cmd”命令,然后按回车键,以打开命令提示符窗口。
3. 在命令提示符窗口中,输入以下命令:`wmic logicaldisk get serialnumber`这将列出当前计算机上的所有硬盘的序列号。
请注意,只有一些新的硬盘(如SSD)才有序列号,而一些旧硬盘可能没有。
4. 如果你的硬盘有序列号,命令执行完毕后,屏幕上会显示该硬盘的序列号。
如果没有显示,可能是因为你的硬盘没有序列号或者上述方法不适用于你的特定情况。
5. 如果你需要将序列号保存到文件中,可以使用重定向符号“>”将输出发送到文件。
例如:`wmic logicaldisk get serialnumber > serialnumber.txt`这将在当前目录下创建一个名为“serialnumber.txt”的文件,其中包含所有硬盘的序列号。
二、注意事项1. 获取硬盘序列号的过程需要管理员权限,因此请确保你的用户账户有足够的权限来执行所需的操作。
2. 请注意保护你的个人隐私,避免将获取到的硬盘序列号信息泄露给无关人员。
3. 如果你使用的是虚拟机或云服务器等环境,获取硬盘序列号的方法可能因操作系统和配置而异。
请根据实际情况调整方法。
4. 如果你对计算机硬件或系统设置有任何疑问,建议咨询专业人士以获取更准确的指导。
通过上述方法,你可以在Windows上轻松获取硬盘序列号。
请确保按照正确的步骤进行操作,并妥善保管获取到的信息,以避免不必要的风险和隐私泄漏。
怎样用vc获取硬盘物理序列号
#pragma once#ifndef __AFXWIN_H__#error include 'stdafx.h' before including this file for PCH #endif#include "resource.h"// 主符号// CgetinfoApp:// 有关此类的实现,请参阅 getinfo.cpp//class CgetinfoApp : public CWinApp{public:CgetinfoApp();// 重写public:virtual BOOL InitInstance();// 实现DECLARE_MESSAGE_MAP()};extern CgetinfoApp theApp;// getinfoDlg.h : 头文件//#pragma once// CgetinfoDlg 对话框class CgetinfoDlg : public CDialog{// 构造public:CgetinfoDlg(CWnd* pParent = NULL);// 标准构造函数// 对话框数据enum { IDD = IDD_GETINFO_DIALOG };virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV 支持// 实现protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()public:afx_msg void OnBnClickedOk();};//{{NO_DEPENDENCIES}}// Microsoft Visual C++ generated include file.// Used by getinfo.RC//#define IDR_MAINFRAME128#define IDM_ABOUTBOX0x0010#define IDD_ABOUTBOX100#define IDS_ABOUTBOX101#define IDD_GETINFO_DIALOG102#define IDR_MANIFESTCREATEPROCESS_MANIFEST_RESOURCE_ID// 新对象的下一组默认值//#ifdef APSTUDIO_INVOKED#ifndef APSTUDIO_READONLY_SYMBOLS#define _APS_NEXT_RESOURCE_VALUE129#define _APS_NEXT_CONTROL_VALUE1000#define _APS_NEXT_SYMED_VALUE101#define _APS_NEXT_COMMAND_VALUE32771#endif#endif// stdafx.h : 标准系统包含文件的包含文件,// 或是经常使用但不常更改的// 项目特定的包含文件#ifndef VC_EXTRALEAN#define VC_EXTRALEAN// 从 Windows 标头中排除不常使用的资料#endif// 如果您必须使用下列所指定的平台之前的平台,则修改下面的定义。
API函数获取硬盘物理序列号
API函数获取硬盘物理序列号以下代码可以取得系统特征码(网卡MAC、硬盘序列号、CPU ID、BIOS编号)BYTE szSystemInfo[4096]; // 在程序执行完毕后,此处存储取得的系统特征码UINT uSystemInfoLen = 0; // 在程序执行完毕后,此处存储取得的系统特征码的长度// 网卡MAC 地址,注意: MAC 地址是可以在注册表中修改的{UINT uErrorCode = 0;IP_ADAPTER_INFO iai;ULONG uSize = 0;DWORD dwResult = GetAdaptersInfo( &iai, &uSize );if( dwResult == ERROR_BUFFER_OVERFLOW ){IP_ADAPTER_INFO* piai = ( IP_ADAPTER_INFO* )HeapAlloc( GetProcessHeap( ) , 0, uSize );if( piai != NULL ){dwResult = GetAdaptersInfo( piai, &uSize );if( ERROR_SUCCESS == dwResult ){IP_ADAPTER_INFO* piai2 = piai;while( piai2 != NULL && ( uSystemInfoLen + piai2->AddressLength ) < 4096U ){CopyMemory( szSystemInfo + uSystemInfoLen, piai2->Address, pi ai2->AddressLength );uSystemInfoLen += piai2->AddressLength;piai2 = piai2->Next;}}else{uErrorCode = 0xF0000000U + dwResult;}VERIFY( HeapFree( GetProcessHeap( ), 0, piai ) );}else{return FALSE;}}else{uErrorCode = 0xE0000000U + dwResult;}if( uErrorCode != 0U ){return FALSE;}}// 硬盘序列号,注意:有的硬盘没有序列号{OSVERSIONINFO ovi = { 0 };ovi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );GetVersionEx( &ovi );if( ovi.dwPlatformId != VER_PLATFORM_WIN32_NT ){// Only Windows 2000, Windows XP, Windows Server 2003...return FALSE;}else{if( !WinNTHDSerialNumAsPhysicalRead( szSystemInfo, &uSystemInfoLen, 1024 ) ){WinNTHDSerialNumAsScsiRead( szSystemInfo, &uSystemInfoLen, 1024 );}}}// CPU ID{BOOL bException = FALSE;BYTE szCpu[16] = { 0 };UINT uCpuID = 0U;__try{_asm{mov eax, 0cpuidmov dword ptr szCpu[0], ebxmov dword ptr szCpu[4], edxmov dword ptr szCpu[8], ecxmov eax, 1cpuidmov uCpuID, edx}}__except( EXCEPTION_EXECUTE_HANDLER ){bException = TRUE;}if( !bException ){CopyMemory( szSystemInfo + uSystemInfoLen, &uCpuID, sizeof( UINT ) );uSystemInfoLen += sizeof( UINT );uCpuID = strlen( ( char* )szCpu );CopyMemory( szSystemInfo + uSystemInfoLen, szCpu, uCpuID );uSystemInfoLen += uCpuID;}}// BIOS 编号,支持AMI, AWARD, PHOENIX{SIZE_T ssize;LARGE_INTEGER so;so.LowPart=0x000f0000;so.HighPart=0x00000000;ssize=0xffff;wchar_t strPH[30]=L"\\device\\physicalmemory";DWORD ba=0;UNICODE_STRING struniph;struniph.Buffer=strPH;struniph.Length=0x2c;struniph.MaximumLength =0x2e;OBJECT_ATTRIBUTES obj_ar;obj_ar.Attributes =64;obj_ar.Length =24;obj_ar.ObjectName=&struniph;obj_ar.RootDirectory=0;obj_ar.SecurityDescriptor=0;obj_ar.SecurityQualityOfService =0;HMODULE hinstLib = LoadLibrary("ntdll.dll");ZWOS ZWopenS=(ZWOS)GetProcAddress(hinstLib,"ZwOpenSection");ZWMV ZWmapV=(ZWMV)GetProcAddress(hinstLib,"ZwMapViewOfSection");ZWUMV ZWunmapV=(ZWUMV)GetProcAddress(hinstLib,"ZwUnmapViewOfSection");//调用函数,对物理内存进行映射HANDLE hSection;if( 0 == ZWopenS(&hSection,4,&obj_ar) &&0 == ZWmapV(( HANDLE )hSection, //打开Section时得到的句柄( HANDLE )0xFFFFFFFF, //将要映射进程的句柄,&ba, //映射的基址0,0xFFFF, //分配的大小&so, //物理内存的地址&ssize, //指向读取内存块大小的指针1, //子进程的可继承性设定0, //分配类型2 //保护类型) )//执行后会在当前进程的空间开辟一段64k的空间,并把f000:0000到f000:ffff处的内容映射到这里//映射的基址由ba返回,如果映射不再有用,应该用ZwUnmapViewOfSection断开映射{BYTE* pBiosSerial = ( BYTE* )ba;UINT uBiosSerialLen = FindAwardBios( &pBiosSerial );if( uBiosSerialLen == 0U ){uBiosSerialLen = FindAmiBios( &pBiosSerial );if( uBiosSerialLen == 0U ){uBiosSerialLen = FindPhoenixBios( &pBiosSerial );}}if( uBiosSerialLen != 0U ){CopyMemory( szSystemInfo + uSystemInfoLen, pBiosSerial, uBiosSerialLen );uSystemInfoLen += uBiosSerialLen;}ZWunmapV( ( HANDLE )0xFFFFFFFF, ( void* )ba );}}// 完毕,系统特征码已取得。
硬盘序列号怎么查
硬盘序列号怎么查引言:在计算机中,硬盘是存储数据的关键组件之一,而硬盘序列号是硬盘的唯一标识符。
了解硬盘序列号的方法可以帮助用户轻松地获取硬盘的相关信息,以便进行故障诊断、硬盘管理或验证硬盘的真实性。
本文将介绍几种常见的方法,可帮助用户查找硬盘序列号。
第一部分:通过操作系统查找硬盘序列号大多数操作系统都提供了一种简单的方法来查找硬盘序列号。
以下是几种常见操作系统的方法:1. Windows 操作系统:在Windows 操作系统中,可以使用以下步骤来查找硬盘序列号: - 打开“命令提示符”(在开始菜单中搜索“命令提示符”)- 键入命令“wmic diskdrive get serialnumber”并按下回车键- 系统将显示硬盘序列号2. macOS 操作系统:在 macOS 操作系统中,可以通过以下步骤来查找硬盘序列号:- 打开“应用程序”文件夹- 进入“实用工具”文件夹- 打开“终端”- 键入命令“diskutil info /dev/disk0 | grep 'Serial Number'”并按下回车键(请注意,这里的“disk0”可能会因为硬盘数量和类型的不同而有所变化)- 系统将显示硬盘序列号3. Linux 操作系统:在 Linux 操作系统中,可以使用以下步骤来查找硬盘序列号:- 打开终端- 键入命令“sudo hdparm -I /dev/sda | grep 'Serial Number'”并按下回车键(这里的“/dev/sda”可能会因为硬盘数量和类型的不同而有所变化)- 系统将显示硬盘序列号第二部分:使用硬盘管理工具查找硬盘序列号除了操作系统自带的工具之外,还可以使用一些专门的硬盘管理工具来查找硬盘序列号。
以下是两个常用的工具:1. HD Tune:HD Tune 是一个广泛使用的硬盘管理工具,它提供了许多硬盘相关的功能,包括查找硬盘序列号。
其中有一个选项可以直接显示硬盘序列号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
bCommandReg := $EC;
end;
end;
if not DeviceIoControl(hDevice, $0007C088, @SCIP, SizeOf(TSendCmdInParams) - 1,
// Structure with drive register values.
irDriveRegs: TIDERegs;
// Physical drive number to send command to (0,1,2,3).
bDriveNumber: BYTE;
bReserved: array[0..2] of Byte;
dwReserved: array[0..3] of DWORD;
bBuffer: array[0..0] of Byte; // Input buffer.
end;
TIdSector = packed record
bReserved: BYTE; // reserved for future use. Must be zero.
end;
TSendCmdInParams = packedn bytes
cBufferSize: DWORD;
bCylHighReg: BYTE; // IDE high order cylinder value
bDriveHeadReg: BYTE; // IDE drive/head register
bCommandReg: BYTE; // Actual IDE command.
@aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil) then Exit;
finally
CloseHandle(hDevice);
end;
with PIdSector(@IdOutCmd.bBuffer)^ do
end;
end;
begin
Result := ; // 如果出错则返回空串
if SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then // Windows NT, Windows 2000
begin
// 提示! 改变名称可适用于其它驱动器,如第二个驱动器: \\.\PhysicalDrive1\
sModelNumber: array[0..39] of Char;
wMoreVendorUnique: Word;
wDoubleWordIO: Word;
wCapabilities: Word;
wReserved1: Word;
wPIOTiming: Word;
end;
PIdSector = ^TIdSector;
TDriverStatus = packed record
// 驱动器返回的错误代码,无错则返回0
bDriverError: Byte;
// IDE出错寄存器的内容,只有当bDriverError 为 SMART_IDE_ERROR 时有效
bIDEStatus: Byte;
bReserved: array[0..1] of Byte;
dwReserved: array[0..1] of DWORD;
end;
TSendCmdOutParams = packed record
// bBuffer的大小
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;
with SCIP do
begin
cBufferSize := IDENTIFY_BUFFER_SIZE;
// bDriveNumber := 0;
with irDriveRegs do
begin
bSectorCountReg := 1;
begin
ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber));
(Pchar(@sSerialNumber) + SizeOf(sSerialNumber))^ := #0;
Result := Pchar(@sSerialNumber);
IdOutCmd : TSendCmdOutParams absolute aIdOutCmd;
procedure ChangeByteOrder(var Data; Size: Integer);
var
ptr : PChar;
i : Integer;
c : Char;
end;
end;
bSectorNumberReg := 1;
// if Win32Platform=VER_PLATFORM_WIN32_NT then bDriveHeadReg := $A0
// else bDriveHeadReg := $A0 or ((bDriveNum and 1) shl 4);
end
else // Version Windows 95 OSR2, Windows 98
hDevice := CreateFile(\\.\SMARTVSD, 0, 0, nil, CREATE_NEW, 0, 0);
if hDevice = INVALID_HANDLE_VALUE then Exit;
wMultSectorStuff: Word;
ulTotalAddressableSectors: DWORD;
wSingleWordDMA: Word;
wMultiWordDMA: Word;
bReserved: array[0..127] of BYTE;
try
FillChar(SCIP, SizeOf(TSendCmdInParams) - 1, #0);
FillChar(aIdOutCmd, SizeOf(aIdOutCmd), #0);
cbBytesReturned := 0;
// Set up data structures for IDENTIFY command.
wDMATiming: Word;
wBS: Word;
wNumCurrentCyls: Word;
wNumCurrentHeads: Word;
wNumCurrentSectorsPerTrack: Word;
ulCurrentSectorCapacity: DWORD;
bSectorCountReg: BYTE; // IDE sector count register
bSectorNumberReg: BYTE; // IDE sector number register
bCylLowReg: BYTE; // IDE low order cylinder value
cBufferSize: DWORD;
// 驱动器状态
DriverStatus: TDriverStatus;
// 用于保存从驱动器读出的数据的缓冲区,实际长度由cBufferSize决定
bBuffer: array[0..0] of BYTE;
end;
var
hDevice : THandle;
cbBytesReturned : DWORD;
SCIP : TSendCmdInParams;
aIdOutCmd : array[0..(SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE - 1) - 1] of Byte;
begin
ptr := @Data;
for I := 0 to (Size shr 1) - 1 do
begin
c := ptr^;
ptr^ := (ptr + 1)^;
(ptr + 1)^ := c;
Inc(ptr, 2);
function GetIdeSerialNumber() : PChar; stdcall;
const
IDENTIFY_BUFFER_SIZE = 512;
type
TIDERegs = packed record
bFeaturesReg: BYTE; // Used for specifying SMART commands.
hDevice := CreateFile(\\.\PhysicalDrive0, GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);