日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NDIS网络数据监控程序NDISMonitor(2)-----驱动与应用的中间层NdisHook

發布時間:2024/3/24 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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
  • HANDLE??????vhHandles[]?=?{?g_hKernelEvent,?g_hExitFromThread?};??
  • ??
  • ????????DWORD???????dwWaitRes?=?g_hsPrevStats.bArePacketsRemaining???WAIT_OBJECT_0?:??
  • ????????????::WaitForMultipleObjects(?2,?vhHandles,?FALSE,?INFINITE?);??

  • ?

    獲得包和數據包的狀態

    [cpp] view plaincopy
  • DWORD???????dwBytesReturned?=?0;??
  • ????????????BOOL????????bIoctlRes?=?::DeviceIoControl(?g_hDevice,?IOCTL_VPCKNT_GET_NEXT_PACKET,??
  • ????????????????NULL,?0,??
  • ????????????????g_pbStorage,?MACRO_STORAGE_BUFFER_SIZE,??
  • ????????????????&?dwBytesReturned,?NULL?);??
  • ??
  • ????????????if?(?bIoctlRes?!=?FALSE?&&?dwBytesReturned?!=?0?)??
  • ????????????{??
  • ????????????????//?allocate?the?packet?memory.??
  • ??
  • ????????????????BYTE*???????????pb?=?(BYTE*)?::malloc(?dwBytesReturned?);??
  • ????????????????if?(?pb?==?NULL?)??
  • ????????????????????return?FALSE;??
  • ????????????????else??
  • ????????????????????::memcpy(?pb,?g_pbStorage,?dwBytesReturned?);??
  • ??
  • ????????????????//?return.??
  • ??
  • ????????????????g_hsPrevStats?=?*?(HOOK_STATS*)?pb;??
  • ??
  • ????????????????if?(?psStats?)??
  • ????????????????????*?psStats?=?*?(HOOK_STATS*)?pb;??
  • ??
  • ????????????????*?pppPacketPtr?=?(PNEXT_PACKET)?(?pb?+?sizeof(?HOOK_STATS?)?);??

  • ?

    ?

    ?

    ?

    二、總結:

    1、原子操作

    通過原子操作能保證在多線程時保證得調用完Start,才能使用Listen和Stop,起到的作用與關鍵代碼類似。

    (1)在Start開始時:

    EHS_INITIALIZING為1;

    EHS_NOT_INITIALIZED為0;

    [plain] view plaincopy
  • LONG????????????prev?=?::InterlockedCompareExchange(?&?g_lHooked,?EHS_INITIALIZING,?EHS_NOT_INITIALIZED?);??
  • ????if?(?prev?!=?EHS_NOT_INITIALIZED?)??
  • ????????return?FALSE;??
  • g_lHooked最開始為0,上面的代碼后g_lHooked為? 1? ;

    (2)在Start結束時:

    [cpp] view plaincopy
  • g_lHooked?=?EHS_FUNCTIONING;??

  • EHS_FUNCTIONING為 2 ;

    (3)在Stop里:?

    EHS_FUNCTIONING 為 2;

    EHS_STOPPING 為 3 ;

    [cpp] view plaincopy
  • LONG????????????prev?=?::InterlockedCompareExchange(?&?g_lHooked,?EHS_STOPPING,?EHS_FUNCTIONING?);??
  • ????if?(?prev?!=?EHS_FUNCTIONING?)??
  • ????????return;??
  • 因為經過了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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。