vista系统下获取硬盘物理序列号的问题,急,急!!!

stefaniemarkc 2008-06-04 10:34:33
有没有朋友有关于
获取硬盘物理序列号的代码的,
在vista系统下也能正确获取的。
有的请发我邮箱,stefaniemark@163.com
谢了。。
...全文
704 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
stefaniemarkc 2008-06-04
  • 打赏
  • 举报
回复
各位高手 进来看看 发表下意见和建议
stefaniemarkc 2008-06-04
  • 打赏
  • 举报
回复
获取的操作就在这个函数里
int ReadPhysicalDriveInNTUsingSmart (void)
{
int done = FALSE;
int drive = 0;
for (drive = 0; drive < MAX_IDE_DRIVES; drive++)
{
HANDLE hPhysicalDriveIOCTL = 0;
char driveName [256];
sprintf (driveName, "\\\\.\\PhysicalDrive%d", drive);
hPhysicalDriveIOCTL = CreateFile (driveName,
GENERIC_WRITE ¦ GENERIC_READ,
FILE_SHARE_DELETE ¦ FILE_SHARE_READ ¦ FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);

if (hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE)
{
DWORD err = GetLastError ();
printf ("\n***ReadPhysicalDriveInNTUsingSmart*** error = %d\n", err);
}
else
{
GETVERSIONINPARAMS GetVersionParams;
DWORD cbBytesReturned = 0;
memset ((void*) & GetVersionParams, 0, sizeof(GetVersionParams));
if ( ! DeviceIoControl (hPhysicalDriveIOCTL, SMART_GET_VERSION,
NULL,
0,
&GetVersionParams, sizeof (GETVERSIONINPARAMS),
&cbBytesReturned, NULL) )
{

}
else
{
ULONG CommandSize = sizeof(SENDCMDINPARAMS) + IDENTIFY_BUFFER_SIZE;
PSENDCMDINPARAMS Command = (PSENDCMDINPARAMS) malloc (CommandSize);

#define ID_CMD 0xEC // Returns ID sector for ATA
Command -> irDriveRegs.bCommandReg = ID_CMD;
DWORD BytesReturned = 0;
if ( ! DeviceIoControl (hPhysicalDriveIOCTL,
SMART_RCV_DRIVE_DATA, Command, sizeof(SENDCMDINPARAMS),
Command, CommandSize,
&BytesReturned, NULL) )
{
}
else
{
DWORD diskdata [256];
USHORT *pIdSector = (USHORT *)
(PIDENTIFY_DATA) ((PSENDCMDOUTPARAMS) Command) -> bBuffer;

for (int ijk = 0; ijk < 256; ijk++)
diskdata [ijk] = pIdSector [ijk];


PrintIdeInfo (drive, diskdata);
done = TRUE;
}
// Done
CloseHandle (hPhysicalDriveIOCTL);
free (Command);
}
}
}
return done;
}


vista系统下首先是因为权限问题
返回的 hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE

解决了权限问题后,
调用 DeviceIoControl
返回错误代码 GetLastError() = 2,功能错误
stefaniemarkc 2008-06-04
  • 打赏
  • 举报
回复
获取的操作就在这个函数里
int ReadPhysicalDriveInNTUsingSmart (void)
{
int done = FALSE;
int drive = 0;

for (drive = 0; drive < MAX_IDE_DRIVES; drive++)
{
HANDLE hPhysicalDriveIOCTL = 0;
char driveName [256];

sprintf (driveName, "\\\\.\\PhysicalDrive%d", drive);
// Windows NT, Windows 2000, Windows Server 2003, Vista
hPhysicalDriveIOCTL = CreateFile (driveName,
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);

if (hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE)
{
DWORD err = GetLastError ();
printf ("\n***ReadPhysicalDriveInNTUsingSmart*** error = %d\n", err);
}
else
{
GETVERSIONINPARAMS GetVersionParams;
DWORD cbBytesReturned = 0;

// Get the version, etc of PhysicalDrive IOCTL
memset ((void*) & GetVersionParams, 0, sizeof(GetVersionParams));
if ( ! DeviceIoControl (hPhysicalDriveIOCTL, SMART_GET_VERSION,
NULL,
0,
&GetVersionParams, sizeof (GETVERSIONINPARAMS),
&cbBytesReturned, NULL) )
{

}
else
{
// Print the SMART version
// PrintVersion (& GetVersionParams);
// Allocate the command buffer
ULONG CommandSize = sizeof(SENDCMDINPARAMS) + IDENTIFY_BUFFER_SIZE;
PSENDCMDINPARAMS Command = (PSENDCMDINPARAMS) malloc (CommandSize);
// Retrieve the IDENTIFY data
// Prepare the command
#define ID_CMD 0xEC // Returns ID sector for ATA
Command -> irDriveRegs.bCommandReg = ID_CMD;
DWORD BytesReturned = 0;
if ( ! DeviceIoControl (hPhysicalDriveIOCTL,
SMART_RCV_DRIVE_DATA, Command, sizeof(SENDCMDINPARAMS),
Command, CommandSize,
&BytesReturned, NULL) )
{


}
else
{
DWORD diskdata [256];
USHORT *pIdSector = (USHORT *)
(PIDENTIFY_DATA) ((PSENDCMDOUTPARAMS) Command) -> bBuffer;

for (int ijk = 0; ijk < 256; ijk++)
diskdata [ijk] = pIdSector [ijk];


PrintIdeInfo (drive, diskdata);
done = TRUE;
}
// Done
CloseHandle (hPhysicalDriveIOCTL);
free (Command);
}
}
}
return done;
}


vista系统下首先是因为权限问题
返回的 hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE

解决了权限问题后,
调用 DeviceIoControl
返回错误代码 GetLastError() = 2,功能错误
Chivalry 2008-06-04
  • 打赏
  • 举报
回复
把你在其他系统能用的代码发出来
Chivalry 2008-06-04
  • 打赏
  • 举报
回复
看了一下msdn,DeviceIo是支持vista的
lz这样用也没有问题啊
for (drive = 0; drive < MAX_IDE_DRIVES; drive++)
{
你这是一个循环,你先去掉循环,手动式一下"\\\\.\\PhysicalDrive0","\\\\.\\PhysicalDrive1" 等等,看看都不可以么
Chivalry 2008-06-04
  • 打赏
  • 举报
回复

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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