1 WinCE網絡介紹<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
在WinCE中,網絡架構和windows系統差不多。通過NDIS,WinCE系統和網卡及網絡協議進行交互。NDIS提供了一個完全的網絡驅動的抽象層,目前WinCE支持NDIS5.1,其中包括對RNDIS,NDISWAN,Token Ring等的支持。在WinCE中,整個網絡架構體系如圖:
WinSock是提供給應用層的接口,一般開發網絡應用都會用Winsock接口來開發。往下就是協議層,IrDA和TCP/IP都基於NDIS層以上,通過NDIS封裝層和底層的驅動進行交互。NDIS包含了網卡的驅動,就是圖中的Miniport Driver。實際的網卡驅動就是指Miniport Driver,它向上爲NDIS提供了Miniport相關的接口函數,向下則通過NDIS的接口來訪問硬件網卡。
2 WinCE網絡驅動架構
在WinCE中,開發網卡驅動就是寫一個Miniport Driver,導出相應的Miniport接口函數,調用NDIS的接口訪問底層硬件。驅動架構如圖:
從圖中清楚地看到Miniport driver所處的位置。在WinCE中支持三種類型的網絡驅動:Miniport driver,Intermediate driver和Protocol driver。這裏,只介紹針對硬件網卡的驅動,也就是Miniport driver。Miniport driver直接管理硬件網卡,它使用NDIS Library中的接口函數讀寫硬件網卡,同時對上層導出Miniport接口函數,這樣上層通過該接口可以配置網卡,發送和接收網絡數據包。
開發一個Miniport driver首先需要註冊一個NDIS_MINIPORT_CHARACTERISTICS結構,該結構定義如下:
typedef struct _NDIS_MINIPORT_CHARACTERISTICS
{
UCHAR MajorNdisVersion;
UCHAR MinorNdisVersion;
UINT Reserved;
W_CHECK_FOR_HANG_HANDLER CheckForHangHandler;
W_DISABLE_INTERRUPT_HANDLER DisableInterruptHandler;
W_ENABLE_INTERRUPT_HANDLER EnableInterruptHandler;
W_HALT_HANDLER HaltHandler;
W_HANDLE_INTERRUPT_HANDLER HandleInterruptHandler;
W_INITIALIZE_HANDLER InitializeHandler;
W_ISR_HANDLER ISRHandler;
W_QUERY_INFORMATION_HANDLER QueryInformationHandler;
W_RECONFIGURE_HANDLER ReconfigureHandler;
W_RESET_HANDLER ResetHandler;
W_SEND_HANDLER SendHandler;
W_SET_INFORMATION_HANDLER SetInformationHandler;
W_TRANSFER_DATA_HANDLER TransferDataHandler;
W_RETURN_PACKET_HANDLER ReturnPacketHandler;
W_SEND_PACKETS_HANDLER SendPacketsHandler;
W_ALLOCATE_COMPLETE_HANDLER AllocateCompleteHandler;
W_CANCEL_SEND_PACKETS_HANDLER CancelSendPacketsHandler;
W_MINIPORT_SHUTDOWN_HANDLER AdapterShutdownHandler;
} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS;
上面的結構中定義了NDIS的版本號,以及要導出Minioprt的相應的接口函數的函數指針。該結構會在DriverEntry函數中被設置,並進行註冊。下面將對導出的Miniport接口函數進行介紹。
3 Miniport相關接口
3.1 NDIS_STATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
初始化一個Miniport Driver,該函數會被第一個調用來註冊一個Miniport driver。
DriverObject:指向一個由系統創建的驅動對象
PUNICODE_STRING:指向註冊表中該驅動參數的路徑
該函數中首先調用NdisMInitializeWrapper函數來通知NDIS Library要註冊一個Miniport。然後會初始化NDIS_MINIPORT_CHARACTERISTICS結構,所有的Miniport的相關接口函數都會賦值到NDIS_MINIPORT_CHARACTERISTICS結構中,最後調用NdisMRegisterMiniport來註冊Miniport。
3.2 NDIS_STATUS MiniportInitialize(PNDIS_STATUS OpenErrorStatus, PUINT SelectedMediumIndex, PNDIS_MEDIUM MediumArray, UINT MediumArraySize,
NDIS_HANDLE MiniportAdapterHandle, NDIS_HANDLE WrapperConfigurationContext)
該函數用於初始化網卡。
OpenErrorStatus:額外的狀態信息,一般不會被使用
SelectedMediumIndex:被選中的媒介類型的索引號,以太網一般是NdisMedium802_3
MediumArray:媒介類型數組,包含了不同類型的網絡媒介
MediumArraySize:媒介類型數組大小
MiniportAdapterHandle:Miniport適配器句柄,該參數要被保存,以後調用Ndisxxx函數時會被用到。
WrapperConfigurationContext:一個封裝配置句柄,會被NdisOpenConfiguration函數用到。
3.3 BOOLEAN MiniportCheckForHang(NDIS_HANDLE MiniportAdapterContext)
該函數檢查硬件網卡的狀態,該函數爲Optional,也可以不去實現。
MiniportAdapterContext:一個指向網卡結構的句柄,該網卡結構在MiniportInitialize函數中被創建。
3.4 VOID MiniportDisableInterrupt(NDIS_HANDLE MiniportAdapterContext)
該函數禁用網卡中斷。
MiniportAdapterContext:一個指向網卡結構的句柄,該網卡結構在MiniportInitialize函數中被創建。
3.5 VOID MiniportEnableInterrupt(NDIS_HANDLE MiniportAdapterContext)
該函數使能網卡中斷。
MiniportAdapterContext:一個指向網卡結構的句柄,該網卡結構在MiniportInitialize函數中被創建。
3.6 VOID MiniportHalt(NDIS_HANDLE MiniportAdapterContext)
該函數刪除一個已被初始化的網卡。
MiniportAdapterContext:一個指向網卡結構的句柄,該網卡結構在MiniportInitialize函數中被創建。
3.7 VOID MiniportHandleInterrupt(NDIS_HANDLE MiniportAdapterContext)
該函數爲網卡的中斷處理函數。
MiniportAdapterContext:一個指向網卡結構的句柄,該網卡結構在MiniportInitialize函數中被創建。
3.8 VOID MiniportISR( PBOOLEAN InterruptRecognized, PBOOLEAN QueueMiniportHandleInterrupt, NDIS_HANDLE MiniportAdapterContext)
該函數爲網卡的ISR函數,該函數中應做儘可能少的工作,大部分工作應該交給MiniportHandleInterrupt函數來完成。
InterruptRecognized:中斷確認。如果確實是一個網卡中斷,返回TURE。
QueueMiniportHandleInterrupt:如果需要MiniportHandleInterrupt函數處理,返回TRUE。
MiniportAdapterContext:一個指向網卡結構的句柄,該網卡結構在MiniportInitialize函數中被創建。
3.9 NDIS_STATUS MiniportQueryInformation( NDIS_HANDLE MiniportAdapterContext, NDIS_OID Oid, PVOID InformationBuffer, ULONG InformationBufferLength, PULONG BytesWritten, PULONG BytesNeeded)
該函數爲網卡信息查詢函數,返回網卡狀態等信息。
MiniportAdapterContext:一個指向網卡結構的句柄,該網卡結構在MiniportInitialize函數中被創建。
Oid:網卡的OID信息碼。
InformationBuffer:指向一個網卡信息Buffer,用於存放查詢結構
InformationBufferLength:網卡信息Buffer的大小
BytesWritten:實際寫入網卡信息buffer的字節數
BytesNeeded:如果網卡信息buffer不夠大,返回還需要多大buffer長度
3.10 NDIS_STATUS MiniportReconfigure( PNDIS_STATUS OpenErrorStatus, NDIS_HANDLE MiniportAdapterContext, NDIS_HANDLE WrapperConfigurationContext)
該函數未被使用,不需要實現。
3.11 NDIS_STATUS MiniportReset(PBOOLEAN AddressingReset, NDIS_HANDLE MiniportAdapterContext)
該函數復位硬件網卡。
AddressingReset:返回TRUE表示需要重新設置地址信息,NDIS Library會調用MiniportSetInformation進行設置。
MiniportAdapterContext:一個指向網卡結構的句柄,該網卡結構在MiniportInitialize函數中被創建。
3.12 VOID MiniportReturnPacket(NDIS_HANDLE MiniportAdapterContext, PNDIS_PACKET Packet)
該函數用於返回數據包描述符。
MiniportAdapterContext:一個指向網卡結構的句柄,該網卡結構在MiniportInitialize函數中被創建。
Packet:指向一個數據包描述符
3.13 NDIS_STATUS MiniportSend(NDIS_HANDLE MiniportAdapterContext, PNDIS_PACKET Packet, UINT Flags)
該函數用於發送一個數據包。
MiniportAdapterContext:一個指向網卡結構的句柄,該網卡結構在MiniportInitialize函數中被創建。
Packet:指向一個包描述符,該包描述符用於描述被髮送的數據包
Flags:發送標記
3.14 VOID MiniportSendPackets(NDIS_HANDLE MiniportAdapterContext, PPNDIS_PACKET PacketArray, UINT NumberOfPackets)
該函數用於發送一組數據包
MiniportAdapterContext:一個指向網卡結構的句柄,該網卡結構在MiniportInitialize函數中被創建。
PacketArray:指向一組包描述符
NumberOfPackets:數據包的大小
3.15 NDIS_STATUS MiniportSetInformation(NDIS_HANDLE MiniportAdapterContext, NDIS_OID Oid, PVOID InformationBuffer, ULONG InformationBufferLength, PULONG BytesRead, PULONG BytesNeeded)
該函數用於設置網卡的信息
MiniportAdapterContext:一個指向網卡結構的句柄,該網卡結構在MiniportInitialize函數中被創建。
Oid:網卡的OID信息碼
InformationBuffer:指向一個網卡信息Buffer
InformationBufferLength:網卡信息Buffer的大小
BytesRead:從信息Buffer中讀了多少字節
BytesNeeded:還需要多少字節的Buffer
3.16 VOID MiniportShutdown(PVOID ShutdownContext)
該函數用於恢復硬件網卡爲最初的狀態。該函是爲Optional,可以不實現。該函數不能調用NdisXXX函數。
ShutdownContext:指向一個區域,由NdisMRegisterAdapterShutdownHandler函數註冊MiniportShutdown函數的時候提供。
3.17 NDIS_STATUS MiniportTransferData(PNDIS_PACKET Packet, PUINT BytesTransferred, NDIS_HANDLE MiniportAdapterContext, NDIS_HANDLE MiniportReceiveContext, UINT ByteOffset, UINT BytesToTransfer)
該函數用於拷貝接收到的數據包到指定的Buffer中
Packet:指向一個帶有數據包描述符的數據Buffer
BytesTransferred:拷貝了多少個Bytes
MiniportAdapterContext:一個指向網卡結構的句柄,該網卡結構在MiniportInitialize函數中被創建。
MiniportReceiveContext:一個需要接收數據的網卡結構的句柄,描述哪塊網卡的數據包要被接收
ByteOffset:要被拷貝數據在Buffer中的偏移量
BytesToTransfer:拷貝多少個Bytes
3.18 NDIS_STATUS MiniportWanSend(NDIS_HANDLE MiniportAdapterContext, NDIS_HANDLE NdisLinkHandle, PNDIS_WAN_PACKET WanPacket)
該函數用於在WAN卡上發送數據,如果硬件網卡是一塊WAN卡,則不需要實現MiniportSend函數,而要實現該函數。
MiniportAdapterContext:一個指向網卡結構的句柄,該網卡結構在MiniportInitialize函數中被創建。
NdisLinkHandle:一個NDIS連接的句柄
WanPacket:指向一個NDIS_WAN_PACKET結構,該架構描述了要被傳輸的數據
以上是Miniport相關的接口函數,這裏也只是做個簡單的介紹,能讓大家有個初步的瞭解。如果想了解更多,可以看一下微軟提供的網卡驅動的源代碼,如下:
” /WINCE600/PUBLIC/COMMON/OAK/DRIVERS/NETCARD/NE2000”