// Get the version, etc of PhysicalDrive IOCTL 获取版本信息,发出DFP_GET_VERSION命令 //如果获取成功 if ( DeviceIoControl (hPhysicalDriveIOCTL, DFP_GET_VERSION, NULL, 0, &VersionParams, sizeof(VersionParams), &cbBytesReturned, NULL) ) { //如果有IDE设备 if (VersionParams.bIDEDeviceMap > 0) { BYTE bIDCmd = 0; // IDE or ATAPI IDENTIFY cmd SENDCMDINPARAMS scip; //SENDCMDOUTPARAMS OutCmd; BYTE IdOutCmd [sizeof (SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1]; // Now, get the ID sector for all IDE devices in the system. // If the device is ATAPI use the IDE_ATAPI_IDENTIFY command, // otherwise use the IDE_ATA_IDENTIFY command //判断是ATA设备还是ATAPI设备 bIDCmd = (VersionParams.bIDEDeviceMap >> drive & 0x10) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;
这个貌似是从ReactOs里面抠出来的任务管理器的源码,和Windows的任务管理器一模一样,物理内存虚拟内存Cpu这些都有,不知道有没有你需要的。
还可以通过wmi查询系统硬件信息,msdn上有例子
http://msdn.microsoft.com/en-us/library/aa390418(VS.85).aspx
{
int done = FALSE;
int drive = 0;
//遍历所有磁盘设备
for (drive = 0; drive < MAX_IDE_DRIVES; drive++)
{
//磁盘设备io操作句柄
HANDLE hPhysicalDriveIOCTL = 0;
TCHAR driveName [256];
_stprintf(driveName, TEXT("\\\\.\\PhysicalDrive%d"), drive);
//Windows NT, Windows 2000,必需要有管理权限
//获取对设备的操作句柄(在windows下设备看为文件,使用文件API打开设备,对于磁盘设备的虚拟文件为PhysicalDrive+i)i为设备号
//如IDE0的的主盘为0,从盘为2,IDE1的主盘为3,从盘为4,对于PC机MAX_IDE_DRIVES为4个
hPhysicalDriveIOCTL = CreateFile (driveName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, 0, NULL);
//如果打开成功
if (hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE)
{
GETVERSIONOUTPARAMS VersionParams; //GETVERSIONOUTPARAMS存放磁盘驱动器,版本信息
DWORD cbBytesReturned = 0;
//初始化GETVERSIONOUTPARAMS结构数据
memset ((void*) &VersionParams, 0, sizeof(VersionParams));
// Get the version, etc of PhysicalDrive IOCTL 获取版本信息,发出DFP_GET_VERSION命令
//如果获取成功
if ( DeviceIoControl (hPhysicalDriveIOCTL, DFP_GET_VERSION,
NULL,
0,
&VersionParams,
sizeof(VersionParams),
&cbBytesReturned, NULL) )
{
//如果有IDE设备
if (VersionParams.bIDEDeviceMap > 0)
{
BYTE bIDCmd = 0; // IDE or ATAPI IDENTIFY cmd
SENDCMDINPARAMS scip;
//SENDCMDOUTPARAMS OutCmd;
BYTE IdOutCmd [sizeof (SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];
// Now, get the ID sector for all IDE devices in the system.
// If the device is ATAPI use the IDE_ATAPI_IDENTIFY command,
// otherwise use the IDE_ATA_IDENTIFY command
//判断是ATA设备还是ATAPI设备
bIDCmd = (VersionParams.bIDEDeviceMap >> drive & 0x10) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;
//初始化结构信息
memset (&scip, 0, sizeof(scip));
memset (IdOutCmd, 0, sizeof(IdOutCmd));
if ( DoIDENTIFY (hPhysicalDriveIOCTL,
&scip,
(PSENDCMDOUTPARAMS)&IdOutCmd,
(BYTE) bIDCmd,
(BYTE) drive,
&cbBytesReturned))
{
DISKINFO *diskinfo=new DISKINFO();
diskinfo->drive=drive;
int ijk = 0;
USHORT *pIdSector = (USHORT *)
((PSENDCMDOUTPARAMS) IdOutCmd) -> bBuffer;
for (ijk = 0; ijk < 256; ijk++)
diskinfo->diskdata[ijk] = pIdSector [ijk];
diskinfo_arraylis.m_diskinfo.push_back(diskinfo);
done = TRUE;
}
}
}
CloseHandle (hPhysicalDriveIOCTL);
}
}
return done;
}