<del id="dhfrq"></del>

    1. <tr id="dhfrq"></tr>
      成人午夜激情在线观看,国产精品一线天粉嫩av,99精品国产综合久久久久五月天 ,一卡2卡三卡4卡免费网站,国产高清在线男人的天堂,五月天国产成人AV免费观看,67194熟妇在线观看线路,成人无码潮喷在线观看
      現(xiàn)在位置:范文先生網(wǎng)>理工論文>計算機論文>windows nt環(huán)境下fddi網(wǎng)卡驅(qū)動程序設(shè)計 2

      windows nt環(huán)境下fddi網(wǎng)卡驅(qū)動程序設(shè)計 2

      時間:2023-02-20 22:38:03 計算機論文 我要投稿
      • 相關(guān)推薦

      windows nt環(huán)境下fddi網(wǎng)卡驅(qū)動程序設(shè)計 2

      總體結(jié)構(gòu)介紹
      第一節(jié)windows  nt網(wǎng)絡(luò)結(jié)構(gòu)
      §1.1.1  windows  nt網(wǎng)絡(luò)體系結(jié)構(gòu)
      windows  nt的網(wǎng)絡(luò)體系結(jié)構(gòu)是基于國際標(biāo)準(zhǔn)化(iso)制定的標(biāo)準(zhǔn)模型──開放式系統(tǒng)互連(open  system  interconnection:osi)參考模型分層建立的,這種方式有利于隨時擴(kuò)展其它功能和服務(wù)。
      windows  nt網(wǎng)絡(luò)模型開始于mac子層,網(wǎng)卡驅(qū)動程序就駐留在其中。它通過相關(guān)的網(wǎng)卡把windows  nt與網(wǎng)絡(luò)連接起來,圖中的多個網(wǎng)卡表明在一臺運行windows  nt的計算機上能使用多種網(wǎng)卡。
      這一網(wǎng)絡(luò)體系結(jié)構(gòu)包括兩個重要接口──ndis接口與傳輸驅(qū)動
      程序接口(tdi)。這兩個接口把兩個層隔離開來,辦法是相鄰的部件只允許按單一的標(biāo)準(zhǔn)來寫,不允許多重標(biāo)準(zhǔn)。例如一個網(wǎng)卡驅(qū)動程序(在ndis接口的下面)就不需要特地按每個傳輸協(xié)議來寫它的代碼塊,恰恰相反,該驅(qū)動程序是寫給ndis接口的,它通過符合ndis的相應(yīng)傳輸協(xié)議來請求服務(wù)。這些接口包含在windows  nt的網(wǎng)絡(luò)體系結(jié)構(gòu)中,以容納可移植、可互換的模塊。
      在兩個接口之間,是傳輸協(xié)議。它在網(wǎng)絡(luò)中起著組織者的作用。一個傳輸協(xié)議規(guī)定了數(shù)據(jù)以何種方式呈遞給下一個接收層,以及如何對數(shù)據(jù)相應(yīng)地進(jìn)行打包。它通過ndis把數(shù)據(jù)傳給網(wǎng)卡驅(qū)動程序,并通過tdi把數(shù)據(jù)傳給轉(zhuǎn)發(fā)程序(redirector)
      tdi之上是轉(zhuǎn)發(fā)程序,它把本地的網(wǎng)絡(luò)資源申請轉(zhuǎn)送給網(wǎng)絡(luò)。
      為了能和其他廠商的網(wǎng)絡(luò)互連,windows  nt允許有多個轉(zhuǎn)發(fā)程序。對于每一個轉(zhuǎn)發(fā)程序windows  nt計算機必須也有一個相應(yīng)的供應(yīng)者(provider)(由網(wǎng)絡(luò)廠商提供)。多供應(yīng)者路由選擇程序決定適當(dāng)?shù)墓⿷?yīng)者,然后借助于供應(yīng)者,對應(yīng)用請求到相應(yīng)的轉(zhuǎn)發(fā)程序做出選擇。
      §1.1.2  windows  nt網(wǎng)絡(luò)驅(qū)動程序
      windows  nt支持兩種類型的網(wǎng)絡(luò)驅(qū)動程序
      傳輸驅(qū)動程序  
      實現(xiàn)數(shù)據(jù)鏈路層中的邏輯鏈路控制子層協(xié)議和傳輸層協(xié)議。向  下與ndis接口,向上與tdi接口。
      網(wǎng)卡驅(qū)動程序  
      實現(xiàn)對物理層的管理和數(shù)據(jù)鏈路層中介質(zhì)訪問控制子層協(xié)議,通過ndis向下管理物理網(wǎng)卡,向上與傳輸驅(qū)動程序通信。
      §1.1.3  windows  nt網(wǎng)卡驅(qū)動程序
      windows  nt環(huán)境下的網(wǎng)卡驅(qū)動程序也分為兩種:  
      miniport網(wǎng)卡驅(qū)動程序:miniport驅(qū)動程序只須實現(xiàn)與網(wǎng)絡(luò)硬件相關(guān)的操作(包括發(fā)送和接收)。而所有底層網(wǎng)卡驅(qū)動程序的通用操作(如同步),一般由ndis接口程序來實現(xiàn)。  
      full網(wǎng)卡驅(qū)動程序:full網(wǎng)卡驅(qū)動程序必須實現(xiàn)所有硬件相關(guān)和同步、排隊等操作。例如full網(wǎng)卡驅(qū)動程序為了響應(yīng)數(shù)據(jù)接收,需要保持本身的捆綁信息,而miniport就可以由ndis接口庫來實現(xiàn)。  
      在windows  nt的早期版本中,full網(wǎng)卡驅(qū)動程序要求開發(fā)者實現(xiàn)許多底層操作,來處理多處理器的核心問題以及處理器、線程的同步,這樣不同的開發(fā)者在大量重復(fù)著許多相同的工作。
      而miniport網(wǎng)卡驅(qū)動程序允許開發(fā)者僅僅寫一些與網(wǎng)絡(luò)硬件相關(guān)的代碼即可,而那些通用的函數(shù)由ndis接口庫來實現(xiàn),這樣開發(fā)出來的驅(qū)動程序減少了不必要的工作。
      第二節(jié)miniport驅(qū)動程序的結(jié)構(gòu)
      ndis接口規(guī)范了網(wǎng)卡驅(qū)動程序的實現(xiàn),同時也對tdi驅(qū)動程序的實現(xiàn)提出了一定的要求,在nt中,ndis約束下的網(wǎng)卡驅(qū)動程序、tdi驅(qū)動程序和系統(tǒng)的關(guān)系如下圖所示:
      圖2.0  ndis約束下的網(wǎng)卡驅(qū)動程序、tdi驅(qū)動程序和系統(tǒng)的關(guān)系
      miniport驅(qū)動程序包括驅(qū)動程序?qū)ο蟆Ⅱ?qū)動程序源代碼和ndis接口庫代碼。windows  nt  ddk提供ndis.h作為miniport驅(qū)動程序的主要頭文件,定義了miniport驅(qū)動程序的入口點、ndis接口庫函數(shù)和通用數(shù)據(jù)結(jié)構(gòu)。
      上邊緣函數(shù)的作用是網(wǎng)卡驅(qū)動與ndis接口庫進(jìn)行通信,而下邊緣函數(shù)是tdi協(xié)議驅(qū)動程序與ndis通信的手段。
      §1.2.1  miniport網(wǎng)卡對象
      ndis用一個叫做邏輯網(wǎng)卡的軟件對象來描述系統(tǒng)中的每塊網(wǎng)卡,而邏輯網(wǎng)卡與windows  nt設(shè)備對象的通信由i/o子系統(tǒng)來管理,描述網(wǎng)卡的設(shè)備對象包括相關(guān)的網(wǎng)絡(luò)信息如名字、網(wǎng)絡(luò)地址和網(wǎng)卡內(nèi)存基地址等,它還包含與硬件相關(guān)的驅(qū)動程序狀態(tài)數(shù)據(jù)(捆綁數(shù)目,捆綁句柄,包過濾數(shù)據(jù)庫等)。ndis分配一個句柄到miniportinitialize這個上邊緣函數(shù)的一個結(jié)構(gòu)中,然后miniport網(wǎng)卡驅(qū)動程序?qū)⒃谝院筇峁┻@個句柄來給ndis調(diào)用,這個結(jié)構(gòu)一直被ndis保持,并且對miniport驅(qū)動程序不透明。  

      當(dāng)miniport網(wǎng)卡驅(qū)動程序初始化一塊網(wǎng)卡時,它創(chuàng)立自己的內(nèi)部數(shù)據(jù)結(jié)構(gòu)來描述網(wǎng)卡,記錄需要它管理的與設(shè)備相關(guān)的狀態(tài)信息。當(dāng)miniport網(wǎng)卡驅(qū)動程序調(diào)用ndismsetatttibutes或ndismsetattributesex兩ndis庫函數(shù)時,它傳遞一個句柄給這數(shù)據(jù)結(jié)構(gòu)。這樣,當(dāng)調(diào)用miniport驅(qū)動程序入口點時,它就傳遞這個句柄來驗證驅(qū)動程序所對應(yīng)的網(wǎng)卡的正確性。這個數(shù)據(jù)結(jié)構(gòu)為miniport網(wǎng)卡驅(qū)動程序所擁有并維護(hù)。
      §1.2.2網(wǎng)絡(luò)對象標(biāo)識符
      miniport  nic驅(qū)動程序還需要維護(hù)一組對象,這些對象是系統(tǒng)定義的對象標(biāo)識符(object  idetifier:oid)來標(biāo)識,以描述驅(qū)動程序的性能和當(dāng)前狀態(tài)信息。為查詢這些信息,上層驅(qū)動程序調(diào)用ndisrequest向ndis接口庫指示oid。oid表示了調(diào)用所需的信息類型,如miniport驅(qū)動程序所支持的lookahead緩沖區(qū)大小等。ndis接到上層驅(qū)動程序的查詢請求,將oid傳遞給上邊緣函數(shù)miniportqueryinformation實現(xiàn)對oid的查詢,如果上層驅(qū)動程序請求改變狀態(tài)信息則調(diào)用miniportsetinformation實現(xiàn)對oid的設(shè)置。
      §1.2.3  miniport網(wǎng)卡驅(qū)動程序代碼
      典型的miniport  nic驅(qū)動程序必須有一些函數(shù)來通過ndis接口實現(xiàn)上層驅(qū)動程序與硬件的

      通信。這些函數(shù)稱為上邊緣服務(wù)函數(shù)。
      這些上邊緣服務(wù)函數(shù)由驅(qū)動程序的開發(fā)者根據(jù)驅(qū)動程序面向的特定低層網(wǎng)絡(luò)類型和硬件以及相應(yīng)環(huán)境,可以有選擇地實現(xiàn),但必須保證驅(qū)動程序最基本的功能,這些基本功能包括初始化、發(fā)送、中斷處理、重置、參數(shù)查詢與設(shè)置和報文接收。
      miniportinitialize:操作系統(tǒng)根據(jù)系統(tǒng)配置信息,檢測出網(wǎng)卡已安裝時,由ndis接口在初始化時調(diào)用,主要完成低層網(wǎng)絡(luò)類型確定,對應(yīng)于物理網(wǎng)卡的邏輯網(wǎng)卡初始化,中斷信息注冊,網(wǎng)卡與主機通訊方式的確認(rèn)。i/o端口的申請與注冊,內(nèi)存映像,mib的初始化,物理網(wǎng)卡的驗證與初始化等。
      miniportreconfigure:支持網(wǎng)卡參數(shù)動態(tài)變化,和miniportinitilize一樣由ndis接口以初始化級別調(diào)度執(zhí)行(不能屏蔽中斷,必須由驅(qū)動程序承認(rèn)并清除在此期間產(chǎn)生的中斷),支持即插即用和軟配置的網(wǎng)卡在動態(tài)改變參數(shù)時,必須提供此函數(shù)。  
      miniportqueryinformation:查詢網(wǎng)卡的狀態(tài)以及網(wǎng)卡驅(qū)動程序的操作或統(tǒng)計參數(shù),如是否支持組通訊、網(wǎng)卡的物理速率是否支持回環(huán)、是否支持直接拷貝等,這些參數(shù)以oid方式統(tǒng)一管理。
      miniportsetinformation:ndis接口或協(xié)議驅(qū)動程序通過調(diào)用此接口改變驅(qū)動程序維護(hù)的oid庫,一些操作參數(shù)的改變也將同時改變驅(qū)動程序狀態(tài),例如組地址的設(shè)置。
      miniportreset:包括網(wǎng)卡硬件重置和驅(qū)動程序軟件重置,軟件重置包括驅(qū)動程序狀態(tài)重置,以及一些相關(guān)的參數(shù)重置,還需考慮有些參數(shù)的恢復(fù),重置時不必完成所有正在活躍的外部請求,但必須釋放已占用的外部資源。
      miniporthalt:掛起網(wǎng)卡并釋放該網(wǎng)卡驅(qū)動程序占用的所有資源,在此期間不屏蔽中斷。
      miniportisr:高優(yōu)先級的中斷處理程序,進(jìn)行的工作包括初始中斷處理類型,決定是否進(jìn)行中斷轉(zhuǎn)交,對卡上中斷進(jìn)行處理  等,該服務(wù)類型只在以下情況被調(diào)用:  
      ndis接口調(diào)用miniportinitialize和miniporthalt兩函數(shù)時。  
      .中斷處理類型設(shè)為每此中斷處理過程都調(diào)用時。
      為使系統(tǒng)能及時響應(yīng)所有硬件中斷,高優(yōu)先級的硬件中斷處理程序應(yīng)盡可能的減少運行時間,防止長時間的屏蔽低優(yōu)先級中斷,避免造程中斷丟失。
      miniporthandleinterrupt:由中斷延時處理程序在中斷延時處理時進(jìn)行調(diào)用。ndis排隊所有的延時處理,該服務(wù)主要處理發(fā)送完成、報文接收、描述符用盡、溢出、網(wǎng)卡異常等中斷。
      miniportsend:ndis收到上層發(fā)送請求時經(jīng)過若干協(xié)議處理再向下調(diào)用此服務(wù)過程,發(fā)送的packet已含有l(wèi)lc和mac頭,該服務(wù)過程進(jìn)行邊界對齊、packet約束重整、描述符映射和報文發(fā)送、以及發(fā)送資源和packet緩沖隊列管理。
      miniporttransferdata:多個已和網(wǎng)卡捆綁的協(xié)議驅(qū)動程序在接收到報文到達(dá)指示后,向網(wǎng)卡驅(qū)動程序發(fā)出傳送請求以拷貝各自所需的報文數(shù)據(jù)部分,網(wǎng)卡驅(qū)動程序根據(jù)各協(xié)議驅(qū)動程序?qū)蝹packet是否進(jìn)行多次拷貝,以決定是否暫存只允許單次拷貝的packet等。
      miniportcheckhandle:ndis每秒調(diào)用此服務(wù)函數(shù)一次,驅(qū)動程序發(fā)現(xiàn)網(wǎng)卡異常時報告給ndis由ndis調(diào)用miniportreset進(jìn)行硬件重恢復(fù)。

      miniportenableintrrupt:中斷使能。
      miniportdisableinterrupt:中斷屏蔽。
      另外,每個網(wǎng)卡驅(qū)動程序必須有一個初始化入口點,由driver  entry函數(shù)實現(xiàn),它和系統(tǒng)相關(guān),由操作系統(tǒng)在裝入驅(qū)動程序時調(diào)用,主要完成初始化ndis  wrapper,再由wrapper初始生成驅(qū)動程序管理塊并完成相應(yīng)各種初始化工作,登錄網(wǎng)卡驅(qū)動程序所有上邊緣服務(wù)入口點,同時寫入ndis版本信息。
      §1.2.4  ndis接口庫
      ndis接口庫包括在ndis.sys中,它是一個核態(tài)函數(shù)庫,有一套抽象的函數(shù),無論協(xié)議驅(qū)動程序還是nic驅(qū)動程序都連接到這個庫中,以實現(xiàn)上下層之間的操作。
      第二章fddi網(wǎng)卡驅(qū)動程序的加載和運行
      第一節(jié)  網(wǎng)卡驅(qū)動程序的安裝
      windows  nt網(wǎng)卡驅(qū)動程序安裝的目的是實現(xiàn)網(wǎng)卡相應(yīng)硬件信息和驅(qū)動程序在windows  nt注冊庫中的注冊,使windows  nt能夠正確識別網(wǎng)卡,了解所必需的軟硬件信息并能在windows  nt啟動時加載相應(yīng)驅(qū)動程序。
      網(wǎng)卡驅(qū)動程序安裝時,首先在主群組的控制面板中選擇“網(wǎng)絡(luò)”,然后添加網(wǎng)卡,指定相應(yīng)信息文件──oemsetup.inf的路徑,以完成以下兩個必要的操作:  
      復(fù)制驅(qū)動程序到相應(yīng)的系統(tǒng)目錄(windows  nt根目錄\system32\drivers\)中;  
      在windows  nt注冊庫中存入相應(yīng)軟硬件信息。  
      下面主要以fddi網(wǎng)卡為例介紹安裝驅(qū)動程序所必需的工作:
      §2.1.1網(wǎng)卡一般硬件參數(shù)
      對于fddi網(wǎng)卡,必須在編寫其oemsetup.inf文件時確定以下硬件參數(shù):  
      總線類型:pci(5)……括號中的數(shù)字5表示pci總線在ndis中的總線類型代碼;  
      廠商代號:0x5588……系統(tǒng)加載時確定網(wǎng)卡的標(biāo)記,也是編程時確定pci槽號的標(biāo)識;  
      cfid:  0x01;  
      介質(zhì)類型:光纖(3)  ……括號中的數(shù)字表示光纖在ndis中的介質(zhì)類型代碼;  
      是否支持全雙工:支持。  
      對于其它的硬件信息在此inf配置信息文件中可有可無,如若配置,則可在驅(qū)動程序的編寫時利用這些信息,方便編程,同時有利于其它應(yīng)用對其參數(shù)的確定和使用。
      §2.1.2  fddi網(wǎng)卡加載時需在注冊庫登錄表里做的網(wǎng)絡(luò)配置
      網(wǎng)卡驅(qū)動程序的安裝通常將創(chuàng)建登錄表中的四個不同子鍵:
      software  registrion鍵,對應(yīng)于驅(qū)動程序,存在于hkey_local_machine\software\company\  productname\version中。我們的fddi網(wǎng)卡驅(qū)動程序所對應(yīng)的是hkey_local_machine\software\net612\yhfddi\yhfddi1.0;  
      網(wǎng)卡的軟件登錄鍵,存在于hkey_local_machine\so

      ftware\microsoft\  windows  nt\nt3.51\networkcards\yhfddi1;  
      驅(qū)動程序的服務(wù)登錄鍵,存在于hkey_local_machine\system\currentcontrolset\services  
      網(wǎng)卡的服務(wù)登錄鍵,存在于hkey_local_machine\system\currentcontrolset\services  
      對于每一個網(wǎng)絡(luò)部件,一個名為netrules的特殊子鍵在鄰近的驅(qū)動程序或網(wǎng)卡登錄子鍵里創(chuàng)建,netrules標(biāo)識網(wǎng)絡(luò)部件為網(wǎng)絡(luò)整體的一部分。
      fddi網(wǎng)卡驅(qū)動程序?qū)?yīng)的標(biāo)準(zhǔn)軟件登錄表項將出現(xiàn)在以下路徑:
      hkey_local_machine\software\net612\yhfddi\yhfddi1.0;
      驅(qū)動程序?qū)?yīng)的標(biāo)準(zhǔn)項的值為:
      description  =yhfddi/pci  adapter  controller
      install  date  =……
      ……
      refcount  =0x01
      servicename  =yhfddi
      softwaretype  =driver
      title  =yhfddi/pci  adapter  controller
      而且在yhfddi驅(qū)動程序相關(guān)的netrules子鍵下,這些值項為:
      bindable  =yhfddi  driver  yhfddi  adapter  non  exclusiver
      bindform  =“yhfddisys”yes  no  container
      class  =  reg_multi_sz  “yhfddi  driver  basic”
      infname  =oemnad1.inf
      type  =yhfddisys  ndisdriver  yhfddidriver
      use  =driver
      yhfddi網(wǎng)卡在如下路徑的networkcards子鍵里介紹:
      hkey_local_machine\software\microsoft\
      windows  nt\nt3.51\networkcards\yhfddi1;
      網(wǎng)卡的標(biāo)準(zhǔn)項包括以下這些值:
      description  =yhfddi/pci  adapter  controller
      install  date  =……
      manufacturer  =net612
      productname  =yhfddi
      servicename  =yhfddi01
      title  =[01]yhfddi/pci  adapter  controller
      §2.1.3編寫inf信息配置文件
      gui  inf描述語言被windows  nt用以書寫系統(tǒng)所有部件的配置文件,當(dāng)然也可以用以書寫網(wǎng)絡(luò)系統(tǒng)各部件的配置文件,該配置文件描述了網(wǎng)絡(luò)部件安裝、配置、刪除的執(zhí)行過程。當(dāng)網(wǎng)絡(luò)部件進(jìn)行初始安裝或二次安裝(通常通過ncpa進(jìn)行)時,安裝程序讀取部件對應(yīng)的配置文件,進(jìn)行解釋執(zhí)行。gui  inf描述語言由節(jié)、命令、邏輯操作、變量規(guī)范、流程控制以及一套調(diào)用dll或外部程序的機制組成,其中,節(jié)是配置文件的主體,節(jié)可分為install節(jié)(類似于函數(shù)),shell節(jié)(也類似于函數(shù),但可調(diào)用insall和shell節(jié)),detect節(jié)(不包含命令),一個配置文件一般由若干不同類型的節(jié)組成。驅(qū)動程序的開發(fā)者根據(jù)需要可以在配置文件中編寫相應(yīng)代碼,使得用戶和系統(tǒng)之間能進(jìn)行交互,并且由用戶決定一些配置參數(shù)。  
      nt網(wǎng)卡配置文件有其一套規(guī)范,驅(qū)動程序開發(fā)者必須按規(guī)范編寫配置文件,一般來說,一個配置文件至少應(yīng)該提供下面三個節(jié):
      安裝入口點:[identify]shell節(jié)。該節(jié)主要功能是給出安裝部件的類型名,系統(tǒng)通過它識別該部件屬于哪一大類(display,mouse,scsi,network等)中的哪一類(網(wǎng)絡(luò)adapter,driver,transport,service,network和netprovidor),同時,還需要給出映像文件和配置文件所在的源介質(zhì)及標(biāo)識。  
      [returnoption]shell節(jié)。系統(tǒng)執(zhí)行安裝identify節(jié)后,執(zhí)行該節(jié)。它主要功能是檢查所需安裝的部件是否支持的硬件平臺和語言,并給出網(wǎng)卡名(有些配置文件支持多類網(wǎng)卡,此時必須讓用戶進(jìn)行選擇,并獲得選擇結(jié)果)。  
      [installoption]shell節(jié)。該節(jié)是配置文件得主體,也是上次安裝完后再次進(jìn)行配置、刪除、更新的入口點。主要功能是拷貝映像文件和配置文件,生成配置的各種選項,創(chuàng)建該部件在注冊庫中對應(yīng)的各種登錄子樹并更新重寫。  

      第二節(jié)  驅(qū)動程序的加載過程
      §2.2.1  windows  nt的啟動過程
      第一階段:調(diào)入裝入程序。和硬件平臺相關(guān),x86機器首先由rom裝入根扇區(qū),再由根扇區(qū)裝入ntldr;
      第二階段:硬件檢測。x86機器調(diào)ntdetect程序最大限度地獲取各種硬件設(shè)備信息,引導(dǎo)hal及基本卷設(shè)備驅(qū)動程序,以便引導(dǎo)nt內(nèi)核;
      第三階段:獲取注冊庫中各種控制信息,如用戶定義的非頁內(nèi)存大小;第四階段:初始化注冊庫  \registry\machine下system和hardware并創(chuàng)建currentcontrolset,為裝入相關(guān)硬件設(shè)備驅(qū)動程序作準(zhǔn)備;
      第五階段:裝入基本核心驅(qū)動程序;
      第六階段:釋放一些已經(jīng)完成使命的裝入初始數(shù)據(jù)塊;
      第七階段:進(jìn)一步初始化注冊庫,以便有些依賴于基本核心驅(qū)動程

      序的上層驅(qū)動程序能順利裝入;
      第八階段:服務(wù)控制器裝入應(yīng)該由該服務(wù)控制器裝入的各種驅(qū)動程序。

      §2.2.2  fddi網(wǎng)卡驅(qū)動程序的加載過程
      在windows  nt啟動的第五個階段,將加載核心驅(qū)動程序。而對于ndis網(wǎng)卡驅(qū)動程序是在ndis接口(ndis.sys)加載后調(diào)入運行,向ndis  wrapper注冊、初始化、查詢設(shè)置參數(shù)等。
      windows  nt啟動時,相應(yīng)的實體如nt的服務(wù)控制器根據(jù)注冊庫中yhfddi驅(qū)動程序的配置注冊信息,初始化ndis  wrapper,并裝入相應(yīng)的驅(qū)動程序,生成驅(qū)動程序管理塊結(jié)構(gòu),申請內(nèi)存以保存各種信息,向ndis  wrapper注冊驅(qū)動程序。初始化和注冊完畢后,再由服務(wù)控制器讀取注冊庫中相應(yīng)的鏈接信息。
      在ndis  wrapper和yhfddi驅(qū)動程序初始化和注冊成功后,ndis  wrapper根據(jù)系統(tǒng)相應(yīng)的注冊信息,加入和yhfddi驅(qū)動程序所對應(yīng)的fddi網(wǎng)卡,同時讀入網(wǎng)卡的注冊信息,并進(jìn)行網(wǎng)卡注冊和網(wǎng)卡初始化。
      在以上過程成功后,wrapper將查詢和設(shè)置驅(qū)動程序的各種參數(shù),了解驅(qū)動程序?qū)δ男┎僮髦С郑瑳Q定對上層驅(qū)動程序的支持范圍。
      第三節(jié)fddi網(wǎng)卡驅(qū)動程序的注冊
      driverentry函數(shù)是windows  nt  ddk規(guī)定的核心驅(qū)動程序的入口點,wrapper識別到入口點后,調(diào)入驅(qū)動程序,在driverentry函數(shù)內(nèi)完成兩個基本注冊任務(wù):
      調(diào)用ndisminitializewapper函數(shù)向ndis接口報告驅(qū)動程序?qū)⒁詍iniport類網(wǎng)卡驅(qū)動程序注冊。ndis建立它需要記錄的驅(qū)動程序狀態(tài)信息,同時返回ndiswrapperhandle,驅(qū)動程序保存這個句柄,以利后來調(diào)用ndisxxxconfiguration和initialization等函數(shù)。  
      填寫ndisxx_miniport_characteristics屬性結(jié)構(gòu),主要記錄ndis版本號和驅(qū)動程序支持的miniportxxx函數(shù)的入口點,然后調(diào)用ndismregisterminiport函數(shù)實現(xiàn)驅(qū)動程序的整體注冊。  
      以yhfddi為例所要注冊的屬性結(jié)構(gòu)的內(nèi)容大致如下:
      ndis_miniport_characteristics  yhfddichar;
      (ndis_miniport_characteristics這個結(jié)構(gòu)將在第三章介紹)
      yhfddichar.majorndisversion=yhfddi_ndis_major_version;
      yhfddichar.minorndisversion=yhfddi_ndis_minor_version;
      這兩個屬性決定驅(qū)動程序是ndis的哪個版本所支持,我們所用的是ndis3.0  
      yhfddichar.disableinterrupthandler=yhfddidisableinterrupt;
      yhfddichar.enableinterrupthandler=yhfddienableinterrupt;
      yhfddichar.isrhandle=yhfddiinterruptservice;
      yhfddichar.handleinterrupthandler=yhfddihandleinterrupt;
      以上四項屬性是中斷處理所需的上邊緣服務(wù)函數(shù)的入口點(句柄)。fddi網(wǎng)卡驅(qū)動程序需要有smt站管理功能,而smt是以中斷處理方式進(jìn)行的,故這四項屬性在fddi網(wǎng)卡驅(qū)動程序中是很重要的。
      yhfddichar.initializehandler=yhfddiinitialize;
      此項注冊的是驅(qū)動程序的初始化函數(shù)句柄。
      yhfddichar.queryinformationhandler=  yhfddiqueryinformation;
      yhfddichar.setinformationhandler=yhfddisetinformation;
      這兩項注冊的是參數(shù)查詢和設(shè)置函數(shù)的句柄。
      yhfddichar.sendhanler=  yhfddisend;
      yhfddichar.transferdatahandler=  yhfdditransferdata;
      主要提供數(shù)據(jù)發(fā)送和接收函數(shù)句柄。
      yhfddichar.resethandler=yhfddireset;
      此項注冊網(wǎng)卡軟硬件重置函數(shù)句柄。  
      yhfddichar.halthandler=  yhfddihalt;
      此項注冊網(wǎng)卡驅(qū)動程序掛起函數(shù)句柄。
      yhfddichar.checkforhandler=null;
      yhfddichar.reconfigurehandler=null;
      這兩個上邊緣服務(wù)函數(shù)是fddi網(wǎng)卡驅(qū)動程序所不提供的,故置為null。
      填好這些結(jié)構(gòu)以后,調(diào)用以下函數(shù)實現(xiàn)驅(qū)動程序的注冊:
      ndismregisterminiport(
      yhfddiwrapperhandle,
      &yhfddichar,

      sizeof(yhfddichar));
      其中yhfddiwrapperhandle是在此之前初始化wrapper調(diào)用ndisminitializewrapper所得的句柄。
      如果調(diào)用ndismregisterminiport不能返回ndis_status_success,必須在退出driverentry之前釋放已經(jīng)分配的資源(如yhfddiwrapperhandle等),故調(diào)用
      ndisterminatewrapper(yhfddiwrapperhandle,null)。
      這樣驅(qū)動程序沒能正確注冊,亦不能正常運行。
      第四節(jié)  網(wǎng)卡驅(qū)動程序?qū)ο蟛樵兣c設(shè)置
      如果ndis的管理實體要查詢或設(shè)置一個特定的網(wǎng)絡(luò)對象,它必須提供一個32位的oid。oid的結(jié)構(gòu)如下:  圖2.3.0  oid結(jié)構(gòu)圖
      由上可以看到,oid可分為三大類:
      所有ndis驅(qū)動程序都有的一般對象;  
      特定介質(zhì)的對象;  
      特殊的與具體實現(xiàn)相關(guān)的對象(如多目地址表的長度)。  
      一般的和特定介質(zhì)的oid被記錄在windows  nt  ddk中,對于這些oid  ddk

      文本指明了相關(guān)的對象能否通過miniportqueryinformation查詢參數(shù)和通過miniportsetinformation設(shè)置參數(shù)。
      oid也可被分為操作特性(如多目地址表長度參數(shù))和統(tǒng)計參數(shù)(如廣播包接收)。最后oid可分為必須的和可選的兩種。
      oid的前三個字節(jié)表明oid的不同類別,而最后一個字節(jié)確定這一類別內(nèi)特定的信息管理對象。
      針對于fddi網(wǎng)卡,被查詢的oid的第一個字節(jié)為0x03。而ndis所查詢的介質(zhì)相關(guān)參數(shù)為:
      0x03010104  oid_fddi_long_max_list_size
      0x03010108  oid_fddi_short_max_list_size
      0x03010102  oid_fddi_long_current_addr  
      0x03010106  oid_fddi_short_current_addr
      tcp/ip傳輸驅(qū)動程序所要查詢的fddi  oid為:
      0x03010102  oid_fddi_long_current_addr  
      0x03010103  oid_fddi_long_multicast_list
      0x03010107  oid_fddi_short_multicast_list
      通過以上兩階段的查詢,ndis和tcp/ip驅(qū)動程序就分別了解了網(wǎng)卡驅(qū)動程序?qū)ζ涞闹С郑瑥亩M(jìn)行相應(yīng)的捆綁,以便數(shù)據(jù)傳輸時正確選擇網(wǎng)卡驅(qū)動程序。

      第五節(jié)  開發(fā)環(huán)境與調(diào)試方法
      開發(fā)環(huán)境:
      fddi網(wǎng)卡驅(qū)動程序的開發(fā)環(huán)境為nt  server  3.51,sdk,ddk  for  workstation  3.51,  vc++4.1,硬件平臺為586。
      調(diào)試平臺:
      主機為nt  server  3.51,windbg32
      目標(biāo)機為nt  workstation3.51  (check  944)
      調(diào)試方法:
      ※利用dbgprint把目標(biāo)機上關(guān)鍵信息通過串口傳到主機進(jìn)行分析,以得出ndis驅(qū)動程序的調(diào)度機制和運轉(zhuǎn)狀況;
      ※利用assert產(chǎn)生異常斷點,由主機對異常進(jìn)行控制
      ※自定義宏,進(jìn)行分級控制,以根據(jù)不同情況產(chǎn)生不同調(diào)試信息  
      第四章  與smt移植相關(guān)的問題討論
      在本yhfddi網(wǎng)卡驅(qū)動程序中,smt的移植是極其關(guān)鍵的一部分,主要承擔(dān)了驅(qū)動程序中硬件初始化和中斷延遲處理。但由于smt是相對獨立的軟件,這樣就有一個ndis  wrapper與smt間參數(shù)傳遞的問題。所以本章主要討論miniport驅(qū)動程序與smt的關(guān)系和移植smt過程中初始化的要求、中斷處理的要求,ndis  wrapper與smt如何傳遞參數(shù)。
      (一)miniport  fddi網(wǎng)卡驅(qū)動程序與smt的關(guān)系。
      在第一章已經(jīng)談及網(wǎng)卡驅(qū)動程序主要實現(xiàn)osi參考模型中的物理層和mac層。而對于fddi網(wǎng)絡(luò)的物理層又可分為介質(zhì)相關(guān)子層和介質(zhì)無關(guān)子層。
      對于我們的fddi/pci是基于x.3.19、x3.148、x3.166和x3.229而實現(xiàn)的。

      smt在整個iso七層模型中屬低兩層范疇。下圖是iso模型與fddi層次的對應(yīng)關(guān)系,從而可知fddi  miniport驅(qū)動程序在nt網(wǎng)絡(luò)結(jié)構(gòu)中的位置。
      即在windows  nt  fddi網(wǎng)卡驅(qū)動程序應(yīng)包含smt,實現(xiàn)fddi拓?fù)洵h(huán)上的站管理。
      而在驅(qū)動程序內(nèi)部smt主要是在miniport驅(qū)動程序中的中斷延遲處理上邊緣服務(wù)中實現(xiàn)的,也可以說是將smt嵌入中斷延遲處理程序中,實現(xiàn)ndis接口對smt的正確調(diào)度。
      yh-fddi驅(qū)動程序的實現(xiàn)可分為硬件無關(guān)部分和硬件相關(guān)部分。  
      移植smt過程中初始化的要求.  
      這里的初始化主要是指硬件初始化,包括寄存器的初始化和數(shù)據(jù)結(jié)構(gòu)的初始化,由smt共用的硬件相關(guān)例程庫中硬件初始化部分來完成.  我們在開發(fā)過程序是調(diào)用fddi_main(bdd_t*bdd)這個函數(shù)來調(diào)用smt共用的硬件相關(guān)例程庫的.可見使用fddi_main(bdd_t*bdd)時,需要傳遞bdd這個參量,而bdd_t這個數(shù)據(jù)結(jié)構(gòu)的定義如下:
      它包含了各類硬件寄存器的基址,所以要對其進(jìn)行正確賦值就必須首先在nt的內(nèi)存中映射一塊虛存與網(wǎng)卡內(nèi)存相對應(yīng),也就實現(xiàn)了bdd_t結(jié)構(gòu)的賦值,對fddi_main(bdd_t  *bdd)的正確調(diào)用.  
      因此,我們在調(diào)用fddi_main前首先將網(wǎng)卡上寄存器內(nèi)存空間映射到nt的虛存空間上,并將bdd結(jié)構(gòu)正確賦值.以映射bsi_phy_base為例,具體過程如下:
      pchar  destination;
      bdd_t  *bdd;
      ndis_physical_address  physicaladdress;
      ulong  baseaddress;
      ndis_status  status;
      baseadress  =0x0d0000+bsi_phy_base;
      ndissetphysicaladdresshigh(physicaladdress,0);
      ndissetphysicaladdresslow(physicaladdress,baseaddress);
      status=ndismmapiospace(
      (pvoid  *)&destination,
      miniportadapterhandle,
      physicaladdress,
      bsi_phy_len
      );
      bdd->bsi_vir_base=(pchar)  destination;
      adapter->  bdd->bsi_vir_base=  bsi_vir_base;  
      /*對adapter結(jié)構(gòu)中的bdd結(jié)構(gòu)賦值,以便在其它上邊緣函數(shù)中使用這些虛存基地址

      */
      中斷處理要求.  
      對于中斷處理,在smt中主要調(diào)用cspintrhandandler()來實現(xiàn).我們的fddi網(wǎng)卡驅(qū)動程序是miniport方式的,若在isr中做此處理將占用大量系統(tǒng)資源,使系統(tǒng)崩潰,所以我們采用只在isr中進(jìn)行中斷的排隊,而在dpc中調(diào)用cspintrhandler()來完成中斷處理.
      在中斷處理方面還有一個中斷屏蔽和中斷使能的問題,這兩方面smt并不提供,故我們要正確處理.
      具體處理方法見第三章.
      ndis  wrapper與smt間參數(shù)如何傳遞.  
      miniport方式的網(wǎng)卡驅(qū)動程序中,網(wǎng)卡上有中斷時,系統(tǒng)反映給ndiswrapper,再由wrapper調(diào)度中斷處理上邊緣服務(wù)實現(xiàn)中斷處理,在我們的yhfddi網(wǎng)卡驅(qū)動程序的中斷具體處理是smt完成的所以在調(diào)用cspintrhandler時應(yīng)將adapter結(jié)構(gòu)傳進(jìn)smt以便在以后應(yīng)用.
      如在處理接收中斷時,處理的最后應(yīng)調(diào)用ndisindicatefddireceive,向ndiswrapper指示以接收到一個數(shù)據(jù)包,而ndisindicaterfddireceive的調(diào)用需要adapterminiporthandle作為參數(shù),這就必須一級級從中斷延遲處理函數(shù)(yhfddi  handleinterrupt)中將adapter結(jié)構(gòu)傳遞下來.  當(dāng)然,其它方面如發(fā)送,也會有類似的問題需要考慮.
      總之,對于smt的移植,需要詳盡的在程序中做好接口,才能實現(xiàn)與
      smt的數(shù)據(jù)交換.
      結(jié)束語

      ndis規(guī)范在網(wǎng)絡(luò)兩層間提供了一個統(tǒng)一界面,ndis對網(wǎng)絡(luò)本身而言,是一個帶有協(xié)議功能的標(biāo)準(zhǔn)接口,對實現(xiàn)者而言,它應(yīng)該是一個環(huán)境,這種環(huán)境不僅帶有協(xié)議功能,更重要的是帶有和軟、硬平臺無關(guān)的核心功能支持,它不會受軟、硬平臺的變化嚴(yán)重影響,無疑,它是軟件的移植和兼容的可靠保證,ndis把網(wǎng)絡(luò)的一部分共性抽象出來,并根據(jù)具體的操作系統(tǒng)實現(xiàn)系統(tǒng)和平臺相關(guān)的基礎(chǔ)庫以保證ndis的標(biāo)準(zhǔn)性和對開發(fā)者提供最大的功能支持,這也將加速和規(guī)范開發(fā)過程,但是,在操作系統(tǒng)之上提供ndis基礎(chǔ)庫獲得標(biāo)準(zhǔn)同時也失去直接作用于操作系統(tǒng)帶來的靈活性以及更強的功能支持,同時,ndis處于網(wǎng)絡(luò)中層和低層之間,低層網(wǎng)絡(luò)的快速發(fā)展和ndis對網(wǎng)絡(luò)部分共性的抽象必然導(dǎo)致ndis對實現(xiàn)者的滯后,例如ddk3.51提供的ndis開發(fā)環(huán)境只支持10m以太網(wǎng)、fddi、令牌網(wǎng)(802.5)、localtalk、arcnet等,而對新出現(xiàn)的快速以太網(wǎng)及atm不提供支持,這對我們?nèi)绾卧趎dis環(huán)境下實現(xiàn)諸如atm的lan  emulation,ip  over  atm、快速以太網(wǎng)帶來很大問題。
      smt是實現(xiàn)fddi網(wǎng)卡驅(qū)動程序的關(guān)鍵,然而由于應(yīng)用ddk開發(fā)miniport驅(qū)動程序時要遵循其結(jié)構(gòu)框架,所以要想完整地按其結(jié)構(gòu)移植smt,就必須分解smt適應(yīng)之,即要求對smt有一個很好的理解。但smt是龐大的給開發(fā)帶來了一定的困難。
      參考文獻(xiàn)
      【1】《device  driver  kit用戶手冊》
      【2】《device  driver  kit核心驅(qū)動程序設(shè)計》  
      【3】《device  driver  kit網(wǎng)絡(luò)驅(qū)動程序設(shè)計》
      【4】《windows  nt核心內(nèi)幕》
      【5】《windows  nt資源》之三《性能評測》 


      【windows nt環(huán)境下fddi網(wǎng)卡驅(qū)動程序設(shè)計 2】相關(guān)文章:

      windows nt環(huán)境下fddi網(wǎng)卡驅(qū)動程序設(shè)計08-06

      WindowsCE.Net下CAN卡的驅(qū)動程序設(shè)計08-06

      VxWorks下PC/104-CAN驅(qū)動程序設(shè)計08-06

      Windows NT中的登記項及其完整性08-06

      Windows CE中實現(xiàn)藍(lán)牙串口驅(qū)動程序08-06

      在Linux下驅(qū)動STN彩色LCD08-06

      PCI傳輸卡的WDM驅(qū)動程序設(shè)計08-06

      Windows下多串口的配置與使用08-06

      Windows CE下串行通信的實現(xiàn)08-06

      主站蜘蛛池模板: 亚洲精品在线少妇内射| 精品国产综合一区二区三区| 在线看无码的免费网站| 北岛玲中文字幕人妻系列| 国产男女猛烈无遮挡免费视频网址 | 国产精品无码av不卡| 国产按头口爆吞精在线视频| 亚洲精品成人无限看| 4399理论片午午伦夜理片| 激情五月开心婷婷深爱| 国产精品视频免费一区二区三区| 国产偷国产偷亚洲高清人| 亚洲一区二区三区自拍天堂| 亚洲精品日本一区二区| 日韩狼人精品在线观看| 成人av一区二区亚洲精| 中文字幕国产精品综合| 美女爽到高潮嗷嗷嗷叫免费网站| 国产欧美日韩亚洲一区二区三区| 久久96热在精品国产高清| 国产精品国产高清国产专区| 国产日韩av二区三区| 7777精品久久久大香线蕉| 69精品无人区国产一区| 精品一区二区成人码动漫| 性色欲情网站iwww| 亚洲十八禁一区二区三区| 国产99青青成人A在线| 欧美大胆老熟妇乱子伦视频| 成人国产精品中文字幕| 女同精品女同系列在线观看 | 国产成人精品永久免费视频| 亚洲夂夂婷婷色拍WW47| 国产色无码精品视频免费| 欧美日韩一区二区综合| 久久精品久久精品久久精品| 中文字幕av无码不卡| 好吊妞| 亚洲乱色一区二区三区丝袜| 美女黄18以下禁止观看| 国产福利姬喷水福利在线观看|