获取scsi硬盘序列号

qq_35752802 2017-12-01 02:40:18
有人有可以用的代码吗 从网上下的// WindowsNT/2000/XP系统下读取SCSI硬盘序列号
BOOL CGetHDSerial::WinNTReadSCSIHDSerial (DWORD * buffer)
{
buffer[0]='\n';
int controller = 0;
HANDLE hScsiDriveIOCTL = 0;
char driveName [256];
sprintf (driveName, "\\\\.\\Scsi%d:", controller);
// Windows NT/2000/XP下任何权限都可以进行
hScsiDriveIOCTL = CreateFileA (driveName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, 0, NULL);

if (hScsiDriveIOCTL != INVALID_HANDLE_VALUE)
{
int drive = 0;
DWORD dummy;
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));
// 准备参数
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);
strncpy_s((char *)p->Signature, 9, "SCSIDISK", 9);
pin -> irDriveRegs.bCommandReg = IDE_ATA_IDENTIFY;
pin -> bDriveNumber = drive;
// 得到SCSI硬盘信息
if (DeviceIoControl (hScsiDriveIOCTL, IOCTL_SCSI_MINIPORT,
buffer,
sizeof (SRB_IO_CONTROL) +
sizeof (SENDCMDINPARAMS) - 1,
buffer,
sizeof (SRB_IO_CONTROL) + SENDIDLENGTH/*sizeof(SRB_IO_CONTROL) + sizeof(SENDCMDOUTPARAMS) + sizeof(IDINFO) - 1*/,
&dummy, NULL))
{
SENDCMDOUTPARAMS *pOut =
(SENDCMDOUTPARAMS *) (buffer + sizeof (SRB_IO_CONTROL));
IDSECTOR *pId = (IDSECTOR *) (pOut -> bBuffer);
if (pId -> sModelNumber [0])
{
int n = 0;
USHORT *pIdSector = (USHORT *) pId;

for (n = 0; n < 256; n++)
buffer[n] =pIdSector [n];
return TRUE; // 读取成功
}
}
}
CloseHandle (hScsiDriveIOCTL); // 关闭句柄
}
return FALSE; // 读取失败
}
DeviceIoControl 返回值为0,用getlasterror得到122,传入缓冲区太小,但不知道怎么改,求大神们帮帮忙啊
...全文
505 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-12-05
  • 打赏
  • 举报
回复
引用 4 楼 qq_35752802 的回复:
那在虚拟机上呢 其实我是想获得虚拟机的硬盘号 虚拟机大部分都是scsi硬盘的 应该是一样的把
估计在虚拟机里无法直接获取对应实体机正使用的scsi硬盘的序列号。 跟《黑客帝国》中的虚拟世界中无法获取现实世界Matrix所用硬盘的序列号是一个意思。 参考: 《黑客帝国》完全解析_知识库_博客园 《黑客帝国》里的锡安是不是虚拟世界_知识库_博客园
qq_35752802 2017-12-04
  • 打赏
  • 举报
回复
什么意思? 是得不到吗
qq_35752802 2017-12-04
  • 打赏
  • 举报
回复
那在虚拟机上呢 其实我是想获得虚拟机的硬盘号 虚拟机大部分都是scsi硬盘的 应该是一样的把
赵4老师 2017-12-04
  • 打赏
  • 举报
回复
引用 2 楼 qq_35752802 的回复:
什么意思? 是得不到吗
使用WMI肯定能得到。 我的意思是别在加密软件功能上瞎耽误工夫。
赵4老师 2017-12-01
  • 打赏
  • 举报
回复
WMI ? 奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中!

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