VC获取硬件信息(如硬盘物理序列号及CPUID,主板序列号等等) ??

时间:2022-09-04 18:45:51
如题,公司开发的软件,要实现和某个计算机绑定。

注:是物理的,不是分区的,就是取得的东西必须是机子独一无二的标识。


多谢啦,在线等啊!

31 个解决方案

#1


//an为8字节缓存
int GetCPUid(BYTE *an)
{           
unsigned long s1 = 0,s2=0;       
_asm       
{       
mov     eax,01h       
xor     edx,edx       
cpuid       
mov     s1,edx       
mov     s2,eax       
}
 
memcpy(an,(BYTE *)&s1,4);
memcpy(an+4,(BYTE *)&s2,4);
return 8;
}

硬盘ID:
http://topic.csdn.net/u/20080918/13/6501b4ac-4d2f-44cc-9a0c-16ce88624fba.html

#2


获取CPU ID 

CString CpuID,CPUID_1,CPUID_2; 
        __asm{   
mov eax,01h   
xor edx,edx   
cpuid   
mov s1,edx   
mov s2,eax   
}   
CPUID_1.Format("%08X%08X",s1,s2);   
__asm{   
mov eax,03h   
xor ecx,ecx   
xor edx,edx   
cpuid   
mov s1,edx   
mov s2,ecx   
}   
CPUID_2.Format("%08X%08X",s1,s2);  
CpuID=CPUID_1+CPUID_2;

#3


http://vip.6to23.com/NowCan1/tech/cpuid.htm

#4


给你个 更详细的吧。
http://www.pcppc.cn/kaifa/VCjiaocheng/kaifa_113966.html

#5



BOOLEAN   MainBoardBiosSerialNo()   
  {   
            
          HANDLE   physmem;   
          UNICODE_STRING   physmemString;   
          OBJECT_ATTRIBUTES   attributes;   
          WCHAR   physmemName[]   =   L"\\Device\\PhysicalMemory";   
    
          NTSTATUS   ntStatus;   
          DWORD   RAdd     =   0xFEC71;   
          DWORD   LAdd     =   100;   
          DWORD   OAdd;   
          DWORD   i;   
          
    
          RtlInitUnicodeString(   &physmemString,   physmemName   );   
    
          InitializeObjectAttributes(   &attributes,     
                                  &physmemString,   
  OBJ_CASE_INSENSITIVE,   
  NULL,     
  NULL   
                                                              );   
    
    
          ntStatus   =   ZwOpenSection(   &physmem,     
                                                              SECTION_MAP_READ,     
              &attributes   
                                                          );   
    
          if(   !NT_SUCCESS(   ntStatus   ))   
          {                 
  DbgPrint("ZwOpenSection()   is   error\n");   
                  return   FALSE;   
          }   
    
          DbgPrint("ZwOpenSection()   is   OK\n");   
    
          if   (!MapView(physmem,&RAdd,&LAdd,&OAdd))   
          {                 
  DbgPrint("MapView()   is   error\n");   
                  return   FALSE;   
          }   
    
            DbgPrint("MapView()   is   OK\n");   
    
            for   (   i   =   0;   i   <   LAdd;   i   ++)   
            {   
                    DbgPrint("%x",*(PUCHAR)(OAdd   +   i));   
                    
            }   
    
            ntStatus   =   ZwUnmapViewOfSection(   (HANDLE)   -1,   (PVOID)   OAdd   );   
    
          if(   !NT_SUCCESS(ntStatus))   
          {   
                  DbgPrint("Unable   to   unmap   view");   
    return   FALSE;   
          }     
    
    
  return   TRUE;   
  }   
    
    
  BOOLEAN   MapView(   HANDLE   HPMemory,DWORD   *dwAddress,DWORD   *dwLength,DWORD   *dwVAddress   )   
  {   
          NTSTATUS                   Status;   
          PHYSICAL_ADDRESS   ViewBaseAddress;   
    
          *dwVAddress   =   0;   
          ViewBaseAddress.QuadPart   =   (ULONGLONG)   (*dwAddress);   
    
          Status   =   ZwMapViewOfSection   (   HPMemory,   
                                                                      (HANDLE)   -1,   
      (PVOID)dwVAddress,   
      0,   
      *dwLength,   
      &ViewBaseAddress,   
      dwLength,   
      ViewShare,   
      0,   
      PAGE_READONLY   
  );   
    
          if(   !NT_SUCCESS(   Status   ))   
          {   
                  return   FALSE;   
          }   
    
          return   TRUE;   
  }   
    

