天天看點

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

//來源:阿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;

繼續閱讀