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

📄 driver.h

📁 rtl8139网卡在Windows2000/xp下的驱动程序源代码,无线网卡驱动
💻 H
字号:
#define	NDIS_WDM 1
#define NDIS_MINIPORT_DRIVER
#define NDIS50_MINIPORT   1 

#include "ndis.h"  

#include "8139.h"


PDEVICE_OBJECT      g_deviceObject; //fdo
UNICODE_STRING    ntDeviceName;    //内核设备名
UNICODE_STRING    win32SymbolicLinkName; //win32符号链接名

#define		NUM_OF_DESC		4 
#define		MAX_ETHERNET_FRAME_SIZE	1518
#define		MIN_ETHERNET_FRAME_SIZE	64
#define		MAC_HEADER_SIZE			14
#define		TX_BUF_SIZE		1536 //每个发送包长 1518 ->0x600 32bit align
#define		RX_BUF_SIZE		TX_BUF_SIZE
#define		RING_BUF_SIZE	0x4000	//接收缓冲区 16 k
#define		RING_BUF_PAD	TX_BUF_SIZE
#define		NUM_OF_PACKETS	0x40	//每次接收包的个数
#define		INIT_CODE	//		code_seg("_ITEXT", "ICODE")
#define		PAGE_CODE	//		code_seg("_PTEXT", "PCODE")
#define		LOCK_CODE	//		code_seg("_LTEXT", "LCODE")
#define EE_CS	0x08	/* EEPROM chip select. */
#define EE_CLK	0x04	/* EEPROM shift clock. */
#define EE_DI	0x02	/* EEPROM chip data in. */
#define EE_DO	0x01	/* EEPROM chip data out. */
#define EE_PRO  0x80    //编程模式
#define EE_ENB	(EE_PRO | EE_CS)   //片选 + 编程模式  
#define EE_WRITE_CMD	5
#define EE_READ_CMD		6
#define EE_ERASE_CMD	7

#define	NextTxDesc(i)	(i) == (NUM_OF_DESC - 1) ? 0 : (i + 1)
#define	NextRxDesc(i)	(i) == (NUM_OF_PACKETS - 1) ? 0 : (i + 1)
#define	USER_OID_REV_BYTE							0x02000000
#define	USER_OID_XMIT_BYTE							0x02000001
#define R39_INTERRUPT_MASK \
	(PCIErr | PCSTimeout | RxFIFOOver | RxUnderrun | RxOverflow | TxErr | TxOK | RxErr | RxOK)

/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
   The RTL chips use a 64 element hash table(哈希表) based on the Ethernet CRC.  */
#define		MULTICAST_FILTER_LIMIT		32

typedef struct tagPACKETHEADER{  //每个收到的包都包含了如下的网卡额外加入的信息头,共4个字节
	USHORT	ROK : 1;   //接受到一个好的数据包
	USHORT  FAE : 1;   //帧对齐错误
	USHORT	CRC : 1;   //CRC校验错误
	USHORT	LONG: 1;   //一个超过4KBytes的包
	USHORT	RUNT: 1;   //一个小于64Bytes的包
	USHORT	ISE : 1;
	USHORT	reserved : 7;
	USHORT	BAR : 1;   //收到一个广播包
	USHORT	PAM : 1;   //收到发给自己的包
	USHORT	MAR : 1;   //收到一个组播包
	USHORT   PacketLength;//这个长度是数据包长度+网卡加入的4个字节CRC
}PACKETHEADER, *PPACKETHEADER;

typedef struct tagADAPTER{
	NDIS_HANDLE		MiniportAdapterHandle;
	UCHAR		NetworkAddress[6];
	UCHAR		mc_filter[8];
	ULONG		PacketFilter;

	PUCHAR		ioaddr;
	ULONG		BaseIO;  //端口总线特定的开始地址
	NDIS_MINIPORT_INTERRUPT	IntObj;
	ULONG		IRQLevel;
	ULONG		IRQVector;
	ULONG		IRQAffinity;
	USHORT		IRQMode;

	PUCHAR		            tx_bufs;       //发送缓冲区虚拟基地址  TX_BUF_SIZE * NUM_OF_DESC  1536 * 4
	NDIS_PHYSICAL_ADDRESS	tx_bufs_dma;   //物理地址
	PUCHAR		            rx_bufs;       //接收缓冲区虚拟基地址  RX_BUF_SIZE * NUM_OF_PACKETS(每次接收包的个数),  1536 * 0x40 
	NDIS_PHYSICAL_ADDRESS	rx_bufs_dma;   //物理地址
	PUCHAR		            rx_ring;       //环状缓冲区虚拟基地址  RING_BUF_SIZE + RING_BUF_PAD  0x4000 +1536 = 16384 + 1536
// Ring Buffer环状缓冲区是给网卡接受数据使用的环状的缓冲区,
//当使用到缓冲区的尽头时,又重新从Buffer的开始循环使用。接受到的数据包刚开始就是被连续放在这个环状缓冲区
	NDIS_PHYSICAL_ADDRESS	rx_ring_dma;   //物理地址
	
	USHORT		            read_ptr; //从环状缓冲区数据拷贝的起始地址
	
	NDIS_HANDLE		pkt_pool;
	NDIS_HANDLE		buf_pool;
	PNDIS_PACKET	pkt_desc[NUM_OF_PACKETS];  //包描述符
	PNDIS_BUFFER	buf_desc[NUM_OF_PACKETS];  //缓冲描述符
	UINT			FreeRxPkt;   //被释放的可用接收包数量

    UINT            FreeTxDesc;  //被释放的可用发送描述符数量
	UINT			cur_rx, cur_tx, dirty_rx;
	USHORT		curISR;
	ULONG			ERR_COUNT;
	ULONG			XMIT_OK, XMIT_ERR;
	ULONG			RCV_OK, RCV_ERR;
	ULONG			RCV_NO_BUFFER;
	ULONG			rev_byte, xmit_byte;
	char twistie, twist_row, twist_col;	/* Twister tune state. */
}ADAPTER, *PADAPTER;  

