精华内容
下载资源
问答
  • WinCE 读取Mac地址实践测试

    千次阅读 2014-02-13 17:02:18
    由于错误的理解WinCE 读取Mac地址就是在注册表中所以怎么读都读不到数据,在此记录测试过程。1、通过注册表中读取Mac地址 ; 2、通过SendARP获取MAC地址。

         由于错误的理解WinCE 读取Mac地址就是在注册表中所以怎么读都读不到数据,在此记录测试过程。

    1、通过注册表中读取Mac地址

    using System;
    using System.Linq;
    using System.Collections.Generic;
    using System.Text;
    using SmartDeviceProjectWtms;
    using Microsoft.Win32;
    using System.Windows.Forms;
    
    namespace SmartDeviceProjectWtms
    {
        class MacReader
        {
            public enum HKEY { HKEY_LOCAL_MACHINE = 0, HKEY_CLASSES_ROOT = 1, HKEY_CURRENT_USER = 2, HKEY_USERS = 3 };
    
            private RegistryKey[] reg = new RegistryKey[4];
    
            public MacReader()
            {
                reg[(int)HKEY.HKEY_LOCAL_MACHINE] = Registry.LocalMachine;
                reg[(int)HKEY.HKEY_CLASSES_ROOT] = Registry.ClassesRoot;
                reg[(int)HKEY.HKEY_CURRENT_USER] = Registry.CurrentUser;
                reg[(int)HKEY.HKEY_USERS] = Registry.Users;
            }
    
            //读指定变量值
            public string ReadValue(HKEY Root, string SubKey, string ValueName)
            {
                RegistryKey subKey = reg[(int)Root];
                if (ValueName.Length == 0) return "[ERROR]";
                try
                {
                    if (SubKey.Length > 0)
                    {
                        string[] strSubKey = SubKey.Split('\\');
                        foreach (string strKeyName in strSubKey)
                        {
                            subKey = subKey.OpenSubKey(strKeyName);
                        }
                    }
                    string strKey = subKey.GetValue(ValueName).ToString();
                    subKey.Close();
                    return strKey;
                }
                catch(Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return "[ERROR]";
                }
            }
    
            //获取mac地址
            public static string GetMacAddr()
            {
                MacReader reg = new MacReader();
                string mac = reg.ReadValue(MacReader.HKEY.HKEY_LOCAL_MACHINE, @"Comm\DM9CE1\Parms", "NetWorkAddress").ToUpper();
                if (mac.Length == 12)
                {
                    mac = mac.Substring(0, 2) + "-" + mac.Substring(2, 2) + "-" + mac.Substring(4, 2) + "-" +
                          mac.Substring(6, 2) + "-" + mac.Substring(8, 2) + "-" + mac.Substring(10, 2);
                }
                return mac;
            }
        }
    }
    

    注:智能设备中按照@“Comm\DM9CE1\Parms”地址读取不到所谓的mac值,无论使用“NetWorkAddress”或是“NetWorkAddress0”,应该是找不到路径所致。

    2、通过SendARP获取MAC地址

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Collections;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    using System.IO;
    using System.Security.Cryptography;
    using System.Net; 
    
    namespace SmartDeviceProjectWtms
    {
        class SysInfoReader
        {
            private static string[] strEncrypt = new string[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AK", "AL", "AM", "AN", "AO", "AP" };
    
            private static Int32 METHOD_BUFFERED = 0;
    
            private static Int32 FILE_ANY_ACCESS = 0;
    
            private static Int32 FILE_DEVICE_HAL = 0x00000101;
    
            private const Int32 ERROR_NOT_SUPPORTED = 0x32;
    
            private const Int32 ERROR_INSUFFICIENT_BUFFER = 0x7A;
    
            private static Int32 IOCTL_HAL_GET_DEVICEID = ((FILE_DEVICE_HAL) << 16) | ((FILE_ANY_ACCESS) << 14) | ((21) << 2) | (METHOD_BUFFERED);
    
            [DllImport("coredll.dll", SetLastError = true)]
            private static extern bool KernelIoControl(Int32 dwIoControlCode, IntPtr lpInBuf, Int32 nInBufSize, byte[] lpOutBuf, Int32 nOutBufSize, ref   Int32 lpBytesReturned);
    
            [DllImport("Iphlpapi.dll", EntryPoint = "SendARP")]
            public static extern uint SendARP(uint DestIP, uint SrcIP, byte[] pMacAddr, ref uint PhyAddrLen);
    
            /// 获取MAC地址 
            public string GetMac()
            {
                uint ip = 0;
                string mac = string.Empty;
                //取本机IP列表 
                IPAddress[] ips = Dns.GetHostEntry(Dns.GetHostName()).AddressList;
                //取本机IP 
                byte[] ipp = ips[1].GetAddressBytes();
                ip = (uint)((ipp[0]) | (ipp[1] << 8) | (ipp[2] << 16) | (ipp[3] << 24));
                //取MAC 
                byte[] MacAddr = new byte[6];
                uint PhyAddrLen = 6;
                uint hr = SendARP(ip, 0, MacAddr, ref PhyAddrLen);
                if (MacAddr[0] != 0 || MacAddr[1] != 0 || MacAddr[2] != 0 || MacAddr[3] != 0 || MacAddr[4] != 0 || MacAddr[5] != 0)
                {
                    mac = MacAddr[0].ToString("X2") + ":" + MacAddr[1].ToString("X2") + ":" + MacAddr[2].ToString("X2") + ":" + MacAddr[3].ToString("X2") + ":" + MacAddr[4].ToString("X2") + ":" + MacAddr[5].ToString("X2");
                }
                return mac;
            }
    
            ///获取本机IP
            public string GetIpAddress() 
            { 
                string strHostName = Dns.GetHostName(); //得到本机的主机名 
                IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);//Dns.GetHostByName(strHostName); //取得本机IP ,此方法已过时
                string strAddr = ipEntry.AddressList[1].ToString(); 
                return strAddr;
            } 
        }
    }
    

    此法则成功获取到了mac地址。


    展开全文
  • 1,待研究 有相同问题的同学,可私信我,我们一起交流。

    1,待研究

    有相同问题的同学,可私信我,我们一起交流。

    展开全文
  • 每个网卡都有一个独一无二的mac地址,一般这个地址就存放在一个e2prom中,这里就是分析一个网卡初始化过程中,怎么从这个e2prom中读取mac地址。 首先这里的e2prom和cpu的i2c控制器相连接,也就是说最后访问这个...


    平台:loongson3A系列CPU+loongson2H桥片的开发板.

    每个网卡都有一个独一无二的mac地址,一般这个地址就存放在一个e2prom中,这里就是分析一个网卡初始化过程中,怎么从这个e2prom中读取mac地址。

    首先这里的e2prom和cpu的i2c控制器相连接,也就是说最后访问这个设备时,使用的是i2c总线的驱动。
    i2c总线的时序这里就不介绍了,大家可以看一个i2c设备的手册,其中时序部分讲解的就很详细了。

    源码在龙芯开源社区:http://www.loongnix.org/cgit。

    网卡的源码:drivers/net/ethernet/stmicro/stmmac
    stmmac_open->stmmac_check_ether_addr->stmmac_eep_get_mac_addr->i2c_transfer
    


    这里是网卡初始化过程中函数调用关系,在最后去取mac地址时调用到函数i2c_transfer,这就是i2c驱动中的代码,下面看这个函数的调用关系:

    i2c驱动源码:drivers/i2c/busses/i2c-ls2h.c

    i2c_transfer-->__i2c_transfer-->adap->algo->master_xfer-->ls2h_i2c_xfer-->ls2h_i2c_doxfer-->ls2h_i2c_start-->ls2h_i2c_read
    

    这里说明一下,adap->algo->master_xfer是一个函数指针,这是在i2c驱动的probe函数初始化的。

    ls2h_i2c_probe
    {
    	...
    	adap->algo = &ls2h_i2c_algo;
    	...
    }
    
    static const struct i2c_algorithm ls2h_i2c_algo = {
    	.master_xfer	= ls2h_i2c_xfer,
    	.functionality	= ls2h_i2c_func,
    };
    

    最后一部分函数的调用
    ls2h_i2c_doxfer-->ls2h_i2c_start-->ls2h_i2c_read
    其实就是模拟i2c时序来和设备进行通信,最后读取出来设备中存储的mac地址。






    展开全文
  • Linux Intel网卡IGB驱动修改mac地址

    千次阅读 2018-12-20 17:58:03
    实然心血来潮,想研究一下Intel网卡mac地址怎么设置的。本文使用IGB驱动,适合于i211等网卡。 MAC地址对于网络来说十分重要,观察过几个网络驱动,发现在Linux内核中,MAC来龙去脉无非以下几个: 1、通过某种...

    实然心血来潮,想研究一下Intel网卡mac地址是怎么设置的。本文使用IGB驱动,适合于i211等网卡。

    MAC地址对于网络来说十分重要,观察过几个网络驱动,发现在Linux内核中,MAC来龙去脉无非以下几个:

    1、通过某种方式读取到mac地址,如果没有,则会有随机的mac地址,比如从eeprom中读取一个预先定义的MAC号;
    2、赋值到netdev的dev_addr——这个值是驱动中使用的地址;
    3、注册网络驱动,多个网卡则要进行多次注册;
    4、如果在用户空间更改mac地址,则使用net_device_ops对应的函数,在该实现函数中要更新netdev的dev_addr,还有可能要修改具体芯片的eeprom。
    一、IGB驱动

    IGB的初始化在igb_main.c文件igb_init_module()函数:

        static int __init igb_init_module(void)
        {
            int ret;
         
            pr_info("%s - version %s\n",
                   igb_driver_string, igb_driver_version);
            pr_info("%s\n", igb_copyright);
         
        #ifdef CONFIG_IGB_DCA
            dca_register_notify(&dca_notifier);
        #endif
            ret = pci_register_driver(&igb_driver);
         
            return ret;
        }

    调用pci_register_driver注册pci驱动,最终会调用到同文件的igb_probe函数,在probe函数中进行各种初始化工作,包括读取NVM的mac地址,注册网络设备。

    注意,如果主板有多个网卡,由于它们的PCI地址不同,会多次调用到igb_probe函数。
    读取MAC地址并进行赋值代码片段如下:

            /* copy the MAC address out of the NVM */
            // 读取eeprom的mac地址,实际调用的函数为igb_read_mac_addr_82575()。
            if (hw->mac.ops.read_mac_addr(hw))
                dev_err(&pdev->dev, "NVM Read Error\n");
         
            // 拷贝到netdev的dev_addr,这个是内核中使用的变量
            memcpy(netdev->dev_addr, hw->mac.addr, netdev->addr_len);
            // 判断MAC是否合法
            if (!is_valid_ether_addr(netdev->dev_addr)) {
                dev_err(&pdev->dev, "Invalid MAC Address\n");
                err = -EIO;
                goto err_eeprom;
            }

    二、添加自定义的MAC地址

    下面在igb_probe中写入自定义的MAC地址,示例代码片段如下:

            // new add by Late Lee
            unsigned char mac[] = {0x6c, 0x61, 0x74, 0x75, 0x6c, 0x65};
            // 根据pci地址做MAC区别,防止使用同一MAC
            if (pdev->bus->number == 1)
            {
                    printk(KERN_ERR "net device num1.\n");
                    mac[5] = 0x65;
            }
            else if (pdev->bus->number == 2)
            {
                printk(KERN_ERR "net device num2.\n");
                mac[5] = 0x66;
            }
            // 设置到nvm
            // 存疑:手册好像提到invm有次数限制,但看得不是很明白,故存疑
            // igb_rar_set_qsel(adapter, mac, 0, adapter->vfs_allocated_count);
            // end adding
         
            /* copy the MAC address out of the NVM */
            if (hw->mac.ops.read_mac_addr(hw))
                dev_err(&pdev->dev, "NVM Read Error\n");
            
            // add by Late Lee
            printk(KERN_ERR "read mac addr: %pM but will update it!!\n", hw->mac.addr);
            // 拷贝到hw结构体,其它函数需要使用
            memcpy(hw->mac.addr, mac, 6);
            // end adding
            memcpy(netdev->dev_addr, hw->mac.addr, netdev->addr_len);

    思路如下:

    1、首先根据PCI地址变换不同的MAC号,否则多个网卡都有相同的MAC号。

    2、将自定义的mac地址拷贝到hw结构体的mac.addr中,注意,这个值会在igb_configure_rx函数(最后还是调用igb_rar_set_qsel)中调用到,因此要同步更新。如果只更新netdev的dev_addr是无法使用网络通信的。


    效果如下:

        root@latelee:~# ifconfig
        eth0      Link encap:Ethernet  HWaddr 6c:61:74:75:6c:65
        ...
        eth1      Link encap:Ethernet  HWaddr 6c:61:74:75:6c:66
        ...

    注:

    1、网络操作函数集net_device_ops有设置MAC号接口:ndo_set_mac_address,对于igb驱动调用igb_set_mac,最后会调用igb_rar_set_qsel写入了iNVM中。
    2、i211手册,table 8-6,0x5404 + 8 *n、0x5400 + 8*n分别是高、低地址,共32位字节。从代码上看,除了读取mac地址外,还有其它用途。
    三、其它

    下面是igb_probe函数栈调用:

        [    3.295643]  [<c16f6e6a>] dump_stack+0x41/0x57
        [    3.300176]  [<c144e5cf>] igb_probe+0xedf/0x1100
        [    3.304881]  [<c12c4957>] local_pci_probe+0x17/0x50
        [    3.309848]  [<c12c48f3>] ? pci_match_device+0xc3/0xe0
        [    3.315148]  [<c12c4b88>] pci_device_probe+0x58/0x80
        [    3.320202]  [<c13fc56f>] driver_probe_device+0x6f/0x200
        [    3.325601]  [<c12c48f3>] ? pci_match_device+0xc3/0xe0
        [    3.330825]  [<c13fc779>] __driver_attach+0x79/0x80
        [    3.335789]  [<c13fb0d8>] bus_for_each_dev+0x68/0x90
        [    3.340841]  [<c13fc3f9>] driver_attach+0x19/0x20
        [    3.345630]  [<c13fc700>] ? driver_probe_device+0x200/0x200
        [    3.351288]  [<c13fbfef>] bus_add_driver+0x14f/0x1d0
        [    3.356342]  [<c19c7631>] ? mdio_bus_init+0x38/0x38
        [    3.361308]  [<c19c7631>] ? mdio_bus_init+0x38/0x38
        [    3.366272]  [<c13fcae4>] driver_register+0x54/0xe0
        [    3.371242]  [<c16f6d19>] ? printk+0x38/0x3a
        [    3.375598]  [<c12c4c4e>] __pci_register_driver+0x2e/0x40
        [    3.381084]  [<c19c768d>] igb_init_module+0x5c/0x7a
        [    3.386051]  [<c10003b2>] do_one_initcall+0x72/0x190
        [    3.391105]  [<c19c7631>] ? mdio_bus_init+0x38/0x38
        [    3.396081]  [<c10596ab>] ? parse_args+0x1ab/0x370
        [    3.400966]  [<c1072d50>] ? __wake_up+0x40/0x50
        [    3.405584]  [<c198c648>] kernel_init_freeable+0x124/0x1c9
        [    3.411163]  [<c198c6ed>] ? kernel_init_freeable+0x1c9/0x1c9
        [    3.416924]  [<c16f54db>] kernel_init+0xb/0xe0
        [    3.421455]  [<c16faac1>] ret_from_kernel_thread+0x21/0x30
        [    3.427029]  [<c16f54d0>] ? rest_init+0x70/0x70
    ---------------------  

    原文:https://blog.csdn.net/subfate/article/details/52440498  
     

    展开全文
  • 前言不同的Linux发行版显示网卡配置信息时有不同的格式,如果我们通过shell脚本读取这些网卡信息时,可能需要较长时间编写这些脚本以满足需求.比如使用以下命令获取ip地址ifconfig | grep 'inet addr:'| grep -v '...
  • 前言不同的Linux发行版显示网卡配置信息时有不同的格式,如果我们通过shell脚本读取这些网卡信息时,可能需要较长时间编写这些脚本以满足需求.比如使用以下命令获取ip地址ifconfig | grep 'inet addr:'| grep -v '...
  • 如何用VB获得机器的MAC地址

    千次阅读 2004-05-02 20:58:00
    我有一个asp做的网站,现在想...嵌入网页后,通过asp调用读取客户端网卡mac地址,请各位前辈多多帮忙,告诉怎么做,我是一个初学者,有急用,谢谢!!!Option Explicit Public Const NCBASTAT As Long = &H33 Public C
  • 怎么用C语言读取WireShark捕获的数据包文件,要求能分析出以太网头部,Ip头部,TCP头部,并提取出数据部分,下面是我写的一段代码,但是读的不对,希望高手指点 //.pcap文件 //#ifndef xiaohouzi //#define ...
  • 上次弱电行业网提到关于局域网ip地址如何显示的问题,提供了两种方法,都是通过代码实现的,...我们来简单的回顾上之前提供的两种方法:方法一、arp -a命令arp -a ,当你需要显示当前ip地址对应的mac地址时使用在命...
  • 需求一:参数设置:路由器标识采用MAC地址,其他标识等多个参数是否开启串口数据转发服务,可以设置多个转发IP端口(支持内网IP和外网IP)是否开启内网IP转发服务,可以设置多个转发IP端口(支持内网IP和外网IP)可以...
  • 前言不同的Linux发行版显示网卡配置信息时有不同的格式,如果我们通过shell脚本读取这些网卡信息时,可能需要较长时间编写这些脚本以满足需求.比如使用以下命令获取ip地址ifconfig | grep 'inet addr:'| grep -v '...
  • 今天在用jQuery读取本地的json文件的时候发现出现跨域问题,百度了一下,发现可能是Chrome的安全策略导致的,需要在后台设置一下。 跨域问题报错 怎么解决 第一步:我们需要先建立一个文件夹 第二步:打开终端,...
  • //MAC地址处理代码 CStdioFile file; int i; CString str1,strd; file.Open("F:\\h1.txt",CFile::modeRead); //h1.txt是串口接收到的MAC地址数据包文件 for(i=0;file.ReadString(str1);i++) { str1....
  • 具体的工作流程如下:(1) 当交换机从某个端口收到一个数据包,它先读取包头中的源MAC地址,这样它就知道源MAC地址的机器是连在哪个端口上的;(2) 再去读 取包头中的目的MAC地址,并在地址表中查找相应的端口...
  • 原问题问题是这样呢我和iOS两个人在本地调试的时候,我直接运行java项目,然后让他直接连接我的IP地址、相应端口号,这时候能够正常的接收到iOS客户端发送的数据,一切正常。诡异的事情来了。。。将这个代码打包成....
  • 1. java服务端获取公网MAC地址(局域网可以,公网获取不到) 2. js获取本地mac地址(非IE获取不到) 3. js读写本地文件() 4. 跨浏览器共享cookie(经测试cookie,storage都不能跨) 5. 网页镶嵌swf,用flash shared ...
  • Q:{INVENTORY.MACADDRESS.A}宏使用不了?...A:https://blog.csdn.net/zhangxueleishamo/article/details/94400572 建议通过传入的IP地址,从数据的资产表中读取mac地址 Q:我试试,谢谢 Q:你好老师 这...
  • strd+="数据包开始,包含"+str1.Mid(2,str1.Find('%')-2)+"个MAC地址:"; strd+="\r\n"; } else if(str1.Find('@')>=0) { strd+="数据包结束!"; strd+="\r\n"; } else { CStdioFile ...
  • 多种网络协议

    2011-02-28 11:35:53
    1:冲突域:同一网段的计算机同时竞争同一条带宽是就会造成冲突域 2:广播域:接受同样广播消息的节点集合...答:交换机把所读取到的数据帧的源地址和记录帧添加到所转发的数据库或MAC地址表中,地址是动态学习的、...
  • 通过阅读此,可以了解到怎么获取上联设备的mac地址、上联网口接口(根据网络工作判断)、如果是无线中继怎么获取上联的ssid和密码、wifi工作信道、读取速率、读取噪声和信噪比、读取信号强度等等。 ...
  • 上一回,一帆风给大家讲了讲如何读取计算机的MAC地址,这次聊聊怎么获取硬盘序列号。硬盘物理序列号是硬盘的出厂序列号,它是全球都是唯一的,不会随着系统的安装、硬盘的格式化等操作而改变,跟mac地址一样都具有...
  • 项目背景:生产制造型公司有多台生产测试设备同时运行,测试中产品错误代码记录在本地,现在需要将多台设备测试过程中出现的产品错误代码保存在...代码功能:将本机MAC地址保存在.txt文件中供读取,因为设备是按MAC地址
  • 对于源地址很容易理解,该地址可以直接从硬件上读取. 但是对于一个网络节点,他怎么知道一个 Frame 的目的物理地址呢? 本文我们将学习 ARP 协议来解答这个问题. ARP 协议主要用来完成将网络层协议的地址(比如,IP ...
  • 今天在以前公司同事李副总的大力支持和协助下,终于把B/S框架跑了起来。再次谢谢李副总,谢谢李副总的父母,谢谢党培养了这么... 今天知道了怎么通过JavaScript脚本在客户端进行读取客户机的mac地址。 在客户端读取m
  • //当点击了设备列表后返回所指向设备的MAC地址,根据此MAC进行主动连接 if (resultCode == Activity.RESULT_OK) { String address = data.getExtras().getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS); ...
  • 2.3.5 以下对MAC地址描述正确的是? 2.3.6 以下属于数据链路层功能的是? 2.3.7 IEEE802.3u标准是指? 2.3.8 如果要将两计算机通过双绞线直接连接,正确的线序是? 2.3.9 在V.35和V.24规程中,控制信号RTS表示?...
  • 8.5.2 使用ContentProvider读取系统数据 156 8.5.3 使用ContentProvider操作数据日记本实例 159 8.6 再学一招——网络存储 171 8.7 本章小结 173 第9章 我来“广播”你的“意图”——Intent和Broadcast面对面 ...
  • Python读取文件以及读取大文件 gensim之Word2vec使用 心得:多动手,别只看 机器学习及深度学习篇 机器学习网站及教程 机器学习入门教程与实例-SofaSofa scikit-learn: Python 中的机器学习 — scikit-learn...
  • 新版Android开发教程.rar

    千次下载 热门讨论 2010-12-14 15:49:11
    o Apache Ant 1.6.5 or later for Linux and Mac, 1.7 or later for Windows o Not Not Not Not compatible with Gnu Compiler for Java (gcj) Note: Note: Note: Note: If JDK is already installed on your ...

空空如也

空空如也

1 2
收藏数 30
精华内容 12
关键字:

怎么读取mac地址