网卡的MAC是如何得到的?

解决方案 »

  1.   

    vckbase上好像有一个文章,自己搜搜。
      

  2.   

    //-----------------------------------------------------------------   
      // 取得所有网卡信息   
      //-----------------------------------------------------------------   
      BOOL   GetAdapterInfo()   
      {   
      //   这里的代码适合WINDOWS2000,对于NT需要读取HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows   NT\CurrentVersion\NetworkCards   
      HKEY   hKey,   hSubKey,   hNdiIntKey;   
        
      if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,   
      "System\\CurrentControlSet\\Control\\Class\\{4d36e972-e325-11ce-bfc1-08002be10318}",   
      0,   
      KEY_READ,   
      &hKey)   !=   ERROR_SUCCESS)   
      return   FALSE;   
        
      DWORD   dwIndex   =   0;   
      DWORD   dwBufSize   =   256;   
      DWORD   dwDataType;   
      char   szSubKey[256];   
      unsigned   char   szData[256];   
        
      while(RegEnumKeyEx(hKey,   dwIndex++,   szSubKey,   &dwBufSize,   NULL,   NULL,   NULL,   NULL)   ==   ERROR_SUCCESS)   
      {   
      //AfxMessageBox(szSubKey);   
      if(RegOpenKeyEx(hKey,   szSubKey,   0,   KEY_READ,   &hSubKey)   ==   ERROR_SUCCESS)   
      {   
      if(RegOpenKeyEx(hSubKey,   "Ndi\\Interfaces",   0,   KEY_READ,   &hNdiIntKey)   ==   ERROR_SUCCESS)   
      {   
      dwBufSize   =   256;   
      if(RegQueryValueEx(hNdiIntKey,   "LowerRange",   0,   &dwDataType,   szData,   &dwBufSize)   ==   ERROR_SUCCESS)   
      {   
      if(strcmp((char*)szData,   "ethernet")   ==   0) // 判断是不是以太网卡   
      {   
      dwBufSize   =   256;   
      if(RegQueryValueEx(hSubKey,   "DriverDesc",   0,   &dwDataType,   szData,   &dwBufSize)   ==   ERROR_SUCCESS)   
      {   
      ADAPTER_INFO   *pAI   =   new   ADAPTER_INFO;   
      pAI->strDriverDesc   =   (LPCTSTR)szData;   
      //AfxMessageBox((LPCTSTR)szData);   
      dwBufSize   =   256;   
      if(RegQueryValueEx(hSubKey,   "NetCfgInstanceID",   0,   &dwDataType,   szData,   &dwBufSize)   ==   ERROR_SUCCESS)   
      {   
      pAI->strName   =   (LPCTSTR)szData;   
      //AfxMessageBox((LPCTSTR)szData);   
      RegGetIP(pAI,   (LPCTSTR)szData);   
      //AfxMessageBox((LPCTSTR)szData);   
      }   
      AdapterInfoVector.push_back(pAI); //   加入到容器中   
      }   
      }   
      }   
      RegCloseKey(hNdiIntKey);   
      }   
      RegCloseKey(hSubKey);   
      }   
        
      dwBufSize   =   256;   
      } /*   end   of   while   */   
        
      RegCloseKey(hKey);   
        
      /*   
      // 可以使用GetAdaptersInfo来取得网卡信息,但其显示的名称不是很具体   
        
      ULONG   ulAdapterInfoSize   =   sizeof(IP_ADAPTER_INFO);   
      IP_ADAPTER_INFO   *pAdapterInfoBkp,   *pAdapterInfo   =   (IP_ADAPTER_INFO*)new   char[ulAdapterInfoSize];   
      if(   GetAdaptersInfo(pAdapterInfo,   &ulAdapterInfoSize)   ==   ERROR_BUFFER_OVERFLOW   ) //   缓冲区不够大   
      {   
      delete   pAdapterInfo;   
      pAdapterInfo   =   (IP_ADAPTER_INFO*)new   char[ulAdapterInfoSize];   
      pAdapterInfoBkp   =   pAdapterInfo;   
      }   
      if(   GetAdaptersInfo(pAdapterInfo,   &ulAdapterInfoSize)   ==   ERROR_SUCCESS   )   
      {   
      do   {   
      if   (pAdapterInfo->Type   ==   MIB_IF_TYPE_ETHERNET)   
      {   
      ADAPTER_INFO   *pAI   =   new   ADAPTER_INFO;   
      pAI->strDriverDesc   =   pAdapterInfo->Description;   
      pAI->strName   =   pAdapterInfo->AdapterName;   
      RegGetIP(pAI,   (LPCTSTR)pAdapterInfo->AdapterName); //   因为IP_ADAPTER_INFO中未包含掩码信息,所以干脆直接读注册表   
      AdapterInfoVector.push_back(pAI);   
      }   
      pAdapterInfo   =   pAdapterInfo->Next;   
      }   while(pAdapterInfo);   
      }   
      delete   pAdapterInfoBkp;   
      */   
      return   TRUE;   
      }   
      

  3.   

    //-----------------------------------------------------------------   
      // 得到注册表中的IP信息   
      // nIndex暂时未处理   
      //-----------------------------------------------------------------   
        
      BOOL   RegGetIP(ADAPTER_INFO   *pAI,   LPCTSTR   lpszAdapterName,   int   nIndex/*   =0   */)   
      {   
      ASSERT(pAI);   
        
      HKEY   hKey;   
      string   strKeyName   =   "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\";   
      strKeyName   +=   lpszAdapterName;   
      if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,   
      strKeyName.c_str(),   
      0,   
      KEY_READ,   
      &hKey)   !=   ERROR_SUCCESS)   
      return   FALSE;   
        
      unsigned   char   szData[256];   
      DWORD   dwDataType,   dwBufSize;   
        
      dwBufSize   =   256;   
      if(RegQueryValueEx(hKey,   "IPAddress",   0,   &dwDataType,   szData,   &dwBufSize)   ==   ERROR_SUCCESS)   
      pAI->strIP   =   (LPCTSTR)szData;   
        
      dwBufSize   =   256;   
      if(RegQueryValueEx(hKey,   "SubnetMask",   0,   &dwDataType,   szData,   &dwBufSize)   ==   ERROR_SUCCESS)   
      pAI->strNetMask   =   (LPCTSTR)szData;   
        
      dwBufSize   =   256;   
      if(RegQueryValueEx(hKey,   "DefaultGateway",   0,   &dwDataType,   szData,   &dwBufSize)   ==   ERROR_SUCCESS)   
      pAI->strNetGate   =   (LPCTSTR)szData;   
        
      RegCloseKey(hKey);   
      return   TRUE;   
      }   
        
      //-----------------------------------------------------------------   
      // 设置注册表中的IP信息   
      //-----------------------------------------------------------------   
        
      BOOL   RegSetIP(LPCTSTR   lpszAdapterName,   int   nIndex,   LPCTSTR   pIPAddress,   LPCTSTR   pNetMask,   LPCTSTR   pNetGate)   
      {   
      HKEY   hKey;   
      string   strKeyName   =   "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\";   
      strKeyName   +=   lpszAdapterName;   
      if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,   
      strKeyName.c_str(),   
      0,   
      KEY_WRITE,   
      &hKey)   !=   ERROR_SUCCESS)   
      return   FALSE;   
        
      char   mszIPAddress[100];   
      char   mszNetMask[100];   
      char   mszNetGate[100];   
        
      strncpy(mszIPAddress,   pIPAddress,   98);   
      strncpy(mszNetMask,   pNetMask,   98);   
      strncpy(mszNetGate,   pNetGate,   98);   
        
      int   nIP,   nMask,   nGate;   
        
      nIP   =   strlen(mszIPAddress);   
      nMask   =   strlen(mszNetMask);   
      nGate   =   strlen(mszNetGate);   
        
      *(mszIPAddress   +   nIP   +   1)   =   0x00;   
      nIP   +=   2;   
        
      *(mszNetMask   +   nMask   +   1)   =   0x00;   
      nMask   +=   2;   
        
      *(mszNetGate   +   nGate   +   1)   =   0x00;   
      nGate   +=   2;   
        
      RegSetValueEx(hKey,   "IPAddress",   0,   REG_MULTI_SZ,   (unsigned   char*)mszIPAddress,   nIP);   
      RegSetValueEx(hKey,   "SubnetMask",   0,   REG_MULTI_SZ,   (unsigned   char*)mszNetMask,   nMask);   
      RegSetValueEx(hKey,   "DefaultGateway",   0,   REG_MULTI_SZ,   (unsigned   char*)mszNetGate,   nGate);   
        
      RegCloseKey(hKey);   
        
      return   TRUE;   
      }   
        
      //-----------------------------------------------------------------   
      // 通知IP地址的改变   
      //-----------------------------------------------------------------   
        
      BOOL   NotifyIPChange(LPCTSTR   lpszAdapterName,   int   nIndex,   LPCTSTR   pIPAddress,   LPCTSTR   pNetMask)   
      {   
      BOOL bResult   =   FALSE;   
      HINSTANCE hDhcpDll;   
      DHCPNOTIFYPROC pDhcpNotifyProc;   
      WCHAR   wcAdapterName[256];   
        
      MultiByteToWideChar(CP_ACP,   0,   lpszAdapterName,   -1,   wcAdapterName,256);   
        
      if((hDhcpDll   =   LoadLibrary("dhcpcsvc"))   ==   NULL)   
      return   FALSE;   
        
      if((pDhcpNotifyProc   =   (DHCPNOTIFYPROC)GetProcAddress(hDhcpDll,   "DhcpNotifyConfigChange"))   !=   NULL)   
      if((pDhcpNotifyProc)(NULL,   wcAdapterName,   TRUE,   nIndex,   inet_addr(pIPAddress),   inet_addr(pNetMask),   0)   ==   ERROR_SUCCESS)   
      bResult   =   TRUE;   
        
      FreeLibrary(hDhcpDll);   
      return   bResult;   
      }   
        
      //-----------------------------------------------------------------   
      // 设置IP地址   
      // 如果只绑定一个IP,nIndex   =   0,暂时未处理一个网卡绑定多个地址   
      //-----------------------------------------------------------------   
        
      BOOL   SetIP(LPCTSTR   lpszAdapterName,   int   nIndex,   LPCTSTR   pIPAddress,   LPCTSTR   pNetMask,   LPCTSTR   pNetGate)   
      {   
      if(!RegSetIP(lpszAdapterName,   nIndex,   pIPAddress,   pNetMask,   pNetGate))   
      return   FALSE;   
        
      if(!NotifyIPChange(lpszAdapterName,   nIndex,   pIPAddress,   pNetMask))   
      return   FALSE;   
        
      return   TRUE;   
      }
      

  4.   

    看了半天,根本没有得到MAC地址的方法嘛。
    不过在上面的基础上,知道IP后一般还是用sendARP函数得到MAC地址。