// 所有原创文章转载请注明作者及链接// blackboycpp(AT)gmail.com// QQ群: 135202158
环境: windows xp sp3, visual studio 2010, wireshark-1.0.0, wireshark-1.0.0源代码,gtk+-bundle_2.16.6-20100207_win32(开发包,包括glib,gtk+,gdk等等)
WIN32版的wireshark根目录下有一个libwireshark.dll, 此DLL封装了wireshark大部分功能函数(个人见解)。用Dependency Walker打开,如下图所示:
我们可以动态加载此DLL,并使用其中导出的函数。
我做了一个小试验,导出其中的一个简单函数val_to_str(), 此函数位于源代码目录:/epan/value_string.c,原型为const gchar* val_to_str(guint32 val, const value_string *vs, const char *fmt)
用Visual Studio建立一个Win32控制台项目,并添加glib编译的支持,相关设置可见http://blog.csdn.net/owe/archive/2007/05/10/1603744.aspx
以下是试验工程的主要源代码:
#include "stdafx.h" #include <glib.h> /* 此结构取自于源码:wireshark-1.0.0/epan/value_string.h */ typedef struct _value_string { guint32 value; const gchar *strptr; } value_string; const value_string vs[] = { {1, "aaa"}, {2, "bbb"}, {3, "ccc"} }; const value_string* vs2 = NULL; typedef void (*f_ep_init_chunk) (void); typedef void (*f_ep_free_all) (void); typedef const gchar* (*f_val_to_str)(guint32 val, const value_string *vs, const char *fmt); int _tmain(int argc, _TCHAR* argv[]) { HINSTANCE hDLL; f_ep_init_chunk ep_init_chunk; f_ep_free_all ep_free_all; f_val_to_str val_to_str; const gchar *ret; hDLL = ::LoadLibrary(_T("C://Program Files//Wireshark//libwireshark.dll")); if(!hDLL) { printf("Can't load DLL!/n"); } else { ep_init_chunk = (f_ep_init_chunk)::GetProcAddress(hDLL, "ep_init_chunk"); ep_free_all = (f_ep_free_all)::GetProcAddress(hDLL, "ep_free_all"); val_to_str = (f_val_to_str)::GetProcAddress(hDLL, "val_to_str"); if(!hDLL) { ::FreeLibrary(hDLL); printf("Can't get function!/n"); } else { printf("Function is ready!/n"); ep_init_chunk(); /*ret = val_to_str(2, vs, "msg - %d");*/ ret = val_to_str(2, vs2, "msg - %d"); printf("%s/n", ret); ep_free_all(); } } system("PAUSE"); return 0; }
需要注意的是当val_to_str()函数的第2个参数为NULL指针的时候,不加ep_init_chunk()会出错,因为那种情况下会调用epan/emem.c中的某些函数来动态分配内存,而在调用这些函数之前,必须先用ep_init_chunk()进行初始化,最后用ep_free_all()清理(这是wireshark自己的内存管理机制emem.h/.c)。所以说仔细阅读源码还是必要的。
调试的话,加断点就行了。调试过程中,如果问你要某个源代码,你找到相应的wireshark源码就行了,visual C++会进行定位。
编译生成后,将生成的exe拷贝到wireshark的根目录下,执行即可。把wireshark根目录加到PATH环境变量都不行,老报找不到某个DLL。