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