windows2008 c++ 如何获取SCSI硬盘物理序列号

jonny 2014-12-16 02:17:52
使用网上下载的《共享软件加密算法库》里面的reg.dll是可以获取scsi硬盘序列号的。
查阅了很多资料好像推荐使用下面的代码的比较多,尝试了还是不行,读不到scsi硬盘的序列号(系统2008r2),DeviceIoControl返回结果都为0.
由于特殊原因必须使用vs2008 vc++,求帮助。
#include<ntddscsi.h>
bool CSN::ReadIdeDriveAsScsiDriveInNT (void)
{
int done = FALSE;
int controller = 0;

for (controller = 0; controller < 16; controller++)
{
HANDLE hScsiDriveIOCTL = 0;
char driveName [256];

// Try to get a handle to PhysicalDrive IOCTL, report failure
// and exit if can't.
sprintf_s (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_s ((char *) p -> Signature,9,"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 (controller * 2 + drive, diskdata);
done = TRUE;
}
}
}
CloseHandle (hScsiDriveIOCTL);
}
}
return done;
}
...全文
627 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
archer_wl 2015-06-29
  • 打赏
  • 举报
回复
你是怎么解决的啊?我高了好久还没搞出来
tinweisog 2015-06-24
  • 打赏
  • 举报
回复
希望楼主分享一下
从来不作 2015-01-12
  • 打赏
  • 举报
回复
楼主把方法分享一下啊
zhu_cl 2014-12-19
  • 打赏
  • 举报
回复
to callme_wlt : 我 也 遇到 同一问题 ,盼复!!!!!!
赵4老师 2014-12-18
  • 打赏
  • 举报
回复
奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中!
jonny 2014-12-18
  • 打赏
  • 举报
回复
谢谢牛人 zhlf1987 的帮助,问题解决了。
luciferisnotsatan 2014-12-18
  • 打赏
  • 举报
回复
lz用在什么操作系统上, 看代码里的注释 // Windows NT, Windows 2000, any rights should do 感觉是很久以前写的了。 从 windows vista(还是windows server 2003)开始,很多东西都没法在用户态下得到了,比如映射物理内存\\Device\\PhysicalMemory
zhlf1987 2014-12-18
  • 打赏
  • 举报
回复
已邮件发送给你,请查收。
fly_dragon_fly 2014-12-17
  • 打赏
  • 举报
回复
帮顶吧! 这好像diskid的代码,我以前在03server上好像打过sp后就不太好用了,以前简单,太不了挂个驱动去读,现在驱动要签名搞得麻烦了。
jonny 2014-12-16
  • 打赏
  • 举报
回复
to:robertbo // SCSI读取函数(for NT/2000/XP) String __fastcall ReadIDEDriveAsScsiDriveOnNT(); //--------------------------------------------------------------------------- 没有实现
robertbo 2014-12-16
  • 打赏
  • 举报
回复
http://www.ccrun.com/article.asp?i=605&d=l3si2a 你看看这个里面的办法行吗?

24,860

社区成员

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

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