📄 driver.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 + -