windows2008 c++ 怎么获取SCSI硬盘物理序列号
windows2008 c++ 如何获取SCSI硬盘物理序列号
使用网上下载的《共享软件加密算法库》里面的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;
}
------解决思路----------------------
http://www.ccrun.com/article.asp?i=605&d=l3si2a
你看看这个里面的办法行吗?
------解决思路----------------------
帮顶吧! 这好像diskid的代码,我以前在03server上好像打过sp后就不太好用了,以前简单,太不了挂个驱动去读,现在驱动要签名搞得麻烦了。
------解决思路----------------------
已邮件发送给你,请查收。
------解决思路----------------------
lz用在什么操作系统上,
看代码里的注释 // Windows NT, Windows 2000, any rights should do 感觉是很久以前写的了。
从 windows vista(还是windows server 2003)开始,很多东西都没法在用户态下得到了,比如映射物理内存\\Device\\PhysicalMemory
使用网上下载的《共享软件加密算法库》里面的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;
}
------解决思路----------------------
http://www.ccrun.com/article.asp?i=605&d=l3si2a
你看看这个里面的办法行吗?
------解决思路----------------------
帮顶吧! 这好像diskid的代码,我以前在03server上好像打过sp后就不太好用了,以前简单,太不了挂个驱动去读,现在驱动要签名搞得麻烦了。
------解决思路----------------------
已邮件发送给你,请查收。
------解决思路----------------------
lz用在什么操作系统上,
看代码里的注释 // Windows NT, Windows 2000, any rights should do 感觉是很久以前写的了。
从 windows vista(还是windows server 2003)开始,很多东西都没法在用户态下得到了,比如映射物理内存\\Device\\PhysicalMemory