pcap_wrapper.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include <windows.h>
  2. #include <pcap_wrapper.h>
  3. #include <assert.h>
  4. #include <stdio.h>
  5. int (*pcap_loop)(pcap_t *, int, pcap_handler, u_char *);
  6. int (*pcap_breakloop)(pcap_t *);
  7. pcap_t *(*pcap_create)(const char *, char *);
  8. int (*pcap_set_snaplen)(pcap_t *, int) = 0;
  9. int (*pcap_set_promisc)(pcap_t *, int) = 0;
  10. int (*pcap_can_set_rfmon)(pcap_t *) = 0;
  11. int (*pcap_set_rfmon)(pcap_t *, int) = 0;
  12. int (*pcap_set_timeout)(pcap_t *, int) = 0;
  13. int (*pcap_set_buffer_size)(pcap_t *, int) = 0;
  14. int (*pcap_activate)(pcap_t *) = 0;
  15. int (*pcap_setfilter)(pcap_t *, struct bpf_program *) = 0;
  16. int (*pcap_setdirection)(pcap_t *, pcap_direction_t) = 0;
  17. int (*pcap_datalink)(pcap_t *) = 0;
  18. void (*pcap_freecode)(struct bpf_program *) = 0;
  19. int (*pcap_compile)(pcap_t *, struct bpf_program *, const char *, int,
  20. bpf_u_int32) = 0;
  21. char *(*pcap_geterr)(pcap_t *) = 0;
  22. int (*pcap_sendpacket)(pcap_t *, const u_char *, int) = 0;
  23. char *(*pcap_lookupdev)(char *) = 0;
  24. int (*pcap_findalldevs)(pcap_if_t **, char *) = 0;
  25. struct init_pcap_t {
  26. init_pcap_t() {
  27. init_pcap();
  28. }
  29. } do_it;
  30. static void init_npcap_dll_path() {
  31. BOOL(WINAPI * SetDllDirectory)
  32. (LPCTSTR);
  33. char sysdir_name[512];
  34. int len;
  35. SetDllDirectory = (BOOL(WINAPI *)(LPCTSTR))GetProcAddress(GetModuleHandle("kernel32.dll"), "SetDllDirectoryA");
  36. if (SetDllDirectory == NULL) {
  37. printf("Error in SetDllDirectory\n");
  38. } else {
  39. len = GetSystemDirectory(sysdir_name, 480); // be safe
  40. if (!len)
  41. printf("Error in GetSystemDirectory (%d)\n", (int)GetLastError());
  42. strcat(sysdir_name, "\\Npcap");
  43. if (SetDllDirectory(sysdir_name) == 0)
  44. printf("Error in SetDllDirectory(\"System32\\Npcap\")\n");
  45. }
  46. }
  47. #define EXPORT_FUN(XXX) \
  48. do { \
  49. XXX = (__typeof__(XXX))GetProcAddress(wpcap, #XXX); \
  50. } while (0)
  51. int init_pcap() {
  52. HMODULE wpcap = LoadLibrary("wpcap.dll");
  53. if (wpcap != 0) {
  54. printf("using system32/wpcap.dll\n");
  55. } else {
  56. init_npcap_dll_path();
  57. // SetDllDirectory("C:\\Windows\\System32\\Npcap\\");
  58. wpcap = LoadLibrary("wpcap.dll");
  59. if (wpcap != 0)
  60. printf("using system32/npcap/wpcap.dll\n");
  61. }
  62. if (wpcap == 0) {
  63. printf("cant not open wpcap.dll, make sure winpcap/npcap is installed\n");
  64. exit(-1);
  65. }
  66. assert(wpcap != 0);
  67. EXPORT_FUN(pcap_loop);
  68. EXPORT_FUN(pcap_breakloop);
  69. EXPORT_FUN(pcap_create);
  70. EXPORT_FUN(pcap_set_snaplen);
  71. EXPORT_FUN(pcap_set_promisc);
  72. EXPORT_FUN(pcap_set_timeout);
  73. EXPORT_FUN(pcap_activate);
  74. EXPORT_FUN(pcap_setfilter);
  75. EXPORT_FUN(pcap_setdirection);
  76. EXPORT_FUN(pcap_datalink);
  77. EXPORT_FUN(pcap_freecode);
  78. EXPORT_FUN(pcap_compile);
  79. EXPORT_FUN(pcap_geterr);
  80. EXPORT_FUN(pcap_sendpacket);
  81. EXPORT_FUN(pcap_lookupdev);
  82. EXPORT_FUN(pcap_findalldevs);
  83. /*
  84. pcap_loop = (__typeof__(pcap_loop))GetProcAddress(wpcap, "pcap_loop");
  85. pcap_create = (__typeof__(pcap_create))GetProcAddress(wpcap, "pcap_create");
  86. pcap_set_snaplen = (__typeof__(pcap_set_snaplen))GetProcAddress(wpcap, "pcap_set_snaplen");
  87. pcap_set_promisc = (__typeof__(pcap_set_promisc))GetProcAddress(wpcap, "pcap_set_promisc");
  88. pcap_set_timeout = (__typeof__(pcap_set_timeout))GetProcAddress(wpcap, "pcap_set_timeout");
  89. pcap_activate = (__typeof__(pcap_activate))GetProcAddress(wpcap, "pcap_activate");
  90. pcap_setfilter = (__typeof__(pcap_setfilter))GetProcAddress(wpcap, "pcap_setfilter");
  91. pcap_setdirection = (__typeof__(pcap_setdirection))GetProcAddress(wpcap, "pcap_setdirection");
  92. pcap_datalink = (__typeof__(pcap_datalink))GetProcAddress(wpcap, "pcap_datalink");
  93. pcap_freecode = (__typeof__(pcap_freecode))GetProcAddress(wpcap, "pcap_freecode");
  94. pcap_compile = (__typeof__(pcap_compile))GetProcAddress(wpcap, "pcap_compile");
  95. pcap_geterr = (__typeof__(pcap_geterr))GetProcAddress(wpcap, "pcap_geterr");
  96. pcap_sendpacket = (__typeof__(pcap_sendpacket))GetProcAddress(wpcap, "pcap_sendpacket");
  97. pcap_lookupdev = (__typeof__(pcap_lookupdev))GetProcAddress(wpcap, "pcap_lookupdev");
  98. pcap_findalldevs = (__typeof__(pcap_findalldevs))GetProcAddress(wpcap, "pcap_findalldevs");
  99. //pcap_loop = (__typeof__(pcap_loop))GetProcAddress(wpcap, "pcap_loop");
  100. //pcap_loop = (__typeof__(pcap_loop))GetProcAddress(wpcap, "pcap_loop");
  101. //pcap_loop = (__typeof__(pcap_loop))GetProcAddress(wpcap, "pcap_loop");
  102. */
  103. return 0;
  104. }