Windows环境下libpcap无法正常工作的问题排查求助
在Windows 11系统中,使用MSYS2编译的MinGW GCC编译器,尝试通过libpcap和Npcap实现简单实时抓包已耗时两天,遇到以下情况:
- 通过pacman安装并链接了libpcap,Npcap安装时勾选了无线支持、环回驱动、LWF、带无线支持的LWF以及WFP调用驱动(通过NPFInstall.exe),Npcap服务正常运行,Wireshark可正常抓包
- Wi-Fi网卡不支持监听模式,无法通过WlanHelper.exe尝试该模式
测试代码及报错
初始抓包代码
#include <stdio.h> #include <stdlib.h> #include <pcap.h> static void init_npcap_dll_path () { BOOL(WINAPI *SetDllDirectory)(LPCTSTR); char sysdir_name[512]; int len; SetDllDirectory = (BOOL(WINAPI *)(LPCTSTR)) GetProcAddress(GetModuleHandle("kernel32.dll"), "SetDllDirectoryA"); if(SetDllDirectory == NULL) { printf("Error in SetDllDirectory\n"); } else { len = GetSystemDirectory(sysdir_name, 480); if(!len) printf("Error in GetSystemDirectory (%d)\n", GetLastError()); strcat(sysdir_name, "\\Npcap"); if(SetDllDirectory(sysdir_name) == 0) printf("Error in SetDllDirectory(\"System32\\Npcap\")\n"); } } int main (void) { /* No error here: */ init_npcap_dll_path(); /* Modules were loaded successfully */ HMODULE lib1 = LoadLibrary("wpcap"); HMODULE lib2 = LoadLibrary("Packet"); char errbuf[PCAP_ERRBUF_SIZE]; char *dev = "\\Device\\NPF_{B4B56B26-D9F1-49CF-831F-DD58B7DA5ACC}"; //char *dev = "b4b56b26-d9f1-49cf-831f-dd58b7da5acc"; /* Tried this as well */ pcap_t* handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf); if(handle == NULL) { fprintf(stderr, "Could not open device %s: %s\n", dev, errbuf); return 2; } return 0; }
运行后报错:live packet capture is not supported on this system
适配器查找代码
char *dev = pcap_lookupdev(errbuf); if(dev == NULL) { fprintf(stderr, "Couldn't find default device: %s\n", errbuf); return(2); }
错误信息:no suitable device found
已尝试操作
- 以管理员身份运行程序,无效
- 考虑过使用VS并隐式链接Npcap SDK的.lib文件,但不确定是否为正确方向
请问哪里操作出错了?
替换MSYS2的libpcap为Npcap官方SDK
MSYS2自带的libpcap多是针对WinPcap编译的,和Npcap兼容性较差。直接下载Npcap官方SDK,编译时指定链接Npcap提供的libwpcap.a(MinGW版本),同时确保程序能访问C:\Windows\System32\Npcap下的wpcap.dll和Packet.dll。不要硬编码设备路径,改用枚举方式
硬编码的设备路径可能因系统或Npcap版本变化失效,且MinGW的路径处理逻辑和VS有差异。使用pcap_findalldevs枚举所有可用设备,从中选择目标设备,能确保拿到正确的设备名称。调整MinGW编译参数
编译时需指定Npcap SDK的头文件路径和库路径,同时链接对应库,示例命令(以64位系统为例):
gcc your_code.c -o your_program -I"D:\npcap-sdk\Include" -L"D:\npcap-sdk\Lib\x64" -lwpcap -lPacket
注意替换为你实际的SDK路径,并匹配系统位数(x86/x64)。
检查Npcap安装设置
安装Npcap时务必勾选「兼容WinPcap API」选项,提升对libpcap代码的兼容性。同时确认Npcap服务(Npcap Packet Driver)处于正常运行状态,可通过服务管理器查看。删除冗余的手动DLL加载代码
代码中手动加载wpcap和PacketDLL的操作完全多余,链接器会自动处理库文件的加载。删除这部分代码可避免库版本不匹配的问题。
内容的提问来源于stack exchange,提问作者Edenia

