关于获取系统信息,CPUID,硬盘ID,网卡MAC地址的VS2008实现

前段时间,总是要获取一些系统的相关信息。在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


猜你喜欢

转载自blog.csdn.net/zy499/article/details/79488396
今日推荐