Home | History | Annotate | Download | only in modules
      1 # Original license
      2 #-------------------------------------------------------------------------------
      3 # Name:        winpcapy.py
      4 #
      5 # Author:      Massimo Ciani
      6 #
      7 # Created:     01/09/2009
      8 # Copyright:   (c) Massimo Ciani 2009
      9 #
     10 #-------------------------------------------------------------------------------
     11 # Modified for scapy's usage
     12 
     13 ## This file is part of Scapy
     14 ## See http://www.secdev.org/projects/scapy for more informations
     15 ## This program is published under a GPLv2 license
     16 
     17 from ctypes import *
     18 from ctypes.util import find_library
     19 import sys, os
     20 from scapy.consts import WINDOWS
     21 
     22 HAVE_REMOTE=False
     23 
     24 if WINDOWS:
     25     HAVE_REMOTE=True
     26     SOCKET = c_uint
     27     npcap_folder = os.environ["WINDIR"] + "\\System32\\Npcap"
     28     if os.path.exists(npcap_folder):
     29         # Try to load npcap
     30         os.environ['PATH'] = npcap_folder + ";" + os.environ['PATH']
     31     del npcap_folder
     32     _lib=CDLL("wpcap.dll")
     33 else:
     34     SOCKET = c_int
     35     _lib_name = find_library("pcap")
     36     if not _lib_name:
     37         raise OSError("Cannot fine libpcap.so library")
     38     _lib=CDLL(_lib_name)
     39     
     40 
     41 ##
     42 ## misc
     43 ##
     44 u_short = c_ushort
     45 bpf_int32 = c_int
     46 u_int = c_int
     47 bpf_u_int32 = u_int
     48 pcap = c_void_p
     49 pcap_dumper = c_void_p
     50 u_char = c_ubyte
     51 FILE = c_void_p
     52 STRING = c_char_p
     53 
     54 class bpf_insn(Structure):
     55     _fields_=[("code",c_ushort),
     56               ("jt",c_ubyte),
     57               ("jf",c_ubyte),
     58               ("k",bpf_u_int32)]
     59     
     60 class bpf_program(Structure):
     61     pass
     62 bpf_program._fields_ = [('bf_len', u_int),
     63                         ('bf_insns', POINTER(bpf_insn))]
     64 
     65 class bpf_version(Structure):
     66     _fields_=[("bv_major",c_ushort),
     67               ("bv_minor",c_ushort)]
     68 
     69 
     70 class timeval(Structure):
     71     pass
     72 timeval._fields_ = [('tv_sec', c_long),
     73                     ('tv_usec', c_long)]
     74 
     75 ## sockaddr is used by pcap_addr.
     76 ## For example if sa_family==socket.AF_INET then we need cast
     77 ## with sockaddr_in 
     78 if WINDOWS:
     79     class sockaddr(Structure):
     80         _fields_ = [("sa_family", c_ushort),
     81                     ("sa_data",c_ubyte * 14)]
     82 
     83     class sockaddr_in(Structure):
     84         _fields_ = [("sin_family", c_ushort),
     85                     ("sin_port", c_uint16),
     86                     ("sin_addr", 4 * c_ubyte)]
     87 
     88     class sockaddr_in6(Structure):
     89         _fields_ = [("sin6_family", c_ushort),
     90                     ("sin6_port", c_uint16),
     91                     ("sin6_flowinfo", c_uint32),
     92                     ("sin6_addr", 16 * c_ubyte),
     93                     ("sin6_scope", c_uint32)]
     94 else:
     95     class sockaddr(Structure):
     96         _fields_ = [("sa_len", c_ubyte),
     97                     ("sa_family",c_ubyte),
     98                     ("sa_data",c_ubyte * 14)]
     99 
    100     class sockaddr_in(Structure):
    101         _fields_ = [("sin_len", c_ubyte),
    102                     ("sin_family", c_ubyte),
    103                     ("sin_port", c_uint16),
    104                     ("sin_addr", 4 * c_ubyte),
    105                     ("sin_zero", 8 * c_char)]
    106 
    107     class sockaddr_in6(Structure):
    108         _fields_ = [("sin6_len", c_ubyte),
    109                     ("sin6_family", c_ubyte),
    110                     ("sin6_port", c_uint16),
    111                     ("sin6_flowinfo", c_uint32),
    112                     ("sin6_addr", 16 * c_ubyte),
    113                     ("sin6_scope", c_uint32)]
    114 
    115     class sockaddr_dl(Structure):
    116         _fields_ = [("sdl_len", c_ubyte),
    117                     ("sdl_family", c_ubyte),
    118                     ("sdl_index", c_ushort),
    119                     ("sdl_type", c_ubyte),
    120                     ("sdl_nlen", c_ubyte),
    121                     ("sdl_alen", c_ubyte),
    122                     ("sdl_slen", c_ubyte),
    123                     ("sdl_data", 46 * c_ubyte)]
    124 ##
    125 ## END misc
    126 ##
    127 
    128 ##
    129 ## Data Structures
    130 ##
    131 
    132 ## struct   pcap_file_header
    133 ##  Header of a libpcap dump file.
    134 class pcap_file_header(Structure):
    135     _fields_ = [('magic', bpf_u_int32),
    136                 ('version_major', u_short),
    137                 ('version_minor', u_short),
    138                 ('thiszone', bpf_int32),
    139                 ('sigfigs', bpf_u_int32),
    140                 ('snaplen', bpf_u_int32),
    141                 ('linktype', bpf_u_int32)]
    142 
    143 ## struct   pcap_pkthdr
    144 ##  Header of a packet in the dump file.
    145 class pcap_pkthdr(Structure):
    146     _fields_ = [('ts', timeval),
    147                 ('caplen', bpf_u_int32),
    148                 ('len', bpf_u_int32)]
    149 
    150 ## struct   pcap_stat
    151 ##  Structure that keeps statistical values on an interface.
    152 class pcap_stat(Structure):
    153     pass
    154 ### _fields_ list in Structure is final.
    155 ### We need a temp list
    156 _tmpList = [("ps_recv", c_uint), ("ps_drop", c_uint), ("ps_ifdrop", c_uint)]
    157 if HAVE_REMOTE:
    158     _tmpList.append(("ps_capt",c_uint))
    159     _tmpList.append(("ps_sent",c_uint))
    160     _tmpList.append(("ps_netdrop",c_uint))
    161 pcap_stat._fields_=_tmpList
    162 
    163 ## struct   pcap_addr
    164 ##  Representation of an interface address, used by pcap_findalldevs().
    165 class pcap_addr(Structure):
    166     pass
    167 pcap_addr._fields_ = [('next', POINTER(pcap_addr)),
    168                       ('addr', POINTER(sockaddr)),
    169                       ('netmask', POINTER(sockaddr)),
    170                       ('broadaddr', POINTER(sockaddr)),
    171                       ('dstaddr', POINTER(sockaddr))]
    172 
    173 ## struct   pcap_if
    174 ##  Item in a list of interfaces, used by pcap_findalldevs().
    175 class pcap_if(Structure):
    176     pass
    177 pcap_if._fields_ = [('next', POINTER(pcap_if)),
    178                     ('name', STRING),
    179                     ('description', STRING),
    180                     ('addresses', POINTER(pcap_addr)),
    181                     ('flags', bpf_u_int32)]
    182 
    183 ##
    184 ## END Data Structures
    185 ##
    186 
    187 ##
    188 ## Defines
    189 ##
    190 
    191 ##define  PCAP_VERSION_MAJOR   2
    192 #   Major libpcap dump file version.
    193 PCAP_VERSION_MAJOR = 2 
    194 ##define  PCAP_VERSION_MINOR   4
    195 #   Minor libpcap dump file version.
    196 PCAP_VERSION_MINOR = 4 
    197 ##define  PCAP_ERRBUF_SIZE   256
    198 #   Size to use when allocating the buffer that contains the libpcap errors.
    199 PCAP_ERRBUF_SIZE = 256 
    200 ##define  PCAP_IF_LOOPBACK   0x00000001
    201 #   interface is loopback
    202 PCAP_IF_LOOPBACK = 1 
    203 ##define  MODE_CAPT   0
    204 #   Capture mode, to be used when calling pcap_setmode().
    205 MODE_CAPT = 0
    206 ##define  MODE_STAT   1
    207 #   Statistical mode, to be used when calling pcap_setmode().
    208 MODE_STAT = 1
    209 
    210 ##
    211 ## END Defines
    212 ##
    213 
    214 ##
    215 ## Typedefs
    216 ##
    217 
    218 #typedef int  bpf_int32 (already defined)
    219 #   32-bit integer
    220 #typedef u_int  bpf_u_int32 (already defined)
    221 #   32-bit unsigned integer
    222 #typedef struct pcap  pcap_t
    223 #   Descriptor of an open capture instance. This structure is opaque to the user, that handles its content through the functions provided by wpcap.dll.
    224 pcap_t = pcap
    225 #typedef struct pcap_dumper   pcap_dumper_t
    226 #   libpcap savefile descriptor.
    227 pcap_dumper_t = pcap_dumper
    228 #typedef struct pcap_if   pcap_if_t
    229 #   Item in a list of interfaces, see pcap_if.
    230 pcap_if_t = pcap_if
    231 #typedef struct pcap_addr   pcap_addr_t
    232 #   Representation of an interface address, see pcap_addr.
    233 pcap_addr_t = pcap_addr
    234 
    235 ##
    236 ## END Typedefs
    237 ##
    238 
    239 
    240 
    241 
    242 
    243 # values for enumeration 'pcap_direction_t'
    244 #pcap_direction_t = c_int # enum
    245 
    246 ##
    247 ## Unix-compatible Functions
    248 ## These functions are part of the libpcap library, and therefore work both on Windows and on Linux. 
    249 ##
    250 
    251 #typedef void(* pcap_handler )(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data)
    252 #   Prototype of the callback function that receives the packets.
    253 ## This one is defined from programmer
    254 pcap_handler=CFUNCTYPE(None,POINTER(c_ubyte),POINTER(pcap_pkthdr),POINTER(c_ubyte))
    255 
    256 #pcap_t *   pcap_open_live (const char *device, int snaplen, int promisc, int to_ms, char *ebuf)
    257 #   Open a live capture from the network.
    258 pcap_open_live = _lib.pcap_open_live
    259 pcap_open_live.restype = POINTER(pcap_t)
    260 pcap_open_live.argtypes = [STRING, c_int, c_int, c_int, STRING]
    261 
    262 #pcap_t *   pcap_open_dead (int linktype, int snaplen)
    263 #   Create a pcap_t structure without starting a capture.
    264 pcap_open_dead = _lib.pcap_open_dead
    265 pcap_open_dead.restype = POINTER(pcap_t)
    266 pcap_open_dead.argtypes = [c_int, c_int]
    267 
    268 #pcap_t *   pcap_open_offline (const char *fname, char *errbuf)
    269 #   Open a savefile in the tcpdump/libpcap format to read packets.
    270 pcap_open_offline = _lib.pcap_open_offline
    271 pcap_open_offline.restype = POINTER(pcap_t)
    272 pcap_open_offline.argtypes = [STRING, STRING]
    273 
    274 #pcap_dumper_t *   pcap_dump_open (pcap_t *p, const char *fname)
    275 #   Open a file to write packets.
    276 pcap_dump_open = _lib.pcap_dump_open
    277 pcap_dump_open.restype = POINTER(pcap_dumper_t)
    278 pcap_dump_open.argtypes = [POINTER(pcap_t), STRING]
    279 
    280 #int pcap_setnonblock (pcap_t *p, int nonblock, char *errbuf)
    281 #   Switch between blocking and nonblocking mode.
    282 pcap_setnonblock = _lib.pcap_setnonblock
    283 pcap_setnonblock.restype = c_int
    284 pcap_setnonblock.argtypes = [POINTER(pcap_t), c_int, STRING]
    285 
    286 #int pcap_getnonblock (pcap_t *p, char *errbuf)
    287 #   Get the "non-blocking" state of an interface.
    288 pcap_getnonblock = _lib.pcap_getnonblock
    289 pcap_getnonblock.restype = c_int
    290 pcap_getnonblock.argtypes = [POINTER(pcap_t), STRING]
    291 
    292 #int pcap_findalldevs (pcap_if_t **alldevsp, char *errbuf)
    293 #   Construct a list of network devices that can be opened with pcap_open_live().
    294 pcap_findalldevs = _lib.pcap_findalldevs
    295 pcap_findalldevs.restype = c_int
    296 pcap_findalldevs.argtypes = [POINTER(POINTER(pcap_if_t)), STRING]
    297 
    298 #void pcap_freealldevs (pcap_if_t *alldevsp)
    299 #   Free an interface list returned by pcap_findalldevs().
    300 pcap_freealldevs = _lib.pcap_freealldevs
    301 pcap_freealldevs.restype = None
    302 pcap_freealldevs.argtypes = [POINTER(pcap_if_t)]
    303 
    304 #char *   pcap_lookupdev (char *errbuf)
    305 #   Return the first valid device in the system.
    306 pcap_lookupdev = _lib.pcap_lookupdev
    307 pcap_lookupdev.restype = STRING
    308 pcap_lookupdev.argtypes = [STRING]
    309 
    310 #int pcap_lookupnet (const char *device, bpf_u_int32 *netp, bpf_u_int32 *maskp, char *errbuf)
    311 #   Return the subnet and netmask of an interface.
    312 pcap_lookupnet = _lib.pcap_lookupnet
    313 pcap_lookupnet.restype = c_int
    314 pcap_lookupnet.argtypes = [STRING, POINTER(bpf_u_int32), POINTER(bpf_u_int32), STRING]
    315 
    316 #int pcap_dispatch (pcap_t *p, int cnt, pcap_handler callback, u_char *user)
    317 #   Collect a group of packets.
    318 pcap_dispatch = _lib.pcap_dispatch
    319 pcap_dispatch.restype = c_int
    320 pcap_dispatch.argtypes = [POINTER(pcap_t), c_int, pcap_handler, POINTER(u_char)]
    321 
    322 #int pcap_loop (pcap_t *p, int cnt, pcap_handler callback, u_char *user)
    323 #   Collect a group of packets.
    324 pcap_loop = _lib.pcap_loop
    325 pcap_loop.restype = c_int
    326 pcap_loop.argtypes = [POINTER(pcap_t), c_int, pcap_handler, POINTER(u_char)]
    327 
    328 #u_char *   pcap_next (pcap_t *p, struct pcap_pkthdr *h)
    329 #   Return the next available packet.
    330 pcap_next = _lib.pcap_next
    331 pcap_next.restype = POINTER(u_char)
    332 pcap_next.argtypes = [POINTER(pcap_t), POINTER(pcap_pkthdr)]
    333 
    334 #int pcap_next_ex (pcap_t *p, struct pcap_pkthdr **pkt_header, const u_char **pkt_data)
    335 #   Read a packet from an interface or from an offline capture.
    336 pcap_next_ex = _lib.pcap_next_ex
    337 pcap_next_ex.restype = c_int
    338 pcap_next_ex.argtypes = [POINTER(pcap_t), POINTER(POINTER(pcap_pkthdr)), POINTER(POINTER(u_char))]
    339 
    340 #void pcap_breakloop (pcap_t *)
    341 #   set a flag that will force pcap_dispatch() or pcap_loop() to return rather than looping.
    342 pcap_breakloop = _lib.pcap_breakloop
    343 pcap_breakloop.restype = None
    344 pcap_breakloop.argtypes = [POINTER(pcap_t)]
    345 
    346 #int pcap_sendpacket (pcap_t *p, u_char *buf, int size)
    347 #   Send a raw packet.
    348 pcap_sendpacket = _lib.pcap_sendpacket
    349 pcap_sendpacket.restype = c_int
    350 #pcap_sendpacket.argtypes = [POINTER(pcap_t), POINTER(u_char), c_int]
    351 pcap_sendpacket.argtypes = [POINTER(pcap_t), c_void_p, c_int]
    352 
    353 #void pcap_dump (u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
    354 #   Save a packet to disk.
    355 pcap_dump = _lib.pcap_dump
    356 pcap_dump.restype = None
    357 pcap_dump.argtypes = [POINTER(pcap_dumper_t), POINTER(pcap_pkthdr), POINTER(u_char)]
    358 
    359 #long pcap_dump_ftell (pcap_dumper_t *)
    360 #   Return the file position for a "savefile".
    361 pcap_dump_ftell = _lib.pcap_dump_ftell
    362 pcap_dump_ftell.restype = c_long
    363 pcap_dump_ftell.argtypes = [POINTER(pcap_dumper_t)]
    364 
    365 #int pcap_compile (pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask)
    366 #   Compile a packet filter, converting an high level filtering expression (see Filtering expression syntax) in a program that can be interpreted by the kernel-level filtering engine.
    367 pcap_compile = _lib.pcap_compile
    368 pcap_compile.restype = c_int
    369 pcap_compile.argtypes = [POINTER(pcap_t), POINTER(bpf_program), STRING, c_int, bpf_u_int32]
    370 
    371 #int pcap_compile_nopcap (int snaplen_arg, int linktype_arg, struct bpf_program *program, char *buf, int optimize, bpf_u_int32 mask)
    372 #   Compile a packet filter without the need of opening an adapter. This function converts an high level filtering expression (see Filtering expression syntax) in a program that can be interpreted by the kernel-level filtering engine.
    373 pcap_compile_nopcap = _lib.pcap_compile_nopcap
    374 pcap_compile_nopcap.restype = c_int
    375 pcap_compile_nopcap.argtypes = [c_int, c_int, POINTER(bpf_program), STRING, c_int, bpf_u_int32]
    376 
    377 #int pcap_setfilter (pcap_t *p, struct bpf_program *fp)
    378 #   Associate a filter to a capture.
    379 pcap_setfilter = _lib.pcap_setfilter
    380 pcap_setfilter.restype = c_int
    381 pcap_setfilter.argtypes = [POINTER(pcap_t), POINTER(bpf_program)]
    382 
    383 #void pcap_freecode (struct bpf_program *fp)
    384 #   Free a filter.
    385 pcap_freecode = _lib.pcap_freecode
    386 pcap_freecode.restype = None
    387 pcap_freecode.argtypes = [POINTER(bpf_program)]
    388 
    389 #int pcap_datalink (pcap_t *p)
    390 #   Return the link layer of an adapter.
    391 pcap_datalink = _lib.pcap_datalink
    392 pcap_datalink.restype = c_int
    393 pcap_datalink.argtypes = [POINTER(pcap_t)]
    394 
    395 #int pcap_list_datalinks (pcap_t *p, int **dlt_buf)
    396 #   list datalinks
    397 pcap_list_datalinks = _lib.pcap_list_datalinks
    398 pcap_list_datalinks.restype = c_int
    399 #pcap_list_datalinks.argtypes = [POINTER(pcap_t), POINTER(POINTER(c_int))]
    400 
    401 #int pcap_set_datalink (pcap_t *p, int dlt)
    402 #   Set the current data link type of the pcap descriptor to the type specified by dlt. -1 is returned on failure.
    403 pcap_set_datalink = _lib.pcap_set_datalink
    404 pcap_set_datalink.restype = c_int
    405 pcap_set_datalink.argtypes = [POINTER(pcap_t), c_int]
    406 
    407 #int pcap_datalink_name_to_val (const char *name)
    408 #   Translates a data link type name, which is a DLT_ name with the DLT_ removed, to the corresponding data link type value. The translation is case-insensitive. -1 is returned on failure.
    409 pcap_datalink_name_to_val = _lib.pcap_datalink_name_to_val
    410 pcap_datalink_name_to_val.restype = c_int
    411 pcap_datalink_name_to_val.argtypes = [STRING]
    412 
    413 #const char *   pcap_datalink_val_to_name (int dlt)
    414 #   Translates a data link type value to the corresponding data link type name. NULL is returned on failure.
    415 pcap_datalink_val_to_name = _lib.pcap_datalink_val_to_name
    416 pcap_datalink_val_to_name.restype = STRING
    417 pcap_datalink_val_to_name.argtypes = [c_int]
    418 
    419 #const char *   pcap_datalink_val_to_description (int dlt)
    420 #   Translates a data link type value to a short description of that data link type. NULL is returned on failure.
    421 pcap_datalink_val_to_description = _lib.pcap_datalink_val_to_description
    422 pcap_datalink_val_to_description.restype = STRING
    423 pcap_datalink_val_to_description.argtypes = [c_int]
    424 
    425 #int pcap_snapshot (pcap_t *p)
    426 #   Return the dimension of the packet portion (in bytes) that is delivered to the application.
    427 pcap_snapshot = _lib.pcap_snapshot
    428 pcap_snapshot.restype = c_int
    429 pcap_snapshot.argtypes = [POINTER(pcap_t)]
    430 
    431 #int pcap_is_swapped (pcap_t *p)
    432 #   returns true if the current savefile uses a different byte order than the current system.
    433 pcap_is_swapped = _lib.pcap_is_swapped
    434 pcap_is_swapped.restype = c_int
    435 pcap_is_swapped.argtypes = [POINTER(pcap_t)]
    436 
    437 #int pcap_major_version (pcap_t *p)
    438 #   return the major version number of the pcap library used to write the savefile.
    439 pcap_major_version = _lib.pcap_major_version
    440 pcap_major_version.restype = c_int
    441 pcap_major_version.argtypes = [POINTER(pcap_t)]
    442 
    443 #int pcap_minor_version (pcap_t *p)
    444 #   return the minor version number of the pcap library used to write the savefile.
    445 pcap_minor_version = _lib.pcap_minor_version
    446 pcap_minor_version.restype = c_int
    447 pcap_minor_version.argtypes = [POINTER(pcap_t)]
    448 
    449 #FILE *   pcap_file (pcap_t *p)
    450 #   Return the standard stream of an offline capture.
    451 pcap_file=_lib.pcap_file
    452 pcap_file.restype = FILE
    453 pcap_file.argtypes = [POINTER(pcap_t)]
    454 
    455 #int pcap_stats (pcap_t *p, struct pcap_stat *ps)
    456 #   Return statistics on current capture.
    457 pcap_stats = _lib.pcap_stats
    458 pcap_stats.restype = c_int
    459 pcap_stats.argtypes = [POINTER(pcap_t), POINTER(pcap_stat)]
    460 
    461 #void pcap_perror (pcap_t *p, char *prefix)
    462 #   print the text of the last pcap library error on stderr, prefixed by prefix.
    463 pcap_perror = _lib.pcap_perror
    464 pcap_perror.restype = None
    465 pcap_perror.argtypes = [POINTER(pcap_t), STRING]
    466 
    467 #char *   pcap_geterr (pcap_t *p)
    468 #   return the error text pertaining to the last pcap library error.
    469 pcap_geterr = _lib.pcap_geterr
    470 pcap_geterr.restype = STRING
    471 pcap_geterr.argtypes = [POINTER(pcap_t)]
    472 
    473 #char *   pcap_strerror (int error)
    474 #   Provided in case strerror() isn't available.
    475 pcap_strerror = _lib.pcap_strerror
    476 pcap_strerror.restype = STRING
    477 pcap_strerror.argtypes = [c_int]
    478 
    479 #const char *   pcap_lib_version (void)
    480 #   Returns a pointer to a string giving information about the version of the libpcap library being used; note that it contains more information than just a version number.
    481 pcap_lib_version = _lib.pcap_lib_version
    482 pcap_lib_version.restype = STRING
    483 pcap_lib_version.argtypes = []
    484 
    485 #void pcap_close (pcap_t *p)
    486 #   close the files associated with p and deallocates resources.
    487 pcap_close = _lib.pcap_close
    488 pcap_close.restype = None
    489 pcap_close.argtypes = [POINTER(pcap_t)]
    490 
    491 #FILE *   pcap_dump_file (pcap_dumper_t *p)
    492 #   return the standard I/O stream of the 'savefile' opened by pcap_dump_open().
    493 pcap_dump_file=_lib.pcap_dump_file
    494 pcap_dump_file.restype=FILE
    495 pcap_dump_file.argtypes= [POINTER(pcap_dumper_t)]
    496 
    497 #int pcap_dump_flush (pcap_dumper_t *p)
    498 #   Flushes the output buffer to the ``savefile,'' so that any packets written with pcap_dump() but not yet written to the ``savefile'' will be written. -1 is returned on error, 0 on success.
    499 pcap_dump_flush = _lib.pcap_dump_flush
    500 pcap_dump_flush.restype = c_int
    501 pcap_dump_flush.argtypes = [POINTER(pcap_dumper_t)]
    502 
    503 #void pcap_dump_close (pcap_dumper_t *p)
    504 #   Closes a savefile. 
    505 pcap_dump_close = _lib.pcap_dump_close
    506 pcap_dump_close.restype = None
    507 pcap_dump_close.argtypes = [POINTER(pcap_dumper_t)]
    508 
    509 if not WINDOWS:
    510     #int pcap_get_selectable_fd(pcap_t, *p)
    511     #   Returns, on UNIX, a file descriptor number for a file descriptor on which one can do a select(), poll(). -1 is returned if no such descriptor exists.
    512     pcap_get_selectable_fd = _lib.pcap_get_selectable_fd
    513     pcap_get_selectable_fd.restype = c_int    
    514     pcap_get_selectable_fd.argtypes = [POINTER(pcap_t)]
    515 
    516 ###########################################
    517 ## Windows-specific Extensions
    518 ## The functions in this section extend libpcap to offer advanced functionalities
    519 ## (like remote packet capture, packet buffer size variation or high-precision packet injection).
    520 ## Howerver, at the moment they can be used only in Windows.
    521 ###########################################
    522 if WINDOWS:
    523     HANDLE = c_void_p
    524     
    525     ##############
    526     ## Identifiers related to the new source syntax
    527     ##############
    528     #define   PCAP_SRC_FILE   2
    529     #define   PCAP_SRC_IFLOCAL   3
    530     #define   PCAP_SRC_IFREMOTE   4
    531     #Internal representation of the type of source in use (file, remote/local interface).
    532     PCAP_SRC_FILE = 2
    533     PCAP_SRC_IFLOCAL = 3
    534     PCAP_SRC_IFREMOTE = 4
    535     
    536     ##############
    537     ## Strings related to the new source syntax
    538     ##############
    539     #define   PCAP_SRC_FILE_STRING   "file://"
    540     #define   PCAP_SRC_IF_STRING   "rpcap://"
    541     #String that will be used to determine the type of source in use (file, remote/local interface).
    542     PCAP_SRC_FILE_STRING="file://"
    543     PCAP_SRC_IF_STRING="rpcap://"
    544     
    545     ##############
    546     ## Flags defined in the pcap_open() function
    547     ##############
    548     # define  PCAP_OPENFLAG_PROMISCUOUS   1
    549     #   Defines if the adapter has to go in promiscuous mode.
    550     PCAP_OPENFLAG_PROMISCUOUS=1
    551     # define  PCAP_OPENFLAG_DATATX_UDP   2
    552     #   Defines if the data transfer (in case of a remote capture) has to be done with UDP protocol.
    553     PCAP_OPENFLAG_DATATX_UDP=2
    554     # define  PCAP_OPENFLAG_NOCAPTURE_RPCAP   4
    555     PCAP_OPENFLAG_NOCAPTURE_RPCAP=4
    556     #   Defines if the remote probe will capture its own generated traffic.
    557     # define  PCAP_OPENFLAG_NOCAPTURE_LOCAL   8
    558     PCAP_OPENFLAG_NOCAPTURE_LOCAL = 8
    559     # define  PCAP_OPENFLAG_MAX_RESPONSIVENESS   16
    560     #   This flag configures the adapter for maximum responsiveness.
    561     PCAP_OPENFLAG_MAX_RESPONSIVENESS=16
    562     
    563     ##############
    564     ## Sampling methods defined in the pcap_setsampling() function
    565     ##############
    566     # define  PCAP_SAMP_NOSAMP   0
    567     # No sampling has to be done on the current capture.
    568     PCAP_SAMP_NOSAMP=0
    569     # define  PCAP_SAMP_1_EVERY_N   1
    570     # It defines that only 1 out of N packets must be returned to the user.
    571     PCAP_SAMP_1_EVERY_N=1
    572     #define   PCAP_SAMP_FIRST_AFTER_N_MS   2
    573     # It defines that we have to return 1 packet every N milliseconds.
    574     PCAP_SAMP_FIRST_AFTER_N_MS=2
    575     
    576     ##############
    577     ## Authentication methods supported by the RPCAP protocol
    578     ##############
    579     # define  RPCAP_RMTAUTH_NULL   0
    580     # It defines the NULL authentication.
    581     RPCAP_RMTAUTH_NULL=0
    582     # define  RPCAP_RMTAUTH_PWD   1
    583     # It defines the username/password authentication.
    584     RPCAP_RMTAUTH_PWD=1
    585     
    586 
    587     ##############
    588     ## Remote struct and defines
    589     ##############
    590     # define  PCAP_BUF_SIZE   1024
    591     # Defines the maximum buffer size in which address, port, interface names are kept.
    592     PCAP_BUF_SIZE = 1024
    593     # define  RPCAP_HOSTLIST_SIZE   1024
    594     # Maximum length of an host name (needed for the RPCAP active mode).
    595     RPCAP_HOSTLIST_SIZE = 1024
    596     
    597     class pcap_send_queue(Structure):
    598         _fields_=[("maxlen",c_uint),
    599                   ("len",c_uint),
    600                   ("buffer",c_char_p)]
    601         
    602     ## struct   pcap_rmtauth
    603     ## This structure keeps the information needed to autheticate the user on a remote machine
    604     class pcap_rmtauth(Structure):
    605         _fields_=[("type",c_int),
    606                   ("username",c_char_p),
    607                   ("password",c_char_p)]
    608     
    609     ## struct   pcap_samp
    610     ## This structure defines the information related to sampling    
    611     class pcap_samp(Structure):
    612         _fields_=[("method",c_int),
    613                   ("value",c_int)]
    614 
    615     #PAirpcapHandle   pcap_get_airpcap_handle (pcap_t *p)
    616     #   Returns the AirPcap handler associated with an adapter. This handler can be used to change the wireless-related settings of the CACE Technologies AirPcap wireless capture adapters.
    617     
    618     #bool pcap_offline_filter (struct bpf_program *prog, const struct pcap_pkthdr *header, const u_char *pkt_data)
    619     #   Returns if a given filter applies to an offline packet.
    620     pcap_offline_filter = _lib.pcap_offline_filter
    621     pcap_offline_filter.restype = c_bool
    622     pcap_offline_filter.argtypes = [POINTER(bpf_program),POINTER(pcap_pkthdr),POINTER(u_char)]
    623     
    624     #int pcap_live_dump (pcap_t *p, char *filename, int maxsize, int maxpacks)
    625     #   Save a capture to file.
    626     pcap_live_dump = _lib.pcap_live_dump
    627     pcap_live_dump.restype = c_int
    628     pcap_live_dump.argtypes = [POINTER(pcap_t), POINTER(c_char), c_int,c_int]
    629     
    630     #int pcap_live_dump_ended (pcap_t *p, int sync)
    631     #   Return the status of the kernel dump process, i.e. tells if one of the limits defined with pcap_live_dump() has been reached.
    632     pcap_live_dump_ended = _lib.pcap_live_dump_ended
    633     pcap_live_dump_ended.restype = c_int
    634     pcap_live_dump_ended.argtypes = [POINTER(pcap_t), c_int]
    635     
    636     #struct pcap_stat *  pcap_stats_ex (pcap_t *p, int *pcap_stat_size)
    637     #   Return statistics on current capture.
    638     pcap_stats_ex = _lib.pcap_stats_ex
    639     pcap_stats_ex.restype = POINTER(pcap_stat)
    640     pcap_stats_ex.argtypes = [POINTER(pcap_t), POINTER(c_int)]
    641     
    642     #int pcap_setbuff (pcap_t *p, int dim)
    643     #   Set the size of the kernel buffer associated with an adapter.
    644     pcap_setbuff = _lib.pcap_setbuff
    645     pcap_setbuff.restype = c_int
    646     pcap_setbuff.argtypes = [POINTER(pcap_t), c_int]
    647     
    648     #int pcap_setmode (pcap_t *p, int mode)
    649     #   Set the working mode of the interface p to mode.
    650     pcap_setmode = _lib.pcap_setmode
    651     pcap_setmode.restype = c_int
    652     pcap_setmode.argtypes = [POINTER(pcap_t), c_int]
    653     
    654     #int pcap_setmintocopy (pcap_t *p, int size)
    655     #   Set the minumum amount of data received by the kernel in a single call.
    656     pcap_setmintocopy = _lib.pcap_setmintocopy
    657     pcap_setmintocopy.restype = c_int
    658     pcap_setmintocopy.argtype = [POINTER(pcap_t), c_int]
    659     
    660     #HANDLE pcap_getevent (pcap_t *p)
    661     #   Return the handle of the event associated with the interface p.
    662     pcap_getevent = _lib.pcap_getevent
    663     pcap_getevent.restype = HANDLE
    664     pcap_getevent.argtypes = [POINTER(pcap_t)]
    665 
    666     #pcap_send_queue *  pcap_sendqueue_alloc (u_int memsize)
    667     #   Allocate a send queue.
    668     pcap_sendqueue_alloc = _lib.pcap_sendqueue_alloc
    669     pcap_sendqueue_alloc.restype = POINTER(pcap_send_queue)
    670     pcap_sendqueue_alloc.argtypes = [c_uint]
    671     
    672     #void pcap_sendqueue_destroy (pcap_send_queue *queue)
    673     #   Destroy a send queue.
    674     pcap_sendqueue_destroy = _lib.pcap_sendqueue_destroy
    675     pcap_sendqueue_destroy.restype = None
    676     pcap_sendqueue_destroy.argtypes = [POINTER(pcap_send_queue)]
    677     
    678     #int pcap_sendqueue_queue (pcap_send_queue *queue, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data)
    679     #   Add a packet to a send queue.
    680     pcap_sendqueue_queue = _lib.pcap_sendqueue_queue
    681     pcap_sendqueue_queue.restype = c_int
    682     pcap_sendqueue_queue.argtypes = [POINTER(pcap_send_queue), POINTER(pcap_pkthdr), POINTER(u_char)]
    683     
    684     #u_int pcap_sendqueue_transmit (pcap_t *p, pcap_send_queue *queue, int sync)
    685     #   Send a queue of raw packets to the network.
    686     pcap_sendqueue_transmit = _lib.pcap_sendqueue_transmit
    687     pcap_sendqueue_transmit.retype = u_int
    688     pcap_sendqueue_transmit.argtypes = [POINTER(pcap_t), POINTER(pcap_send_queue), c_int]
    689     
    690     #int pcap_findalldevs_ex (char *source, struct pcap_rmtauth *auth, pcap_if_t **alldevs, char *errbuf)
    691     #   Create a list of network devices that can be opened with pcap_open().
    692     pcap_findalldevs_ex = _lib.pcap_findalldevs_ex
    693     pcap_findalldevs_ex.retype = c_int
    694     pcap_findalldevs_ex.argtypes = [STRING, POINTER(pcap_rmtauth), POINTER(POINTER(pcap_if_t)), STRING]
    695     
    696     #int pcap_createsrcstr (char *source, int type, const char *host, const char *port, const char *name, char *errbuf)
    697     #   Accept a set of strings (host name, port, ...), and it returns the complete source string according to the new format (e.g. 'rpcap://1.2.3.4/eth0').
    698     pcap_createsrcstr = _lib.pcap_createsrcstr
    699     pcap_createsrcstr.restype = c_int
    700     pcap_createsrcstr.argtypes = [STRING, c_int, STRING, STRING, STRING, STRING]
    701     
    702     #int pcap_parsesrcstr (const char *source, int *type, char *host, char *port, char *name, char *errbuf)
    703     #   Parse the source string and returns the pieces in which the source can be split.
    704     pcap_parsesrcstr = _lib.pcap_parsesrcstr
    705     pcap_parsesrcstr.retype = c_int
    706     pcap_parsesrcstr.argtypes = [STRING, POINTER(c_int), STRING, STRING, STRING, STRING]
    707     
    708     #pcap_t *   pcap_open (const char *source, int snaplen, int flags, int read_timeout, struct pcap_rmtauth *auth, char *errbuf)
    709     #   Open a generic source in order to capture / send (WinPcap only) traffic.
    710     pcap_open = _lib.pcap_open
    711     pcap_open.restype = POINTER(pcap_t)
    712     pcap_open.argtypes = [STRING, c_int, c_int, c_int, POINTER(pcap_rmtauth), STRING]
    713     
    714     #struct pcap_samp *  pcap_setsampling (pcap_t *p)
    715     #   Define a sampling method for packet capture.
    716     pcap_setsampling = _lib.pcap_setsampling
    717     pcap_setsampling.restype = POINTER(pcap_samp)
    718     pcap_setsampling.argtypes = [POINTER(pcap_t)]
    719     
    720     #SOCKET pcap_remoteact_accept (const char *address, const char *port, const char *hostlist, char *connectinghost, struct pcap_rmtauth *auth, char *errbuf)
    721     #   Block until a network connection is accepted (active mode only).
    722     pcap_remoteact_accept = _lib.pcap_remoteact_accept
    723     pcap_remoteact_accept.restype = SOCKET
    724     pcap_remoteact_accept.argtypes = [STRING, STRING, STRING, STRING, POINTER(pcap_rmtauth), STRING]
    725     
    726     #int pcap_remoteact_close (const char *host, char *errbuf)
    727     #   Drop an active connection (active mode only).
    728     pcap_remoteact_close = _lib.pcap_remoteact_close
    729     pcap_remoteact_close.restypes = c_int
    730     pcap_remoteact_close.argtypes = [STRING, STRING]
    731     
    732     #void pcap_remoteact_cleanup ()
    733     #   Clean the socket that is currently used in waiting active connections.
    734     pcap_remoteact_cleanup = _lib.pcap_remoteact_cleanup
    735     pcap_remoteact_cleanup.restypes = None
    736     pcap_remoteact_cleanup.argtypes = []
    737     
    738     #int pcap_remoteact_list (char *hostlist, char sep, int size, char *errbuf)
    739     #   Return the hostname of the host that have an active connection with us (active mode only). 
    740     pcap_remoteact_list = _lib.pcap_remoteact_list
    741     pcap_remoteact_list.restype = c_int
    742     pcap_remoteact_list.argtypes = [STRING, c_char, c_int, STRING]
    743