#6


好呀,搜到了...

#7


收藏....,极具升值潜力

#8


哦,好多热心人哦.
CPU,硬盘可以做. 主板就比较麻烦了,即使支持SMBIOS,也不一定有厂商标识或者GUID, 要不全为空要不全为0XFF,要不一串空格

#9


多谢大家啊,只是发一部分代码,我还是整理不出来的,呵呵
能有封装好的类或者源码就更好了,

现在还是没有搞定啊,

#10


学习了

#11


那用户更换硬件怎么办?

#12


所以能获取CPUIID最好了
大家谁还有什么建议啊?
最好把地址发上来,呵呵

多谢了

#13


CPUID 有什么好的?
很多主板可以硬屏蔽对CPU序列号读取命令

#14


CSDN资源里有《VC获取CPU ID号》可以用的,
还是把关键代码发一下吧



char OEMString[13];       
int iEAXValue,iEBXValue,iECXValue,iEDXValue;       
_asm
{       
mov     eax,0       
cpuid       
mov     DWORD     PTR     OEMString,ebx       
mov     DWORD     PTR     OEMString+4,edx       
mov     DWORD     PTR     OEMString+8,ecx       
mov     BYTE     PTR     OEMString+12,0       
}       

SetDlgItemText(IDC_STATIC1,OEMString);  //CPU名称

_asm     
{       
mov     eax,1       
cpuid       
mov     iEAXValue,eax       
mov     iEBXValue,ebx       
mov     iECXValue,ecx       
mov     iEDXValue,edx       
}       

int iCPUFamily=(0xf00 & iEAXValue)>>8;       
char Family[10]={0};
itoa(iCPUFamily,Family,10);
SetDlgItemText(IDC_STATIC2,Family);    //CPU系列

_asm
{       
mov     eax,2       
CPUID       
}       

char szCPUID[129]={NULL};       
char szTmp[33]={NULL};       
unsigned long s1 = 0,s2=0;  

_asm       
{       
mov     eax,01h       
xor     edx,edx       
cpuid       
mov     s1,edx       
mov     s2,eax       
}       
sprintf(szTmp, "%08X%08X", s1, s2);       
strcpy(szCPUID, szTmp);       
_asm       
{       
mov     eax,03h       
xor     ecx,ecx       
xor     edx,edx       
cpuid       
mov     s1,edx       
mov     s2,ecx       
}       
sprintf(szTmp, "%08X%08X", s1, s2);       
strcat(szCPUID, szTmp);  
SetDlgItemText(IDC_STATIC3,szCPUID);   //CPUID号



在这里再次感谢那位上传资源的朋友。

现在问题是有的CPU不支持cpuid指令(而且“很多主板可以硬屏蔽对CPU序列号读取命令”),那该怎么办呢?

还发现一个网址,给大家做参考。http://www.weste.net/2006/6-12/11380593215-2.html

#15


现在可以了,上边获取CPIID还有个小问题,

 _asm       
    {       
        mov     eax,01h       
            xor     edx,edx       
            cpuid       
            mov     s1,edx       
            mov     s2,eax       
    }       
    sprintf(szTmp, "%08X%08X", s1, s2);       
    strcpy(szCPUID, szTmp);

要先判断edx的18位是否为1,为1则CPU有序列号,为没有。若有再执行下边。。。。
_asm       
    {       
        mov     eax,03h       
            xor     ecx,ecx       
            xor     edx,edx       
            cpuid       
            mov     s1,edx       
            mov     s2,ecx       
    }       
硬盘物理序列号在http://www.vckbase.com/document/viewdoc/?id=706有个封装好的类。
这个也不错,可以了解下CPU
http://www.codeguru.com/cpp/w-p/system/hardwareinformation/article.php/c9087/

#16


跨越时空赞下楼主和各位好心人.....

#17


好贴

#18


好好好

#19


学习了......
------------------------------

#20


收藏了

#21


好贴,收藏!

#22


好贴,mark一下,留着以后用!~

#23


xuexi

#24


不容易呀,看个贴子不得回复才能看!

#25


跨越时空的礼赞

#26


一年多了 我又搜到这帖子了

#27


