




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、基于PassThru的NDIS中間層驅(qū)動(dòng)程序擴(kuò)展概要:開發(fā)一個(gè)NDIS驅(qū)動(dòng)是一項(xiàng)相對(duì)復(fù)雜的工作,這一方面是由于核心驅(qū)動(dòng)本身有更多的限制和要求,有更多的“游戲規(guī)則”要求開發(fā)者理解和掌握,NDIS 的復(fù)雜性把難度更是提高了,本文以PassThru為例,加上自己的理解,講述了NDIS驅(qū)動(dòng)的處理過程和在PassThru的基礎(chǔ)上進(jìn)行擴(kuò)展的基本方法,本文并不是一個(gè)入門讀物,所以沒有提及任何核心驅(qū)動(dòng)開發(fā)的相關(guān)知識(shí),本文主要講述的是NDIS中間層對(duì)數(shù)據(jù)包處理的流程。在閱讀過程中,關(guān)于相關(guān) API的用法,或其它信息,請(qǐng)參看DDK文檔。一NDIS驅(qū)動(dòng)程序分類.NDIS(Network Driver Interfa
2、ce Specification)是Windows網(wǎng)絡(luò)驅(qū)動(dòng)程序接口標(biāo)準(zhǔn),NDIS驅(qū)動(dòng)程序分為三類:1. NDIS Miniport NIC Driver: 底層的微端口NIC驅(qū)動(dòng),這就是網(wǎng)絡(luò)設(shè)備的物理的驅(qū)動(dòng)程序了。2. NDIS Protocol Driver: 高層的協(xié)議驅(qū)動(dòng),用來實(shí)現(xiàn)某個(gè)具體的協(xié)議棧,如TCP/IP協(xié)議棧, 并向上導(dǎo)出TDI接口。3. NDIS Intermediate Driver: 中間層驅(qū)動(dòng),位于Miniport Driver和Protocol Driver之間。二NDIS驅(qū)動(dòng)結(jié)構(gòu)簡(jiǎn)介.其中,最上層是一個(gè)NDIS Protocol Driver,它向上提供一個(gè)Tran
3、sport Driver Interface(TDI),向下通過NDIS接口與下面的NDIS中間層的上邊界交互,NDIS中間層的下邊界通過NDIS接口與下層的NDIS Miniport Driver交互。最后,由NDIS Miniport Driver利用NDIS接口與物理網(wǎng)絡(luò)設(shè)備NetCard交互。NetCard是由不同的網(wǎng)卡設(shè)備產(chǎn)商提供的,而NDIS接口庫是由Microsoft 開發(fā)好的,為什么NDIS Miniport Driver不是直接與物理網(wǎng)卡交互,而是通過NDIS接口與下物理網(wǎng)卡交互呢?(我想很多人都會(huì)和我當(dāng)初一樣,有這個(gè)疑問)。事實(shí)上,這是由于Windows系統(tǒng)為了提高可移植性
4、,而設(shè)計(jì)出一個(gè)硬件抽象層(HAL),硬件抽象層在內(nèi)部處理不同的硬件之間的差異,并且暴露出一個(gè)統(tǒng)一的接口給核心驅(qū)動(dòng)開發(fā)者。例如:在Intel構(gòu)架的系統(tǒng)中,內(nèi)存和外部設(shè)備的端口采用分別編址,如果要從某個(gè)外部設(shè)備的端口上讀寫數(shù)據(jù)的話,可能要通過專用指令I(lǐng)N/OUT讀寫,而在Alpha構(gòu)架的系統(tǒng)上,采用的是統(tǒng)一編址的方式,所以對(duì)外部設(shè)備的IO端口進(jìn)行讀寫的話還是通過訪問內(nèi)存的指令,HAL提供一組服務(wù)支持函數(shù),如果要訪問外部設(shè)備上的端口數(shù)據(jù)可以使用READ_PORT_UCHAR/WRITE_PORT_UCHAR等等,核心驅(qū)動(dòng)開發(fā)者不用去考慮不同硬件構(gòu)架的之間的差異。在NDIS Miniport Driv
5、er中,NetCard驅(qū)動(dòng)的程序,正是這樣通過NDIS接口提供的一組類似功能的函數(shù),與物理的網(wǎng)絡(luò)設(shè)備進(jìn)行交互。其中,最上層是一個(gè)NDIS Protocol Driver,它向上提供一個(gè)Transport Driver Interface(TDI),向下通過NDIS接口與下面的NDIS中間層的上邊界交互,NDIS中間層的下邊界通過NDIS接口與下層的NDIS Miniport Driver交互。最后,由NDIS Miniport Driver利用NDIS接口與物理網(wǎng)絡(luò)設(shè)備NetCard交互。三 NDIS驅(qū)動(dòng)程序的數(shù)據(jù)處理流程3.1 三種NDIS驅(qū)動(dòng)程序的關(guān)系。通常一個(gè)NDIS Protocol
6、Driver 的上邊沿導(dǎo)出TDI接口,并在其下邊沿向NDIS注冊(cè)一組Protocolxxx操作例程;一個(gè)NDIS Miniport Driver則在其下邊沿通過NDIS接口操作物理網(wǎng)絡(luò)設(shè)備,并在其上邊沿向NDIS注冊(cè)一組Miniportxxx操作例程。當(dāng)一個(gè)中間層介入的時(shí)候,必需遵守這個(gè)規(guī)則,因此,中間層驅(qū)動(dòng)對(duì)上層來說,扮演一個(gè)Miniport Driver的角色,它在上邊沿向NDIS注冊(cè)一組Miniportxxx函數(shù);對(duì)于下層Miniport Driver來說,中間層驅(qū)動(dòng)扮演一個(gè)Protocol Driver的角色,因此它在下邊沿向NDIS注冊(cè)一組Protocolxxx函數(shù)。Miniport
7、 Driver通過調(diào)用NdisMRegisterMiniport向NDIS注冊(cè)一組MiniportXxx函數(shù)。其中原型如下:NDIS_STATUS NdisMRegisterMiniport(IN NDIS_HANDLENdisWrapperHandle, IN PNDIS_MINIPORT_CHARACTERISTICSMiniportCharacteristics, IN UINTCharacteristicsLength );其中,NdisWrapperHandls是之前通過調(diào)用NdisMInitializeWrapper取得的句柄MiniportCharacteristics包含一組M
8、iniportXxx函數(shù)指針。Protocol Driver 通過調(diào)用 NdisRegisterProtocol向NDIS注冊(cè)一組ProtocolXxx函數(shù)。其中原型如下:VOID NdisRegisterProtocol(OUT PNDIS_STATUSStatus,OUT PNDIS_HANDLENdisProtocolHandle,IN PNDIS_PROTOCOL_CHARACTERISTICSProtocolCharacteristics,IN UINTCharacteristicsLength);其中,ProtocolCharacteristics包含一組ProtocolXxx函數(shù)
9、。由于NDIS Intermediate Driver的雙重性,它需要調(diào)用 NdisIMRegisterLayeredMiniport 向NDIS注冊(cè),并向上層導(dǎo)出一組MiniportXxx函數(shù),之后,調(diào)用NdisRegisterProtocol向NIDS注冊(cè),并向下層導(dǎo)出一組 ProtocolXxx函數(shù)。當(dāng)一個(gè)NDIS中間層介入后,如圖二所示。3.2 NDIS數(shù)據(jù)發(fā)送流程:當(dāng)上層協(xié)議驅(qū)動(dòng)要發(fā)數(shù)據(jù)時(shí),調(diào)用NdisSend/NdisSendPackets請(qǐng)求NDIS發(fā)送數(shù)據(jù)包,NDIS將會(huì)調(diào)用緊接其下的中間層驅(qū)動(dòng)的MiniportSend/MiniportSendPackets,中間層驅(qū)動(dòng)Min
10、iportSend/MiniportSendPackets 有機(jī)會(huì)在這里對(duì)包進(jìn)行必要的操作,然后,中間層驅(qū)動(dòng)再次調(diào)用NdisSend/NdisSendPackets請(qǐng)NDIS發(fā)送數(shù)據(jù)包,NDIS將調(diào)用其下層的Miniport Driver的MiniportSend/MiniportSendPackets,底層MiniportSend /MiniportSendPackets通過NDIS接口控制物理網(wǎng)絡(luò)設(shè)備,將數(shù)據(jù)發(fā)送出去。在上層請(qǐng)求發(fā)送數(shù)據(jù)包時(shí),上層分配了相關(guān)的資源(如內(nèi)存),希望在下層完成發(fā)送動(dòng)作后,能夠及時(shí)的收回相關(guān)的資源,所以,當(dāng)上層調(diào)用NdisSend/NdisSendPackets返
11、回 NDIS_STATUS_PENDING以外的任何值時(shí),上層就可以釋放資源了,如果得到返回的結(jié)果是NDIS_STATUS_PENDING話,說明下層還沒有完成發(fā)送請(qǐng)求,以后,等下層最終完成發(fā)送請(qǐng)求時(shí),下層調(diào)用NdisMSendComplete請(qǐng)求NDIS通知上層可以釋放資源了,于是NDIS 調(diào)用上層注冊(cè)的ProtocolSendComplete函數(shù),上層在這它的ProtocolSendComplete中釋放了資源后,再次調(diào)用 NdisMSendComplete請(qǐng)求NDIS通知更上層。3.3 NDIS數(shù)據(jù)接收流程:當(dāng)?shù)讓泳W(wǎng)絡(luò)設(shè)備有數(shù)據(jù)到來的時(shí)候,將觸發(fā)中斷,相應(yīng)的中斷處理程序接管中斷后,將可能
12、調(diào)用Miniport Driver所注冊(cè)的中斷處理例程(ISR),Miniport Driver通常在這里把網(wǎng)卡上的數(shù)據(jù)考貝到Miniport Driver緩沖區(qū)隊(duì)列中去,出于效率的考慮,Miniport Driver這時(shí)可能不會(huì)立即通知上層處理新的數(shù)據(jù),因?yàn)楹芸赡?,馬上還有隨后的新的數(shù)據(jù)到來,當(dāng)接收到的包的數(shù)量達(dá)到一定程度的時(shí)候,Miniport Driver會(huì)調(diào)用NdisMIndicateReceivePacket指示新的NDIS新數(shù)據(jù)的到來,這時(shí)候,NdisMIndicateReceivePacket的調(diào)用將導(dǎo)致NDIS調(diào)用位于Miniport上層的中間層向NDIS注冊(cè)的下邊沿 Prot
13、ocolReceivePacket函數(shù)。中間層驅(qū)動(dòng)程序的ProtocolReceivePacket可以對(duì)收到的數(shù)據(jù)包進(jìn)行相應(yīng)的處理,之后,可以選擇再次調(diào)用NdisMIndicateReceivePacket請(qǐng)求NDIS通知更上層數(shù)據(jù)包的到來,這時(shí),NDIS調(diào)用更上層注冊(cè)的 ProtocolReceive函數(shù),上層的ProtocolReceive對(duì)數(shù)據(jù)包進(jìn)行必要的處理后,繼續(xù)調(diào)用 NdisMIndicateReceivePacket請(qǐng)求NDIS,通知更上層,最終數(shù)據(jù)包傳到協(xié)議驅(qū)動(dòng)中,由相關(guān)的協(xié)議棧進(jìn)行處理。有時(shí)候,在這種級(jí)連的上傳過程中,并不是那么的順利,例如,由于某種原因,如:網(wǎng)絡(luò)設(shè)備的驅(qū)動(dòng)程
14、序的可用緩沖區(qū)數(shù)量減少到某個(gè)指定的數(shù)量時(shí),網(wǎng)絡(luò)設(shè)備的驅(qū)動(dòng)程序調(diào)用NdisMxxxIndicateReceivePacket請(qǐng)求NDIS通知上層數(shù)據(jù)的到來,這時(shí)NDIS將調(diào)用上層注冊(cè)的 ProtocolReceive,上層在ProtocolReceive中進(jìn)行必要的處理后,進(jìn)一步調(diào)用 NdisMxxxIndicateReceivePacket使得NDIS調(diào)用上層的協(xié)議驅(qū)動(dòng)注冊(cè)的ProtocolReceive。在一些不太理想的情況下,一次中斷,從網(wǎng)絡(luò)設(shè)備中接收到的數(shù)據(jù)對(duì)某個(gè)協(xié)議來說并不是一個(gè)完整的協(xié)議數(shù)據(jù)包。(一般情況下,其余的數(shù)據(jù)bit已經(jīng)在鏈路途中了,并隨后立即就會(huì)到達(dá)網(wǎng)絡(luò)設(shè)備,這有可能就發(fā)生
15、在一個(gè)CPU在處理網(wǎng)絡(luò)設(shè)備中斷的同時(shí),網(wǎng)絡(luò)設(shè)備的板載存儲(chǔ)器上就已經(jīng)收到了其余的數(shù)據(jù)了,甚至DMA控制器可能已經(jīng)把這些數(shù)據(jù)傳到了系統(tǒng)的主存儲(chǔ)器上了),這時(shí),上層的ProtocolReceive都無法進(jìn)行正常的處理(一般對(duì)某個(gè)包進(jìn)行處理,都要以相關(guān)的協(xié)議為依據(jù),進(jìn)行分析)。這時(shí),在上傳到某一層時(shí),可以調(diào)用NdisTransferData請(qǐng)求NDIS把隨后的信息傳上來,這時(shí),NDIS又將在向上傳遞的途中回過頭來向下調(diào)用下面的MiniportTransferData,下層重復(fù)調(diào)用NdisTransferData把這個(gè)請(qǐng)求傳送到底程的Miniport Driver。如果在上層調(diào)用NdisTransfer
16、Data時(shí)不是返回NDIS_STATUS_PENDING,則上層可以繼續(xù)它的處理,而如果返回 NDIS_STATUS_PENDING,底程在最終完成請(qǐng)求時(shí),調(diào)用NdisMTransferDataComplete請(qǐng)求NDIS通知上層傳送完成,這將導(dǎo)致上層注冊(cè)的ProtocolTransferDataComplete被調(diào)用,上層調(diào)用NdisMTransferDataComplete 請(qǐng)求NDIS通知更上層。由于硬件技術(shù)的發(fā)展,網(wǎng)絡(luò)設(shè)備板載存儲(chǔ)的增加,系統(tǒng)主存儲(chǔ)器的增加,以及網(wǎng)絡(luò)傳輸能力的改善,NDIS那么迂回的通過 MdisMxxxIndicateReceivePacket,ProtocolRec
17、eive,MiniportTransferData這一條坎坷的路徑進(jìn)行數(shù)據(jù)處理的情況似乎越來越少見了。接收過程是由下層傳遞上去的,同樣,底層的Miniport分配了一些資源,如用于存儲(chǔ)這個(gè)數(shù)據(jù)包內(nèi)容的內(nèi)存,我們希望這些資源最終能極時(shí)的被歸還,以供以后使用。一個(gè)包在從下到上的傳遞過程時(shí),如果某一層的ProtocolReceive/ProtocolReceivePacket有興趣對(duì)這個(gè)包進(jìn)行處理的話,則需要檢查這個(gè)包的OOB信息段是不是攜帶NDIS_STATUS_RESOURCES,如果是的話,說明其下層資源緊缺,希望上層在處理的時(shí)候,自己考貝一份副本,以供自己使用,因?yàn)橄聦酉M约耗軌虮M快收回這
18、個(gè)包的資源,在這里,上層以后可以用自己的那份拷貝指示上層數(shù)據(jù)包的到來,這樣的話,以后,中間層希望上層處理完后,能夠收回所有權(quán)。另一方面,底層的Miniport并不是每一次都會(huì)在OOB信息段中設(shè)置 NDIS_STATUS_RESOURCES標(biāo)志的,這在很多情況下是不必要的。當(dāng)上層協(xié)議驅(qū)動(dòng)完成處理時(shí),可以調(diào)用NdisReturnPackets 通知NDIS,相應(yīng)包已經(jīng)處理完成,可以安全的釋放相關(guān)資源了,于是NDIS將調(diào)用其下層注冊(cè)的MiniportReturnPackets,下層在這里釋放與這個(gè)包相關(guān)的資源,并繼續(xù)調(diào)用NdisReturnPackets,請(qǐng)求NDIS把這個(gè)通知傳給更下層。這樣一來,
19、發(fā)數(shù)據(jù)由上層發(fā)起請(qǐng)求往下傳,而接收數(shù)據(jù)從下層往上傳,有沒有可能一次接收的過層是由上面發(fā)起往下傳的呢?這是沒有必要的,為什么?我的應(yīng)用程序不就主動(dòng)調(diào)用WSARecv或WSARecvFrom等函數(shù)主動(dòng)向下傳遞的一次收數(shù)據(jù)的請(qǐng)求的嗎?事實(shí)上是這樣的,你的接收請(qǐng)求經(jīng)過 SPI,TDI,到了最終的協(xié)議驅(qū)動(dòng)時(shí),如果協(xié)議驅(qū)動(dòng)中,指定的套接字上(最重要的是端口和目的IP了)有相應(yīng)的數(shù)據(jù)的能滿足你的這一次的讀請(qǐng)求的話,就完成你的請(qǐng)求,如果不能的話,則阻塞了。當(dāng)下層有數(shù)據(jù)來的時(shí)候,數(shù)據(jù)傳遞到協(xié)議驅(qū)動(dòng)時(shí),協(xié)議驅(qū)動(dòng)會(huì)檢查包頭的信息并查看當(dāng)前不是有應(yīng)用程序打開過相應(yīng)的端口,以及和對(duì)應(yīng)的目標(biāo)建立過連接,如果有的話,就把數(shù)
20、據(jù)存到協(xié)議棧中的緩沖區(qū)中去,如果對(duì)應(yīng)套接字上有阻塞的接收請(qǐng)求的話,就判斷是不是能完成它的請(qǐng)求了,如果能了,就完成他,如果不能,繼續(xù)等以后下層傳上來再重復(fù)這個(gè)過程。否則就拋棄了,另外,如果,一個(gè)應(yīng)用程序建立一個(gè)套接字,并與一臺(tái)機(jī)器建立連接,對(duì)方發(fā)送了數(shù)據(jù),協(xié)議棧會(huì)把數(shù)據(jù)保存起來,也許連接超時(shí)后,協(xié)議棧的緩沖區(qū)中還有應(yīng)用程序沒有接收的數(shù)據(jù)的話,也被拋棄了。所以,協(xié)議驅(qū)動(dòng)從來都沒有必要主動(dòng)往下傳遞一個(gè)接收數(shù)據(jù)的請(qǐng)求。這一點(diǎn),對(duì)于有一點(diǎn)網(wǎng)絡(luò)程序調(diào)試經(jīng)驗(yàn)的人來說,似乎可以直接找到一個(gè)的證據(jù),在調(diào)試器的調(diào)用WSARecv前下一個(gè)斷點(diǎn),用Sniffer抓包,可能數(shù)據(jù)已經(jīng)到來了,然后,再回到調(diào)試器中執(zhí)行WSA
21、Recv,可以看到收到的就是先前Sniffer下來的數(shù)據(jù)了。(注:用一個(gè)工作在NDIS協(xié)議層或是NDIS中間層的Sniffer來觀查。)3.4 NDIS 的數(shù)據(jù)包結(jié)構(gòu)。發(fā)送NDIS Protocol Driver分配相關(guān)的包資源,請(qǐng)求NDIS向下傳遞發(fā)送動(dòng)作,接收時(shí),NDIS Miniport Driver分配相關(guān)的包資源請(qǐng)求NDIS向上傳遞接收動(dòng)作,中間層要對(duì)包進(jìn)行處理,首先通過包描述符查詢出這個(gè)包中的所有Buffer描述符,然后,從每一個(gè)Buffer描述符中取得相應(yīng)的數(shù)據(jù)。一個(gè)包描述符中包含了一個(gè)或多個(gè)Buffer描述符,每一個(gè)Buffer描述符中包含了這個(gè)Buffer中數(shù)據(jù)的緩沖區(qū)首地址
22、及其大小等信息,另外,一個(gè)包描述符中還包括了一些保留給開發(fā)者自己使用的Reserved字段,其于的一些字段,并沒有被公開。另外 NDIS提供了一些宏和一些函數(shù)對(duì)這相應(yīng)的描述符進(jìn)行操作。為什么要把這個(gè)結(jié)構(gòu)弄得這么復(fù)雜呢?這是由于面對(duì)分層的協(xié)議處理的時(shí)候,避免過多的數(shù)據(jù)考貝,比如對(duì)于TCP/IP協(xié)議來說,上層傳遞下來的數(shù)據(jù),在經(jīng)過TCP,IP層時(shí),把TCP,IP協(xié)議頭部那個(gè)Buffer分別加入這個(gè)Packet來就可以了,如果,要它們?cè)谝粋€(gè)Buffer中,則需要在經(jīng)過TCP層時(shí),TCP層建立一個(gè)新的Buffer,把頭部放到這個(gè)Buffer中來,并把數(shù)據(jù)考貝到這個(gè)Buffer中來;到了IP層還要繼續(xù)這
23、一動(dòng)作.四 基于PassThru框架的中間層驅(qū)動(dòng)程序的擴(kuò)展實(shí)現(xiàn)Microsoft在DDK中附帶PassThru提供了一個(gè)的中間層驅(qū)動(dòng)框架,使得開發(fā)者能夠相對(duì)容易的在這個(gè)基礎(chǔ)實(shí)現(xiàn)自己的NDIS中間層驅(qū)動(dòng)擴(kuò)展。我們將在PassThru的基礎(chǔ)上實(shí)現(xiàn)一個(gè)基本的數(shù)據(jù)包操作的擴(kuò)展。對(duì)于發(fā)送出去的數(shù)據(jù)包處理,只要在PassThru中的 MiniportSend和MiniportSendPackets中加入必要的操作代碼,而對(duì)于接收的數(shù)據(jù)包時(shí),則需要在 ProtocolReceive和ProtocolReceviePackets中加入必要的操作代碼,在這里,我將以windows 2003 DDK的PassTh
24、ru為例,進(jìn)行擴(kuò)展。4.1 發(fā)送處理VOID MPSendPackets(IN NDIS_HANDLE MiniportAdapterContext,IN PPNDIS_PACKET PacketArray,IN UINT NumberOfPackets)/ 省略代碼若干,請(qǐng)參看PassThru的源代碼。/ 分配一個(gè)新的包描述符。NdisAllocatePacket(&Status, &MyPacket, pAdapt-SendPacketPoolHandle);if (Status = NDIS_STATUS_SUCCESS)PSEND_RSVD SendRsvd;SendRsvd = (P
25、SEND_RSVD)(MyPacket-ProtocolReserved);/ 把原來的包描述符保存在新分配的包描述符中的Reserved字段中,原因在后面描述。SendRsvd-OriginalPkt = Packet; / 調(diào)用BuildMyPacket對(duì)包進(jìn)行自己的處理(更改包的內(nèi)容,或其它動(dòng)作)。if (BuildMyPacket(pAdapt, Packet, MyPacket) = FALSE)/ 如果處理失敗,則把原始的包信息Copy到MyPacket。/ 這是為了在處理失敗的情況下,也讓原始的信息能發(fā)出去。NDIS_PACKET_FIRST_NDIS_BUFFER(MyPack
26、et) = NDIS_PACKET_FIRST_NDIS_BUFFER(Packet);NDIS_PACKET_LAST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_LAST_NDIS_BUFFER(Packet);/ ./ 請(qǐng)求NDIS向下層傳遞發(fā)送動(dòng)作。NdisSend(&Status, pAdapt-BindingHandle, MyPacket);/ 如果NdisSend返回非NDIS_STATUS_PENDING則釋放自己的資源。if (Status != NDIS_STATUS_PENDING)DestroyMyPacket(MyPacket);Ndis
27、FreePacket(MyPacket); / ./ 如果NdisSend返回非NDIS_STATUS_PENDING,說明下層已成功發(fā)送完成/ 調(diào)用NdisMSendComplete請(qǐng)求NDIS通知上層釋放資源,這將導(dǎo)致上層注冊(cè)的/ ProtocolSendComplete被調(diào)用,上層在ProtocolSendComplete中釋放資源后/ 將繼續(xù)調(diào)用NdisMSendComplete請(qǐng)求NDIS把這個(gè)通知往上傳遞。if (Status != NDIS_STATUS_PENDING)NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt), Packet
28、, Status);/ 如果返回了 NDIS_STATUS_PENDING,則在該層的資源還不能釋放,在底層/ 完成發(fā)送時(shí),底層將調(diào)用NdisMSendComplete,請(qǐng)求NDIS向上傳遞這個(gè)通知。/ 該層在自己的ProtocolSendComplete釋放相應(yīng)的資源。VOID PtSendComplete(IN NDIS_HANDLE ProtocolBindingContext,IN PNDIS_PACKET Packet,IN NDIS_STATUS Status) / ./ 上面發(fā)送的時(shí)候,我們分配了一個(gè)新的包描述符,并把上層的包描述符保存在/ ProtocolReserved中,現(xiàn)
29、在,把這個(gè)上層的包描述符還原出來。PSEND_RSVD SendRsvd;SendRsvd = (PSEND_RSVD)(Packet-ProtocolReserved);Pkt = SendRsvd-OriginalPkt;/ ./ 釋放自己的資源DestroyMyPacket(Packet);NdisDprFreePacket(Packet);/ 用上層的包描述符請(qǐng)求NDIS通知上層釋放資源NdisMSendComplete(pAdapt-MiniportHandle, Pkt, Status);BOOLEAN BuildMyPacket(IN PADAPT pAdapt,IN PNDIS
30、_PACKET original_packet,OUT PNDIS_PACKET MyPacket)PSEND_RSVD SendRsvd;NDIS_STATUS Status;NDIS_PHYSICAL_ADDRESS phyaddr = -1;PVOID pcontent = NULL;ULONG total_length = 0, current_length = 0;PNDIS_BUFFER MyBuffer;/ 分配新的內(nèi)存Status = NdisAllocateMemory(PVOID)&pcontent, 2014, 0, phyaddr);if (NDIS_STATUS_SU
31、CCESS != Status)return FALSE;NdisZeroMemory(pcontent, 2014);/ 把包中的數(shù)據(jù)Copy到自己的Buffer中來。NdisQueryPacket(packet, NULL, NULL, &ndis_buffer, &total_length);while (NULL != ndis_buffer)NdisQueryBufferSafe(ndis_buffer, &address, ¤t_length, NormalPagePriority);NdisMoveMemory(pcontent, address, current_l
32、ength);(PUCHAR)pcontent += current_length;NdisGetNextBuffer(ndis_buffer, &ndis_buffer);/ 分配新的一個(gè)Buffer描述符 NdisAllocateBuffer(&Status, &MyBuffer, pAdapt-SendPacketPoolHandle,pcontent, total_length); if (NDIS_STATUS_SUCCESS != Status)NdisFreeMemory(pcontent, 2014, 0);return FALSE;/ 在這里對(duì)包的內(nèi)容進(jìn)行你自己的處理,如果修改了內(nèi)容的話,由
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子商務(wù)解決方案開發(fā)基干試題及答案
- 計(jì)算機(jī)一級(jí)WPS基本操作知識(shí)試題及答案
- 2025年計(jì)算機(jī)Msoffice應(yīng)試經(jīng)驗(yàn)試題及答案
- 一級(jí)Photoshop考試知識(shí)點(diǎn)總結(jié)與反思試題及答案
- 2025年煤炭清潔高效燃燒技術(shù)在城市燃?xì)忸I(lǐng)域的應(yīng)用前景報(bào)告
- 前端開發(fā)技術(shù)測(cè)試試題及答案
- 精準(zhǔn)解析2025年稅法熱點(diǎn)試題及答案
- WPS信息管理的趨勢(shì)與解讀試題及答案
- 法學(xué)概論對(duì)法律職業(yè)規(guī)劃的影響試題及答案
- 餐桌談判與禮儀
- 2025江蘇中考:化學(xué)必背知識(shí)點(diǎn)
- 漆房外協(xié)協(xié)議書
- 2025年能源行業(yè)能源需求預(yù)測(cè)與市場(chǎng)發(fā)展趨勢(shì)2025
- 2024年“藍(lán)橋杯”科學(xué)素養(yǎng)競(jìng)賽考試題庫(含答案)
- 康復(fù)醫(yī)療復(fù)習(xí)題及參考答案
- 高標(biāo)準(zhǔn)農(nóng)田項(xiàng)目規(guī)劃設(shè)計(jì)方案
- 高血壓科普基礎(chǔ)知識(shí)培訓(xùn)-2025世界高血壓日
- 2025春季學(xué)期國(guó)開電大??啤独砉び⒄Z1》一平臺(tái)在線形考(綜合測(cè)試)試題及答案
- 混凝土預(yù)制構(gòu)件項(xiàng)目可行性研究報(bào)告
- 無人機(jī)拍攝培訓(xùn)課件
- 電力調(diào)度自動(dòng)化系統(tǒng)預(yù)案
評(píng)論
0/150
提交評(píng)論