1 WinCE網絡介紹

1 WinCE網絡介紹<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

      WinCE中,網絡架構和windows系統差不多。通過NDISWinCE系統和網卡及網絡協議進行交互。NDIS提供了一個完全的網絡驅動的抽象層,目前WinCE支持NDIS5.1,其中包括對RNDISNDISWANToken Ring等的支持。在WinCE中,整個網絡架構體系如圖:

 

       WinSock是提供給應用層的接口,一般開發網絡應用都會用Winsock接口來開發。往下就是協議層,IrDATCP/IP都基於NDIS層以上,通過NDIS封裝層和底層的驅動進行交互。NDIS包含了網卡的驅動,就是圖中的Miniport Driver。實際的網卡驅動就是指Miniport Driver,它向上爲NDIS提供了Miniport相關的接口函數,向下則通過NDIS的接口來訪問硬件網卡。

 

 

2 WinCE網絡驅動架構

      WinCE中,開發網卡驅動就是寫一個Miniport Driver,導出相應的Miniport接口函數,調用NDIS的接口訪問底層硬件。驅動架構如圖:

 

     從圖中清楚地看到Miniport driver所處的位置。在WinCE中支持三種類型的網絡驅動:Miniport driverIntermediate driverProtocol driver。這裏,只介紹針對硬件網卡的驅動,也就是Miniport driverMiniport 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:媒介類型數組大小

MiniportAdapterHandleMiniport適配器句柄,該參數要被保存,以後調用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”

 
發佈了11 篇原創文章 · 獲贊 0 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章