学习中
跨越时空,感谢各位热心的同志

#28


我来了

#29


前人栽树后人乘凉,在此谢过~

#30


mark

#31


标记,哈哈哈……

#1


//an为8字节缓存
int GetCPUid(BYTE *an)
{           
unsigned long s1 = 0,s2=0;       
_asm       
{       
mov     eax,01h       
xor     edx,edx       
cpuid       
mov     s1,edx       
mov     s2,eax       
}
 
memcpy(an,(BYTE *)&s1,4);
memcpy(an+4,(BYTE *)&s2,4);
return 8;
}

硬盘ID:
http://topic.csdn.net/u/20080918/13/6501b4ac-4d2f-44cc-9a0c-16ce88624fba.html

#2


获取CPU ID 

CString CpuID,CPUID_1,CPUID_2; 
        __asm{   
mov eax,01h   
xor edx,edx   
cpuid   
mov s1,edx   
mov s2,eax   
}   
CPUID_1.Format("%08X%08X",s1,s2);   
__asm{   
mov eax,03h   
xor ecx,ecx   
xor edx,edx   
cpuid   
mov s1,edx   
mov s2,ecx   
}   
CPUID_2.Format("%08X%08X",s1,s2);  
CpuID=CPUID_1+CPUID_2;

#3


http://vip.6to23.com/NowCan1/tech/cpuid.htm

#4


给你个 更详细的吧。
http://www.pcppc.cn/kaifa/VCjiaocheng/kaifa_113966.html

#5



BOOLEAN   MainBoardBiosSerialNo()   
  {   
            
          HANDLE   physmem;   
          UNICODE_STRING   physmemString;   
          OBJECT_ATTRIBUTES   attributes;   
          WCHAR   physmemName[]   =   L"\\Device\\PhysicalMemory";   
    
          NTSTATUS   ntStatus;   
          DWORD   RAdd     =   0xFEC71;   
          DWORD   LAdd     =   100;   
          DWORD   OAdd;   
          DWORD   i;   
          
    
          RtlInitUnicodeString(   &physmemString,   physmemName   );   
    
          InitializeObjectAttributes(   &attributes,     
                                  &physmemString,   
  OBJ_CASE_INSENSITIVE,   
  NULL,     
  NULL   
                                                              );   
    
    
          ntStatus   =   ZwOpenSection(   &physmem,     
                                                              SECTION_MAP_READ,     
              &attributes   
                                                          );   
    
          if(   !NT_SUCCESS(   ntStatus   ))   
          {                 
  DbgPrint("ZwOpenSection()   is   error\n");   
                  return   FALSE;   
          }   
    
          DbgPrint("ZwOpenSection()   is   OK\n");   
    
          if   (!MapView(physmem,&RAdd,&LAdd,&OAdd))   
          {                 
  DbgPrint("MapView()   is   error\n");   
                  return   FALSE;   
          }   
    
            DbgPrint("MapView()   is   OK\n");   
    
            for   (   i   =   0;   i   <   LAdd;   i   ++)   
            {   
                    DbgPrint("%x",*(PUCHAR)(OAdd   +   i));   
                    
            }   
    
            ntStatus   =   ZwUnmapViewOfSection(   (HANDLE)   -1,   (PVOID)   OAdd   );   
    
          if(   !NT_SUCCESS(ntStatus))   
          {   
                  DbgPrint("Unable   to   unmap   view");   
    return   FALSE;   
          }     
    
    
  return   TRUE;   
  }   
    
    
  BOOLEAN   MapView(   HANDLE   HPMemory,DWORD   *dwAddress,DWORD   *dwLength,DWORD   *dwVAddress   )   
  {   
          NTSTATUS                   Status;   
          PHYSICAL_ADDRESS   ViewBaseAddress;   
    
          *dwVAddress   =   0;   
          ViewBaseAddress.QuadPart   =   (ULONGLONG)   (*dwAddress);   
    
          Status   =   ZwMapViewOfSection   (   HPMemory,   
                                                                      (HANDLE)   -1,   
      (PVOID)dwVAddress,   
      0,   
      *dwLength,   
      &ViewBaseAddress,   
      dwLength,   
      ViewShare,   
      0,   
      PAGE_READONLY   
  );   
    
          if(   !NT_SUCCESS(   Status   ))   
          {   
                  return   FALSE;   
          }   
    
          return   TRUE;   
  }   
    

