阅读:2139回复:5
如何得到scsi硬盘的id号?我手里有个源码,但是不行,请帮我分析一下,给分
下面是代码,createfile 打开驱动都正常,可是deviceiocontrol返回值却是0,用getlasterror得到48f(设备没有连接。)的错误
sprintf (driveName, \"\\\\\\\\.\\\\Scsi%d:\", controller); // Windows NT, Windows 2000, any rights should do hScsiDriveIOCTL = CreateFile (driveName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); // if (hScsiDriveIOCTL == INVALID_HANDLE_VALUE) // printf (\"Unable to open SCSI controller %d, error code: 0x%lX\\n\", // controller, GetLastError ()); if (hScsiDriveIOCTL != INVALID_HANDLE_VALUE) { int drive = 0; for (drive = 0; drive < 2; drive++) { char buffer [sizeof (SRB_IO_CONTROL) + SENDIDLENGTH]; SRB_IO_CONTROL *p = (SRB_IO_CONTROL *) buffer; SENDCMDINPARAMS *pin = (SENDCMDINPARAMS *) (buffer + sizeof (SRB_IO_CONTROL)); DWORD dummy; memset (buffer, 0, sizeof (buffer)); p -> HeaderLength = sizeof (SRB_IO_CONTROL); p -> Timeout = 10000; p -> Length = SENDIDLENGTH; p -> ControlCode = IOCTL_SCSI_MINIPORT_IDENTIFY; strncpy ((char *) p -> Signature, \"SCSIDISK\", 8); pin -> irDriveRegs.bCommandReg = IDE_ATA_IDENTIFY; pin -> bDriveNumber = drive; if (DeviceIoControl (hScsiDriveIOCTL, IOCTL_SCSI_MINIPORT, buffer, sizeof (SRB_IO_CONTROL) + sizeof (SENDCMDINPARAMS) - 1, buffer, sizeof (SRB_IO_CONTROL) + SENDIDLENGTH, &dummy, NULL)) { SENDCMDOUTPARAMS *pOut = (SENDCMDOUTPARAMS *) (buffer + sizeof (SRB_IO_CONTROL)); IDSECTOR *pId = (IDSECTOR *) (pOut -> bBuffer); if (pId -> sModelNumber [0]) { DWORD diskdata [256]; int ijk = 0; USHORT *pIdSector = (USHORT *) pId; for (ijk = 0; ijk < 256; ijk++) diskdata [ijk] = pIdSector [ijk]; PrintIdeInfo (info, controller * 2 + drive, diskdata); done = TRUE; } } } CloseHandle (hScsiDriveIOCTL); |
|
最新喜欢:![]() |
沙发#
发布于:2003-10-21 16:08
用SMART_RCV_DRIVE_DATA和SMART_SEND_DRIVE_COMMAND试一下
|
|
|
板凳#
发布于:2003-10-21 16:36
用SMART_RCV_DRIVE_DATA和SMART_SEND_DRIVE_COMMAND试一下???
我没明白您的这两个值是用在deviceiocontrol的功能号,还是其他的地方??输入输出的buffer数据用变么? 能不能稍微详细点? |
|
地板#
发布于:2003-10-21 18:04
IO功能号,参照一下DDK,应该可以
[编辑 - 10/21/03 by he_x_p] |
|
|
地下室#
发布于:2003-10-23 18:01
ddk里面好像没有IOCTL_SCSI_MINIPORT_IDENTIFY哦。
是不是用了aspi的部分定义? 取得id号应该没这么复杂。 |
|
5楼#
发布于:2003-11-04 17:25
你打开的是卡的设备对象,可以通过打开磁盘的设备对象,然后通过发送IOCTL_SCSI_GET_ADDRESS得到PathId,TargetId,LUN
DeviceIoControl(hTemp, IOCTL_SCSI_GET_ADDRESS, NULL, 0, &addr, sizeof(addr), &dwReturnedData, NULL); |
|