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

📄 common.h

📁 一个无线网卡的驱动程序,基于win2
💻 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 + -