VC++ 對網路卡的控制 - 獲得網卡名稱

本文介绍通过VC++和DDK来查询系统中网络适配器名称的方法。使用SetupDiGetClassDevs、SetupDiEnumDeviceInfo及SetupDiGetDeviceRegistryProperty等函数实现对网卡设备的查找与详细信息读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//来源:阿J特殊事件纪录簿: VC++ 对网路卡的控制- 获得网卡名称

//链接:http://inse2005.spaces.live.com/blog/cns!F384BBC6107C1D3F!276.entry

//正文

介紹使用透過 DDK ( Driver Development Kit ) 的方式來查詢。DDK 雖然主要是協助開發驅動的一套API ,但是有很多很實用的函式平時也很好用。

 
例如 :
 

HDEVINFO
  
SetupDiGetClassDevs(
    IN LPGUID  ClassGuid,  OPTIONAL
    IN PCTSTR  Enumerator,  OPTIONAL
    IN HWND  hwndParent,  OPTIONAL
    IN DWORD  Flags
    );

WINSETUPAPI BOOL WINAPI
  
SetupDiEnumDeviceInfo(
    IN HDEVINFO  DeviceInfoSet,
    IN DWORD  MemberIndex,
    OUT PSP_DEVINFO_DATA  DeviceInfoData
    );

BOOL SetupDiGetDeviceRegistryProperty(
  HDEVINFO DeviceInfoSet,
  PSP_DEVINFO_DATA DeviceInfoData,
  DWORD Property,
  PDWORD PropertyRegDataType,
  PBYTE PropertyBuffer,
  DWORD PropertyBufferSize,
  PDWORD RequiredSize
);

  這三`個函式的詳細說明可以參考MSDN,這邊我先簡介一下即可。

SetupDiGetClassDevs  找出系統內的所有裝置

參數一:ClassGuid 要找什麼裝置就傳入什麼裝置類型的 ClassGuid,NULL 則是不指定。

參數二:Enumerator 指定裝置的介面,如果是PCI裝置 就傳入"PCI",NULL 則是不指定。

參數三:hwndParent  指定父視窗的句柄,不需要就用NULL。

參數四:Flags 設定搜尋的條件。

 SetupDiEnumDeviceInfo 獲得該裝置的相關資訊

參數一:DeviceInfoSet 驅動資料叢集,也就是上面 SetupDiGetClassDevs 所獲得的 HDEVINFO 物件。

參數二:MemberIndex 指定第幾個裝置。

參數三:DeviceInfoData 儲存獲得的資訊。

 SetupDiGetDeviceRegistryProperty 獲得單一裝置的特定 ( 或者說 詳細 ) 資料,

( 參數太多 自己看吧 讓我偷個小懶 )

 看起來還是很複雜吧,簡單的說

SetupDiGetClassDevs         ---->獲得特定的某一堆裝置 如網卡 ( 注意系統中可能不只一張網卡 )

SetupDiEnumDeviceInfo   ---->從上面的一堆裝置找出單一裝置 ( 也就是指定兩張網卡中的其中之一 )

SetupDiGetDeviceRegistryProperty   --->再把單一裝置的資訊 轉成我們人類看的懂的資料

 這樣的說法或許不夠精確,但是初期以這樣的了解就可以。接下來就是如何獲得網卡的名稱的實作

 


 

HDEVINFO m_hDevInfo;

m_hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_DEVCLASS_NET,
                                                           "PCI",
                                                             0,
                                                             DIGCF_PROFILE  | DIGCF_PRESENT );

if (m_hDevInfo == INVALID_HANDLE_VALUE)
{
        AfxMessageBox("沒有找到有效的 PCI 網路卡裝置");
        return FALSE;
}

SP_DEVINFO_DATA DeviceInfoData;

DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

int index = 0 // 第一張網卡

if ( SetupDiEnumDeviceInfo(m_hDevInfo,index,&DeviceInfoData) )
{
        DWORD DataT;
        LPTSTR buffer = NULL;
        DWORD buffersize = 0;
 

 while (!SetupDiGetDeviceRegistryProperty(m_hDevInfo,
                                                                     &DeviceInfoData,
                                                                     SPDRP_DEVICEDESC, //指定讀取該裝置的名稱
                                                                     &DataT,
                                                                     (PBYTE)buffer,
                                                                     buffersize,
                                                                     &buffersize))
        {
           
                     if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER )
                    {               
                            if (buffer) LocalFree(buffer);
                                    buffer=(char*)LocalAlloc(LPTR,buffersize);               
                    }
                    else
                    {
                            // Insert error handling here.
                            AfxMessageBox("讀取 Property 錯誤");
                            return FALSE;
                     }
           }
  
          CStrint strEthernet = buffer ;

         AfxMessageBox(strEthernet);

         return TRUE;
}

else

   return FALSE;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值