`
yexin218
  • 浏览: 970708 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

Filter驱动发送OID Request获取当前MAC地址

 
阅读更多

1. 目的:获得当前网卡的MAC地址

2.方法:使用OID: OID_DOT11_CURRENT_ADDRESS

3.信息准备:

     DOT11_MAC_ADDRESS           MacAddress;
                pFilter = CONTAINING_RECORD(Link, MS_FILTER, FilterModuleLink); 
	        Status = filterDoInternalRequest(pFilter,
	                                 NdisRequestQueryInformation,
									 Oid,
									 &MacAddress,
									 sizeof(DOT11_MAC_ADDRESS),
									 sizeof(DOT11_MAC_ADDRESS),
									 MethodId,
									 &BytesProcessed);

		    if(Status == NDIS_STATUS_SUCCESS)
		     {
               DEBUGP(DL_TEST,("Get Curremt address Successfully!\n"));   
               DEBUGP(DL_TEST,("Mac Address is %x-%x-%x-%x-%x-%x\n",MacAddress[0],MacAddress[1],MacAddress[2],MacAddress[3],MacAddress[4],MacAddress[5]));	
               filterSendOriginatedBufferList(pFilter,NDIS_DEFAULT_PORT_NUMBER,&MacAddress);//You can modify this method to do what you want!			   
		     }else{
               DEBUGP(DL_TEST,("Delete a mac fail\n"));
			   break;
             } 

 4.是执行filterDoInterNalRequest函数(来自LWF驱动源码)

NDIS_STATUS
filterDoInternalRequest(
    IN PMS_FILTER                   FilterModuleContext,
    IN NDIS_REQUEST_TYPE            RequestType,
    IN NDIS_OID                     Oid,
    IN PVOID                        InformationBuffer,
    IN ULONG                        InformationBufferLength,
    IN ULONG                        OutputBufferLength, OPTIONAL
    IN ULONG                        MethodId, OPTIONAL
    OUT PULONG                      pBytesProcessed
    )
/*++

Routine Description:

    Utility routine that forms and sends an NDIS_OID_REQUEST to the
    miniport, waits for it to complete, and returns status
    to the caller.

    NOTE: this assumes that the calling routine ensures validity
    of the filter handle until this returns.

Arguments:

    FilterModuleContext - pointer to our filter module context
    RequestType - NdisRequest[Set|Query|method]Information
    Oid - the object being set/queried
    InformationBuffer - data for the request
    InformationBufferLength - length of the above
    OutputBufferLength  - valid only for method request
    MethodId - valid only for method request
    pBytesProcessed - place to return bytes read/written

Return Value:

    Status of the set/query request

--*/
{
    FILTER_REQUEST              FilterRequest;
    PNDIS_OID_REQUEST           NdisRequest = &FilterRequest.Request;
    NDIS_STATUS                 Status = NDIS_STATUS_SUCCESS;

    DEBUGP(DL_TEST,("==>filterDoInternalRequest\n"));
    NdisZeroMemory(NdisRequest, sizeof(NDIS_OID_REQUEST));

    NdisInitializeEvent(&FilterRequest.ReqEvent);
    
    NdisRequest->Header.Type = NDIS_OBJECT_TYPE_OID_REQUEST;
    NdisRequest->Header.Revision = NDIS_OID_REQUEST_REVISION_1;
    NdisRequest->Header.Size = sizeof(NDIS_OID_REQUEST);
    NdisRequest->RequestType = RequestType;

    switch (RequestType)
    {
        case NdisRequestQueryInformation:
             NdisRequest->DATA.QUERY_INFORMATION.Oid = Oid;
             NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer =
                                    InformationBuffer;
             NdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength =
                                    InformationBufferLength;
            break;

        case NdisRequestSetInformation:
             NdisRequest->DATA.SET_INFORMATION.Oid = Oid;
             NdisRequest->DATA.SET_INFORMATION.InformationBuffer =
                                    InformationBuffer;
             NdisRequest->DATA.SET_INFORMATION.InformationBufferLength =
                                    InformationBufferLength;
            break;

        case NdisRequestMethod:
             NdisRequest->DATA.METHOD_INFORMATION.Oid = Oid;
             NdisRequest->DATA.METHOD_INFORMATION.MethodId = MethodId;
             NdisRequest->DATA.METHOD_INFORMATION.InformationBuffer =
                                    InformationBuffer;
             NdisRequest->DATA.METHOD_INFORMATION.InputBufferLength =
                                    InformationBufferLength;
             NdisRequest->DATA.METHOD_INFORMATION.OutputBufferLength = OutputBufferLength;
             break;
             
                

        default:
            FILTER_ASSERT(FALSE);
            break;
    }

    NdisRequest->RequestId = (PVOID)FILTER_REQUEST_ID;
    Status = NdisFOidRequest(FilterModuleContext->FilterHandle,
                           NdisRequest);
    
    if (Status == NDIS_STATUS_PENDING)
    {
       NdisWaitEvent(&FilterRequest.ReqEvent, 0);
       Status = FilterRequest.Status;
    }


    if (Status == NDIS_STATUS_SUCCESS)
    {
       if (RequestType == NdisRequestSetInformation)
       {
           *pBytesProcessed = NdisRequest->DATA.SET_INFORMATION.BytesRead;
       }

       if (RequestType == NdisRequestQueryInformation)
       {
           *pBytesProcessed = NdisRequest->DATA.QUERY_INFORMATION.BytesWritten;
		   InformationBuffer = NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer;
       }

       if (RequestType == NdisRequestMethod)
       {
           *pBytesProcessed = NdisRequest->DATA.METHOD_INFORMATION.BytesWritten;
		   InformationBuffer = NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer;
       }
       
       
       // The driver below should set the correct value to BytesWritten 
       // or BytesRead. But now, we just truncate the value to InformationBufferLength
	   

       if (RequestType == NdisRequestMethod)
       {
           if (*pBytesProcessed > OutputBufferLength)
           {
               *pBytesProcessed = OutputBufferLength;
           }
       }
       else
       {
           
           if (*pBytesProcessed > InformationBufferLength)
           {
               *pBytesProcessed = InformationBufferLength;
           }
       }
    }
	//add by leyond
	if(Status == NDIS_STATUS_INVALID_LENGTH || Status == NDIS_STATUS_BUFFER_TOO_SHORT)
	{
      DEBUGP(DL_TEST,("Still need more bytes = %u",NdisRequest->DATA.QUERY_INFORMATION.BytesNeeded));

	}

	if(Status == NDIS_STATUS_INVALID_OID)
	{
         DEBUGP(DL_TEST,(" NDIS_STATUS_INVALID_OID--||--"));
	}

    return (Status);
}

 这样就完成了~

Mac Address is 0-14-78-7a-88-b6

分享到:
评论

相关推荐

    vc++获取取网卡MAC地址的三种方法.zip

    在VC++编程环境中,获取计算机网卡的MAC(Media Access Control)地址是一项常见的任务,特别是在网络通信和设备识别中。MAC地址是网络接口控制器(NIC)的唯一标识,由6个字节(48位)组成,通常表示为12位的十六...

    Sonix 二代OID驱动原码

    《Sonix二代OID驱动原码解析与应用》 在嵌入式系统开发中,驱动程序是连接硬件设备和操作系统的关键部分,它使得操作系统能够有效地控制和管理硬件资源。本篇文章将详细探讨“Sonix二代OID驱动原码”,这是针对松翰...

    跨网段获取远程主机MAC地址的方法与java实现

    2. **构建PDU(Protocol Data Unit)**:创建一个GetRequest PDU,指定要查询的OID(Object Identifier),在本场景下,通常是与MAC地址相关的MIB(Management Information Base)对象。 3. **发送请求并接收响应**...

    Filter驱动开发笔记

    - **获取方法**:通过查询NDIS对象或者使用特定的OID请求可以获得IP地址。 - **应用场景**:网络监控、日志记录等。 #### 49. Ndis过滤驱动:拷贝NetBufferList数据 - **拷贝方法**:使用NdisMCopyFromBusMemory等...

    Java实现SNMP获得OId值

    ### Java实现SNMP获取OID值:深入解析与代码示例 #### SNMP协议简介与OID概念 简单网络管理协议(SNMP)是一种应用层协议,用于收集和组织有关网络设备的信息,如路由器、交换机和服务器等,并对其进行管理。SNMP...

    基于win 10的 NDIS 6.0 Filter 驱动,新增加了收发数据包以及查询网卡Mac地址的代码

    操作系统: win 10 x64 ...1. 发送OID请求; 2. 发送自定义数据包,以ICMP数据包为例; 3. 接收数据包; 可以从代码中学习: 1. 内核OID的请求发送和接收; 2. 内核资源的分配和回收; 3. 数据包的发送和接受;

    基于C#编写的通过OID获取SNMP

    以上代码片段展示了如何使用C#和SnmpSharpNet库发送一个GET请求并获取OID对应的值。在实际大型项目中,可能需要处理更复杂的场景,如错误处理、定时轮询、批量查询等。SnmpSharpNet库提供了丰富的功能,能够满足这些...

    基于java的Oid获取软件

    【标题】"基于Java的Oid获取软件"指的是一个利用Java编程语言开发的工具,它主要用于SNMP(简单网络管理协议)环境下获取OID(Object Identifier,对象标识符)信息。OID是SNMP中的一个重要概念,它唯一地标识网络...

    通过snmp的OID获取对方主机的内存利用率及CPU的使用率

    内存利用率和CPU使用率是常见的监控指标,它们可以通过特定的OID获取。例如,内存利用率可能对应于`HOST-RESOURCES-MIB::hrMemorySize`或`UCD-SNMP-MIB::memAvailReal`等OID,而CPU使用率可能对应于`HOST-RESOURCES-...

    snmp监控设备时获取设备oid工具

    在构建网管系统时,获取设备的OID(Object Identifier,对象标识符)是至关重要的一步,因为OID就像是网络设备上的唯一地址,它能标识出特定的管理信息,如CPU利用率和内存使用情况。 OID是一个树状结构,由多个...

    用snmp4j获取本地所有oid

    然后,通过发送一个GETBULK请求来获取所有OID,以提高性能。收到响应后,遍历并打印每个OID及其对应的值。 除了直接获取所有OID,还可以使用Snmp4j提供的`SnmpUtilites`类,这个类包含了各种实用工具方法,如解析...

    SNMP一些常用OID

    - **1.3.6.1.2.1.2.2.1.6**: 接口的物理地址,通常是MAC地址,通过`WALK`请求可获取。 - **1.3.6.1.2.1.2.2.1.8**: 接口的当前操作状态(如up或down),通过`WALK`请求可获取。 - **1.3.6.1.2.1.2.2.1.10**: 接口...

    SNMP_WALK获取SNMP协议oid的非常好用的工具

    "SNMP_WALK"是利用SNMP协议进行数据查询的一个功能,它能够遍历设备的MIB(Management Information Base)树,获取指定OID(Object Identifier,对象标识符)的所有子节点信息。 SNMP_WALK工具通常是一个命令行实用...

    SNMP常用OID,zabbix监控交换机

    Zabbix通过查询特定的OID(Object Identifier,对象标识符)来获取交换机的运行数据,如接口状态、带宽利用率、错误统计等。OID是一个唯一的数字序列,用于在SNMP管理的信息结构中定位特定的管理对象。例如,`.1.3....

    snmp_SNMP_oid_snmp查内存oid_使用snmp_

    4. **执行查询**:使用SNMP工具,指定目标主机的IP地址、社区字符串以及要查询的OID,发送SNMP GET请求。对于Java环境,可以使用如`snmp4j`这样的库来编写SNMP查询代码。 5. **解析响应**:收到SNMP响应后,解析...

    NDIS驱动开发API函数手册.zip

    3. NdisM OID Request:微型端口驱动处理OID请求,根据请求类型执行相应的操作。 4. NdisCompleteRequest:完成OID请求,告知发起者请求的状态。 四、中断处理 1. MiniportInterrupt:微型端口驱动处理硬件中断的回...

    java通过SNMP协议获取交换机设备信息(如:交换机下的PC机MAC、IP、连接端口号等信息)

    对于获取交换机下的PC信息,我们需要知道特定OID,例如,"1.3.6.1.2.1.4.22.1.2" 可以用于获取接口的物理地址(即MAC地址)。 以下是一个基本的Java代码示例,展示了如何使用Snmp4j来获取交换机的MAC地址: ```...

    F5 SNMP OID说明

    F5 SNMP OID 说明 本资源摘要信息涵盖了 F5 BIG-IP LTM V9.2.x SNMP 的详细信息,包括 SNMP 基础、F5 BIG-IP SNMP 系统概述、在 BIG-IP LTM 上配置 SNMP、BIG-IP LTM 的 SNMP MIB 库文件、通过 SNMP 采集 BIG-IP 的...

    OID编解码工具

    OID,全称Object Identifier,是网络协议中用于唯一标识对象的一种编码方式。它在各种网络标准、证书、协议中广泛使用,比如SNMP(简单网络管理协议)和X.509数字证书。OID编解码工具是针对这种编码方式进行操作的...

    NDIS Filter Drivers指南

    5. **协议驱动获取 Filter Module 列表**:当 NDIS 重启驱动程序栈时,协议驱动程序可以获得栈上所有 Filter Module 的列表。这有助于协议驱动程序了解网络数据流所经过的所有过滤层。 6. **通信过滤**:Filter ...

Global site tag (gtag.js) - Google Analytics