1 引言
無(wú)線局域網(wǎng)經(jīng)過(guò)幾年的發(fā)展,在技術(shù)上已經(jīng)日漸成熟 。尤其是IEEE推出802.11-1999和802.11b以來(lái),應(yīng)用也日漸廣泛 。無(wú)線局域網(wǎng)硬件實(shí)現(xiàn)的兩大主要部分是基帶處理器和MAC控制器,軟件部分包括驅(qū)動(dòng)網(wǎng)卡本身工作的嵌入式軟件和網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序 。在本文中,首先介紹了小端口驅(qū)動(dòng)程序的基本要點(diǎn),然后給出了基于Driver Studio開發(fā)PCMCIA接口編程I/O(Programmed IO)方式工作的無(wú)線局域網(wǎng)網(wǎng)卡NDIS(網(wǎng)絡(luò)驅(qū)動(dòng)程序接口標(biāo)準(zhǔn)),并討論了小端口驅(qū)動(dòng)程序?qū)崿F(xiàn)過(guò)程中的若干要害技術(shù)的細(xì)節(jié) 。
2 小端口驅(qū)動(dòng)程序
在典型的網(wǎng)絡(luò)中,如以太網(wǎng)LLC子層及其上層協(xié)議均由軟件實(shí)現(xiàn),MAC及其以下層協(xié)議由硬件實(shí)現(xiàn) 。微軟Windows操作系統(tǒng)下的網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序遵守NDIS規(guī)范,它在分層的網(wǎng)絡(luò)驅(qū)動(dòng)程序框架中規(guī)定了一個(gè)標(biāo)準(zhǔn)接口,從而使抽象低層次的硬件提供了高層次網(wǎng)絡(luò)上的網(wǎng)絡(luò)治理 。因此,該規(guī)范極大簡(jiǎn)化了設(shè)備特定網(wǎng)絡(luò)驅(qū)動(dòng)程序的開發(fā) 。
NDIS還用于網(wǎng)絡(luò)驅(qū)動(dòng)器的狀態(tài)信息和參數(shù)的維護(hù),包括函數(shù)的指針、句柄、鏈接的參數(shù)塊和其他的一些系統(tǒng)變量 。NDIS規(guī)范下的網(wǎng)絡(luò)驅(qū)動(dòng)程序分為三類:小端口驅(qū)動(dòng)程序、中間驅(qū)動(dòng)程序和協(xié)議驅(qū)動(dòng)程序 。普通網(wǎng)卡的驅(qū)動(dòng)程序都是小端口驅(qū)動(dòng)程序,它有兩種基本功能:治理一個(gè)網(wǎng)絡(luò)接口卡(NIC),包括通過(guò)NIC收、發(fā)數(shù)據(jù);與高級(jí)驅(qū)動(dòng)程序接口(如中間驅(qū)動(dòng)程序和傳輸協(xié)議驅(qū)動(dòng)程序) 。一個(gè)小端口NIC驅(qū)動(dòng)程序通過(guò)NDIS庫(kù)和它的NIC與高層驅(qū)動(dòng)程序相互通訊 。NDIS庫(kù) 導(dǎo)出一個(gè)完全的函數(shù)集合(NdisXXX函數(shù)),來(lái)裝入小端口需要調(diào)用的操作系統(tǒng)函數(shù) 。然后,小端口必須導(dǎo)出一套MiniportX xx函數(shù)的實(shí)體指針,可供NDIS自己使用或代替高層驅(qū)動(dòng)程序訪問(wèn)小端口 。
關(guān)于網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序和Windows驅(qū)動(dòng)程序模型,感愛好的讀者可以參考文獻(xiàn)[3] 。
3 無(wú)線網(wǎng)卡驅(qū)動(dòng)程序框架
標(biāo)準(zhǔn)的驅(qū)動(dòng)程序都是C語(yǔ)言寫的,Nu Mega公司卻通過(guò)引入C和封裝基本的函數(shù)庫(kù)簡(jiǎn)化了驅(qū)動(dòng)程序的設(shè)計(jì) 。
使用DriverStudio編寫網(wǎng)絡(luò)驅(qū)動(dòng)程序,首先需要使用NetworkDriver Wizard生成驅(qū)動(dòng)程序的框架 。該框架生成兩個(gè)驅(qū)動(dòng)程序的基本類:一個(gè)是 wlan_drvDriver,它是KndisMiniDriver的繼續(xù)類;另一個(gè)驅(qū)動(dòng)程序必須且只有一個(gè)KndisMiniDriver的繼續(xù)類 。wlan_drvDriver的定義如下
class wlan_drvDriver : protected
KNdisMiniDriver
{
protected:
// must implement the entry point
NTSTATUS DriverEntry(IN PVOID RegistryPath);
};
NTSTATUS wlan_drvDriver::DriverEntry(IN PVOID)
{
TRACE("wlan_drvDriver::DriverEntry Com piled at " __TIME__ " on " __DATE__ "n");
KNDIS_MINIPORT_CHARACTERISTICS Chars;
return Chars.Register(*this);
}
wlan_drvDriver的唯一工作是定義DriverEntry 。操作系統(tǒng)通過(guò)該函數(shù)得知驅(qū)動(dòng)程序的入口 。DriverEntry例化NetworkDriver Wizard生成的另外一個(gè)類wlan_drvAdapter,并將本驅(qū)動(dòng)程序注冊(cè) 。
wlan_drvDriver類不用開發(fā)者干預(yù) 。開發(fā)者需要關(guān)心的是另外一個(gè)類wlan_drvAdapter,它是KndisMiniAdapter的子類 。
4 驅(qū)動(dòng)程序的初始化
wlan_drvAdapter類的實(shí)現(xiàn)是整個(gè)驅(qū)動(dòng)程序的主體部分,包括初始化驅(qū)動(dòng)程序、發(fā)送數(shù)據(jù)、接收數(shù)據(jù)、中斷處理、網(wǎng)卡復(fù)位等 。
驅(qū)動(dòng)程序在被裝入操作系統(tǒng)后的第一步工作是進(jìn)行初始化 。該工作由wlan_drv Adapter::Initialize函數(shù)完成 。該函數(shù)完成的工作如下:
(1)選擇媒體類型 。對(duì)于無(wú)線局域網(wǎng)為 NdisMedium802_3,而不是NdisMedium-WirelessWan 。聲明為 NdisMediumWirelessWan將支持各種無(wú)線媒體類型,NdisMedium802_3原本為以太網(wǎng)設(shè)計(jì),這里無(wú)線局域網(wǎng)似乎應(yīng)該聲明為NdisMediumWirelessWan媒體類型,但事實(shí)并不是這樣 。通過(guò)查詢OID_GEN_PHYSICAL_MEDIUM,協(xié)議驅(qū)動(dòng)程序可以得知物理媒體為NdisPhysical-MediumWirelessLan類型 。
推薦閱讀
- 無(wú)線和樓宇覆蓋
- 什么是無(wú)線局域網(wǎng)Wi-Fi認(rèn)證?
- VoWLAN中輪詢方法的探討
- 細(xì)說(shuō)無(wú)線局域網(wǎng)搭建之經(jīng)典問(wèn)題解答
- 中國(guó)寬帶無(wú)線技術(shù)發(fā)展走勢(shì)和技術(shù)分析
- 小型休閑咖啡廳巧布無(wú)線網(wǎng)絡(luò)
- 無(wú)線網(wǎng)絡(luò)中如何選擇無(wú)線加密
- 配置常見無(wú)線網(wǎng)絡(luò)基本方法
- 無(wú)線網(wǎng)絡(luò)的室內(nèi)覆蓋方案
- 無(wú)線局域網(wǎng)設(shè)備之疑惑解答
