Delphi 如何获得;识别“设备数据”;一个USB硬盘?

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

我正在写一个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(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
一起使用时,我得到了相同的错误:“请求不受支持”