| 
					阅读:5083回复:9
				 请问如何获取usb口移动硬盘的序列号大家好,我在做一个程序,获取U盘和移动硬盘的序列号,目前获取识别为可移动设备的U盘成功,而不能获取识别为硬盘的U盘和移动硬盘的序列号。 请问有没有办法获取?按照读硬盘的方法好像也不行。 谢谢! | |
| 沙发#发布于:2008-01-11 16:13 
					用IDENTIFY DEVICE命令获取数据,在获取的数据中第20-39为序列号				 | |
| 板凳#发布于:2008-01-13 20:42 
					谢谢,请问具体发哪个命令,我用DeviceIoControl发DFP_RECEIVE_DRIVE_DATA得不到usb口移动硬盘的,只能得到固定硬盘的 引用第1楼mzyongabc于2008-01-11 16:13发表的 : | |
| 地板#发布于:2008-01-13 20:48 
					这是我查的资料,好险读usb硬盘不行: IDENTIFY DEVICE专门用于固定硬盘,而IDENTIFY PACKET DEVICE用于可移动存储设备如CDROM、CF、MO、ZIP、TAPE等。因为驱动程序的原因,实际上用本例的方法,不管是IDENTIFY DEVICE也好,IDENTIFY PACKET DEVICE也好,获取可移动存储设备的详细信息,一般是做不到的。而且除了IDE硬盘,对SCSI、USB等接口的硬盘也不起作用。除非厂商提供的驱动支持这样的功能。 | |
| 地下室#发布于:2008-01-13 21:30 
					请问怎样给usb口移动硬盘里面的ide硬盘 发送 ide的命令?谢谢				 | |
| 5楼#发布于:2008-01-14 20:07 
					有人知道吗?要写驱动吗?				 | |
| 6楼#发布于:2008-01-14 21:23 
					可以给usb口移动硬盘里面的ide硬盘发送SCSI命令,象普通U盘那样				 | |
| 
 | 
| 7楼#发布于:2008-01-14 22:21 
					谢谢 IOCTL_SCSI_MINIPORT命令我试过,不行 请问是哪个命令? | |
| 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); } | |
| 9楼#发布于:2008-01-15 19:26 
					我又用SCSI_PASS_THROUGH_DIRECT发送SCSIOP_INQUIRY命令也不行,得到好像只有名称一类的信息,请问各位应该怎么发scsi命令呢?				 | |
 
							
