亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ndis開發(fā).htm

?? 詳細介紹了NIDS的應用和開發(fā)過程這是中文的
?? HTM
?? 第 1 頁 / 共 5 頁
字號:
      NIC驅(qū)動程序,其上層是一個向上層提供TDI(傳輸驅(qū)動程序接口)支持的傳輸驅(qū)動程序(也可能是多層結構)。從理論上講,一個中間層驅(qū)動程序也可以是基于其他中間層驅(qū)動程序或作為其他中間層驅(qū)動程序的低層出現(xiàn)的,盡管這種方案未必能展現(xiàn)更好的性能。<BR>中間層驅(qū)動程序的一個示例是LAN仿真中間層驅(qū)動程序,其上層是一個早期傳輸驅(qū)動程序,下層是一個非LAN介質(zhì)的微端口 
      NIC驅(qū)動程序。該驅(qū)動程序從上層接收LAN格式的數(shù)據(jù)包并將其轉換為本地網(wǎng)卡的介質(zhì)格式,然后將其發(fā)送到那個NIC的NDIS 
      微端口。接收數(shù)據(jù)時,該驅(qū)動程序?qū)⒌蛯泳W(wǎng)卡驅(qū)動程序送來的數(shù)據(jù)包轉換為LAN兼容格式,最后向上層傳輸驅(qū)動程序提交這些轉換過的數(shù)據(jù)包。<BR>例如,NDISWAN就具有一些上述特征。NDISWAN將數(shù)據(jù)包從上層的傳輸LAN格式轉換為WAN數(shù)據(jù)包格式,或者將數(shù)據(jù)包從低層的網(wǎng)卡驅(qū)動WAN格式轉換為LAN數(shù)據(jù)包格式。另外,如果低層NIC硬件不支持這些功能,那么NDISWAN也可提供諸如壓縮、加密和端對端協(xié)議(PPP)等的數(shù)據(jù)格式化功能。NDISWAN為在NDIS 
      API和網(wǎng)卡驅(qū)動程序之間進行通信提供了一個專用接口,同時,NDISWAN也將協(xié)議綁定映射為活動連接請求。<BR>另一個中間層驅(qū)動程序的例子是ATM 
      LANE 
      (LAN仿真)驅(qū)動程序,它將數(shù)據(jù)包從上層無連接的傳輸格式轉換為下層面向連接的網(wǎng)卡支持的ATM格式。<BR>圖1.1說明了中間層驅(qū)動程序結構</FONT></P>
      <P><FONT face=Verdana size=2></FONT>&nbsp;</P>
      <P><FONT face=Verdana size=2>圖表 1&nbsp; 中間層驅(qū)動程序結構</FONT></P>
      <P><FONT face=Verdana 
      size=2>NDIS中間層驅(qū)動程序在NDIS中起著轉發(fā)上層驅(qū)動程序送來的數(shù)據(jù)包,并將其向下層驅(qū)動程序發(fā)送的接口功能。當中間層驅(qū)動程序從下層驅(qū)動程序接收到數(shù)據(jù)包時,它要么調(diào)用NdisMXxxIndicateReceive函數(shù),要么調(diào)用NdisMindicateReceivePacket函數(shù)向上層指示該數(shù)據(jù)包。<BR>中間層驅(qū)動程序通過調(diào)用NDIS打開和建立一個對低層NIC驅(qū)動程序或者NDIS中間層驅(qū)動程序的綁定。中間層驅(qū)動程序提供MiniportSetInformation和MiniportQueryInformation函數(shù)來處理高層驅(qū)動程序的設置和查詢請求,某些情況下,可能還要將這些請求向低層NDIS驅(qū)動程序進行傳遞,如果其下邊界是面向無連接的可通過調(diào)用NidsRequest實現(xiàn)這一功能,如果其下邊界是面向連接的則通過調(diào)用NidsCoRequest實現(xiàn)該功能。<BR>中間層驅(qū)動程序通過調(diào)用NDIS提供的函數(shù)向網(wǎng)絡低層NDIS驅(qū)動程序發(fā)送數(shù)據(jù)包。例如,下邊界面向無連接的中間層驅(qū)動程序必須調(diào)用NdisSend或NdisSendPackets來發(fā)送數(shù)據(jù)包或者包數(shù)組,而在下邊界面向連接的情況下就必須調(diào)用NdisCoSendPackets來發(fā)送包數(shù)組數(shù)據(jù)包。如果中間層驅(qū)動程序是基于非NDIS 
      NIC驅(qū)動程序的,那么在調(diào)用中間層驅(qū)動程序的MiniportSend或Miniport(Co)SendPackets函數(shù)之后,發(fā)送接口對NDIS將是不透明的。<BR>NDIS提供了一組隱藏低層操作系統(tǒng)細節(jié)的NdisXxx函數(shù)和宏。例如,中間層驅(qū)動程序可以調(diào)用NdisMInitializeTimer來創(chuàng)建同步時鐘,可以調(diào)用NdisInitializeListHead創(chuàng)建鏈表。中間層驅(qū)動程序使用符合NDIS標準的函數(shù),來提高其在支持Win32接口的微軟操作系統(tǒng)上的可移植性。</FONT></P>
      <P><FONT face=Verdana size=2>1.2&nbsp;NDIS中間層驅(qū)動程序的用途</FONT></P>
      <P><FONT face=Verdana size=2>NDIS中間層驅(qū)動有幾個方面的用途,包括:<BR>局域網(wǎng)仿真(LAN Emulation) 
      – NDIS中間層驅(qū)動可以使一個非局域網(wǎng)NIC驅(qū)動(如,ATM)猶如一個局域網(wǎng)NIC驅(qū)動(如,Ethernet)。<BR>包過濾(Packet 
      Filtering) - 
      可以攔截和修改高層TDI(傳輸驅(qū)動程序)和底層NIC驅(qū)動程序之間的網(wǎng)絡包(Packets):<BR>通過或過濾掉(Pass/Drop 
      Packets)<BR>延遲或重新排序( Delay/Reorder Packets)<BR>加密或解密(Packet 
      Encryption/Decryption)<BR>壓縮或解壓(Packet 
      Compression/Decompression)<BR>路由包(Route Packets):<BR>NAT網(wǎng)絡地址轉換(Network 
      Address Translation)<BR>LBFO負載平衡和失效替換(Adapter Load Balancing And 
      Fail-Over)</FONT></P>
      <P><FONT face=Verdana size=2>1.3&nbsp;NDIS中間層驅(qū)動程序的開發(fā)環(huán)境</FONT></P>
      <P><FONT face=Verdana size=2>OS&nbsp;:&nbsp; Microsoft Windows 2000 
      Server<BR>IDE&nbsp;:&nbsp; Microsoft Visual C++ V6.0&nbsp; 
      <BR>DDK&nbsp;:&nbsp; Windows 2000 Device Drivers Kit</FONT></P>
      <P><FONT face=Verdana size=2>2&nbsp;NDIS中間層驅(qū)動程序的開發(fā)</FONT></P>
      <P><FONT face=Verdana size=2>2.1&nbsp;可分頁和可丟棄代碼</FONT></P>
      <P><FONT face=Verdana 
      size=2>每一個MiniportXxx函數(shù)或ProtocolXxx函數(shù)都運行在一個特定的IRQL上,在中間層驅(qū)動程序中這些函數(shù)可使用的IRQL從PASSIVE_LEVEL一直到DISPATCH_LEVEL(包括DISPATCH_LEVEL)。<BR>總是運行在IRQL 
      PASSIVE_LEVEL上的中間層驅(qū)動程序函數(shù)可通過調(diào)用NDIS_PAGEABLE_FUNCTION宏將其標記為可分頁代碼。驅(qū)動程序設計者應盡可能的將程序代碼設計為可分頁的,為那些必須駐留內(nèi)存代碼釋放系統(tǒng)空間。運行在IRQL 
      PASSIVE_LEVEL的驅(qū)動程序函數(shù),當其既不調(diào)用運行在IRQL &gt;=DISPATCH_LEVEL的任何函數(shù),也不被運行在IRQL 
      &gt;=DISPATCH_LEVEL的任何函數(shù)調(diào)用時,可將其標注為可分頁的。例如,一個獲取自旋鎖的函數(shù),而獲取自旋鎖將促使獲取線程提升到IRQL&nbsp; 
      DISPATCH_LEVEL上運行。一個運行在IRQL 
      PASSIVE_LEVEL的函數(shù),如ProtocolBindAdapter,如果被標注為可分頁的,就不能再調(diào)用運行在IRQL 
      &gt;=DISPATCH_LEVEL NDIS的函數(shù)。關于運行在IRQL 上的NDIS函數(shù)的更多信息,請參閱在線DDK的“Network 
      Drivers 
      Reference”,其中列出了每一個NdisXxx函數(shù)的IRQL。<BR>中間層驅(qū)動程序的DriverEntry函數(shù)以及只在DriverEntry中調(diào)用的代碼,應該用NDIS_INIT_FUNCTION宏將其設定為僅用作系統(tǒng)初始化功能。假定NDIS_INIT_FUNCTION宏標識的代碼僅在系統(tǒng)初始化時運行,這樣該部分代碼將只有在初始化時才會被映射,在DriverEntry返回后,NDIS_INIT_FUNCTION宏標識的這部分代碼將被丟棄。</FONT></P>
      <P><FONT face=Verdana size=2>2.2&nbsp;共享資源的訪問同2.3&nbsp;步</FONT></P>
      <P><FONT face=Verdana 
      size=2>如果驅(qū)動程序分配的資源能夠被兩個驅(qū)動程序函數(shù)同時共享,或者中間層驅(qū)動程序能夠運行在SMP(對稱多處理)機器上,這樣相同的驅(qū)動程序函數(shù)能夠從多個處理器同時訪問該資源,那么對這些共享資源的訪問必須進行同步。例如,驅(qū)動程序維持一個共享隊列,使用自旋鎖來對隊列的訪問進行同步,自旋鎖在隊列創(chuàng)建之前調(diào)用NdisAllocateSpinLock進行初始化。<BR>當然,也不必過分地保護共享資源,例如,對于隊列,一些讀操作不進行串行化也是可以成功執(zhí)行的。但任何針對隊列鏈接的操作都必須進行同步。自旋鎖應該盡量少使用,并且每次都要盡可能縮短其使用的時間。關于自旋鎖更深入的討論可參閱“Kernel_Mode 
      Drivers Design Guide”。</FONT></P>
      <P><FONT face=Verdana size=2>2.4&nbsp;中間層驅(qū)動程序的DriverEntry函數(shù)</FONT></P>
      <P><FONT face=Verdana 
      size=2>為了使加載程序能夠準確地識別,必須將中間層驅(qū)動程序的初始入口點明確地指定為DriverEntry的形式。所有其他的驅(qū)動程序?qū)С龊瘮?shù),像這里所描述的MiniportXxx和ProtocolXxx函數(shù),由于其地址傳給了NDIS,因此在設計時可由開發(fā)者任意指定名稱。任何內(nèi)核模式驅(qū)動程序DriverEntry的定義具有以下形式:<BR>NTSTAUS<BR>DriverEntry(<BR>&nbsp;&nbsp;IN 
      PDRIVER_OBJECT DriverObject,<BR>&nbsp;&nbsp;IN PUNICODE_STRING 
      RegistryPath<BR>);<BR>如果除了ProtocolXxx之外,驅(qū)動程序還導出一組標準的內(nèi)核模式驅(qū)動程序函數(shù),那么必須將這些標準函數(shù)的地址寫入要傳給DriverEntry的驅(qū)動程序?qū)ο笾小?lt;BR>在中間層驅(qū)動程序中,DriverEntry至少應該完成以下工作:<BR>調(diào)用NdisMInitializeWrapper并保存在NdisWrapperHandle中返回的句柄;<BR>傳遞上一步保存的句柄,調(diào)用NdisIMRegisterLayeredMiniport注冊驅(qū)動程序的MiniportXxx函數(shù);<BR>如果驅(qū)動程序隨后要綁定到低層NDIS驅(qū)動程序上,則調(diào)用NdisRegisterProtocol注冊驅(qū)動程序的ProtocolXxx函數(shù);<BR>如果驅(qū)動程序?qū)С隽薓iniportXxx和ProtocolXxx函數(shù),那么調(diào)用NdisIMAssociateMiniport向NDIS通告有關驅(qū)動程序的微端口低邊界和協(xié)議高邊界信息;<BR>DriverEntry能夠為中間層驅(qū)動程序分配的所有共享資源初始化自旋鎖,例如驅(qū)動程序用于跟蹤運行中的連接和發(fā)送任務的構件和內(nèi)存區(qū)。<BR>當DriverEntry不能為驅(qū)動程序分配用于網(wǎng)絡I/O操作的所有資源時,它就應該釋放先前已經(jīng)分配的任何資源并返回一個適當?shù)腻e誤狀態(tài)。例如,如果DriverEntry已經(jīng)調(diào)用了NdisMInitializeWrapper函數(shù),那么當后續(xù)操作出錯時必須調(diào)用NdisTerminateWrapper復位系統(tǒng)狀態(tài)。<BR>中間層驅(qū)動程序的DriverEntry函數(shù)能夠執(zhí)行一些全局初始化操作。然而,如果驅(qū)動程序提供了在2.4節(jié)所描述的,實現(xiàn)對低層設備的打開和綁定功能的ProtocolBindAdapter函數(shù),那么驅(qū)動程序就能夠讓ProtocolBindAdapter來分配綁定相關的系統(tǒng)資源,ProtocolBindAdapter根據(jù)要求為DeviceName設備進行資源分配和綁定操作。DriverEntry必須初始化該包裹程序并注冊微端口驅(qū)動程序。如果中間層驅(qū)動程序?qū)С隽艘唤MProtocolXxx函數(shù)的話,也要注冊協(xié)議驅(qū)動程序。<BR>如果中間層驅(qū)動程序僅向NDIS導出了一組MiniportXxx函數(shù),只要向NDIS庫注冊這些函數(shù)即可,如下所述。</FONT></P>
      <P><FONT face=Verdana size=2>2.4.1&nbsp;注冊NDIS中間層驅(qū)動程序</FONT></P>
      <P><FONT face=Verdana 
      size=2>NDIS中間層驅(qū)動程序必須在DriverEntry函數(shù)的環(huán)境中向NDIS注冊其MiniportXxx函數(shù)和ProtocolXxx函數(shù)。驅(qū)動程序通過調(diào)用NdisIMRegisterLayeredMiniport對MiniportXxx函數(shù)進行注冊,該調(diào)用導出中間層驅(qū)動程序的MiniportXxx函數(shù)。當虛擬NIC被初始化時,以及隨后當驅(qū)動程序?qū)⒁谠揘IC接收和發(fā)送數(shù)據(jù)包時,注意驅(qū)動程序的控制過程。<BR>對于指定的虛擬NIC,NDIS將在NdisIMInitializeDeviceInstance的環(huán)境中調(diào)用中間層驅(qū)動程序的MiniportInitialize函數(shù)對其進行初始化操作。如果中間層驅(qū)動程序?qū)С隽硕鄠€虛擬NIC,那么為使其可用于網(wǎng)絡請求,驅(qū)動程序必須為每一個NIC調(diào)用NdisIMInitializeDeviceInstance函數(shù)進行初始化。這樣可根據(jù)網(wǎng)絡業(yè)務量,生成相應的數(shù)量的虛擬NIC。<BR>如果NDIS中間層驅(qū)動程序也導出了一組ProtocolXxx函數(shù),則必須調(diào)用相應的NdisRegisterProtocol函數(shù)向NDIS庫注冊這些函數(shù)。</FONT></P>
      <P><FONT face=Verdana 
      size=2>2.4.1.1&nbsp;注冊中間層驅(qū)動程序的Miniport<BR>中間層驅(qū)動程序通過調(diào)用NdisIMRegisterLayeredMiniport導出MiniportXxx函數(shù)。<BR>NdisIMRegisterLayeredMiniport以如下方式進行聲明:<BR>NDIS_STATUS<BR>NdisIMRegisterLayeredMiniport(<BR>&nbsp;IN 
      NDIS_HANDLE NdisWrapperHandle,<BR>&nbsp;IN PNDIS_MINIPORT_CHARACTERISTICS 
      MiniportCharacteristics,<BR>&nbsp;IN UINT 
      CharacteristicsLength,<BR>&nbsp;OUT PNDIS_HANDLE 
      DriverHandle<BR>);<BR>中間層驅(qū)動程序必須保存NdisIMRegisterLayeredMiniport返回的DriverHandle句柄,并且在驅(qū)動程序中調(diào)用NdisIMInitializeDeviceInstance函數(shù),請求中間層驅(qū)動程序的MiniportInitialize函數(shù)對虛擬NIC進行初始化時,將該句柄輸入NDIS。當中間層驅(qū)動程序成功的綁定到一個或多個低層NIC驅(qū)動程序上或者當其綁定在一個非NIC設備驅(qū)動程序上后,將調(diào)用NdisIMInitializeDeviceInstance函數(shù),使得中間層驅(qū)動程序可以初始化Miniport組件來接受虛擬NIC上的I/O請求。<BR>NdisWrapperHandle句柄是由先前的NdisMInitializeWrapper函數(shù)返回的。<BR>中間層驅(qū)動程序必須完成以下操作:<BR>用NdisZeroMemory函數(shù)零初始化一個NDIS_MINIPORT_CHARACTERISTICS類型的構件;<BR>保存所有驅(qū)動程序?qū)С龅膹娭菩缘暮头菑娭频腗iniportXxx函數(shù)的地址,并將所有非強制的MiniportXxx入口指針設為NULL;<BR>當其他類型的NDIS驅(qū)動程序的有效主版本是0x03、0x04、0x05時,如果要導出任何新的V4.0或 
      V5.0的MiniportXxx函數(shù),中間層驅(qū)動程序的主版本必須是4.0并提供4.0或5.0版的MiniportCharacteristics構件。<BR>對于MiniportCharacteristics,如果驅(qū)動程序不用導出MiniportXxx函數(shù),則必須將其設為NULL,但是如果要導出函數(shù)的話,則必須將其設為某個有效的MiniportXxx函數(shù)地址值。<BR>HaltHandler<BR>當?shù)蛯覰IC超時并且NDIS已經(jīng)中止了網(wǎng)卡驅(qū)動程序時,或者操作系統(tǒng)正在執(zhí)行一個可控的系統(tǒng)關閉操作時,NDIS將調(diào)用該函數(shù)。<BR>InitializeHandler<BR>作為中間層驅(qū)動程序調(diào)用NdisIMInitializeDeviceInstance初始化微端口的結果,調(diào)用該函數(shù)對虛擬網(wǎng)卡進行初始化。<BR>QueryInformationHandler<BR>該函數(shù)接收OID_XXX請求,這個請求來自于高層驅(qū)動程序(用NdisRequestQueryInformation請求類型作參數(shù),調(diào)用NdisRequest)。<BR>ResetHandler<BR>在高層協(xié)議驅(qū)動程序調(diào)用NdisReset的指示下,NDIS能夠調(diào)用中間層驅(qū)動程序的MiniportReset函數(shù)。然而,協(xié)議驅(qū)動程序并不啟動復位功能,通常,NDIS啟動低層網(wǎng)卡驅(qū)動程序復位操作并調(diào)用中間層驅(qū)動程序的ProtocolStatus和ProtocolStatusComplete函數(shù)通知中間層驅(qū)動程序低層微端口正在復位網(wǎng)卡。<BR>SetInformationHandler<BR>該函數(shù)接收OID_XXX請求,這個請求來自于高層驅(qū)動程序(用NdisRequestSetInformation請求類型作參數(shù),調(diào)用NdisRequest)。<BR>SendHandler<BR>NDIS調(diào)用該函數(shù)向低層網(wǎng)卡(或設備)驅(qū)動程序發(fā)送單個數(shù)據(jù)包。如果中間層驅(qū)動程序不支持MiniportSendPackets函數(shù),那么MiniportSend函數(shù)(或MiniportWanSend函數(shù))是必須提供的。除非中間層驅(qū)動程序總是基于那些每次只發(fā)送單一數(shù)據(jù)包或?qū)⒆陨斫壎ǖ降蛯覹AN 
      NIC的驅(qū)動程序,否則MiniportSendPackets函數(shù)應該總是以SendPacketsHander方式提供,而不是以該SendHander處理程序方式提供,關于這方面的更多討論請參閱2.9節(jié)。<BR>SendPacketsHander<BR>該函數(shù)接收用于指定網(wǎng)上傳輸數(shù)據(jù)包的包描述符指針數(shù)組。除非中間層驅(qū)動程序綁定到低層WAN 
      NIC驅(qū)動程序上并提供了MiniportWanSend函數(shù),否則驅(qū)動程序應提供對MiniportSendPackets而不是MiniportSend函數(shù)支持。換句話說,不管中間層驅(qū)動程序是基于每次只能傳送單個數(shù)據(jù)包的網(wǎng)卡驅(qū)動程序;還是基于每次可以傳送多個數(shù)據(jù)包的網(wǎng)卡驅(qū)動程序,也不管中間層驅(qū)動程序是基于每次只能傳送單個數(shù)據(jù)包的協(xié)議驅(qū)動程序;還是基于每次可以傳送多個數(shù)據(jù)包的協(xié)議驅(qū)動程序,MiniportSendPackets函數(shù)都能實現(xiàn)最好的性能,關于這方面的更多討論可參閱2.9節(jié)。<BR>TransferDataHandler<BR>該函數(shù)用于傳輸在前視緩沖區(qū)中沒有指示的接收數(shù)據(jù)包的剩余部分,該前視緩沖區(qū)由中間層驅(qū)動程序傳遞給NdisMXxxIndicateReceive函數(shù)。這個被指示的數(shù)據(jù)包可以是中間層驅(qū)動程序的ProtocolReceive函數(shù)或者是ProtocolReceivePackets處理程序接收的轉換數(shù)據(jù)包。如果中間層驅(qū)動程序通過調(diào)用(除NdisMWanIndicateReceive之外)NdisMXxxIndicateReceive函數(shù)向上層驅(qū)動程序指示接收數(shù)據(jù)包,那么該處理程序是必須提供的。如果中間層驅(qū)動程序總是通過調(diào)用NdisMIndicateReceivePacket向上層驅(qū)動程序指示接收數(shù)據(jù)包,則不必要提供MiniportTransferData函數(shù)。<BR>ReturnPacketHandler<BR>該函數(shù)接收返回包描述符(該包描述符先前通過NdisMIndicateReceivePacket調(diào)用向高層指示),從而釋放指示給高層驅(qū)動程序的資源的控制權。在高層驅(qū)動程序處理完所有指示之后,中間層驅(qū)動程序分配的描述符及所描述的資源將返回給MiniportReturnPacket函數(shù)。當然,如果中間層驅(qū)動程序總是通過調(diào)用介質(zhì)相關的NdisMXxxIndicateReceive函數(shù)向上層指示數(shù)據(jù)包,或者在調(diào)用NdisMIndicateReceivePacket之前總是將OOB數(shù)據(jù)塊(與每一個描述符相關的)狀態(tài)設置為NDIS_STATUS_RESOUCES,則不必提供MiniportReturnPacket函數(shù)。<BR>CheckForHangHandler<BR>該函數(shù)以NDIS規(guī)定的時間間隔調(diào)用,或者以中間層驅(qū)動程序規(guī)定的時間間隔運行,二者只居其一。如果提供了該處理程序,那么MiniportCheckForHang函數(shù)每兩秒鐘被調(diào)用一次(或者按驅(qū)動程序要求的間隔調(diào)用)。關于MiniportCheckForHang函數(shù)的更多信息可參見在線DDK的“Network 
      Drivers 
      Reference”或者該手冊的第二部分。通常情況下,由于驅(qū)動程序無法確定低層網(wǎng)卡是否懸掛,NDIS中間層驅(qū)動程序并不提供對MiniportCheckForHang函數(shù)的支持。如果驅(qū)動程序基于狀態(tài)不能到達NDIS的非NDIS驅(qū)動程序,中間層驅(qū)動程序可能會提供對該處理程序的支持。<BR>由于驅(qū)動程序并不管理中斷設備,不為使用中的IRQL分配緩沖區(qū),或者因為NDIS并不調(diào)用MiniportReconfigure函數(shù)(在ReconfigureHandler情況下),因此中間層驅(qū)動程序不會提供以下的幾個微端口處理程序函數(shù)。<BR>DisableInterruptHandler<BR>EnableInterruptHandler<BR>HandleInterruptHandler<BR>ISRHandler<BR>AllocateCompleteHandler<BR>ReconfigureHandler</FONT></P>
      <P><FONT face=Verdana 
      size=2>2.4.1.2&nbsp;注冊中間層驅(qū)動程序的協(xié)議<BR>中間層驅(qū)動程序通過調(diào)用NdisRegisterProtocol向NDIS注冊ProtocolXxx函數(shù)。<BR>NdisRegisterProtocol以如下方式進行聲明:<BR>VOID<BR>NdisRegisterProtocol(<BR>OUT 
      PNDIS_STATUS Status,<BR>OUT PNDIS_HANDLE NdisProtocolHandler,<BR>IN 
      NDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics,<BR>IN UINT 
      CharacteristicsLength<BR>);<BR>在調(diào)用NdisRegisterProtocol函數(shù)之前,中間層驅(qū)動程序必須完成以下操作:<BR>零初始化一個NDIS_PROTOCOL_CHARACTERISTICS類型的結構。中間層驅(qū)動程序能夠使用4.0或者5.0版的ProtocolCharacteristics結構。協(xié)議驅(qū)動程序必須支持即插即用功能,因此NDIS不再支持3.0版的協(xié)議驅(qū)動程序。<BR>保存所有驅(qū)動程序支持的強制性的和非強制的ProtocolXxx函數(shù)的地址;<BR>該調(diào)用的返回句柄NdisProtocolHandler對中間層驅(qū)動程序是不透明的,中間層驅(qū)動程序必須保存該句柄,并在將來NDIS中間層驅(qū)動程序的協(xié)議部分的函數(shù)調(diào)用中作為輸入?yún)?shù)傳遞,例如,打開低層適配器的函數(shù)調(diào)用。<BR>2.4.1.2.1&nbsp;注冊下邊界面向無連接的中間層驅(qū)動程序的ProtocolXxx函數(shù)<BR>下邊界面向無連接中間層驅(qū)動程序能夠?qū)С龅模ò蛇x的和必須的)協(xié)議處理程序函數(shù)如下所列:<BR>BindAdapterHandler<BR>這是一個必須提供的函數(shù)。NDIS調(diào)用該函數(shù)請求中間層驅(qū)動程序綁定到低層NIC或虛擬NIC上,NIC名作為該處理程序的一個參數(shù)傳遞。關于動態(tài)綁定的更多的信息參見2.4節(jié).<BR>UnbindAdapterHandler<BR>這是一個必須提供的函數(shù)。NDIS調(diào)用ProtocolUnbindAdapter釋放對低層NIC或虛擬NIC的綁定,網(wǎng)卡名作為該處理程序的一個參數(shù)傳遞。當綁定成功關閉時,ProtocolUnbindAdapter將調(diào)用NdisCloseAdapter函數(shù)并釋放相關資源。<BR>OpenAdapterCompleteHandler<BR>這是一個必須提供的函數(shù)。如果中間層驅(qū)動程序?qū)disOpenAdapter的調(diào)用返回NDIS_STATUS_PENDING,則接著調(diào)用ProtocolOpenAdapterComplete來完成綁定。<BR>CloseAdapterCompleteHandler<BR>這是一個必須提供的函數(shù)。如果中間層驅(qū)動程序?qū)disCloseAdapter的調(diào)用返回NDIS_STATUS_PENDING,則接著調(diào)用ProtocolCloseAdapterComplete來完成綁定釋放。<BR>ReceiveHandler<BR>這是一個必須提供的函數(shù)。ProtocolReceive函數(shù)以指向包含網(wǎng)絡接收數(shù)據(jù)的前視緩沖區(qū)的指針為參數(shù)被調(diào)用執(zhí)行。如果該緩沖區(qū)包含的不是完整的網(wǎng)絡數(shù)據(jù)包,ProtocolReceive以數(shù)據(jù)包描述符作為參數(shù),調(diào)用NdisTransferData接收該數(shù)據(jù)包的剩余部分。如果低層驅(qū)動程序調(diào)用NdisMIndicateReceivePacket指示接收數(shù)據(jù)包,那么傳給ProtocolReceive函數(shù)的前視緩沖區(qū)將總是完整的網(wǎng)絡數(shù)據(jù)包。<BR>ReceivePacketHandler<BR>這是一個可選函數(shù)。如果中間層驅(qū)動程序所基于的NIC驅(qū)動程序指示的是數(shù)據(jù)包描述符指針數(shù)組,或者調(diào)用NdisMIndicateReceivePacket函數(shù)指示接收帶外數(shù)據(jù),那么驅(qū)動程序應提供ProtocolReceivePacket函數(shù)。如果開發(fā)者不能確定中間層驅(qū)動程序的執(zhí)行環(huán)境,也應提供函數(shù),因為在能夠產(chǎn)生多包指示的低層NIC驅(qū)動程序上,中間層驅(qū)動程序?qū)@得更好的性能。<BR>ReceiveCompleteHandler<BR>這是一個必須提供的函數(shù)。當先前指示給ProtocolReceive 
      函數(shù)的數(shù)據(jù)包被處理后,將調(diào)用ProtocolReceiveComplete函數(shù)。<BR>TransferDataCompleteHandler<BR>如果ProtocolReceive要調(diào)用NdisTransferData函數(shù),則必須提供該處理程序。如果復制接收數(shù)據(jù)包剩余部分的NdisTransferData函數(shù)調(diào)用返回NDIS_STATUS_PENDING,那么當傳輸操作完成后,將調(diào)用ProtocolTransferDataComplete函數(shù)。<BR>ResetCompleteHandler<BR>這是一個必須提供的函數(shù)。當NdisReset函數(shù)(返回NDIS_STATUS_PENDING)調(diào)用啟動的復位操作完成時,ProtocolResetComplete函數(shù)將被調(diào)用。通常情況下,中間層驅(qū)動程序并不調(diào)用NdisReset,但由于上層驅(qū)動程序可能會調(diào)用該函數(shù),所以中間層驅(qū)動程序可能只是向低層NDIS驅(qū)動程序轉發(fā)復位請求而已。<BR>RequestCompleteHandler<BR>這是一個必須提供的函數(shù)。當NdisRequest函數(shù)(返回NDIS_STATUS_PENDING)調(diào)用啟動的查詢或設置操作完成時,ProtocolRequestComplete函數(shù)將被調(diào)用。<BR>SendCompleteHandler<BR>這是一個必須提供的函數(shù)。對每一個調(diào)用NdisSend函數(shù)傳輸?shù)臄?shù)據(jù)包,當其返回NDIS_STATUS_PENDING作為發(fā)送狀態(tài)時,將調(diào)用ProtocolSendComplete函數(shù)完成發(fā)送操作。如果調(diào)用NdisSendPackets發(fā)送一組數(shù)據(jù)包,那么對于每一個傳送給NdisSendPackets的數(shù)據(jù)包,ProtocolSendComplete將被調(diào)用一次。中間層驅(qū)動程序僅僅根據(jù)送給ProtocolSendComplete的狀態(tài)參數(shù)就能確定調(diào)用NdisSendPackets函數(shù)的發(fā)送操作的狀態(tài)。<BR>StatusHandler<BR>這是一個必須提供的函數(shù)。NDIS用低層NIC驅(qū)動程序發(fā)起的狀態(tài)通知來調(diào)用ProtocolStatus函數(shù)。<BR>StatusCompleteHandler<BR>這是一個必須提供的函數(shù)。NDIS調(diào)用ProtocolStatusComplete函數(shù)來指示狀態(tài)改變操作已經(jīng)完成,該狀態(tài)先前被指示給ProtocolStatus函數(shù)。<BR>PnPEventHandler<BR>這是一個必須提供的函數(shù)。NDIS調(diào)用ProtocolPnPEvent來指示即插即用事件或電源管理事件。更多信息可參見2.9節(jié)。<BR>UnloadHandler<BR>這是一個可選函數(shù)。NDIS調(diào)用ProtocolUnload函數(shù)來響應用戶卸載中間層驅(qū)動程序的請求。對于每一個綁定的適配器,NDIS在調(diào)用ProtocolUnbindAdapter之后,將調(diào)用ProtocolUnload函數(shù)卸載驅(qū)動程序。ProtocolUnload執(zhí)行驅(qū)動程序決定的清除操作。<BR>2.4.1.2.2&nbsp;注冊下邊界面向連接的中間層驅(qū)動程序的ProtocolXxx函數(shù)<BR>&nbsp;下邊界面向連接的中間層驅(qū)動程序必須注冊如下的面向無連接的和面向連接的微端口所共有的協(xié)議處理程序函數(shù):<BR>BindHandler<BR>UnbindHandler<BR>OpenAdapterCompleteHandler<BR>CloseAdapterCompleteHandler<BR>ReceiveCompleteHandler<BR>ResetCompleteHandler<BR>RequestCompleteHandler<BR>StatusCompleteHandler<BR>PnPEventHandler<BR>這些函數(shù)已經(jīng)在上一小節(jié)作了匯總。<BR>下邊界面向連接的中間層驅(qū)動程序還必須注冊如下的面向連接協(xié)議函數(shù):<BR>CoSendCompleteHandler<BR>這是一個必須提供的函數(shù)。對于傳給NdisCoSendPackets的每一個數(shù)據(jù)包都要調(diào)用一次ProtocolCoSendComplete函數(shù)。中間層驅(qū)動程序僅僅根據(jù)送給ProtocolCoSendComplete的狀態(tài)參數(shù)就能確定調(diào)用NdisCoSendPackets的發(fā)送操作的狀態(tài)。<BR>CoStatusHandler<BR>這是一個必須提供的函數(shù)。NDIS用低層NIC驅(qū)動程序發(fā)起的狀態(tài)通知來調(diào)用ProtocolCoStatus函數(shù)。<BR>CoReceivePacketsHandler<BR>這是一個必須提供的函數(shù)。當綁定的面向連接NIC驅(qū)動程序或者集成微端口呼叫管理器(MCM)通過調(diào)用NdisMCoIndicateReceivePackets指示一個指針數(shù)組時,NDIS將調(diào)用中間層驅(qū)動程序的ProtocolCoReceivePacketHandler函數(shù)。<BR>CoAfRegisterNotifyHandler<BR>如果中間層驅(qū)動程序是一個使用呼叫管理器或MCM驅(qū)動程序的呼叫管理服務的面向連接客戶,那么就必須注冊ProtocolCoAfRegisterNotify函數(shù),該函數(shù)用來確定中間層驅(qū)動程序能否使用呼叫管理器或MCM(已經(jīng)通過注冊地址族,公布其服務)的服務。</FONT></P>
      <P><FONT face=Verdana size=2>2.5&nbsp;中間層驅(qū)動程序的動態(tài)綁定</FONT></P>
      <P><BR><FONT face=Verdana 
      size=2>中間層驅(qū)動程序必須提供ProtocolBindAdapter和ProtocolUnbindAdapter函數(shù)以支持對低層NIC的動態(tài)綁定。當NIC可用時,NDIS調(diào)用中間層驅(qū)動程序(能夠綁定到NIC)的ProtocolBindAdapter函數(shù)實現(xiàn)動態(tài)綁定操作。<BR>&nbsp;VOID<BR>&nbsp;ProtocolBindAdapter(<BR>&nbsp;&nbsp;OUT 
      PNDIS_STATUS &nbsp;Status,<BR>&nbsp;&nbsp;IN NDIS_HANDLE 
      &nbsp;BindContext,<BR>&nbsp;&nbsp;IN PNDIS_STRING 
      &nbsp;DeviceName,<BR>&nbsp;&nbsp;IN PVOID 
      &nbsp;&nbsp;SystemSpecific1,<BR>&nbsp;&nbsp;IN PVOID 
      &nbsp;&nbsp;SystemSpecific2<BR>&nbsp;);<BR>BindContext句柄代表綁定請求的NDIS環(huán)境,中間層驅(qū)動程序必須保存該句柄,并且在中間層驅(qū)動程序完成綁定相關操作,并準備接受發(fā)送請求時,將該句柄作為NdisCompleteBindAdapter的參數(shù)返回NDIS。<BR>綁定時的操作包括為該綁定分配NIC相關的環(huán)境區(qū)域并進行初始化,接著調(diào)用NdisOpenAdapter綁定到DeviceName參數(shù)指定的適配器。DeviceName可以是低層NIC驅(qū)動程序管理的NIC,也可以是介于被調(diào)用的中間層驅(qū)動程序和管理適配器的NIC驅(qū)動程序之間,由中間層NDIS驅(qū)動程序?qū)С龅目刂苽鬏斦埱蟮奶摂MNIC。通常情況下,可能僅有一個基于NIC驅(qū)動程序的中間層NDIS驅(qū)動程序,實現(xiàn)早期的高層協(xié)議驅(qū)動程序支持的介質(zhì)格式和低層NIC驅(qū)動程序支持的介質(zhì)格式之間的轉換。<BR>注意,中間層驅(qū)動程序向NdisOpenAdapter傳遞的DeviceName必須與先前向ProtocolBindAdapter函數(shù)傳遞的DeviceName(一個Unicode字符串緩沖區(qū)指針)相同,驅(qū)動程序不能復制該指針并將指針副本傳遞給NdisOpenAdapter函數(shù)。<BR>中間層驅(qū)動程序能夠在已分配的綁定相關環(huán)境區(qū)域或者另一個驅(qū)動程序可訪問位置保存BindContext。如果NdisOpenAdapter返回NDIS_STATUS_PEDDING,則必須保存BindContext值,在這種情況下,中間層驅(qū)動程序直到打開適配器的操作完成,并且其ProtocolOpenAdapterComplete函數(shù)已調(diào)用完成,才能調(diào)用NdisCompleteBindAdapter函數(shù)完成綁定工作。BindContext必須從某個已知位置獲得,并由ProtocolOpenAdapterComplete傳遞給NdisCompleteBindAdapter函數(shù)。<BR>如果中間層驅(qū)動程序?qū)⑦m配器相關信息存入注冊表,那么SystemSpecific1將指向注冊表路徑,該值將被傳給NdisOpenProtocolConfiguration函數(shù)以獲取用于讀寫適配器信息的句柄。<BR>SystemSpecific2預留系統(tǒng)使用。<BR>如果中間層驅(qū)動程序要將內(nèi)入數(shù)據(jù)包從一種介質(zhì)格式轉化為另一種格式,那么ProtocolBindAdapter能夠分配數(shù)據(jù)包描述符池和每一個綁定所需的緩沖描述符。關于分配和管理數(shù)據(jù)包的要求可參閱2.5節(jié)。另外,如果中間層驅(qū)動程序僅僅用Protocol(Co)Receive函數(shù)接收內(nèi)入數(shù)據(jù),那么驅(qū)動程序應該分配數(shù)據(jù)包池和緩沖池來復制接收的數(shù)據(jù)。</FONT></P>
      <P><FONT face=Verdana size=2>2.5.1&nbsp;打開中間層驅(qū)動程序下層的適配器</FONT></P>
      <P><FONT face=Verdana 
      size=2>ProtocolBindAdapter函數(shù)通過DeviceName參數(shù)值打開低層NIC或虛擬網(wǎng)卡,從而建立到低層NIC驅(qū)動程序的綁定,它也能夠從注冊表中讀取所要求的附加配置信息。NdisOpenProtocolConfiguration用于獲取指向中間層驅(qū)動程序存儲適配器相關信息的注冊表主鍵句柄。中間層驅(qū)動程序通過調(diào)用NdisOpenConfigurationKeyByIndex函數(shù)或者NdisOpenConfigurationKeyByName函數(shù)打開并獲取主鍵(由NdisOpenProtocolConfiguration函數(shù)打開)下的子鍵句柄。然后,中間層驅(qū)動程序能夠調(diào)用NdisRead(Write)Configuration函數(shù)讀寫注冊表主鍵或子鍵下的相關信息。NdisRead(Write)Configuration函數(shù)在在線DDK的“Network 
      Drivers 
      Reference”中有詳細的描述。<BR>典型地,ProtocolBindAdapter使用環(huán)境區(qū)域(代表對DeviceName綁定)存儲所有綁定相關信息(與綁定適配器相關聯(lián)的)。<BR>綁定操作最終由NdisOpenAdapter函數(shù)調(diào)用來實現(xiàn),該函數(shù)聲明如下:<BR>&nbsp;VOID<BR>&nbsp;NdisOpenAdapter(<BR>&nbsp;&nbsp;OUT 
      PNDIS_STATUS &nbsp;Status,<BR>&nbsp;&nbsp;OUT PNDIS_STATUS 
      &nbsp;OpenErrorStatus,<BR>&nbsp;&nbsp;OUT 
      PNDIS_HANDLE&nbsp;NdisBindingHandle,<BR>&nbsp;&nbsp;OUT PUNIT 
      &nbsp;&nbsp;SelectedMediumIndex,<BR>&nbsp;&nbsp;IN PNDIS_MEDIUM 
      &nbsp;MediumArray,<BR>&nbsp;&nbsp;IN UINT 
      &nbsp;&nbsp;MediumArraySize,<BR>&nbsp;&nbsp;IN NDIS_HANDLE 
      &nbsp;NdisProtocolHandle,<BR>&nbsp;&nbsp;IN NDIS_HANDLE 
      &nbsp;ProtocolBindingContext,<BR>&nbsp;&nbsp;IN PNDIS_STRING 
      &nbsp;AdapterName,<BR>&nbsp;&nbsp;IN UINT 
      &nbsp;&nbsp;OpenOptions,<BR>&nbsp;&nbsp;IN PSTRING 
      &nbsp;&nbsp;AddressingInformation<BR>&nbsp;);<BR>中間層驅(qū)動程序在ProtocolBindingContext中傳遞代表綁定相關環(huán)境區(qū)域(已經(jīng)分配并初始化)的句柄。NDIS在未來與綁定相關的調(diào)用中,將向中間層驅(qū)動程序返回該環(huán)境。例如,在對Protocol(Co)Receive或Protocol(Co)Status函數(shù)的調(diào)用中。相似地,當NdisOpenAdapter 
      調(diào)用返回時,NDIS將向中間層驅(qū)動程序傳遞該NdisProtocolHandle句柄。驅(qū)動程序必須保存該句柄,通常保存在綁定相關的環(huán)境區(qū)域,在以后與該綁定相關的調(diào)用中,中間層驅(qū)動程序?qū)⑾騈DIS傳送該句柄,例如NdisSend或Ndis(Co)SendPackets函數(shù)調(diào)用。<BR>ProtocolBindAdapter也能夠通過MediumArray傳遞所支持的介質(zhì)類型。如果NdisOpenAdapter函數(shù)調(diào)用成功,低層NIC驅(qū)動程序?qū)⑦x擇一種其所支持的介質(zhì)類型,并通過SelectedMediumHandle返回其從MediumArray中所選介質(zhì)的索引。<BR>ProtocolBindAdapter可以通過NdisProtocolHandle傳遞前面對NdisRegisterProtocol函數(shù)成功調(diào)用所返回的值。<BR>如果NdisOpenAdapter返回了一個錯誤,那么中間層驅(qū)動程序應該收回為綁定相關環(huán)境區(qū)域分配的內(nèi)存空間,并釋放為綁定分配的其他所有資源。典型地,ProtocolBindAdapter通過調(diào)用NdisWriteErrorLogEntry,用適當?shù)拿枋鲂畔⒂涗浫魏问〉慕壎ú僮鳌?lt;/FONT></P>
      <P><FONT face=Verdana size=2>2.5.2&nbsp;微端口(Miniport)初始化</FONT></P>
      <P><FONT face=Verdana 
      size=2>當成功打開低層NIC并準備在虛擬NIC或NIC上接收請求和發(fā)送數(shù)據(jù)之后,ProtocolBindAdapter將對NdisIMIntializeDeviceInstance進行一次或多次調(diào)用來請求對一個或多個網(wǎng)卡進行初始化操作。NdisIMIntializeDeviceInstance調(diào)用中間層驅(qū)動程序的MiniportInitialize函數(shù)執(zhí)行指定網(wǎng)卡的初始化。當MiniportInitialize函數(shù)返回后,上層NDIS驅(qū)動程序就能夠進行對中間層驅(qū)動程序的虛擬NIC(s)的綁定操作了。<BR>&nbsp;MiniportInitialize函數(shù)必須分配和初始化虛擬NIC相關的環(huán)境區(qū)域。作為初始化操作的一部分,MiniportInitialize必須用相應的環(huán)境句柄調(diào)用NdisMSetAttributeEx函數(shù),NDIS將在以后對MiniportXxx函數(shù)調(diào)用中傳遞該環(huán)境句柄。MiniportInitialize也必須設置AttributeFlags參數(shù)(將被傳遞給NdisMSetAttributeEx函數(shù))中的NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER標記。中間層驅(qū)動程序通過設置NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER標記來標識NDIS驅(qū)動程序類型。<BR>另外,如果當中間層驅(qū)動程序隊列中的發(fā)送和請求操作超時時,不想讓NDIS調(diào)用MiniportCheckForHang(或MiniportReset)函數(shù),那么MiniportInitialize必須對AttributeFlags參數(shù)(將被傳遞給NdisMSetAttributeEx函數(shù))中的NDIS_ATTRIBUTE_IGNORE_PACKET_TIMEOUT和NDIS_ATTRIBUTE_IGNORE_REQUEST_TIMEOUT標記進行設置。通過設置超時標記來通知NDIS將由中間層驅(qū)動程序負責處理虛擬NIC超時操作。因為中間層驅(qū)動程序并不操縱低層NIC,因此它無法控制到底花了多長時間完成未決發(fā)送和請求操作,驅(qū)動程序通常既不提供MiniportCheckForHang函數(shù)也不處理虛擬NIC超時。<BR>然而,如果中間層驅(qū)動程序已經(jīng)注冊了CheckForHangHandler句柄的入口點,并且沒有請求NDIS忽略數(shù)據(jù)包和請求超時,也沒有改變超事間隔,那么,在默認情況下,將每隔兩秒對MiniportCheckForHang函數(shù)進行一次調(diào)用。如果MiniportCheckForHang函數(shù)返回TRUE,驅(qū)動程序?qū)⒄{(diào)用MiniportReset函數(shù)。如果驅(qū)動程序支持MiniportCheckForHang函數(shù),那么可以通過調(diào)用NdisMSetAttributeEx函數(shù)來明確指定一個不同的TimeInSeconds值,改變默認的兩秒調(diào)用間隔設置。<BR>中間層驅(qū)動程序必須像一個非串行驅(qū)動程序那樣進行操作,并且通過設置將要傳遞給NdisMSetAttributeEx函數(shù)的AttributeFlags參數(shù)中的NDIS_ATTRIBUTE_DESERIALIZE標記來進行注冊。非串行驅(qū)動程序?qū)iniportXxx函數(shù)的操作進行串行化,并且對所有引入的發(fā)送數(shù)據(jù)包在內(nèi)部進行排隊,而不是依靠NDIS來保存發(fā)送隊列。<BR>中間層驅(qū)動程序也必須設置AttributeFlags參數(shù)(將被傳給NdisMSetAttributeEx函數(shù))中的NDIS_ATTRIBUTE_NO_HALT_SUSPEND標記,防止NDIS在低層微端口過渡到低功耗狀態(tài)之前中斷驅(qū)動程序。<BR>中間層驅(qū)動程序要確保所保持的狀態(tài)信息是完全初始化過的。如果中間層驅(qū)動程序請求發(fā)送相關的資源(例如MiniportSend或MiniportSendPackets將要向相鄰低層發(fā)送的數(shù)據(jù)包的包描述符),那么如果在調(diào)用NdisIMInitializeDeviceInstance之前,ProtocolBindAdapter還沒有分配數(shù)據(jù)包池,則分配數(shù)據(jù)包池。</FONT></P>
      <P><FONT face=Verdana size=2>2.5.3&nbsp;中間層驅(qū)動程序查詢和設置操作</FONT></P>
      <P><FONT face=Verdana 
      size=2>當成功綁定到低層NIC并完成虛擬NIC(s)的初始化操作之后,中間層驅(qū)動程序就可以查詢低層NIC驅(qū)動程序的操作特性,設置其內(nèi)部狀態(tài),也可以協(xié)商一些參數(shù)(如為低層NIC驅(qū)動程序預留的緩沖區(qū)大小等)。下邊界面向無連接的中間層驅(qū)動程序通過調(diào)用NdisRequest實現(xiàn)該功能,下邊界面向連接的中間層驅(qū)動程序則通過調(diào)用Ndis(Co)Request函數(shù)實現(xiàn)該功能。<BR>中間層驅(qū)動程序也能夠接收來自協(xié)議驅(qū)動程序的MiniportQueryInformation和MiniportSetInformation函數(shù)的查詢和設置請求,它要么響應這些請求要么將這些請求傳給低層驅(qū)動程序。<BR>在在線DDK的“Network 
      Drivers 
      Reference”中包含了中間層驅(qū)動程序開發(fā)者所關心的全部通用的、面向連接的、非介質(zhì)相關的OID,以及介質(zhì)相關的OID的詳細信息。接下來將討論幾個標準且常用的通用分類OID、面向連接OID以及一些介質(zhì)相關OID。<BR>2.5.3.1&nbsp;發(fā)布設置和查詢請求<BR>&nbsp;典型地,下邊界面向無連接的中間層驅(qū)動程序通過發(fā)布OID_GEN_MAXIMUM_FRAME_SIZE請求,查詢低層NIC驅(qū)動程序所支持的幀最大長度,該請求返回值不包括幀頭部分的長度。<BR>&nbsp;下邊界面向無連接的中間層驅(qū)動程序能夠用OID_GEN_MAXIMUM_TOTAL_SIZE請求,查詢綁定從而確定低層NIC驅(qū)動程序所管理的NIC所能接納的最大數(shù)據(jù)包,中間層驅(qū)動程序必須對發(fā)送數(shù)據(jù)包進行設置,使其滿足這一尺寸要求。如果上層驅(qū)動程序發(fā)送一個超出NIC驅(qū)動程序(中間層驅(qū)動程序所綁定的)所能支持尺寸的數(shù)據(jù)包,那么將會出現(xiàn)錯誤。<BR>下邊界面向無連接的中間層驅(qū)動程序能夠用OID_GEN_CURRENT_LOOKAHEAD請求,查詢前視數(shù)據(jù)緩沖區(qū)的大小。如果中間層驅(qū)動程序提交這一查詢請求,NDIS將返回對低層NIC驅(qū)動程序的給定綁定的最新前視緩沖區(qū)尺寸。如果中間層驅(qū)動程序進行相應的設置請求,那么它將指示所提出的前視緩沖區(qū)尺寸,但中間層驅(qū)動程序并不能保證低層NIC驅(qū)動程序能夠按照所指示尺寸設置前視緩沖區(qū)。<BR>下邊界面向無連接的中間層驅(qū)動程序用OID_GEN_LINK_SPEED請求,查詢低層NIC驅(qū)動程序的鏈接速率,并用該請求的返回值修改其保存的內(nèi)部超時設置。下邊界面向連接的中間層驅(qū)動程序用OID_GEN_CO_LINK_SPEED請求,查詢低層NIC驅(qū)動程序的鏈接速率,并且也能夠用OID_GEN_CO_LINK_SPEED請求,設置低層NIC驅(qū)動程序的鏈接速率。<BR>如果中間層驅(qū)動程序綁定到WAN 
      NIC驅(qū)動程序上的,那么直到接收到一個連結指示(指示本地節(jié)點和遠程節(jié)點連結建立)時才能確定鏈接速率。關于鏈接指示的描述請參閱第二部分第八章的“廣域網(wǎng)微端口驅(qū)動程序做出的指示”。<BR>中間層驅(qū)動程序也必須確定低層NIC驅(qū)動程序的操作特性的設置,下邊界面向無連接的中間層驅(qū)動程序用OID_GEN_MAC_OPTIONS請求來實現(xiàn)這一功能,下邊界面向連接的中間層驅(qū)動程序用OID_GEN_CO_MAC_OPTIONS請求來實現(xiàn)這一功能。<BR>下邊界面向無連接的中間層驅(qū)動程序通常發(fā)布的是OID_GEN_MAXIMUM_SEND_PACKETS查詢(特別是在中間層驅(qū)動程序?qū)С隽薓iniportSendPackets函數(shù)情況下),驅(qū)動程序能夠在以后響應高層驅(qū)動程序的OID_GEN_MAXIMUM_SEND_PACKETS查詢時,向上層傳遞該查詢的返回值。<BR>中間層驅(qū)動程序也能夠通過介質(zhì)相關OID查詢相關介質(zhì)的當前地址,例如,下邊界面向無連接的中間層驅(qū)動程序可以發(fā)布OID_WAN_CURRENT_ADDRESS、OID_802_3_CURRENT_ADDRESS、OID_802_5_CURRENT_ADDRESS或者OID_FDDI_LONG_CURRENT_ADDRESS查詢,下邊界面向連接的中間層驅(qū)動程序可以OID_ATM_WAN_CURRENT_ADDRESS查詢。<BR>如果必要,中間層驅(qū)動程序能夠發(fā)布一個設置請求,來通知NDIS其操作特性的有關信息。下邊界面向無連接的中間層驅(qū)動程序用OID_GEN_PROTOCOL_OPTIONS調(diào)用NdisRequest函數(shù)來實現(xiàn)這一功能,而下邊界面向連接的中間層驅(qū)動程序用OID_GEN_CO_PROTOCOL_OPTIONS調(diào)用NdisRequest來實現(xiàn)這一功能。<BR>綁定到支持WAN的NIC的中間層驅(qū)動程序同時必須完成以下設置信息請求:<BR>用OID_WAN_PROTOCOL_TYPE請求,通知低層NIC驅(qū)動程序其協(xié)議的類型,該類型以單字節(jié)的網(wǎng)絡層協(xié)議標識符形式提供;<BR>用OID_WAN_HEADER_FORMAT請求,通知低層NIC驅(qū)動程序其發(fā)送數(shù)據(jù)包的頭格式。</FONT></P>
      <P><FONT face=Verdana 
      size=2>2.5.3.2&nbsp;響應設置和查詢請求<BR>因為NDIS中間層驅(qū)動程序可被高層NDIS驅(qū)動程序綁定,所以它也可以接收MiniportQueryInformation和MiniportSetInformation函數(shù)的查詢和設置請求。在某些情況下,中間層驅(qū)動程序所起的作用僅僅是將這些請求傳遞給低層驅(qū)動程序。另外,當這些請求是關于其在上邊界導出的介質(zhì)時,也能夠?qū)@些查詢和設置請求進行響應。注意中間層驅(qū)動程序必須將其從上層NDIS驅(qū)動程序接收到的OID_PNP_XXX請求,傳遞給低層Miniport驅(qū)動程序處理。<BR>通常情況下,中間層驅(qū)動程序所接收到的通用OID,與其向低層NIC驅(qū)動程序提交的OID是相似甚至相同的,中間層驅(qū)動程序所接收到的介質(zhì)相關OID將是高層驅(qū)動程序所期望的介質(zhì)類型。</FONT></P>
      <P><FONT face=Verdana size=2>2.5.4&nbsp;作為面向連接客戶程序注冊中間層驅(qū)動程序</FONT></P>
      <P><FONT face=Verdana 
      size=2>下邊界面向連接的中間層驅(qū)動程序必須作為面向連接客戶程序進行注冊。面向連接客戶程序使用呼叫管理器或集成微端口呼叫管理器(MCM)的安裝調(diào)用(call-setup)和卸載(tear-down)服務完成相關功能,也可以使用面向連接的微端口或MCM的接收和發(fā)送功能進行發(fā)送和接收數(shù)據(jù)操作。關于面向連接通信的更多信息請參閱第一部分第四章。<BR>當呼叫管理器或MCM從ProtocolBindAdapter函數(shù)中調(diào)用Ndis(M)CmRegisterAddressFamily注冊地址族時,NDIS將調(diào)用綁定上的所有協(xié)議驅(qū)動程序的ProtocolCoRegisterAfNotify函數(shù)。如果中間層驅(qū)動程序在注冊協(xié)議時調(diào)用了ProtocolCoRegisterAfNotify函數(shù),那么NDIS將對中間層驅(qū)動

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美国产激情一区二区三区蜜月 | 久久综合九色综合97婷婷| 成人三级伦理片| 极品少妇xxxx精品少妇偷拍| 日韩激情视频网站| 午夜视频久久久久久| 青青草国产成人av片免费| 不卡av电影在线播放| 成人ar影院免费观看视频| 日韩欧美精品在线| 精品美女被调教视频大全网站| 久久免费精品国产久精品久久久久| 久久久久久久久久久黄色| 天堂一区二区在线免费观看| 99在线精品一区二区三区| 91国偷自产一区二区三区成为亚洲经典| 99久久精品免费看国产| 欧美日韩一区二区三区视频| 欧美一区二区三区免费在线看 | 成人av动漫在线| 日韩精品一区在线| 午夜伊人狠狠久久| 精品一区二区免费看| 欧美一区二区三区四区在线观看| 亚洲自拍偷拍av| 麻豆精品一区二区| 成人黄色在线视频| 国产欧美一区二区精品久导航 | 久久夜色精品国产欧美乱极品| 亚洲在线视频网站| 在线观看国产一区二区| 精品国产一区二区三区久久影院| 一区在线中文字幕| 亚洲 欧美综合在线网络| 在线亚洲+欧美+日本专区| 亚洲美女视频在线观看| 九九热在线视频观看这里只有精品| 欧美剧情片在线观看| 欧美激情一区二区在线| 懂色av噜噜一区二区三区av| 欧美顶级少妇做爰| 日韩av一二三| 97aⅴ精品视频一二三区| 综合久久久久久久| 国产精品91xxx| 在线观看91av| 精品在线观看视频| 久久久久国产成人精品亚洲午夜| 国产999精品久久久久久绿帽| 欧美激情一二三区| 91国产丝袜在线播放| 视频一区中文字幕国产| 精品福利一区二区三区免费视频| 国产成人精品综合在线观看| 91精品国产全国免费观看| 久久成人av少妇免费| 9191久久久久久久久久久| 亚洲色图19p| 69堂精品视频| 国产福利不卡视频| 亚洲一区二区欧美日韩| 亚洲精品久久久蜜桃| 高清beeg欧美| 一区二区三区欧美久久| 91丨九色porny丨蝌蚪| 国产日韩欧美一区二区三区乱码 | 日本欧美在线看| 国产欧美日韩激情| 欧美主播一区二区三区美女| 狠狠色丁香婷婷综合久久片| 欧美一区二区在线免费观看| 国产成人自拍网| 亚洲18女电影在线观看| 久久精品免视看| 大胆欧美人体老妇| 亚洲.国产.中文慕字在线| 国产精品嫩草99a| jvid福利写真一区二区三区| 日本不卡在线视频| 亚洲欧美综合色| 欧美成人一区二区三区片免费| 99re亚洲国产精品| 精品制服美女丁香| 亚洲第一二三四区| 中文字幕免费一区| 精品久久久久久久久久久久久久久| 91一区二区在线观看| 国产一区二区三区在线观看免费| 久久久亚洲午夜电影| 69久久夜色精品国产69蝌蚪网| 99在线热播精品免费| 韩国中文字幕2020精品| 99视频有精品| 国模大尺度一区二区三区| 亚洲一区中文日韩| 亚洲三级在线播放| 中文字幕久久午夜不卡| 久久伊99综合婷婷久久伊| 91精品国产综合久久香蕉的特点| 色美美综合视频| 99国产精品一区| 国产福利一区二区| 经典三级视频一区| 麻豆精品视频在线观看免费| 五月婷婷综合在线| 亚洲一区二区影院| 亚洲一区精品在线| 亚洲免费观看高清完整| 国产精品久久久久久久久搜平片| 色婷婷久久久综合中文字幕| 天天av天天翘天天综合网| 一区二区三区四区蜜桃| 国产精品热久久久久夜色精品三区 | 日韩免费观看2025年上映的电影 | 色综合天天天天做夜夜夜夜做| 亚洲日本青草视频在线怡红院| 国产午夜精品美女毛片视频| 久久综合九色综合欧美亚洲| 久久欧美一区二区| 久久精品男人的天堂| 中文字幕av免费专区久久| 欧美国产激情二区三区| 亚洲欧美综合色| 一区二区三区在线免费观看| 一区二区三区资源| 午夜久久久影院| 日韩va欧美va亚洲va久久| 久久99久久精品| 国产精品一区二区黑丝| 成人美女视频在线看| 色婷婷综合久久久| 欧美猛男男办公室激情| 99久久免费国产| 欧美性淫爽ww久久久久无| 懂色中文一区二区在线播放| caoporm超碰国产精品| 欧洲精品在线观看| 欧美一区二区大片| 国产欧美日韩在线观看| 亚洲视频你懂的| 日韩—二三区免费观看av| 91成人在线精品| 欧美一区二区人人喊爽| 久久精品欧美一区二区三区麻豆| 国产精品国产精品国产专区不蜜 | 日本一区二区综合亚洲| 依依成人综合视频| 精品一区二区久久久| 91视频免费播放| 日韩视频在线你懂得| 欧美亚洲国产一区二区三区va| 欧美日韩dvd在线观看| 久久久美女艺术照精彩视频福利播放| 成人免费小视频| 蜜桃视频一区二区| 99re亚洲国产精品| 精品少妇一区二区三区视频免付费| 欧美激情在线一区二区| 亚洲123区在线观看| 国产成a人亚洲精| 欧美性感一类影片在线播放| 国产欧美日韩在线观看| 午夜视频一区在线观看| 9l国产精品久久久久麻豆| 日韩一区二区视频在线观看| 国产精品美女久久久久aⅴ| 日本特黄久久久高潮| 91一区二区三区在线播放| 久久综合色之久久综合| 天天色综合天天| 色先锋资源久久综合| 中文字幕乱码久久午夜不卡| 无码av免费一区二区三区试看| 成人黄色一级视频| 久久久久久一二三区| 蜜臀精品一区二区三区在线观看| 日本精品视频一区二区| 欧美国产日韩精品免费观看| 久久er99精品| 欧美一区二区三区日韩视频| 亚洲最大成人网4388xx| 91亚洲精品久久久蜜桃网站 | 国产精品18久久久久久久久 | 国产麻豆精品一区二区| 欧美一级日韩一级| 亚洲bt欧美bt精品| 欧美日韩国产综合一区二区| 亚洲精品乱码久久久久久久久| 波多野结衣亚洲一区| 日本一区二区三区dvd视频在线| 久久超碰97中文字幕| 在线综合+亚洲+欧美中文字幕| 亚洲一区中文在线| 欧美日韩你懂得| 亚瑟在线精品视频| 欧美日韩一区二区在线观看| 亚洲成在人线免费| 欧美精品高清视频| 三级欧美韩日大片在线看| 欧美人与性动xxxx|