pcap_wrapper.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. {
  27. init_pcap_t()
  28. {
  29. init_pcap();
  30. }
  31. }do_it;
  32. static void init_npcap_dll_path()
  33. {
  34. BOOL(WINAPI *SetDllDirectory)(LPCTSTR);
  35. char sysdir_name[512];
  36. int len;
  37. SetDllDirectory = (BOOL(WINAPI *)(LPCTSTR)) GetProcAddress(GetModuleHandle("kernel32.dll"), "SetDllDirectoryA");
  38. if (SetDllDirectory == NULL) {
  39. printf("Error in SetDllDirectory\n");
  40. }
  41. else {
  42. len = GetSystemDirectory(sysdir_name, 480); // be safe
  43. if (!len)
  44. printf("Error in GetSystemDirectory (%d)\n", (int)GetLastError());
  45. strcat(sysdir_name, "\\Npcap");
  46. if (SetDllDirectory(sysdir_name) == 0)
  47. printf("Error in SetDllDirectory(\"System32\\Npcap\")\n");
  48. }
  49. }
  50. #define EXPORT_FUN(XXX) do{ XXX= (__typeof__(XXX)) GetProcAddress(wpcap, #XXX); }while(0)
  51. int init_pcap()
  52. {
  53. HMODULE wpcap=LoadLibrary("wpcap.dll");
  54. if(wpcap!=0)
  55. {
  56. printf("using system32/wpcap.dll\n");
  57. }
  58. else
  59. {
  60. init_npcap_dll_path();
  61. //SetDllDirectory("C:\\Windows\\System32\\Npcap\\");
  62. wpcap=LoadLibrary("wpcap.dll");
  63. if(wpcap!=0)
  64. printf("using system32/npcap/wpcap.dll\n");
  65. }
  66. if(wpcap==0)
  67. {
  68. printf("cant not open wpcap.dll, make sure winpcap/npcap is installed\n");
  69. exit(-1);
  70. }
  71. assert(wpcap!=0);
  72. EXPORT_FUN(pcap_loop);
  73. EXPORT_FUN(pcap_breakloop);
  74. EXPORT_FUN(pcap_create);
  75. EXPORT_FUN(pcap_set_snaplen);
  76. EXPORT_FUN(pcap_set_promisc);
  77. EXPORT_FUN(pcap_set_timeout);
  78. EXPORT_FUN(pcap_activate);
  79. EXPORT_FUN(pcap_setfilter);
  80. EXPORT_FUN(pcap_setdirection);
  81. EXPORT_FUN(pcap_datalink);
  82. EXPORT_FUN(pcap_freecode);
  83. EXPORT_FUN(pcap_compile);
  84. EXPORT_FUN(pcap_geterr);
  85. EXPORT_FUN(pcap_sendpacket);
  86. EXPORT_FUN(pcap_lookupdev);
  87. EXPORT_FUN(pcap_findalldevs);
  88. /*
  89. pcap_loop = (__typeof__(pcap_loop))GetProcAddress(wpcap, "pcap_loop");
  90. pcap_create = (__typeof__(pcap_create))GetProcAddress(wpcap, "pcap_create");
  91. pcap_set_snaplen = (__typeof__(pcap_set_snaplen))GetProcAddress(wpcap, "pcap_set_snaplen");
  92. pcap_set_promisc = (__typeof__(pcap_set_promisc))GetProcAddress(wpcap, "pcap_set_promisc");
  93. pcap_set_timeout = (__typeof__(pcap_set_timeout))GetProcAddress(wpcap, "pcap_set_timeout");
  94. pcap_activate = (__typeof__(pcap_activate))GetProcAddress(wpcap, "pcap_activate");
  95. pcap_setfilter = (__typeof__(pcap_setfilter))GetProcAddress(wpcap, "pcap_setfilter");
  96. pcap_setdirection = (__typeof__(pcap_setdirection))GetProcAddress(wpcap, "pcap_setdirection");
  97. pcap_datalink = (__typeof__(pcap_datalink))GetProcAddress(wpcap, "pcap_datalink");
  98. pcap_freecode = (__typeof__(pcap_freecode))GetProcAddress(wpcap, "pcap_freecode");
  99. pcap_compile = (__typeof__(pcap_compile))GetProcAddress(wpcap, "pcap_compile");
  100. pcap_geterr = (__typeof__(pcap_geterr))GetProcAddress(wpcap, "pcap_geterr");
  101. pcap_sendpacket = (__typeof__(pcap_sendpacket))GetProcAddress(wpcap, "pcap_sendpacket");
  102. pcap_lookupdev = (__typeof__(pcap_lookupdev))GetProcAddress(wpcap, "pcap_lookupdev");
  103. pcap_findalldevs = (__typeof__(pcap_findalldevs))GetProcAddress(wpcap, "pcap_findalldevs");
  104. //pcap_loop = (__typeof__(pcap_loop))GetProcAddress(wpcap, "pcap_loop");
  105. //pcap_loop = (__typeof__(pcap_loop))GetProcAddress(wpcap, "pcap_loop");
  106. //pcap_loop = (__typeof__(pcap_loop))GetProcAddress(wpcap, "pcap_loop");
  107. */
  108. return 0;
  109. }