Ejemplo n.º 1
0
        /// <summary>
        /// Open
        /// </summary>
        /// <param name="flags">
        /// A <see cref="OpenFlags"/>
        /// </param>
        /// <param name="readTimeoutMilliseconds">
        /// A <see cref="System.Int32"/>
        /// </param>
        /// <param name="remoteAuthentication">
        /// A <see cref="RemoteAuthentication"/>
        /// </param>
        public void Open(OpenFlags flags,
                         int readTimeoutMilliseconds,
                         RemoteAuthentication remoteAuthentication)
        {
            if (!Opened)
            {
                var errbuf = new StringBuilder(Pcap.PCAP_ERRBUF_SIZE);   //will hold errors

                IntPtr rmAuthPointer;
                if (remoteAuthentication == null)
                {
                    rmAuthPointer = IntPtr.Zero;
                }
                else
                {
                    rmAuthPointer = remoteAuthentication.GetUnmanaged();
                }

                PcapHandle = SafeNativeMethods.pcap_open(Name,
                                                         Pcap.MAX_PACKET_SIZE,   // portion of the packet to capture.
                                                         (int)flags,
                                                         readTimeoutMilliseconds,
                                                         rmAuthPointer,
                                                         errbuf);

                if (rmAuthPointer != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(rmAuthPointer);
                }

                if (PcapHandle == IntPtr.Zero)
                {
                    string err = "Unable to open the adapter (" + Name + "). " + errbuf.ToString();
                    throw new PcapException(err);
                }
            }
        }
Ejemplo n.º 2
0
        private static List <WinPcapDevice> Devices(string rpcapString,
                                                    RemoteAuthentication remoteAuthentication)
        {
            var retval = new List <WinPcapDevice>();

            var devicePtr   = IntPtr.Zero;
            var errorBuffer = new StringBuilder(Pcap.PCAP_ERRBUF_SIZE); //will hold errors

            // convert the remote authentication structure to unmanaged memory if
            // one was specified
            IntPtr rmAuthPointer;

            if (remoteAuthentication == null)
            {
                rmAuthPointer = IntPtr.Zero;
            }
            else
            {
                rmAuthPointer = remoteAuthentication.GetUnmanaged();
            }

            int result = SafeNativeMethods.pcap_findalldevs_ex(rpcapString,
                                                               rmAuthPointer,
                                                               ref devicePtr,
                                                               errorBuffer);

            // free the memory if any was allocated
            if (rmAuthPointer != IntPtr.Zero)
            {
                Marshal.FreeHGlobal(rmAuthPointer);
            }

            if (result < 0)
            {
                throw new PcapException(errorBuffer.ToString());
            }

            IntPtr nextDevPtr = devicePtr;

            while (nextDevPtr != IntPtr.Zero)
            {
                // Marshal pointer into a struct
                var pcap_if_unmanaged =
                    (LibPcap.PcapUnmanagedStructures.pcap_if)Marshal.PtrToStructure(nextDevPtr,
                                                                                    typeof(LibPcap.PcapUnmanagedStructures.pcap_if));
                LibPcap.PcapInterface pcap_if = new LibPcap.PcapInterface(pcap_if_unmanaged);

                // create an airpcap device if the device appears to be a
                // airpcap device
                var winpcapDevice = new WinPcapDevice(pcap_if);
                if (winpcapDevice.Name.Contains("airpcap"))
                {
                    retval.Add(new AirPcap.AirPcapDevice(winpcapDevice));
                }
                else
                {
                    retval.Add(new WinPcapDevice(pcap_if));
                }
                nextDevPtr = pcap_if_unmanaged.Next;
            }

            LibPcap.LibPcapSafeNativeMethods.pcap_freealldevs(devicePtr);  // Free unmanaged memory allocation.

            return(retval);
        }