📄 common.h
字号:
//////////////////////////////////////////////////////////////////////////
// Copyright @2003 Peng He,Information Science Insititute,XiDian University
// MyNdis_Wdm example
//Abstract:
// Common.h 面向USB设备适配器的头文件,定义了数据结构,此头文件必须对Wdm.h和Ndis.h可用
//Environment:
// kernel mode only
// Version history:
//
// Peng.He - 04/17/03: this source code for USB to fast Ethernet adapter driver
// show how an NDIS miniport driver can interface with an USB device.
// 17-Apr-2003 creation
/////////////////////////////////////////////////////////////////////////
#ifndef _COM_H
#define _COM_H
//
// 我们用一个指向USB结构的指针作为指向微端口环境区的指针
//
#define CONTEXT_TO_DEV(__deviceContext) ((PUSB_DEVICE)(__deviceContext))
#define DEV_TO_CONTEXT(__irdev) ((HANDLE)(__irdev))
#define USB_TAG 'Usb_Ethernet'
#define MAX_PACKET_SIZE 0x00000600
#define USB_PACKET_LENGTH 2
//
// 定义一些控制字,以便确定USB设备是否需要挂起或重启
//
#define USB_100ns_PER_ms 10000
#define USB_100ns_PER_us 10
#define USB_ms_PER_SEC 1000
#define USB_100ns_PER_SEC ( USB_100ns_PER_ms * USB_ms_PER_SEC )
#define MAX_QUERY_TIME_100ns ( 8 * USB_100ns_PER_SEC ) //8 sec
#define MAX_SET_TIME_100ns MAX_QUERY_TIME_100ns
#define MAX_SEND_TIME_100ns ( 20 * USB_100ns_PER_SEC ) //20 sec
#define MAX_TURNAROUND_usec 10000
#define DEFAULT_TURNAROUND_usec 5000
#define MIN(a,b) (((a) <= (b)) ? (a) : (b))
#define MAX(a,b) (((a) >= (b)) ? (a) : (b))
//
// 枚举接收缓冲器的状态:空、满、挂起
//
typedef enum rcvbufferStates{
STATE_FREE,
STATE_FULL,
STATE_PENDING
} rcvbufferState;
//
// 为接收包和缓冲定义一个结构体
//
typedef struct
{
PVOID Packet;
UINT dataLen; // 映射的字节数目
PUCHAR databuf; // 接收缓冲区映射的虚拟内存地址
PVOID device;
PVOID Irp;
KEVENT Event;
rcvBufferState state;
PVOID Urb;
}RCV_BUFFER,*PRCV_BUFFER;
//
// 为SendPacket枚举类型
//
typedef enum _CONTEXT_TYPE
{
CONTEXT_NDIS_PACKET = 1,
CONTEXT_TERMINATOR
}CONTEXT_TYPE;
typedef VOID (*WORK_PROC)(struct _USB_WORK_ITEM *);
//
// 定义USB_WORK_ITEM结构体
//
typedef struct _USB_WORK_ITEM
{
PVOID pDevice;
WORK_PROC Callback;
PUCHAR InfoBuf;
ULONG InfoBufLen;
ULONG fInUse; // declared as ulong for use with interlockedexchange
} USB_WORK_ITEM, *PUSB_WORK_ITEM;
typedef struct _USB_DEVICE //自定义结构,为保存设备信息,类似设备对象
{
//
// 跟踪各种不同的设备对象
//
PDEVICE_OBJECT pUsbDevObj; // 功能设备对象
PDEVICE_OBJECT pPhysDevObj; // 物理设备对象
//
// 逻辑适配器句柄
//
HANDLE MiniportHandle;
//
// 保持调试的信息
//
ULONG packetsReceived;
ULONG packetsReceivedDropped;
ULONG packetsReceivedOverflow;
ULONG packetsSent;
ULONG packetsSentDropped;
ULONG SendContextsInUse;
ULONG RcvBuffersInUse; //已用接收的缓冲数
// 跟踪查询、设置、发送的时间,以便以后被查询挂起处理例程使用
LARGE_INTEGER LastQueryTime;
LARGE_INTEGER LastSetTime;
BOOLEAN fSetpending;
BOOLEAN fQuerypending;
//
// 定义一个布尔类型,在设备正常启动后为真,设备初始化失败后安全清除
//
BOOLEAN fDeviceStarted;
//
// 定义一个布尔类型,确定是否已经接收到了OID_GEN_CURRENT_PACKET_FILTER,以便向上层协议驱动程序传递接收包
//
//
BOOLEAN fGotFilterIndication;
//
// 定义内核事件的句柄,以便事件可在PASSIVE_LEVEL级上运行
//
HANDLE hPassiveThread;
BOOLEAN fKillPassiveLevelThread;
KEVENT EventPassiveThread;
//
// 定义一个布尔型变量,以便确定此功能设备是否从USB设备挂起了一个接收
//
// 通常情况下fReceiving变量为真,但当usbHalt或usbReset被调用时,接收被停止,
// 此变量应与halt和reset处理同步
//
BOOLEAN fReceiving;
//
// 定义fPendingHalt和fPendingReset两个布尔型变量,允许发送和接收完成例程完成当前挂起的irp,
// 并随即清除和停止向USB设备发送irp
//
BOOLEAN fPendingHalt;
BOOLEAN fPendingReset;
ULONG fPendingReadClearStall;
ULONG fPendingWriteClearStall;
//
// 定义接收链式缓冲
//
// 协议栈中可以保存8个包,滑动窗口大小为8,所有为16个包分配缓冲区
//
#define NUM_RCV_BUFS 16
RCV_BUFFER rcvBufs[NUM_RCV_BUFS];
PRCV_BUFFER pCurrentRcvBuf;
// 定义NUM_WORK_ITEMS 变量,其最大值为NUM_RCV_BUFS包+一个Pending+ 一个set+一个Query
//
#define NUM_WORK_ITEMS (NUM_RCV_BUFS + 3)
USB_WORK_ITEM WorkItems[ NUM_WORK_ITEMS ];
//
// 定义写操作的挂起irp区,以便跟踪每个USB写完成例程的irp
//
#define NUM_SEND_CONTEXTS NUM_RCV_BUFS
PVOID pSendContexts;
//
// 指向NDIS包池和NDIS缓冲区池的句柄
//
HANDLE PacketPoolHandle;
HANDLE BufferPoolHandle;
KEVENT EventUrb;
KEVENT EventIoCtl;//仅为调试用
NTSTATUS StatusControl;
NTSTATUS StatusReset;
ULONG BytesRead;
// 跟踪挂起的irp数量,irp挂起时为零
UINT PendingIrpCount;
ULONG NumReads;
// 记录控制信息、读信息、写信息的出错数目,以便由检查挂起例
// 程处理,确定是否重新启动
//
ULONG NumDataErrors;
//这里要加上Interrupt pipeHandle和接收每个Internal的以太网状态
HANDLE BulkInPipeHandle;
HANDLE BulkOutPipeHandle;
HANDLE InterruptInPipeHandle;
UINT IntInternalTime;
HANDLE hPollingThread;
BOOLEAN fKillPollingThread;
//
// USB设备ID
//
UINT IdVendor;
//
// 设备信息
//
PUCHAR pUsbInfo;
UINT UrbLen;
}USB_DEVICE, *PUSB_DEVICE;
//
// 定义两个内核例程
//
VOID PassiveLevelThread(
IN PVOID Context
);
VOID PollingThread(
IN PVOID Context
);
NTSTATUS StartUsbRead(IN PUSB_DEVICE Device);
NTSTATUS
SendPacket(
IN PUSB_DEVICE Adapter,
IN PVOID pPacket,
IN UINT Flags,
IN CONTEXT_TYPE Type
);
BOOLEAN NdisToUsbPacket(
IN PUSB_DEVICE thisDev,
IN PVOID Packet,
OUT UCHAR *usbPacketBuf,
IN UINT usbPacketBufLen
);
PRCV_BUFFER
GetRcvBuf(
PUSB_DEVICE Adapter,
OUT UINT *pIndex,
IN rcvBufferState state
);
PVOID
GetFreeContext(
PUSB_DEVICE Adapter
);
VOID
IndicateMediaBusy(
IN PUSB_DEVICE Adapter
);
NTSTATUS ProcessData(
IN PUSB_DEVICE Adapter,
IN PRCV_BUFFER pRecBuf
);
VOID
ProcessDataCallBack( PUSB_WORK_ITEM pWorkItem );
VOID ProcessReturnPacket(PUSB_DEVICE Adapter,
PRCV_BUFFER pReceiveBuffer);
NTSTATUS DeliverBuffer(
IN PUSB_DEVICE Adapter,
IN PRCV_BUFFER pRecBuf
);
NTSTATUS
ResetPipe (
IN PUSB_DEVICE Adapter,
IN HANDLE Pipe
);
VOID
ResetPipeCallback (
IN PUSB_WORK_ITEM pWorkItem
);
PVOID
AllocXferUrb ( VOID );
VOID
FreeXferUrb( PVOID Urb );
BOOLEAN
CancelPendingReadIo(
IN PUSB_DEVICE DeviceExt,
BOOLEAN fWaitCancelComplete
);
BOOLEAN
CancelPendingWriteIo(
IN PUSB_DEVICE DeviceExt
);
BOOLEAN
InitWdmStuff(
IN OUT PUSB_DEVICE Device
);
VOID
FreeWdmStuff(
IN OUT PUSB_DEVICE Device
);
BOOLEAN AllocUsbInfo(
PUSB_DEVICE Adapter );
VOID FreeUsbInfo(
PUSB_DEVICE Adapter );
PVOID MemAlloc(UINT);
VOID MemFree(
IN PVOID memptr,
IN UINT size
);
VOID
UsbIncIoCount(
IN PUSB_DEVICE Adapter
);
VOID
UsbDecIoCount(
IN PUSB_DEVICE Adapter
);
NTSTATUS InitializeReceive(
IN OUT PUSB_DEVICE Adapter
);
BOOLEAN
ScheduleWorkItem(
PUSB_DEVICE Adapter,
WORK_PROC Callback,
PVOID InfoBuf,
ULONG InfoBufLen);
VOID FreeWorkItem(
IN PUSB_WORK_ITEM pItem
);
void DumpStatsEverySec( PUSB_DEVICE Device, UINT NumSeconds ) ;
#endif// _IRCOM_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -