WinNT系统, 我做了个小程序用DeviceIoControl来获取磁盘的物理序列号,用普通磁盘(IDE或者SCSI, XP和VISTA都行)测试没问题,但是用一个RAID 5的磁盘测试, 当用DeviceIoControl发送指令码IOCTL_SCSI_MINIPORT时出错,错误码87,意思是参数错误.
请教高手如何获取RAID磁盘物理序列号?所用代码如下:char szBuffer[sizeof( SRB_IO_CONTROL ) + SENDIDLENGTH] = { 0 };
SRB_IO_CONTROL* p = ( SRB_IO_CONTROL* )szBuffer;
SENDCMDINPARAMS* pin = ( SENDCMDINPARAMS* )( szBuffer + sizeof( SRB_IO_CONTROL ) );
DWORD dwResult;
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 = iDrive; DeviceIoControl( hScsiDriveIOCTL,
IOCTL_SCSI_MINIPORT,
szBuffer,
sizeof(SRB_IO_CONTROL) + sizeof(SENDCMDINPARAMS) - 1,
szBuffer,
sizeof( SRB_IO_CONTROL ) + SENDIDLENGTH,
&dwResult,
NULL );
请教高手如何获取RAID磁盘物理序列号?所用代码如下:char szBuffer[sizeof( SRB_IO_CONTROL ) + SENDIDLENGTH] = { 0 };
SRB_IO_CONTROL* p = ( SRB_IO_CONTROL* )szBuffer;
SENDCMDINPARAMS* pin = ( SENDCMDINPARAMS* )( szBuffer + sizeof( SRB_IO_CONTROL ) );
DWORD dwResult;
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 = iDrive; DeviceIoControl( hScsiDriveIOCTL,
IOCTL_SCSI_MINIPORT,
szBuffer,
sizeof(SRB_IO_CONTROL) + sizeof(SENDCMDINPARAMS) - 1,
szBuffer,
sizeof( SRB_IO_CONTROL ) + SENDIDLENGTH,
&dwResult,
NULL );
用网上搜到的获取硬盘序列号的方法读不到这种磁盘的序列号,现象就是我主贴中说的。
但是我在CSDN上下载了一个“DiskSerial.exe”的工具,它调用了“DiskSerial.DLL”中的函数,它在RAID5上运行能够返回一个序列号。
我没有这个工具的代码,所以想知道是怎么实现的,诚求高手指点另外,我用一个可以查询磁盘类型的指令,在RAID5上返回的类型码是8,对应类型RAID
工作都换了
原来这里还有一个没搞定的帖子
结贴完事