以下为我网上找的代码。经过调试可以获得mac。但是我如果装一张无线网卡进去,能够看到两个mac。但是却不能知道那个是无线那个是有线(pci),因为打算把mac 作为软件的注册信息。所以只能取一个,而且统一起来只取pci网卡的macid 。兄弟才疏学浅。才来此拜山头。分数不多。能给好多给好多。
bool CLifeApp::dywkid()
{ char tempChar;
ULONG uListSize=1;
PIP_ADAPTER_INFO pAdapter; // 定义PIP_ADAPTER_INFO结构存储网卡信息
int nAdapterIndex = 0; DWORD dwRet = GetAdaptersInfo((PIP_ADAPTER_INFO)&tempChar, &uListSize); // 关键函数 if (dwRet == ERROR_BUFFER_OVERFLOW)
{
PIP_ADAPTER_INFO pAdapterListBuffer = (PIP_ADAPTER_INFO)new(char[uListSize]);
dwRet = GetAdaptersInfo(pAdapterListBuffer, &uListSize);
if (dwRet == ERROR_SUCCESS)
{
pAdapter = pAdapterListBuffer;
while (pAdapter) // 枚举网卡
{
u_char g_ucLocalMac[6];
memcpy(g_ucLocalMac, pAdapter->Address,6);
u_char *p = g_ucLocalMac;
wkidku[nAdapterIndex].Format("%02X%02X%02X", p[3], p[4], p[5]);
AfxMessageBox(wkidku[nAdapterIndex] );
AdapterList[nAdapterIndex].dwIndex = pAdapter->Index; // 编号 pAdapter = pAdapter->Next; nAdapterIndex ++;
}
delete pAdapterListBuffer;
}
}
return false;
}
bool CLifeApp::dywkid()
{ char tempChar;
ULONG uListSize=1;
PIP_ADAPTER_INFO pAdapter; // 定义PIP_ADAPTER_INFO结构存储网卡信息
int nAdapterIndex = 0; DWORD dwRet = GetAdaptersInfo((PIP_ADAPTER_INFO)&tempChar, &uListSize); // 关键函数 if (dwRet == ERROR_BUFFER_OVERFLOW)
{
PIP_ADAPTER_INFO pAdapterListBuffer = (PIP_ADAPTER_INFO)new(char[uListSize]);
dwRet = GetAdaptersInfo(pAdapterListBuffer, &uListSize);
if (dwRet == ERROR_SUCCESS)
{
pAdapter = pAdapterListBuffer;
while (pAdapter) // 枚举网卡
{
u_char g_ucLocalMac[6];
memcpy(g_ucLocalMac, pAdapter->Address,6);
u_char *p = g_ucLocalMac;
wkidku[nAdapterIndex].Format("%02X%02X%02X", p[3], p[4], p[5]);
AfxMessageBox(wkidku[nAdapterIndex] );
AdapterList[nAdapterIndex].dwIndex = pAdapter->Index; // 编号 pAdapter = pAdapter->Next; nAdapterIndex ++;
}
delete pAdapterListBuffer;
}
}
return false;
}
我就想问下取那个值能够看到网卡是不是pci的特征
// 全局数据
u_char g_ucLocalMac[6]; // 本地MAC地址
DWORD g_dwGatewayIP; // 网关IP地址
DWORD g_dwLocalIP; // 本地IP地址
DWORD g_dwMask; // 子网掩码BOOL GetGlobalData()
{
PIP_ADAPTER_INFO pAdapterInfo = NULL;
ULONG ulLen = 0; // 为适配器结构申请内存
::GetAdaptersInfo(pAdapterInfo,&ulLen);
pAdapterInfo = (PIP_ADAPTER_INFO)::GlobalAlloc(GPTR, ulLen); // 取得本地适配器结构信息
if(::GetAdaptersInfo(pAdapterInfo,&ulLen) == NO_ERROR )
{
pAdapterInfo=pAdapterInfo->Next;//由于自己是双网卡,第一个是无线网卡,第二个才有信息.
if(pAdapterInfo != NULL)
{
memcpy(g_ucLocalMac, pAdapterInfo->Address, 6);
g_dwGatewayIP = ::inet_addr(pAdapterInfo->GatewayList.IpAddress.String);
g_dwLocalIP = ::inet_addr(pAdapterInfo->IpAddressList.IpAddress.String);
g_dwMask = ::inet_addr(pAdapterInfo->IpAddressList.IpMask.String);
}
} printf(" \n -------------------- 本地主机信息 -----------------------\n\n");
in_addr in;
in.S_un.S_addr = g_dwLocalIP;
printf(" IP Address : %s \n", ::inet_ntoa(in)); in.S_un.S_addr = g_dwMask;
printf(" Subnet Mask : %s \n", ::inet_ntoa(in)); in.S_un.S_addr = g_dwGatewayIP;
printf(" Default Gateway : %s \n", ::inet_ntoa(in)); u_char *p = g_ucLocalMac;
printf(" MAC Address : %02X-%02X-%02X-%02X-%02X-%02X \n", p[0], p[1], p[2], p[3], p[4], p[5]); printf(" \n \n "); return TRUE;
}
我这个问题的关键是如何从获得多个网卡信息中进行判断。最终找出pci网卡的mac。
// 取得本地适配器结构信息
if(::GetAdaptersInfo(pAdapterInfo,&ulLen) == NO_ERROR )
{
pAdapterInfo=pAdapterInfo->Next;//由于自己是双网卡,第一个是无线网卡,第二个才有信息.
这种直接获取到信息后就next的方法是行不通的。因为不能确定第一个还是第二个是无线网卡,也就是说他们的排列顺序问题。
while (pAdapter) // 枚举网卡
{
u_char g_ucLocalMac[6];
memcpy(g_ucLocalMac, pAdapter->Address,6);
u_char *p = g_ucLocalMac;
wkidku[nAdapterIndex].Format("%02X%02X%02X", p[3], p[4], p[5]);
AfxMessageBox(wkidku[nAdapterIndex] );
AdapterList[nAdapterIndex].dwIndex = pAdapter->Index; // 编号 pAdapter = pAdapter->Next; nAdapterIndex ++;
}
我使用的如上代码是循环取出。目前困扰我的就是如何从取出的资料中区分pci的mac
再次谢谢楼上老兄,继续求解
int iEAXValue, iEBXValue, iECXValue, iEDXValue;
_asm
{
mov eax, 01h
// xor edx,edx
cpuid
mov iEDXValue, edx
mov iEAXValue, eax
}
_asm
{
mov eax, 03h
xor ecx, ecx
xor edx, edx
cpuid
mov iEBXValue, edx
mov iECXValue, ecx
}//获取cpuid
CPUID.Format( "%d%d%d%d", iEAXValue, iEBXValue, iECXValue, iEDXValue );