如何用API函式獲取網絡卡或硬碟的序列號

2021-09-09 09:23:34 字數 3880 閱讀 2758

**:

#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...