999roseto347
驱动牛犊
驱动牛犊
  • 注册日期2002-10-25
  • 最后登录2009-07-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:7134回复:6

如何用deviceiocontrol函数查询网卡硬件地址?

楼主#
更多 发布于:2005-02-19 17:37
用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我。

最新喜欢:

ljmmaryljmmar...
999roseto347
驱动牛犊
驱动牛犊
  • 注册日期2002-10-25
  • 最后登录2009-07-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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;
999roseto347
驱动牛犊
驱动牛犊
  • 注册日期2002-10-25
  • 最后登录2009-07-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-02-20 17:08
NetCardName在下面的键值中:
HKEY_LOCAL_MACHINE
'SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\1?或其他';

servicename中
yujianru
驱动牛犊
驱动牛犊
  • 注册日期2004-11-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-03-16 14:55
这些OID应该是NDIS定义的,不知道在哪里??
ubuntu_amateur
驱动牛犊
驱动牛犊
  • 注册日期2006-08-04
  • 最后登录2008-12-04
  • 粉丝0
  • 关注0
  • 积分970分
  • 威望98点
  • 贡献值0点
  • 好评度97点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-10-11 12:59
Good!
Thanks
there is a will,there is a way
flyflyz
驱动牛犊
驱动牛犊
  • 注册日期2008-04-27
  • 最后登录2008-04-28
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-04-27 06:29
我用了楼主的代码,在2k和xp下能够正确取得网卡的物理地址,可是在win98下无法CreateFile,请问有解决的办法吗?
powerlinm
驱动牛犊
驱动牛犊
  • 注册日期2006-04-10
  • 最后登录2013-03-01
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望166点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2009-04-11 14:58
不错, 看到这个帖子,很开心,不知道是否有效. 我需要翻译成C++。 先顶一下。谢谢了。
游客

返回顶部