Brain
驱动牛犊
驱动牛犊
  • 注册日期2003-01-11
  • 最后登录2007-06-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2138回复:5

如何得到scsi硬盘的id号?我手里有个源码,但是不行,请帮我分析一下,给分

楼主#
更多 发布于:2003-10-21 15:49
下面是代码,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);

最新喜欢:

iwubiwub
he_x_p
驱动小牛
驱动小牛
  • 注册日期2002-11-15
  • 最后登录2005-07-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-10-21 16:08
用SMART_RCV_DRIVE_DATA和SMART_SEND_DRIVE_COMMAND试一下
乘着梦的翅膀, 借助黎明时柔和的阳光, 化着一只自由自在的冲天鸟, 在有梦的地方潇洒地飞翔......
Brain
驱动牛犊
驱动牛犊
  • 注册日期2003-01-11
  • 最后登录2007-06-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-10-21 16:36
用SMART_RCV_DRIVE_DATA和SMART_SEND_DRIVE_COMMAND试一下???


我没明白您的这两个值是用在deviceiocontrol的功能号,还是其他的地方??输入输出的buffer数据用变么?

能不能稍微详细点?
he_x_p
驱动小牛
驱动小牛
  • 注册日期2002-11-15
  • 最后登录2005-07-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-10-21 18:04
IO功能号,参照一下DDK,应该可以

[编辑 -  10/21/03 by  he_x_p]
乘着梦的翅膀, 借助黎明时柔和的阳光, 化着一只自由自在的冲天鸟, 在有梦的地方潇洒地飞翔......
fengyinb
驱动牛犊
驱动牛犊
  • 注册日期2002-11-04
  • 最后登录2004-05-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-10-23 18:01
ddk里面好像没有IOCTL_SCSI_MINIPORT_IDENTIFY哦。
是不是用了aspi的部分定义?

取得id号应该没这么复杂。
tanky
驱动牛犊
驱动牛犊
  • 注册日期2002-03-04
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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);
游客

返回顶部