Delphi 如何获得;识别“设备数据”;一个USB硬盘?
我正在写一个HDD工具,可以读取智能数据并更改驱动器的APM/AAM。我从内部磁盘开始,一切似乎都很好。我使用Delphi 如何获得;识别“设备数据”;一个USB硬盘?,delphi,usb,ioctl,Delphi,Usb,Ioctl,我正在写一个HDD工具,可以读取智能数据并更改驱动器的APM/AAM。我从内部磁盘开始,一切似乎都很好。我使用CreateFile和\.\PhysicalDriveX获取句柄,并使用DeviceIoControl和IOCTL\u ATA\u PASS\u THROUGH获取驱动器的标识设备数据: function GetDriveHandle(Name:String; var hDrive:THandle):Boolean; begin hDrive:=CreateFile(PChar(Nam
CreateFile
和\.\PhysicalDriveX
获取句柄,并使用DeviceIoControl
和IOCTL\u ATA\u PASS\u THROUGH
获取驱动器的标识设备数据
:
function GetDriveHandle(Name:String; var hDrive:THandle):Boolean;
begin
hDrive:=CreateFile(PChar(Name), GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
Result:=hDrive<>INVALID_HANDLE_VALUE;
end;
function GetIdentify(hDrive:THandle; var Data:IDENTIFY_DEVICE_DATA):Boolean;
var atpexb: ATA_PASS_THROUGH_EX_WITH_BUFFERS;
bytesRet: DWord;
begin
bytesRet:=0;
FillChar(atpexb,SizeOf(atpexb),0);
atpexb.Length:=SizeOf(ATA_PASS_THROUGH_EX);
atpexb.AtaFlags:=ATA_FLAGS_DATA_IN;
atpexb.DataTransferLength:=512;
atpexb.TimeOutValue:=3;
atpexb.DataBufferOffset:=SizeOf(ATA_PASS_THROUGH_EX);
atpexb.CurrentTaskFile.Command:=WIN_IDENTIFYDEVICE;
atpexb.CurrentTaskFile.SectorCount:=1;
Result:=DeviceIoControl(hDrive, IOCTL_ATA_PASS_THROUGH, @atpexb, SizeOf(ATA_PASS_THROUGH_EX),
@atpexb, SizeOf(atpexb), bytesRet, nil);
if Result then Move(atpexb.DataBuff, Data, SizeOf(Data));
end;
函数GetDriveHandle(名称:String;var hDrive:THandle):布尔;
开始
hDrive:=CreateFile(PChar(Name)、GENERIC_READ或GENERIC_WRITE、,
文件共享读取或文件共享写入,无,打开现有,0,0);
结果:=hDriveINVALID\u HANDLE\u值;
结束;
函数GetIdentify(hDrive:THandle;var数据:IDENTIFY\u DEVICE\u Data):布尔值;
var atpexb:ATA通过带缓冲区的EXU;
拜特莱特:德沃德;
开始
字节数:=0;
FillChar(atpexb,SizeOf(atpexb),0);
atpexb.Length:=SizeOf(ATA_PASS_THROUGH_EX);
atpexb.AtaFlags:=ATA_FLAGS_DATA_IN;
atpexb.DataTransferLength:=512;
atpexb.TimeOutValue:=3;
atpexb.DataBufferOffset:=SizeOf(数据通过);
atpexb.CurrentTaskFile.Command:=WIN_IdentificationDevice;
atpexb.CurrentTaskFile.SectorCount:=1;
结果:=设备控制(hDrive,IOCTL_ATA_PASS_THROUGH,@atpexb,SizeOf(ATA_PASS_THROUGH_EX),
@atpexb,SizeOf(atpexb),bytesRet,无);
如果结果是Move(atpexb.DataBuff,Data,SizeOf(Data));
结束;
但如果我在USB硬盘上尝试,它就不起作用了。我得到“错误50:请求不受支持”。好的,我在互联网上做了更多的研究,发现我需要用这样的东西打开USB设备的一个特殊手柄:\?\USB#vid#u 1058&pid#u 1078#575856314541353752543645{a5dcbf10-6530-11d2-901f-00c04fb951ed}。我使用USB HDD的设备路径来获取句柄,但当我尝试将其与DeviceIoControl/IOCTL\u ATA\u PASS\u THROUGH
一起使用时,我得到了相同的错误:“请求不受支持”