📄 info.c
字号:
#include "driver.h"
NDIS_OID OID_LIST[] =
{
// Required OIDs
OID_GEN_SUPPORTED_LIST,// 0x00010101
OID_GEN_HARDWARE_STATUS,// 0x00010102
OID_GEN_MEDIA_SUPPORTED,// 0x00010103
OID_GEN_MEDIA_IN_USE,// 0x00010104
OID_GEN_MAXIMUM_LOOKAHEAD,// 0x00010105
OID_GEN_MAXIMUM_FRAME_SIZE,// 0x00010106
OID_GEN_LINK_SPEED,// 0x00010107
OID_GEN_TRANSMIT_BUFFER_SPACE,// 0x00010108
OID_GEN_RECEIVE_BUFFER_SPACE,// 0x00010109
OID_GEN_TRANSMIT_BLOCK_SIZE,// 0x0001010A
OID_GEN_RECEIVE_BLOCK_SIZE,// 0x0001010B
OID_GEN_VENDOR_ID,// 0x0001010C
OID_GEN_VENDOR_DESCRIPTION,// 0x0001010D
OID_GEN_CURRENT_PACKET_FILTER,// 0x0001010E
OID_GEN_CURRENT_LOOKAHEAD,// 0x0001010F
OID_GEN_DRIVER_VERSION,// 0x00010110
OID_GEN_MAXIMUM_TOTAL_SIZE,// 0x00010111
OID_GEN_PROTOCOL_OPTIONS,// 0x00010112
OID_GEN_MAC_OPTIONS,// 0x00010113
OID_GEN_MEDIA_CONNECT_STATUS,// 0x00010114
OID_GEN_MAXIMUM_SEND_PACKETS,// 0x00010115
OID_GEN_VENDOR_DRIVER_VERSION,// 0x00010116
OID_GEN_SUPPORTED_GUIDS,// 0x00010117
OID_GEN_NETWORK_LAYER_ADDRESSES,// 0x00010118
OID_GEN_TRANSPORT_HEADER_OFFSET,// 0x00010119
OID_GEN_PHYSICAL_MEDIUM,// 0x0001011A
OID_GEN_MACHINE_NAME,// 0x0001011B
OID_GEN_VLAN_ID,// 0x0001011C
OID_GEN_RNDIS_CONFIG_PARAMETER,// 0x0001011D
// 802.3 Objects (Ethernet)
OID_802_3_PERMANENT_ADDRESS,// 0x01010101
OID_802_3_CURRENT_ADDRESS,// 0x01010102
OID_802_3_MULTICAST_LIST,// 0x01010103
OID_802_3_MAXIMUM_LIST_SIZE,// 0x01010104
OID_802_3_RCV_ERROR_ALIGNMENT,// 0x01020101
OID_802_3_XMIT_ONE_COLLISION,// 0x01020102
OID_802_3_XMIT_MORE_COLLISIONS,// 0x01020103
OID_802_3_XMIT_DEFERRED,// 0x01020201
OID_802_3_XMIT_MAX_COLLISIONS,// 0x01020202
OID_802_3_RCV_OVERRUN,// 0x01020203
OID_802_3_XMIT_UNDERRUN,// 0x01020204
OID_802_3_XMIT_HEARTBEAT_FAILURE,// 0x01020205
OID_802_3_XMIT_TIMES_CRS_LOST,// 0x01020206
OID_802_3_XMIT_LATE_COLLISIONS,// 0x01020207
// Required statistics
OID_GEN_XMIT_OK,// 0x00020101
OID_GEN_RCV_OK,// 0x00020102
OID_GEN_XMIT_ERROR,// 0x00020103
OID_GEN_RCV_ERROR,// 0x00020104
OID_GEN_RCV_NO_BUFFER,// 0x00020105
// 用户定义
USER_OID_REV_BYTE,// 0x02000000
USER_OID_XMIT_BYTE ,// 0x02000001
};
//////////////////////////////////////////////////////////////////////////
//返回有关驱动及其NIC的能力和状态的信息
//MiniportInitialize函数返回NDIS_STATUS_SUCCESS后,NDIS立即调用MiniportQueryInformation函数一次或多次
NDIS_STATUS RQuery(
IN NDIS_HANDLE Context,
IN NDIS_OID Oid,
IN PVOID inbuf,
IN ULONG buf_size, //指 InformationBuffer区域的字节数
OUT PULONG BytesWritten,//指 InformationBuffer区域返回的字节数
OUT PULONG BytesNeeded ) // 指应满足需求的总字节数
{
PADAPTER adapter = (PADAPTER)Context;
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
UINT i;
*BytesWritten = 4;
switch (Oid)
{
case OID_GEN_SUPPORTED_LIST://查询驱动程序支持的OID
if(buf_size < sizeof(OID_LIST))
{
*BytesNeeded = sizeof(OID_LIST);
Status = NDIS_STATUS_INVALID_LENGTH;
}else
{
NdisMoveMemory(inbuf, OID_LIST, sizeof(OID_LIST));
*BytesWritten = sizeof(OID_LIST);
}
break;
case OID_GEN_HARDWARE_STATUS: //查询NIC的当前硬件状态
*((NDIS_HARDWARE_STATUS*)inbuf) = NdisHardwareStatusReady;//已准备好在总线上发送和接收数据
break;
case OID_GEN_MEDIA_SUPPORTED:
case OID_GEN_MEDIA_IN_USE:
*((NDIS_MEDIUM*)inbuf) = (NDIS_MEDIUM)(NdisMedium802_3);
break;
case OID_GEN_MAXIMUM_LOOKAHEAD:
case OID_GEN_CURRENT_LOOKAHEAD://设定接收到的将要被指示给协议驱动的包数据的字节数(不包括头部)
case OID_GEN_MAXIMUM_FRAME_SIZE:
*((PULONG)inbuf) = MAX_ETHERNET_FRAME_SIZE - MAC_HEADER_SIZE; //1518 -14 =1504
break;
case OID_GEN_LINK_SPEED: //查询NIC的最大速度(单位:kbps)
//测量单位是 100 bps, 所以值为1000,000 代表 硬件位速率 100 Mbps
*((PULONG)inbuf) = 1000000; //100m
break;
case OID_GEN_TRANSMIT_BUFFER_SPACE://查询NIC用于传送数据时的内存字节大小
*((PULONG)inbuf) = (ULONG) MAX_ETHERNET_FRAME_SIZE * 4; //1518 * 4
break;
case OID_GEN_RECEIVE_BUFFER_SPACE:
*((PULONG)inbuf) = (ULONG)RING_BUF_SIZE; //0x4000 接收缓冲区 16 k
break;
case OID_GEN_MAXIMUM_TOTAL_SIZE://查询包的最大的总长度,包括头部
case OID_GEN_TRANSMIT_BLOCK_SIZE:
case OID_GEN_RECEIVE_BLOCK_SIZE:
*((PULONG)inbuf) = (ULONG)MAX_ETHERNET_FRAME_SIZE; //1518
break;
case OID_GEN_VENDOR_ID:
*((PULONG)inbuf) = *(PULONG)adapter->NetworkAddress;
break;
case OID_GEN_VENDOR_DESCRIPTION:
*((PULONG)inbuf) = (ULONG)'0900';
break;
case OID_GEN_CURRENT_PACKET_FILTER: //指定网络包的类型
if(buf_size >= 4){
*(PULONG)inbuf = adapter->PacketFilter;
*BytesWritten = 4;
}else
*BytesNeeded = 4;
break;
case OID_GEN_DRIVER_VERSION: //查询NIC驱动程序使用的NDIS版本
*((PULONG)inbuf) = (USHORT)0x0500;
break;
// case OID_GEN_PROTOCOL_OPTIONS:
case OID_GEN_MAC_OPTIONS: //查询用来定义NIC可选属性的位屏蔽
*((PULONG)inbuf) = (ULONG)(NDIS_MAC_OPTION_TRANSFERS_NOT_PEND |
NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA |
NDIS_MAC_OPTION_NO_LOOPBACK );
break;
case OID_GEN_MEDIA_CONNECT_STATUS:
*((PULONG)inbuf) = (ULONG)NdisMediaStateConnected;
break;
case OID_GEN_MAXIMUM_SEND_PACKETS://NDIS忽略非串行化驱动程序响应该OID而返回的值
*((PULONG)inbuf) = (ULONG) NUM_OF_DESC; // 4
break;
case OID_GEN_VENDOR_DRIVER_VERSION: //指定供应商分配的NIC驱动的版本号
*((PULONG)inbuf) = (ULONG) 0x00010000; // 4
break;
// case OID_GEN_SUPPORTED_GUIDS:
// case OID_GEN_NETWORK_LAYER_ADDRESSES:
// case OID_GEN_TRANSPORT_HEADER_OFFSET:
// case OID_GEN_PHYSICAL_MEDIUM:
// case OID_GEN_MACHINE_NAME:
// case OID_GEN_VLAN_ID:
// case OID_GEN_RNDIS_CONFIG_PARAMETER:
// 802.3 Objects (Ethernet)
case OID_802_3_PERMANENT_ADDRESS:// 编码在硬件中的NIC地址
NdisMoveMemory(inbuf, adapter->NetworkAddress, 6);
*BytesWritten = 6;
break;
case OID_802_3_CURRENT_ADDRESS://当前使用的NIC地址
NdisMoveMemory(inbuf, adapter->NetworkAddress, 6);
*BytesWritten = 6;
break;
case OID_802_3_MULTICAST_LIST://用于包接收的NIC multicast地址列表
if (buf_size < 8)
return (NDIS_STATUS_INVALID_LENGTH);
else
NdisMoveMemory(inbuf, adapter->mc_filter, buf_size);
break;
case OID_802_3_MAXIMUM_LIST_SIZE:// NIC可以管理的multicast地址的最大数
*((PULONG)inbuf) = (ULONG)MULTICAST_FILTER_LIMIT; //32
break;
case OID_802_3_RCV_ERROR_ALIGNMENT://因对齐错误而接收的帧数
case OID_802_3_XMIT_ONE_COLLISION://一次碰撞后成功传输的帧数
case OID_802_3_XMIT_MORE_COLLISIONS://多次碰撞后成功传输的帧数
case OID_802_3_XMIT_DEFERRED:// NIC至少延迟传输一次后成功传输的帧数
case OID_802_3_XMIT_MAX_COLLISIONS://由于大量碰撞而不传输的帧数
case OID_802_3_RCV_OVERRUN://由于NIC溢出错误而没有接收的帧数
case OID_802_3_XMIT_UNDERRUN://由于NIC运行错误而没有传输的帧数
case OID_802_3_XMIT_HEARTBEAT_FAILURE://没有检测碰撞检测heartbeat而成功传输的帧数
case OID_802_3_XMIT_TIMES_CRS_LOST://包传输期间CRS信号丢失的次数
case OID_802_3_XMIT_LATE_COLLISIONS://normal window后检测到的碰撞次数
*((PULONG)inbuf) = (ULONG)0;
break;
case OID_GEN_XMIT_OK: //表示正确传送的帧数
*((PULONG)inbuf) = adapter->XMIT_OK;
break;
case OID_GEN_RCV_OK: //指定NIC正确接收且向上层驱动程序指示的帧数
*((PULONG)inbuf) = adapter->RCV_OK;
break;
case OID_GEN_XMIT_ERROR: //表示NIC没有传送的帧数
*((PULONG)inbuf) = adapter->XMIT_ERR;
break;
case OID_GEN_RCV_ERROR: //指定NIC接收到但由于发生错误而没指示给协议驱动程序的帧数
*((PULONG)inbuf) = adapter->RCV_ERR;
break;
case OID_GEN_RCV_NO_BUFFER: //指定NIC由于缺少接收缓冲空间而不能接收的帧数
*((PULONG)inbuf) = adapter->RCV_NO_BUFFER;
break;
case USER_OID_REV_BYTE:
*((PULONG)inbuf) = adapter->rev_byte;
break;
case USER_OID_XMIT_BYTE:
*((PULONG)inbuf) = adapter->xmit_byte;
break;
default:
break;
}
return (Status);
}
//////////////////////////////////////////////////////////////////////////////////
//允许NDIS请求改变微端口驱动程序为特定OID维护的状态信息
NDIS_STATUS RSet(
IN NDIS_HANDLE Context,
IN NDIS_OID Oid,
IN PVOID inbuf,
IN ULONG buf_size,
OUT PULONG BytesRead,
OUT PULONG BytesNeeded )
{
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
UINT i;
PADAPTER adapter = (PADAPTER)Context;
switch(Oid)
{
case OID_802_3_MULTICAST_LIST: //设定用于包接收的NIC multicast地址列表
if ( buf_size > 8)
return (NDIS_STATUS_INVALID_LENGTH);
else
NdisMoveMemory(adapter->mc_filter, inbuf, buf_size); //拷贝特定数的字节到从源到目的地址
break;
case OID_GEN_CURRENT_PACKET_FILTER: //指定网络包的类型
if (buf_size != 4) //sizeof(ULONG)
return (NDIS_STATUS_INVALID_LENGTH);
adapter->PacketFilter = *(PULONG)inbuf;
*BytesRead = buf_size;
break;
case OID_GEN_CURRENT_LOOKAHEAD://设定接收到的将要被指示给协议驱动的包数据的字节数(不包括头部)
if (buf_size != 4)
return (NDIS_STATUS_INVALID_LENGTH);
*BytesRead = 4;//Drivers indicating full packets shouldn't care.
break;
default:
Status = NDIS_STATUS_NOT_SUPPORTED;
break;
}
return Status;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -