⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 info.c

📁 rtl8139网卡在Windows2000/xp下的驱动程序源代码,无线网卡驱动
💻 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 + -