NDIS网络数据监控程序NDISMonitor(2)-----驱动与应用的中间层NdisHook
本工程是驅動vpcknt的一個封閉層而已,比較簡單。
一、導出的API接口分析
1、Start
(1)加載驅動vpcknt.sys。
vpcknt.sys是從工程的資源文件中通過CreateDriverFileFromAppResources加載的。(所以啟動NDIS時金山殺毒軟件會警告)
得到驅動文件后調用StartVersionedDeviceDriver把驅動.sys加載。?(加載過程中還通過驅動讀取了版本)
(驅動加載方法通過服務的方式,與前面文章<<虛擬桌面:一個簡單的桌面管理工具>>是一樣的)?????
(2)初始化PINITIALIZE_HOOK_INPUT的兩個變量pihiHookInput 、pihoHookOutput;
????????? 且通過調用驅動的IOCTL_VPCKNT_INITIALIZE_HOOK初始化pihoHookOutput數據和PNT_PROTOCOL_LIST指針(即協議列表);
2、Stop
卸載驅動
3、Listen
OALIST_ITEM類型的數據指針作為入參數,驅動IO碼為IOCTL_VPCKNT_SUBMIT_OALIST的調用,目的是提交OALIST數據。
4、WaitForPacket
這里先去判斷上一個包狀態中的bArePacketsRemaining標志,如果它為TRUE,表還有數據,那么直接去讀;
否則調用WaitForMultipleObjects等待內核事件;
[cpp] view plaincopy
?
獲得包和數據包的狀態
[cpp] view plaincopy
?
?
?
?
二、總結:
1、原子操作
通過原子操作能保證在多線程時保證得調用完Start,才能使用Listen和Stop,起到的作用與關鍵代碼類似。
(1)在Start開始時:
EHS_INITIALIZING為1;
EHS_NOT_INITIALIZED為0;
[plain] view plaincopyg_lHooked最開始為0,上面的代碼后g_lHooked為? 1? ;
(2)在Start結束時:
[cpp] view plaincopy
EHS_FUNCTIONING為 2 ;
(3)在Stop里:?
EHS_FUNCTIONING 為 2;
EHS_STOPPING 為 3 ;
[cpp] view plaincopy因為經過了Start 的結束后g_lHooked為 2 ; 所以經過上面的代碼后g_lHooked 為? 3 ;
1、InterlockedCompareExchange
InterlockedCompareExchange屬于Interlocked系列互鎖函數之一,常用于多線程編程。
類似的還有下面的幾個:
//增減
(1) LONG InterlockedIncrement(IN OUT LONG volatile *lpAddend);
lpAddend為長整型變量的地址,返回值為原始值。這個函數的主要作用是原子性自增(相當于++操作)。
(2) LONG InterlockedDecrement(IN OUT LONG volatile *lpAddend);
lpAddend為長整型變量的地址,返回值為原始值。這個函數的主要作用是原子性自減(相當于--操作)。
(3) LONG InterlockedExchangeAdd ( LPLONG Addend, LONG Increment );
Addend為長整型變量的地址,Increment為想要在Addend指向的長整型變量上增加的數值(可以是負數)。這個函數的主要作用是保證這個加操作為一個原子訪問。
//交換
(4) LONG InterlockedExchange( LPLONG Target, LONG Value );
用第二個參數的值取代第一個參數指向的值。函數返回值為原始值。
(5) PVOID InterlockedExchangePointer( PVOID *Target, PVOID Value );
用第二個參數的值取代第一個參數指向的值。函數返回值為原始值。
????? //比較交換
(6) LONG InterlockedCompareExchange( LPLONG Destination, LONG Exchange, LONG Comperand );
如果第三個參數與第一個參數指向的值相同,那么用第二個參數取代第一個參數指向的值。函數返回值為原始值。
(7) PVOID InterlockedCompareExchangePointer ( PVOID *Destination, PVOID Exchange, PVOID Comperand );
如果第三個參數與第一個參數指向的值相同,那么用第二個參數取代第一個參數指向的值。函數返回值為原始值。
總結
以上是生活随笔為你收集整理的NDIS网络数据监控程序NDISMonitor(2)-----驱动与应用的中间层NdisHook的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 目标检测和图像分割常用的标注工具
- 下一篇: Ubuntu下打开.avi文件