**:
#include
#include // api getadaptersinfo 標頭檔案
#include // api strcmpia 標頭檔案
#pragma comment(lib, 「iphlpapi.lib」)
#pragma comment(lib, 「shlwapi.lib」)
#include // api stringcbprintfa 標頭檔案
#include // api lstrcpya 標頭檔案
// 功能:獲取介面卡特性
// 引數:
// adapter_name 介面卡 id
// 返回值:成功則返回由引數指定的介面卡的特性標誌,是乙個 dword 值,失敗返回 0
uint getadaptercharacteristics(char* adapter_name)
if(adapter_name == null || adapter_name[0] == 0)
return 0;
hkey root = null;
// 開啟儲存介面卡資訊的登錄檔根鍵
if(error_success != regopenkeyexa(hkey_local_machine, 「system\currentcontrolset\control\class\」, 0, key_read, &root))
return 0;
dword subkeys = 0;
// 獲取該鍵下的子鍵數
if(error_success != regqueryinfokeya(root, null, null, null, &subkeys, null, null, null, null, null, null, null))
subkeys = 100;
dword ret_value = 0;
for(dword i = 0; i < subkeys; i++)
// 每個介面卡用乙個子鍵儲存,子鍵名為從 0 開始的 4 位數
char subkey[max_size];
memset(subkey, 0, max_size);
stringcbprintfa(subkey, max_size, 「%04u」, i);
// 開啟該子鍵
hkey hkey = null;
if(error_success != regopenkeyexa(root, subkey, 0, key_read, &hkey))
continue;
// 獲取該子鍵對應的介面卡 id,存於 name 中
char name[max_path];
dword type = 0;
dword size = max_path;
if(error_success != regqueryvalueexa(hkey, 「netcfginstanceid」, null, &type, (lpbyte)name, &size))
regclosekey(hkey);
continue;
// 對比該介面卡 id 是不是要獲取特性的介面卡 id
if(strcmpia(name, adapter_name) != 0)
regclosekey(hkey);
continue;
// 讀取該介面卡的特性標誌,該標誌儲存於值 characteristics 中
dword val = 0;
size = 4;
lstatus ls = regqueryvalueexa(hkey, 「characteristics」, null, &type, (lpbyte)&val, &size);
regclosekey(hkey);
if(error_success == ls)
ret_value = val;
break;
regclosekey(root);
return ret_value;
// 引數:
// mac 用於輸出 mac 位址的二進位制資料的緩衝區指標
int getmac(byte mac[buf_size])
#define ncf_physical 0x4
dword adapterinfosize = 0;
if(error_buffer_overflow != getadaptersinfo(null, &adapterinfosize))
stringcbprintfa((lpstr)mac, buf_size, 「getmac failed! errorcode: %d」, getlasterror());
return 0;
void* buffer = malloc(adapterinfosize);
if(buffer == null)
lstrcpya((lpstr)mac, 「getmac failed! because malloc failed!」);
return 0;
pip_adapter_info padapt = (pip_adapter_info)buffer;
if(error_success != getadaptersinfo(padapt, &adapterinfosize))
stringcbprintfa((lpstr)mac, buf_size, 「getmac failed! errorcode: %d」, getlasterror());
free(buffer);
return 0;
int mac_length = 0;
while(padapt)
if(padapt->addresslength >= 6 && padapt->addresslength <= 8)
memcpy(mac, padapt->address, padapt->addresslength);
mac_length = padapt->addresslength;
uint flag = getadaptercharacteristics(padapt->adaptername);
bool is_physical = ((flag & ncf_physical) == ncf_physical);
if(is_physical)
break;
padapt = padapt->next;
free(buffer);
return mac_length;
// 引數:
// mac 用於儲存 mac 位址的緩衝區指標
void getmacaddress( char* mac )
byte buf[buf_size];
memset(buf, 0, buf_size);
int len = getmac(buf);
if(len <= 0)
lstrcpya(mac, (lpcstr)buf);
return;
if(len == 6)
stringcbprintfa(mac, buf_size, 「%02x-%02x-%02x-%02x-%02x-%02x」, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
else
stringcbprintfa(mac, buf_size, 「%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x」, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]);
編譯環境: vs2008 + windows sdk 7.1
函式功能在 windows 2000、windows xp、windows 2003、vista、 win7 32位和 win7 64 位下均測試通過。
如何用shell指令碼獲取所有網絡卡名稱和IP位址
1.為了成對統計電腦的網絡卡和ip,本人實現的一種方法 bin bash 先過濾網絡卡名稱,存到陣列a中a ifconfig grep a z awk f 在拿到ip位址,存到陣列b中b ifconfig grep inet sed s inet g sed s netmask.g for i 0 ...
如何用API從風管型別獲取風管型別的截面形狀
現在revit沒有開放直接可用的api從ducttype來獲取管道型別的形狀。本文給出了乙個替代解決辦法來獲取。思路是這樣的 從風管型別獲取與風管型別關聯的彎頭族型別,然後開啟這個彎頭族,在從開啟的族文件中獲取連線件ductconnector的截面形狀。這個事可以工作的。但是效率不是很高,因為需要開...
如何用命令檢視linux的網絡卡吞吐量或最大網絡卡流量
linux檢視網絡卡吞吐量和網絡卡流量用自帶命令,iptraf檢視。1 命令列直接輸入 iptraf 如果沒有,使用yum install iptraf安裝 2.開啟進入選擇ip映象。3.選擇監聽測試的介面,所有介面。4.開啟監聽狀態日誌,系統預設日誌路徑。var log iptraf ip tra...