深度剖析WinPcap之(七)——获得与释放网络适配器设备列表(5)
生活随笔
收集整理的這篇文章主要介紹了
深度剖析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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PON的技术优势及前景应用
- 下一篇: Orion Network Perfor