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;
}
...全文
607 11 打赏 收藏 转发到动态 举报
写回复
用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 你看看这个里面的办法行吗?
一款用于共享软件加密的动态链接库文件,包含了获取硬盘物理序列号及BlowFish、MD5、SHA512、RIPEMD160、Secret16、MD5FileCheck、CRCFileCheck等多种强大加密算法,可以非常方便的用于软件的各类加密需求。支持VC/VB/BCB/Delphi等各类Windows平台下的开发工具,软件同时提供详细的函数定义说明、示例及各类开发工具使用的源代码。 软件功能: (1)可用于获取硬盘序列号(IDE/SCSI),支持Win9x/Me/NT/2000/XP。 (2)内置BlowFish、MD5、SHA512、RIPEMD160、Secret16、MD5FileCheck、 CRCFileCheck等多种强大加密算法来对软件进行加密保护。 (3)支持Window平台下的各类开发工具,如VC/VB/BCB/Delphi/PB/VFP等。 (4)可以非常方便的同时使用多种加密算法来对软件进行加密保护。 打包文件说明: Reg.dll-------------------加密算法动态链接库文件。 Reg.h---------------------在 VC(C/C++) 和 BCB 开发环境下的头文件。 Reg.lib-------------------在 VC(MFC) 开发环境下的 Library 文件。 Reg.bas-------------------在 VB 开发环境下的 Module 文件。 Readme.txt----------------纯文本格式说明文件。 Help.chm------------------函数接口详细定义说明文件。 MFC_TestEncryDll.zip------MFC调用Reg.dll进行加密示例。 VB6_TestEncryDll.zip------VB6调用Reg.dll进行加密示例。 CB5_TestEncryDll.zip------BCB5调用Reg.dll进行加密示例。 Delphi_TestEncryDll.zip---Delphi调用Reg.dll进行加密示例。 函数详细说明请参见Help.chm中具体函数说明部分及相关示例代码。

24,854

社区成员

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

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