获取本机IP、MAC地址、CPUID

来源:互联网 发布:java 服务器 编辑:程序博客网 时间:2024/05/21 14:50

//需要连接Netapi32.lib

#include"winsock2.h" 
#pragma comment(lib,"ws2_32.lib")                                                                                                                         
#include <Nb30.h>  

//内网IP

int GetIPAddr(char *IpAddr)
{        
    WSAData wsaData;                                                                     
    if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0)                                            
    {                                                                                    
        return 1;
    }                                                                                    
                                                                                         
    char host_name[225];                                                                 
    if (gethostname(host_name, sizeof(host_name)) == SOCKET_ERROR)                           
    {                                                                                    
        return 2;
    }                                                                                    
                                                                                         
    struct hostent *phe = gethostbyname(host_name);                                        
    if (phe == 0)                                                                           
    {                                                                                    
        return 3;
    }                                                                                    
   
 for (int i=0; phe->h_addr_list[i]!=0; ++i)
 {
  struct in_addr addr;                                                                 
  memcpy(&addr, phe->h_addr_list[i], sizeof(struct in_addr));
  if (strlen(IpAddr) > 0)
   strcat(IpAddr, "*_*");
  strcat(IpAddr, inet_ntoa(addr));
 }

    WSACleanup();                                                                        
    return 0;                                                                    
}  
                                                                                   
//网卡MAC
int GetMACAddr(char *MACAddr)
{
 try
 {
  NCB ncb;

  typedef struct _ASTAT_
  {
   ADAPTER_STATUS   adapt;
   NAME_BUFFER   NameBuff   [30];
  }ASTAT, *PASTAT;
  ASTAT Adapter;

  typedef struct _LANA_ENUM
  {
   UCHAR   length;
   UCHAR   lana[MAX_LANA];
  }LANA_ENUM;
  LANA_ENUM lana_enum;

  UCHAR uRetCode;
  memset(&ncb, 0, sizeof(ncb));
  memset(&lana_enum, 0, sizeof(lana_enum));

  ncb.ncb_command = NCBENUM;
  ncb.ncb_buffer = (unsigned char *)&lana_enum;
  ncb.ncb_length = sizeof(LANA_ENUM);
  uRetCode = Netbios(&ncb);
  if(uRetCode != NRC_GOODRET)
   return 1;

  for(int lana=0; lana<lana_enum.length; lana++)
  {
   ncb.ncb_command = NCBRESET;
   ncb.ncb_lana_num = lana_enum.lana[lana];
   uRetCode = Netbios(&ncb);
   if(uRetCode == NRC_GOODRET)
    break;
  }
  if(uRetCode != NRC_GOODRET)
   return 2;

  memset(&ncb, 0, sizeof(ncb));
  ncb.ncb_command = NCBASTAT;
  ncb.ncb_lana_num = lana_enum.lana[0];
  strcpy((char*)ncb.ncb_callname, "*");
  ncb.ncb_buffer = (unsigned char *)&Adapter;
  ncb.ncb_length = sizeof(Adapter);
  uRetCode = Netbios(&ncb);
  if(uRetCode != NRC_GOODRET)
   return 3;

  sprintf(MACAddr, "%02X-%02X-%02X-%02X-%02X-%02X",
   Adapter.adapt.adapter_address[0],
   Adapter.adapt.adapter_address[1],
   Adapter.adapt.adapter_address[2],
   Adapter.adapt.adapter_address[3],
   Adapter.adapt.adapter_address[4],
   Adapter.adapt.adapter_address[5]);
  return 0;
 }
 catch (...)
 {
  return -1;
 }
}

//CPU ID
int GetCPUID(char *CpuId)
{
 try
 {
  unsigned   long   s1,s2,s3,s4;
  unsigned   char   vendor_id[]= "------------ ";

  __asm
  {
   xor   eax,eax
   cpuid
   mov   dword   ptr   vendor_id,ebx
   mov   dword   ptr   vendor_id[+4],edx
   mov   dword   ptr   vendor_id[+8],ecx
  }

  __asm
  {
   mov   eax,01h
   xor   edx,edx
   cpuid
   mov   s1,edx
   mov   s2,eax
  }

  __asm
  {
   mov   eax,03h
   xor   ecx,ecx
   xor   edx,edx
   cpuid
   mov   s3,edx
   mov   s4,ecx
  }

  sprintf(CpuId, "%08X%08X", s1, s2);
  return 0;
 }
 catch (...)
 {
  return -1;
 }
}

0 0