在VC下獲取原始MAC位址

2021-06-13 04:21:04 字數 2094 閱讀 7753

在vc下獲取原始mac位址

許多windows的作業系統都支援修改mac位址的功能,因此當使用者修改了mac位址之後,在dos視窗下使用ipconfig /all命令和getmac /v命令得到的網絡卡位址資訊都是經使用者修改過的。修改mac位址的方法可以在網上查詢,這裡主要講述如何通過對驅動程式的操作來獲取原始的mac位址。

本文參考splash的博文,鏈結為:

基本實現思路如下:

1、通過網絡卡介面類guid獲取物理網絡卡的裝置路徑名。

2、通過裝置路徑名,用createfile獲取裝置控制代碼。

3、通過裝置控制代碼,用deviceiocontrol與驅動程式進行通訊,獲取網絡卡的原始mac位址和當前mac位址。

具體**:

#include #include #include #pragma comment (lib,"setupapi.lib")

#define macaddress_bytelen 6 // mac位址位元組長度

#define oid_802_3_permanent_address 0x01010101 //the address of the nic encoded in the hardware.

//#define oid_802_3_current_address 0x01010102 //the address the nic is currently using.

* in the deviceiocontrol() function.*/

#define ioctl_ndis_query_global_stats 0x00170002

// 初始化網絡卡原始mac位址的guid結構

guid guid_devclass_query=;

static bool getmacaddress()

// 列舉裝置資訊集中所有裝置

deviceinte***cedata.cbsize = sizeof(sp_device_inte***ce_data);

/*台式電腦一般只有乙太網卡,的以用"memberindex < 1"條件迴圈一次得到的便是乙太網卡的位址,

而對筆記本來說,使用條件"memberindex < 2"可以得到兩條資訊,第一條資訊是乙太網卡的位址,

第二條資訊是無線網絡卡的位址,可以設定引數來實現列印相應的網絡卡位址*/

for( memberindex = 0; memberindex < 1; memberindex++ )

// 獲取接收緩衝區大小,函式返回值為false,getlasterror()=error_insufficient_buffer

setupdigetdeviceinte***cedetail( hdevinfo, &deviceinte***cedata, null, 0, &requiredsize, null );

// 申請接收緩衝區

deviceinte***cedetaildata = (psp_device_inte***ce_detail_data)malloc( requiredsize );

deviceinte***cedetaildata->cbsize = sizeof(sp_device_inte***ce_detail_data);

// 獲取裝置細節資訊

if( setupdigetdeviceinte***cedetail( hdevinfo, &deviceinte***cedata,

deviceinte***cedetaildata, requiredsize, null, null ) )

// if( isok )

} // if( hdevicefile != invalid_handle_value )

} // if( setupdigetdeviceinte***cedetail() )

free( deviceinte***cedetaildata );

} // for( )

setupdidestroydeviceinfolist( hdevinfo );

return true;

} int main()

VC獲取MAC位址

以前用wdk獲取一些硬體資訊,但是有些需要管理員許可權,比較尷尬。誰都不喜歡多彈乙個對話方塊。現在又因為需要獲取mac位址,在網上收集了一下方法,還是有一些方法。使用過其中兩三種,比較推薦如下 個人在vc2010下使用的 原因是,存在虛擬機器時,其他方法往往不能獲取真實mac位址,而是虛擬機器的。下...

用VC獲取本機MAC位址

include stdafx.h include include include include include int getmac char mac astat,pastat astat adapter typedef struct lana enum lana enum lana enum l...

VC6獲取MAC位址方法

localhostinfo.cpp檔案 include include include iphlpapi.h pragma comment lib,iphlpapi.lib pragma comment lib,ws2 32.lib 全域性資料 u char g uclocalmac 6 本地mac...