surking
驱动牛犊
驱动牛犊
  • 注册日期2002-11-26
  • 最后登录2015-06-24
  • 粉丝0
  • 关注0
  • 积分305分
  • 威望60点
  • 贡献值0点
  • 好评度30点
  • 原创分0分
  • 专家分0分
阅读:4739回复:9

请问如何获取usb口移动硬盘的序列号

楼主#
更多 发布于:2008-01-11 15:46




大家好,我在做一个程序,获取U盘和移动硬盘的序列号,目前获取识别为可移动设备的U盘成功,而不能获取识别为硬盘的U盘和移动硬盘的序列号。
请问有没有办法获取?按照读硬盘的方法好像也不行。

谢谢!
mzyongabc
驱动牛犊
驱动牛犊
  • 注册日期2007-11-19
  • 最后登录2008-02-26
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望6点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-01-11 16:13
用IDENTIFY DEVICE命令获取数据,在获取的数据中第20-39为序列号
surking
驱动牛犊
驱动牛犊
  • 注册日期2002-11-26
  • 最后登录2015-06-24
  • 粉丝0
  • 关注0
  • 积分305分
  • 威望60点
  • 贡献值0点
  • 好评度30点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-01-13 20:42
谢谢,请问具体发哪个命令,我用DeviceIoControl发DFP_RECEIVE_DRIVE_DATA得不到usb口移动硬盘的,只能得到固定硬盘的

 
引用第1楼mzyongabc于2008-01-11 16:13发表的  :
用IDENTIFY DEVICE命令获取数据,在获取的数据中第20-39为序列号
surking
驱动牛犊
驱动牛犊
  • 注册日期2002-11-26
  • 最后登录2015-06-24
  • 粉丝0
  • 关注0
  • 积分305分
  • 威望60点
  • 贡献值0点
  • 好评度30点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-01-13 20:48
这是我查的资料,好险读usb硬盘不行:

IDENTIFY DEVICE专门用于固定硬盘,而IDENTIFY PACKET DEVICE用于可移动存储设备如CDROM、CF、MO、ZIP、TAPE等。因为驱动程序的原因,实际上用本例的方法,不管是IDENTIFY DEVICE也好,IDENTIFY PACKET DEVICE也好,获取可移动存储设备的详细信息,一般是做不到的。而且除了IDE硬盘,对SCSI、USB等接口的硬盘也不起作用。除非厂商提供的驱动支持这样的功能。
surking
驱动牛犊
驱动牛犊
  • 注册日期2002-11-26
  • 最后登录2015-06-24
  • 粉丝0
  • 关注0
  • 积分305分
  • 威望60点
  • 贡献值0点
  • 好评度30点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-01-13 21:30
请问怎样给usb口移动硬盘里面的ide硬盘 发送 ide的命令?谢谢
surking
驱动牛犊
驱动牛犊
  • 注册日期2002-11-26
  • 最后登录2015-06-24
  • 粉丝0
  • 关注0
  • 积分305分
  • 威望60点
  • 贡献值0点
  • 好评度30点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-01-14 20:07
有人知道吗?要写驱动吗?
liaojf
驱动牛犊
驱动牛犊
  • 注册日期2005-12-18
  • 最后登录2008-03-20
  • 粉丝0
  • 关注0
  • 积分503分
  • 威望52点
  • 贡献值0点
  • 好评度50点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-01-14 21:23
可以给usb口移动硬盘里面的ide硬盘发送SCSI命令,象普通U盘那样
熟悉USB设备端
surking
驱动牛犊
驱动牛犊
  • 注册日期2002-11-26
  • 最后登录2015-06-24
  • 粉丝0
  • 关注0
  • 积分305分
  • 威望60点
  • 贡献值0点
  • 好评度30点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-01-14 22:21
谢谢

IOCTL_SCSI_MINIPORT命令我试过,不行

请问是哪个命令?
surking
驱动牛犊
驱动牛犊
  • 注册日期2002-11-26
  • 最后登录2015-06-24
  • 粉丝0
  • 关注0
  • 积分305分
  • 威望60点
  • 贡献值0点
  • 好评度30点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2008-01-15 10:01
我是按照disk32写的,是不是写的不对,代码如下:

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)
      {
          printf ("\\\\.\\Scsi%d:\n", controller);

         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))
            {
                printf ("\\\\.\\Scsi%d: IOCTL_SCSI_MINIPORT success\n", controller);

               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 (controller * 2 + drive, diskdata);

                  done = TRUE;
               }
            }
         }
         CloseHandle (hScsiDriveIOCTL);
      }
surking
驱动牛犊
驱动牛犊
  • 注册日期2002-11-26
  • 最后登录2015-06-24
  • 粉丝0
  • 关注0
  • 积分305分
  • 威望60点
  • 贡献值0点
  • 好评度30点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2008-01-15 19:26
我又用SCSI_PASS_THROUGH_DIRECT发送SCSIOP_INQUIRY命令也不行,得到好像只有名称一类的信息,请问各位应该怎么发scsi命令呢?
游客

返回顶部