请问如何能做到: 枚举网卡时,找到的是网卡,而不是 对应的 数据包计划程序微型端口?现在用GetAdapterInfo函数总是找到 网卡的 数据包计划程序微型端口我想找到的是
"Realtek RTL8139 Family PCI Fast Ethernet NIC"
而不是
"Realtek RTL8139 Family PCI Fast Ethernet NIC - 数据包计划程序微型端口"因为我想用QueryDosDeviceA来根据设备名称找到对应的 “设备对象名”恳请诸位救我
"Realtek RTL8139 Family PCI Fast Ethernet NIC"
而不是
"Realtek RTL8139 Family PCI Fast Ethernet NIC - 数据包计划程序微型端口"因为我想用QueryDosDeviceA来根据设备名称找到对应的 “设备对象名”恳请诸位救我
// 取得所有网卡信息
//-----------------------------------------------------------------
BOOL GetAdapterInfo()
{
// 这里的代码适合WINDOWS2000,对于NT需要读取HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards
HKEY hKey, hSubKey, hNdiIntKey;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards",
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);
#include "Winsock2.h"
#include <vector>
#pragma comment(lib,"Iphlpapi.lib")class AdapterInfo : public MIB_IFROW
{ public:
CString strMacAddress;
CString strDescrption;
}typedef std::vector<AdapterInfo> AdapterInfoVector;HRESULT CPDTool::GetAdapterInfo( AdapterInfoVector& infoVector )
{
HRESULT hr = E_FAIL;
ULONG dwSize = 0;
byte* pBuffer = NULL; try
{
infoVector.clear();
GetIfTable( NULL, &dwSize, TRUE );
ASSERT( dwSize > 0 );
pBuffer = new byte[dwSize];
ZeroMemory( pBuffer, dwSize );
PMIB_IFTABLE pIfTable = (PMIB_IFTABLE)pBuffer;
ASSERT( GetIfTable( pIfTable, &dwSize, TRUE ) == NO_ERROR );
for ( DWORD i = 0; i < pIfTable->dwNumEntries; i++ )
{
MIB_IFROW *pIfRow = (MIB_IFROW *) &(pIfTable->table[i]);
AdapterInfo adapterInfo;
memcpy( ((PMIB_IFROW)&adapterInfo), (MIB_IFROW *) &(pIfTable->table[i]), sizeof(MIB_IFROW)); adapterInfo.strMacAddress.Empty();
for ( int j = 0; j < (int) pIfRow->dwPhysAddrLen; j++)
{
CString strTemp;
if ( j == ( pIfRow->dwPhysAddrLen - 1) )
{
strTemp.Format( _T("%.2X\n"), (int) pIfRow->bPhysAddr[j] );
}
else
{
strTemp.Format( _T("%.2X-"), (int) pIfRow->bPhysAddr[j]);
}
adapterInfo.strMacAddress += strTemp;
}
adapterInfo.strDescrption.Empty();
BYTE bDescr[MAXLEN_IFDESCR + sizeof(TCHAR)];
ZeroMemory( bDescr, sizeof(bDescr) );
memcpy( bDescr, pIfRow->bDescr, pIfRow->dwDescrLen);
adapterInfo.strDescrption = (CHAR*)bDescr;
infoVector.push_back( adapterInfo ); }
hr = S_OK;
}
catch(...)
{
} if ( pBuffer )
{
delete []pBuffer;
}
return hr;
}