PADAPTER			g_adapter;

typedef enum _OP_ENUM{
	OP_WRITE = EE_WRITE_CMD,  //5
	OP_READ = EE_READ_CMD,    //6
	OP_ERASE = EE_ERASE_CMD,  //7
}OP_ENUM;

BOOLEAN RCheck(  IN NDIS_HANDLE  MiniportAdapterContext);
VOID RHalt( IN NDIS_HANDLE  MiniportAdapterContext );
VOID RIsrDpc(  IN NDIS_HANDLE  MiniportAdapterContext  );
NDIS_STATUS RInit(
    OUT PNDIS_STATUS  OpenErrorStatus,
    OUT PUINT  SelectedMediumIndex,
    IN PNDIS_MEDIUM  MediumArray,
    IN UINT  MediumArraySize,
    IN NDIS_HANDLE  MiniportAdapterHandle,
    IN NDIS_HANDLE  WrapperConfigurationContext );
VOID RIsr(
    OUT PBOOLEAN  InterruptRecognized,
    OUT PBOOLEAN  QueueMiniportHandleInterrupt,
    IN NDIS_HANDLE  MiniportAdapterContext  );
NDIS_STATUS RQuery(
    IN NDIS_HANDLE  MiniportAdapterContext,
    IN NDIS_OID  Oid,
    IN PVOID  InformationBuffer,
    IN ULONG  InformationBufferLength,
    OUT PULONG  BytesWritten,
    OUT PULONG  BytesNeeded   );
NDIS_STATUS RReset(OUT PBOOLEAN  AddressingReset,IN NDIS_HANDLE  MiniportAdapterContext);
VOID RSendPkts(IN NDIS_HANDLE  MiniportAdapterContext,
			   IN PPNDIS_PACKET  PacketArray,
               IN UINT  NumberofPackets );
NDIS_STATUS RSet(IN NDIS_HANDLE MiniportAdapterContext,
                   IN NDIS_OID Oid,
                   IN PVOID InformationBuffer,
                   IN ULONG InformationBufferLength,
                   OUT PULONG BytesRead,
                   OUT PULONG BytesNeeded );
VOID RReturnPkt( IN NDIS_HANDLE  MiniportAdapterContext,  IN PNDIS_PACKET  Packet); 

//被调用函数
VOID ResetNIC(PADAPTER	adapter	);
USHORT readEEPROM(PUCHAR	ioaddr, //93c46 port addr
		         USHORT	reg); //寄存器位置
NDIS_STATUS AllocRes(PADAPTER	adapter	);
VOID StartDevice(PADAPTER	adapter	);
VOID FreeRes(PADAPTER	adapter);
ULONG CopyPktToBuf(	PNDIS_PACKET packet,PUCHAR buff	);
VOID TxInt(	PADAPTER adapter);
VOID RxInt(	PADAPTER adapter);
PNDIS_PACKET RevOnePacket(PADAPTER adapter	);
BOOLEAN PacketOK(PPACKETHEADER pPktHdr	);
VOID RxErrHandle(PADAPTER adapter);
VOID SetMII(PADAPTER	adapter	);

NTSTATUS ROpen( IN PDEVICE_OBJECT DeviceObject,  IN PIRP Irp );
NTSTATUS RClose( IN PDEVICE_OBJECT DeviceObject,  IN PIRP Irp );
NTSTATUS RRead( IN PDEVICE_OBJECT DeviceObject,  IN PIRP Irp  );
NTSTATUS RWrite( IN PDEVICE_OBJECT DeviceObject,  IN PIRP Irp );
NTSTATUS RIoControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );
NTSTATUS RCleanup( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp  );
VOID     RUnload( IN PDRIVER_OBJECT DriverObject );






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -