前段时间,总是要获取一些系统的相关信息。在MSDN和各种论坛找了好久,暂时用如下办法解决了。(有网上相关的代码)
参考过使用WMI,速度不敢恭维。就使用了别的方法。
获取的包括:
操作系统信息:基本支持2000-win8.1 (xp win7 64 测试过);
CPUID:网上的汇编老办法了,也不知道对不对,也收集了;
硬盘ID: 可以获取指定磁盘序号的ID;
当前网卡的MAC: 参考网上的,使用iphlpapi.h。
因为我的需要,这些输出都为CString了,有需要改的朋友直接修改代码。
接口相关:
Class:CGetSystemInfo;
GetOSVersion();
GetMACaddress();
GetCPUID();
GetDiskInfo(int driver = 0);
1、GetOSVersion 这个太长了。打包到里头就不列出来了。
2、GetMACaddress
strMAC 在外面定义了,若单独使用,在函数定义就行。
BOOL CGetSystemInfo::GetMACaddress()
{
PIP_ADAPTER_INFO pAdapterInfo;
DWORD AdapterInfoSize;
DWORD Err;
AdapterInfoSize = 0;
Err = GetAdaptersInfo(NULL, &AdapterInfoSize);
if((Err != 0) && (Err != ERROR_BUFFER_OVERFLOW)){
TRACE("获得网卡信息失败!");
return FALSE;
}
// 分配网卡信息内存
pAdapterInfo = (PIP_ADAPTER_INFO) GlobalAlloc(GPTR, AdapterInfoSize);
if(pAdapterInfo == NULL){
TRACE("分配网卡信息内存失败");
return FALSE;
}
if(GetAdaptersInfo(pAdapterInfo, &AdapterInfoSize) != 0){
TRACE(_T("获得网卡信息失败!\n"));
GlobalFree(pAdapterInfo);
return FALSE;
}
strMac.Format(_T("%02X%02X%02X%02X%02X%02X"),
pAdapterInfo->Address[0],
pAdapterInfo->Address[1],
pAdapterInfo->Address[2],
pAdapterInfo->Address[3],
pAdapterInfo->Address[4],
pAdapterInfo->Address[5]);
GlobalFree(pAdapterInfo);
return TRUE;
}
3、GetCPUID
strCPUID 是输出;
void CGetSystemInfo::GetCPUID()
{
CString VernderID;
CString CPUID1,CPUID2;
unsigned long s1,s2;
unsigned char vendor_id[]="------------";
__asm
{
xor eax,eax //eax=0:取Vendor信息
cpuid //取cpu id指令,可在Ring3级使用
mov dword ptr vendor_id,ebx
mov dword ptr vendor_id[+4],edx
mov dword ptr vendor_id[+8],ecx
}
VernderID.Format(_T("%s-"),vendor_id);
__asm
{
mov eax,01h //eax=1:取CPU序列号
xor edx,edx
cpuid
mov s1,edx
mov s2,eax
}
CPUID1.Format(_T("%08X%08X"),s1,s2);
__asm
{
mov eax,03h
xor ecx,ecx
xor edx,edx
cpuid
mov s1,edx
mov s2,ecx
}
CPUID2.Format(_T("%08X%08X"),s1,s2);
strCPUID = CPUID1 + CPUID2;
}
4
、GetDiskInfo
strSerialNumber、strModelNumber 为输出;
int CGetSystemInfo::GetDiskInfo(int driver)
{
char szModelNumber[64];
char szSerialNumber[64];
CString sFilePath;
sFilePath.Format(L"\\\\.\\PHYSICALDRIVE%d",driver);
HANDLE hFile = INVALID_HANDLE_VALUE;
hFile = ::CreateFile(sFilePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,
0, NULL);
if (hFile == INVALID_HANDLE_VALUE) return -1;
DWORD dwBytesReturned;
GETVERSIONINPARAMS gvopVersionParams;
DeviceIoControl(hFile,
SMART_GET_VERSION,
NULL,
0,
&gvopVersionParams,
sizeof(gvopVersionParams),
&dwBytesReturned, NULL);
if(gvopVersionParams.bIDEDeviceMap <= 0) return -2;
// IDE or ATAPI IDENTIFY cmd
int btIDCmd = 0;
SENDCMDINPARAMS InParams;
int nDrive =0;
btIDCmd = (gvopVersionParams.bIDEDeviceMap >> nDrive & 0x10) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;
// 输出参数
BYTE btIDOutCmd[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];
if(DoIdentify(hFile,
&InParams,
(PSENDCMDOUTPARAMS)btIDOutCmd,
(BYTE)btIDCmd,
(BYTE)nDrive, &dwBytesReturned) == FALSE) return -3;
::CloseHandle(hFile);
DWORD dwDiskData[256];
USHORT *pIDSector; // 对应结构IDSECTOR,见头文件
pIDSector = (USHORT*)((SENDCMDOUTPARAMS*)btIDOutCmd)->bBuffer;
for(int i=0; i < 256; i++) dwDiskData[i] = pIDSector[i];
// 取系列号
ZeroMemory(szSerialNumber, sizeof(szSerialNumber));
strcpy(szSerialNumber, ConvertToString(dwDiskData, 10, 19));
strSerialNumber = szSerialNumber;
// 取模型号
ZeroMemory(szModelNumber, sizeof(szModelNumber));
strcpy(szModelNumber, ConvertToString(dwDiskData, 27, 46));
strModelNumber = szModelNumber;
return 0;
}
一些头文件:
#include "atlbase.h"
#include "winioctl.h"
#include "iphlpapi.h"
#pragma comment ( lib, "Iphlpapi.lib" )
const WORD IDE_ATAPI_IDENTIFY = 0xA1; // 读取ATAPI设备的命令
const WORD IDE_ATA_IDENTIFY = 0xEC; // 读取ATA设备的命令
下载地址:http://download.csdn.net/detail/chenzy945/8418897
转载:http://blog.csdn.net/chenzy945/article/details/43446165