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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

深度剖析WinPcap之(七)——获得与释放网络适配器设备列表(5)

發布時間:2023/12/20 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度剖析WinPcap之(七)——获得与释放网络适配器设备列表(5) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.4.2???????PacketGetAdapterNames函數

函數PacketGetAdapterNames獲取可用網絡適配器的一個列表與它們的描述。

參數pStr是用戶分配的字符串,用來存儲適配器的名稱。參數BufferSize是pStr所指緩沖區的長度。

如果函數失敗,該變量返回存儲適配器列表所需的字節數。如果函數成功,返回非0值。

如果返回值為0,BufferSize返回存儲適配器列表所需的字節數。

通常,這是第一個與驅動程序通信的函數。它返回系統上所安裝的WinPcap能支持的適配器名稱。在適配器的名稱之后,pStr包含一個字符串用對每一個適配器進行描述。在調用PacketGetAdapterNames函數后,pStr字符串的格式如下所示:

??一些數量的ASCII字符串,每個適配器的名稱之間由一個"\0"分開

??兩個"\0"

??許多ASCII字符串,之間由一個"\0"分隔,每一個描述一個對應適配器。描述的數量與名稱的數量一樣。第一個描述對應于第一個名稱,以此類推。

??兩個"\0"

?

packetNtx\Dll\Packet32.c:3616-3723

BOOLEAN PacketGetAdapterNames(PTSTR pStr,PULONG? BufferSize)

{

??? …

/*創建適配器鏈表*/

??? PacketPopulateAdaptersInfoList();

?

/*獲得g_AdaptersInfoMutex互斥信號*/

??? WaitForSingleObject(g_AdaptersInfoMutex, INFINITE);

?

??? if(!g_AdaptersInfoList)

??? {?? //失敗系統中沒有找到適配器,函數返回

??????? …

??? }

?

/*

*填充pStr中適配器的名稱與描述兩個列表

*/?

???

??? //第一次遍歷g_AdaptersInfoList,

//為了計算第二個列表開始的偏移與檢查緩沖區的大小

??? for (TAdInfo = g_AdaptersInfoList; TAdInfo != NULL;

TAdInfo = TAdInfo->Next)

??? {

??????? if(TAdInfo->Flags != INFO_FLAG_DONT_EXPORT)

??????? {

??????????? // 更新有關大小的變量值

??????????? SizeNeeded += (ULONG)strlen(TAdInfo->Name) +

?(ULONG)strlen(TAdInfo->Description) + 2;

??????????? SizeNames += (ULONG)strlen(TAdInfo->Name) + 1;

??????? }

??? }

?

//檢查緩沖區大小,以防緩沖區溢出。

//注意:需要2個額外的分隔符(兩個列表間一個’\0’,

//第二個列表結束時的一個’\0’

??? if(SizeNeeded + 2 > *BufferSize || pStr == NULL)

??? {

??????? ReleaseMutex(g_AdaptersInfoMutex); ????

??????? *BufferSize = SizeNeeded + 2;? //報告所需的緩沖區大小

??????? SetLastError(ERROR_INSUFFICIENT_BUFFER);

??????? return FALSE;

??? }

?

??? OffDescriptions = SizeNames + 1;//第二個列表開始的偏移

?

???

??? //第二次遍歷g_AdaptersInfoList,為了復制適配器的信息???

??? for(TAdInfo = g_AdaptersInfoList, SizeNames = 0, SizeDesc = 0;

?TAdInfo != NULL; TAdInfo = TAdInfo->Next)

??? {

??????? if(TAdInfo->Flags != INFO_FLAG_DONT_EXPORT)

??????? {

??????????? // 復制數據

??????????? StringCchCopyA( ((PCHAR)pStr) + SizeNames,

??????????????? *BufferSize - SizeNames, TAdInfo->Name);

??????????? StringCchCopyA( ((PCHAR)pStr) + OffDescriptions + SizeDesc,

??????????????? *BufferSize - OffDescriptions - SizeDesc,

??????????????? TAdInfo->Description);

?

??????????? // 更新有關大小的變量值

??????????? SizeNames += (ULONG)strlen(TAdInfo->Name) + 1;

??????????? SizeDesc += (ULONG)strlen(TAdInfo->Description) + 1;

??????? }

??? }

?

??? //分隔兩個列表

??? ((PCHAR)pStr)[SizeNames] = 0;

?

??? // 添加一個\0,結束列表

??? ((PCHAR)pStr)[SizeNeeded + 1] = 0;

?

//釋放g_AdaptersInfoMutex互斥信號

??? ReleaseMutex(g_AdaptersInfoMutex);

??? return TRUE;

}

函數首先調用PacketPopulateAdaptersInfoList()函數創建適配器鏈表g_AdaptersInfoList。接著開始給pStr中填充適配器的名稱與描述兩個列表,在填充的過程中,需要遍歷g_AdaptersInfoList兩次,第一次遍歷是為了計算第二個列表開始的偏移與檢查緩沖區的大小,第二次遍歷是為了復制適配器的名稱與描述信息。復制數據結束后,在兩個列表之間加入分隔符’\0’,并在第二個列表之后添加一個’\0’結束列表。

本文出自 “千江月” 博客,請務必保留此出處http://eslxf.blog.51cto.com/918801/198586

轉載于:https://blog.51cto.com/runhook/387402

總結

以上是生活随笔為你收集整理的深度剖析WinPcap之(七)——获得与释放网络适配器设备列表(5)的全部內容,希望文章能夠幫你解決所遇到的問題。

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