IOCTL_SCSI_PASS_THROUGH如何查看ATA命令结果
时间: 2023-10-23 19:12:13 浏览: 197
IOCTL_SCSI_PASS_THROUGH是一种向SCSI设备发送SCSI命令的API,而SCSI命令不同于ATA命令。如果要使用ATA命令,应该使用IOCTL_ATA_PASS_THROUGH API。
在使用IOCTL_ATA_PASS_THROUGH API发送ATA命令后,可以通过检查输出的ATA_PASS_THROUGH_EX结构体中的DataBuffer字段来查看命令结果。DataBuffer字段包含了命令的输出数据。具体来说,它是一个指向16字节缓冲区的指针,其中包含了命令返回的结果。
例如,如果你使用IOCTL_ATA_PASS_THROUGH API发送了IDENTIFY命令(0xEC),那么可以通过检查ATA_PASS_THROUGH_EX结构体中的DataBuffer字段来获取硬盘的详细信息,如序列号、固件版本等。
相关问题
IOCTL_SCSI_PASS_THROUGH查看ATA命令的STATUS
在使用 IOCTL_SCSI_PASS_THROUGH 发送 ATA 命令时,可以通过检查返回的 SCSI_STATUS 的值来确定 ATA 命令的执行状态。在 ATA 设备上执行的命令将被映射到 SCSI 命令,并且设备将返回一个 SCSI_STATUS 字段以指示命令的执行状态。
对于 ATA PASS THROUGH 命令,SCSI_STATUS 字段将包含以下信息:
- 如果命令成功执行,则 SCSI_STATUS 字段将被设置为 0。
- 如果命令未正确执行,则 SCSI_STATUS 字段将包含错误码,例如 CHECK CONDITION(0x02)或 COMMAND TERMINATED(0x22)等。此时,还可以检查附加的 SENSE DATA 字段来获取更多的错误信息。
总之,通过检查 IOCTL_SCSI_PASS_THROUGH 命令返回的 SCSI_STATUS 字段,可以确定执行 ATA 命令时的状态。
BOOL status = 0; DWORD accessMode = 0, shareMode = 0; HANDLE fileHandle = NULL; //PUCHAR dataBuffer = NULL; SCSI_PASS_THROUGH_WITH_BUFFERS sptwb; SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER sptdwb; UCHAR buffer[ 2048 ]; UCHAR string[ 25 ]; ULONG length = 0, errorCode = 0; DWORD returned = 0; strcpy(string, "\\\\.\\"); strcat(string, "I:"); shareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;//default accessMode = GENERIC_WRITE | GENERIC_READ;//default fileHandle = CreateFile( string, accessMode, shareMode, NULL, OPEN_EXISTING, 0, NULL ); if (fileHandle == INVALID_HANDLE_VALUE) { MessageBox(NULL, "Create file fail", "tester", MB_OK); return false; } ZeroMemory(&sptwb, sizeof(SCSI_PASS_THROUGH_WITH_BUFFERS)); sptwb.spt.Length = sizeof(SCSI_PASS_THROUGH); sptwb.spt.PathId = 0; sptwb.spt.TargetId = 1; sptwb.spt.Lun = 0; sptwb.spt.CdbLength = CDB6GENERIC_LENGTH; sptwb.spt.SenseInfoLength = 24; sptwb.spt.DataIn = SCSI_IOCTL_DATA_IN; sptwb.spt.DataTransferLength = 192; sptwb.spt.TimeOutValue = 2; sptwb.spt.DataBufferOffset = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,ucDataBuf); sptwb.spt.SenseInfoOffset = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,ucSenseBuf); sptwb.spt.Cdb[0] = SCSI_OPCODE_HWTEST_COMMAND; //SCSI_OPCODE_SIGMATEL_WRITE_COMMAND;// sptwb.spt.Cdb[1] = HWTEST_DISPLAY_ID;//ALLOCATE_MEDIA; sptwb.spt.Cdb[4] = 192; length = offsetof( SCSI_PASS_THROUGH_WITH_BUFFERS, ucDataBuf ) + sptwb.spt.DataTransferLength; status = DeviceIoControl( fileHandle, IOCTL_SCSI_PASS_THROUGH, &sptwb, sizeof(SCSI_PASS_THROUGH), &sptwb, length, &returned, FALSE ); if (!status) { MessageBox(NULL, "Device I/0 control fail!", "tester", MB_OK); errorCode = GetLastError(); ShowMessage(IntToStr(errorCode)); PrintError(errorCode); CloseHandle(fileHandle); return false; } CloseHandle( fileHandle ); return true;
这段代码是用来打开一个名为"I:"的设备文件,并创建一个文件句柄。其中,accessMode表示文件的访问模式,shareMode表示文件的共享模式,fileHandle表示文件句柄。此外,还定义了一些变量和数组用于后续的操作。
阅读全文