vista系统下获取硬盘物理序列号的问题,急,急!!! 有没有朋友有关于获取硬盘物理序列号的代码的,在vista系统下也能正确获取的。有的请发我邮箱,[email protected]谢了。。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 获取的操作就在这个函数里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,功能错误 获取的操作就在这个函数里 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,功能错误 http://blog.csdn.net/bhw98/archive/2003/05/20/19663.aspx看看这个可以不 看了一下msdn,DeviceIo是支持vista的lz这样用也没有问题啊for (drive = 0; drive < MAX_IDE_DRIVES; drive++) { 你这是一个循环,你先去掉循环,手动式一下"\\\\.\\PhysicalDrive0","\\\\.\\PhysicalDrive1" 等等,看看都不可以么 MFC窗口对象的清除 vc 读取word中的表格 Dlg上的X关闭图标,如何将它disable 一个超级难的问题 请问在vc下,如何用http协议来传数据? 散分 关于调用的问题 ※ 使用ShellExecute(或类似函数)调用另一个exe程序后,如何知道该被调用程序何时退出? 实现 列集和散集 vector是否有回收机制 关于CHttpFile重定向问题 ATL开发COM组件怎么调用其他的DLL
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,功能错误
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,功能错误
看看这个可以不
lz这样用也没有问题啊
for (drive = 0; drive < MAX_IDE_DRIVES; drive++)
{
你这是一个循环,你先去掉循环,手动式一下"\\\\.\\PhysicalDrive0","\\\\.\\PhysicalDrive1" 等等,看看都不可以么