获取本机IP、MAC地址、CPUID

12 篇文章 0 订阅
11 篇文章 0 订阅

//需要连接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;
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值