阅读:7133回复:6
如何用deviceiocontrol函数查询网卡硬件地址?
用CreateFile打开设备后,有篇文章说用deviceiocontrol进行查询,如下:
deviceiocontrol(hmac,IOCTL_NDIS_QUERY_STATS,OID_802_3_PERMANENT_ADDRESS/OID_802_3_CURRENT_ADDRESS...) 可是我怎么也找不到IOCTL_NDIS_QUERY_STATS以及OID_802_3_PERMANENT_ADDRESS的定义。 IOCTL_NDIS_QUERY_STATS在msdn也找不到,OID_802_3_PERMANENT_ADDRESS在msdn中找得到,但只说是网卡硬件地址,也没说定义的值是多少。 我想IOCTL_NDIS_QUERY_STATS和OID_802_3_PERMANENT_ADDRESS应该是常量吧? 我对ndis一点都不懂,不要bs我。 |
|
最新喜欢:![]() |
沙发#
发布于:2005-02-20 17:05
自已搞定了。
贴出来给需要的人。 function GetNetCardMac(NetCardName:string):string; const OID_802_3_PERMANENT_ADDRESS :Integer = $01010101; OID_802_3_CURRENT_ADDRESS :Integer = $01010102; IOCTL_NDIS_QUERY_GLOBAL_STATS :Integer = $00170002; var hDevice: THandle; inBuf:Integer; outBuf:array[1..256] of Byte; BytesReturned:DWORD; MacAddr:string; i:integer; begin inBuf:=OID_802_3_PERMANENT_ADDRESS; Result:=''; try hDevice:=CreateFile(PChar('\\.\'+NetCardName), GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ or FILE_SHARE_WRITE,nil, OPEN_EXISTING, 0, 0); if hDevice <> INVALID_HANDLE_VALUE then begin if DeviceIoControl(hDevice, IOCTL_NDIS_QUERY_GLOBAL_STATS, @inBuf,4,@outBuf,256,BytesReturned,nil) then begin MacAddr:=''; for i:=1 to BytesReturned do begin MacAddr:=MacAddr+IntToHex(outbuf,2); end; Result:= MacAddr; end; end; finally if not hDevice <> INVALID_HANDLE_VALUE then CloseHandle(hDevice); end; end; |
|
板凳#
发布于:2005-02-20 17:08
NetCardName在下面的键值中:
HKEY_LOCAL_MACHINE 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\1?或其他'; servicename中 |
|
地板#
发布于:2005-03-16 14:55
这些OID应该是NDIS定义的,不知道在哪里??
|
|
地下室#
发布于:2007-10-11 12:59
Good!
Thanks |
|
|
5楼#
发布于:2008-04-27 06:29
我用了楼主的代码,在2k和xp下能够正确取得网卡的物理地址,可是在win98下无法CreateFile,请问有解决的办法吗?
|
|
6楼#
发布于:2009-04-11 14:58
不错, 看到这个帖子,很开心,不知道是否有效. 我需要翻译成C++。 先顶一下。谢谢了。
|
|