利用Passthru開發NDIS驅動的一點心得

2021-04-12 19:43:24 字數 1137 閱讀 1860

最近看了不少資料,利用passthru例項完成了乙個ndis過濾驅動,解決了一些問題,也總結了一些經驗。

當然,老手就不適用了,純給新手看的。

2、收包的函式,有2個,是ptreceive和ptreceivepacket,分別對應不同的情況。如果網絡卡驅動通知上層,已經收到乙個完整的包,那麼就會呼叫ptreceivepacket,如果不通知,就會呼叫ptreceive。

不通知,有2種情況,其一是網絡卡已經完成的重組報文的工作,但是由於驅動設計的問題,沒有通知上層,返回上層的是乙個完整的資料報;另一種就是網絡卡驅動沒有重組報文,那就需要你在ndis驅動裡重組報文了。

3、定義變數。ddk的編譯環境,需要把所有的變數在乙個函式(過程)的頭部宣告完成,如果在其他語句後面宣告變數,是會報錯的。

4、ptreceive中的資料報內容快取。ptreceive是無法直接得到乙個完整的資料報的,必須在該函式中使用

packet = ndisgetreceivedpacket(padapt->bindinghandle, macreceivecontext);

完成獲取資料報的操作。

如果該過程執行成功,那麼乙個完整的資料報會存放在pndis_packet結構的packet中。

如果不成功,那麼可以從ptrecevie函式的入口引數中得到。

in  pvoid               headerbuffer //頭部快取

in  pvoid               lookaheadbuffer //前視緩衝

如果前視緩衝的長度,等於或大於入口引數packetsize,那麼就說明網絡卡的驅動返回了乙個完整的資料報。

這個完整的資料報,就是頭部緩衝+前視緩衝。(一般頭部緩衝中存放乙太網首部)

5、ptreceivepacket中的資料報內容。該函式直接在入口引數中得到了完整的資料報內容,因此不必多做處理。資料報在 in pndis_packet           packet

6、分配記憶體,需要用ndisallocatememory或者ndisallocatememorywithtag。前者用於2000,後者用於xp和更高版本的系統。

7、進行內容匹配,因為資料報可以拷貝到乙個puchar的變數中,所以進行匹配操作,最好的方法就是宣告puchar型別的模式串,在puchar的主串(資料報內容)中進行匹配,絕對沒錯。

利用user case管理開發

最近在帶領乙個小組進行乙個系統的開發,由於人手比較緊張,所以系統的架構 設計自己都要做,自然少了很多和成員溝通的地方。要知道,如果管理崗位如果具體做某件事情是很致命的,比如乙個架構師還要負責某個業務模組的開發,但現實就是這樣。為了保證良好的溝通效果與進度控制,除了要認真地制訂出切實執行的計畫外,在工...

利用MSN協議開發

今天化了乙個下午的時間研究了一下msn的協議,對msn的協議注意了有很長的時間了,但是卻一直沒有親自做過什麼程式。前面有開心的msn,後來也給陳銳發過,今天決定自己做乙個程式連帶學習託管c 基於msn的開發其實非常簡單,關鍵是熟悉msn的協議,大家可以在這裡學習到詳細的msn協議的知識,唯一可惜的就...

利用NuSoap開發WebService PHP

nusoap 是php 環境下的 webservice 程式設計工具,用於建立或呼叫 webservice 是乙個開源軟體。它完全採用 php語言編寫 通過 收發soap 訊息的一系列 php類,由 nusphere corporation 開發。它的優勢是不需要擴充套件庫的支援,這種特性使它可用於...