pcap_wrapper.cpp 4.0 KB

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