#6


好呀,搜到了...

#7


收藏....,极具升值潜力

#8


哦,好多热心人哦.
CPU,硬盘可以做. 主板就比较麻烦了,即使支持SMBIOS,也不一定有厂商标识或者GUID, 要不全为空要不全为0XFF,要不一串空格

#9


多谢大家啊,只是发一部分代码,我还是整理不出来的,呵呵
能有封装好的类或者源码就更好了,

现在还是没有搞定啊,

#10


学习了

#11


那用户更换硬件怎么办?

#12


所以能获取CPUIID最好了
大家谁还有什么建议啊?
最好把地址发上来,呵呵

多谢了

#13


CPUID 有什么好的?
很多主板可以硬屏蔽对CPU序列号读取命令

#14


CSDN资源里有《VC获取CPU ID号》可以用的,
还是把关键代码发一下吧



char OEMString[13];       
int iEAXValue,iEBXValue,iECXValue,iEDXValue;       
_asm
{       
mov     eax,0       
cpuid       
mov     DWORD     PTR     OEMString,ebx       
mov     DWORD     PTR     OEMString+4,edx       
mov     DWORD     PTR     OEMString+8,ecx       
mov     BYTE     PTR     OEMString+12,0       
}       

SetDlgItemText(IDC_STATIC1,OEMString);  //CPU名称

_asm     
{       
mov     eax,1       
cpuid       
mov     iEAXValue,eax       
mov     iEBXValue,ebx       
mov     iECXValue,ecx       
mov     iEDXValue,edx       
}       

int iCPUFamily=(0xf00 & iEAXValue)>>8;       
char Family[10]={0};
itoa(iCPUFamily,Family,10);
SetDlgItemText(IDC_STATIC2,Family);    //CPU系列

_asm
{       
mov     eax,2       
CPUID       
}       

char szCPUID[129]={NULL};       
char szTmp[33]={NULL};       
unsigned long s1 = 0,s2=0;  

_asm       
{       
mov     eax,01h       
xor     edx,edx       
cpuid       
mov     s1,edx       
mov     s2,eax       
}       
sprintf(szTmp, "%08X%08X", s1, s2);       
strcpy(szCPUID, szTmp);       
_asm       
{       
mov     eax,03h       
xor     ecx,ecx       
xor     edx,edx       
cpuid       
mov     s1,edx       
mov     s2,ecx       
}       
sprintf(szTmp, "%08X%08X", s1, s2);       
strcat(szCPUID, szTmp);  
SetDlgItemText(IDC_STATIC3,szCPUID);   //CPUID号



在这里再次感谢那位上传资源的朋友。

现在问题是有的CPU不支持cpuid指令(而且“很多主板可以硬屏蔽对CPU序列号读取命令”),那该怎么办呢?

还发现一个网址,给大家做参考。http://www.weste.net/2006/6-12/11380593215-2.html

#15


现在可以了,上边获取CPIID还有个小问题,

 _asm       
    {       
        mov     eax,01h       
            xor     edx,edx       
            cpuid       
            mov     s1,edx       
            mov     s2,eax       
    }       
    sprintf(szTmp, "%08X%08X", s1, s2);       
    strcpy(szCPUID, szTmp);

要先判断edx的18位是否为1,为1则CPU有序列号,为没有。若有再执行下边。。。。
_asm       
    {       
        mov     eax,03h       
            xor     ecx,ecx       
            xor     edx,edx       
            cpuid       
            mov     s1,edx       
            mov     s2,ecx       
    }       
硬盘物理序列号在http://www.vckbase.com/document/viewdoc/?id=706有个封装好的类。
这个也不错,可以了解下CPU
http://www.codeguru.com/cpp/w-p/system/hardwareinformation/article.php/c9087/

#16


跨越时空赞下楼主和各位好心人.....

#17


好贴

#18


好好好

#19


学习了......
------------------------------

#20


收藏了

#21


好贴,收藏!

#22


好贴,mark一下,留着以后用!~

#23


xuexi

#24


不容易呀,看个贴子不得回复才能看!

#25


跨越时空的礼赞

#26


一年多了 我又搜到这帖子了

#27


学习中
跨越时空,感谢各位热心的同志

#28


我来了

#29


前人栽树后人乘凉,在此谢过~

#30


mark

#31


标记,哈哈哈……