Packet Sniffer SDK DLL Edition

HNLBAdapter wrapper for C#

 Previous Next

File: HNLBAdapter.cs

using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Runtime.InteropServices;

namespace microOLAP.PSSDK
{
    /// <summary>
    /// Summary description for HNLBAdapter.
    /// </summary>
    public partial class HNLBAdapter : Component
    {
        #region DLL exports

        /// <summary>
        /// Creates an HNLBAdapter object.
        /// </summary>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpCreate")]
        private static extern IntPtr LbAdpCreate();

        /// <summary>
        /// Destroys the HNLBAdapter object.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpDestroy")]
        private static extern int LbAdpDestroy(IntPtr hLbAdp);

        /// <summary>
        /// Opens loopback adapter for TCP/UDP traffic capturing and tracking of TCP sessions.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpOpenAdapter")]
        private static extern int LbAdpOpenAdapter(IntPtr hLbAdp);

        /// <summary>
        /// Closes the loopback adapter, stops receiving of the local traffic and sessions tracking.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpCloseAdapter")]
        private static extern int LbAdpCloseAdapter(IntPtr hLbAdp);

        /// <summary>
        /// Returns the time of the latest opening of the loopback adapter.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="Hivariable"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetOpenTime")]
#if WIN64
        private static extern long LbAdpGetOpenTime(IntPtr hLbAdp);
#else
        private static extern uint LbAdpGetOpenTime(IntPtr hLbAdp, ref int Hivariable);
#endif

        /// <summary>
        /// Returns the process name by the process identifier (PID).
        /// </summary>
        /// <param name="ProcessID"></param>
        /// <param name="Name"></param>
        /// <param name="Size"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetProcessNameByIdW", CharSet = CharSet.Unicode)]
        private static extern int LbAdpGetProcessNameByID(int ProcessID, StringBuilder Name, int Size);

        /// <summary>
        /// Returns the exefile name by the process identifier (PID).
        /// </summary>
        /// <param name="ProcessID"></param>
        /// <param name="Name"></param>
        /// <param name="Size"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetProcessFileByIdW", CharSet = CharSet.Unicode)]
        private static extern int LbAdpGetProcessFileByID(int ProcessID, StringBuilder Name, int Size);

        /// <summary>
        /// Sets the OnTcpPacketReceive event.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="pfOnTcpPacketReceive"></param>
        /// <param name="Param"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpSetOnTcpPacketRecv")]
        private static extern IntPtr LbAdpSetOnTcpPacketRecv(IntPtr hLbAdp, CallBackOnTcpPktReceive pfOnTcpPacketReceive, IntPtr Param);

        /// <summary>
        /// Sets the OnUdpPacketReceive event.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="pfOnUdpPacketReceive"></param>
        /// <param name="Param"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpSetOnUdpPacketRecv")]
        private static extern IntPtr LbAdpSetOnUdpPacketRecv(IntPtr hLbAdp, CallBackOnUdpPktReceive pfOnUdpPacketReceive, IntPtr Param);

        /// <summary>
        /// Sets the OnThreadBegin event.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="pfOnThreadBegin"></param>
        /// <param name="Param"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpSetOnThreadBegin")]
        private static extern IntPtr LbAdpSetOnThreadBegin(IntPtr hLbAdp, CallBackOnThreadBegin pfOnThreadBegin, IntPtr Param);

        /// <summary>
        /// Sets the OnThreadEnd event.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="pfOnThreadEnd"></param>
        /// <param name="Param"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpSetOnThreadEnd")]
        private static extern IntPtr LbAdpSetOnThreadEnd(IntPtr hLbAdp, CallBackOnThreadEnd pfOnThreadEnd, IntPtr Param);

        /// <summary>
        /// Sets the OnConnect event.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="pfOnConnect"></param>
        /// <param name="Param"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpSetOnConnect")]
        private static extern IntPtr LbAdpSetOnConnect(IntPtr hLbAdp, CallBackOnConnect pfOnConnect, IntPtr Param);

        /// <summary>
        /// Sets the OnDisconnect event.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="pfOnDisconnect"></param>
        /// <param name="Param"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpSetOnDisconnect")]
        private static extern IntPtr LbAdpSetOnDisconnect(IntPtr hLbAdp, CallBackOnDisconnect pfOnDisconnect, IntPtr Param);

        /// <summary>
        /// Get TCP traffic capture flag.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetCaptureTcp")]
        private static extern bool LbAdpGetCaptureTcp(IntPtr hLbAdp);

        /// <summary>
        /// Change TCP traffic capture flag.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="bCaptureTcp"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpSetCaptureTcp")]
        private static extern bool LbAdpSetCaptureTcp(IntPtr hLbAdp, bool bCaptureTcp);

        /// <summary>
        /// Get UDP traffic capture flag.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetCaptureUdp")]
        private static extern bool LbAdpGetCaptureUdp(IntPtr hLbAdp);

        /// <summary>
        /// Change UDP traffic capture flag.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="bCaptureUdp"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpSetCaptureUdp")]
        private static extern bool LbAdpSetCaptureUdp(IntPtr hLbAdp, bool bCaptureUdp);

        /// <summary>
        /// Return TCP ports filters using flag value.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetUseTcpPortFilters")]
        private static extern bool LbAdpGetUseTcpPortFilters(IntPtr hLbAdp);

        /// <summary>
        /// Change TCP ports filters using flag.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="bUseTcpPortFilters"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpSetUseTcpPortFilters")]
        private static extern bool LbAdpSetUseTcpPortFilters(IntPtr hLbAdp, bool bUseTcpPortFilters);

        /// <summary>
        /// Return UDP ports filters using flag value.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetUseUdpPortFilters")]
        private static extern bool LbAdpGetUseUdpPortFilters(IntPtr hLbAdp);

        /// <summary>
        /// Change UDP ports filters using flag.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="bUseUdpPortFilters"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpSetUseUdpPortFilters")]
        private static extern bool LbAdpSetUseUdpPortFilters(IntPtr hLbAdp, bool bUseUdpPortFilters);

        /// <summary>
        /// Add a TCP port filter.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="Port"></param>
        /// <param name="PortType"></param>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpAddFilterTcpPort")]
        private static extern void LbAdpAddFilterTcpPort(IntPtr hLbAdp, ushort Port, int PortType);

        /// <summary>
        /// Remove a TCP port filter.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="Port"></param>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpRemoveFilterTcpPort")]
        private static extern void LbAdpRemoveFilterTcpPort(IntPtr hLbAdp, ushort Port);

        /// <summary>
        /// Remove all TCP port filters.
        /// </summary>
        /// <param name="hLbAdp"></param>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpRemoveAllTcpPortFilters")]
        private static extern void LbAdpRemoveAllTcpPortFilters(IntPtr hLbAdp);

        /// <summary>
        /// Add a UDP port filter.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="Port"></param>
        /// <param name="PortType"></param>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpAddFilterUdpPort")]
        private static extern void LbAdpAddFilterUdpPort(IntPtr hLbAdp, ushort Port, int PortType);

        /// <summary>
        /// Remove a UDP port filter.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="Port"></param>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpRemoveFilterUdpPort")]
        private static extern void LbAdpRemoveFilterUdpPort(IntPtr hLbAdp, ushort Port);

        /// <summary>
        /// Remove all UDP port filters.
        /// </summary>
        /// <param name="hLbAdp"></param>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpRemoveAllUdpPortFilters")]
        private static extern void LbAdpRemoveAllUdpPortFilters(IntPtr hLbAdp);

        /// <summary>
        /// Returns the handle of the Receive HNQueue object.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetReceiveQueue")]
        private static extern IntPtr LbAdpGetReceiveQueue(IntPtr hLbAdp);

        /// <summary>
        /// Sets the handle of the Receive HNQueue object.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="hQue"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpSetReceiveQueue")]
        private static extern IntPtr LbAdpSetReceiveQueue(IntPtr hLbAdp, IntPtr hQue);

        /// <summary>
        /// Returns the handle of the HNUserFilter object. 
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetUserFilter")]
        private static extern IntPtr LbAdpGetUserFilter(IntPtr hLbAdp);

        /// <summary>
        /// Sets the handle of the HNUserFilter object. 
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="hUserFilter"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpSetUserFilter")]
        private static extern IntPtr LbAdpSetUserFilter(IntPtr hLbAdp, IntPtr hUserFilter);

        /// <summary>
        /// Returns the status flag of the user-settable packet filter using. 
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetUserFilterActive")]
        private static extern bool LbAdpGetUserFilterActive(IntPtr hLbAdp);

        /// <summary>
        /// Sets the status flag of the user-settable packet filter using. 
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="bActiveBpf"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpSetUserFilterActive")]
        private static extern bool LbAdpSetUserFilterActive(IntPtr hLbAdp, bool bActiveBpf);

        /// <summary>
        /// Returns the status flag of the FastBPF using.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetUseFastUserFilter")]
        private static extern bool LbAdpGetUseFastUserFilter(IntPtr hLbAdp);

        /// <summary>
        /// Sets the status flag of the FastBPF using.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="bUseFastBpf"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpSetUseFastUserFilter")]
        private static extern bool LbAdpSetUseFastUserFilter(IntPtr hLbAdp, bool bUseFastBpf);

        /// <summary>
        /// Returns the maximal number of the threads allowed to be created for work with the loopback adapter.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetMaxThreadCount")]
        private static extern int LbAdpGetMaxThreadCount(IntPtr hLbAdp);

        /// <summary>
        /// Returns the number of threads created for work with the loopback adapter.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetThreadCount")]
        private static extern int LbAdpGetThreadCount(IntPtr hLbAdp);

        /// <summary>
        /// Sets the number of threads created for work with the loopback adapter.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="ThreadCount"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpSetThreadCount")]
        private static extern int LbAdpSetThreadCount(IntPtr hLbAdp, int ThreadCount);

        /// <summary>
        /// Returns the number of the packets received by the Packet Sniffer SDK internal driver from OS.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="HiValue"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetRecvCount")]
#if WIN64
        private static extern ulong LbAdpGetRecvCount(IntPtr hLbAdp);
#else
        private static extern uint LbAdpGetRecvCount(IntPtr hLbAdp, ref uint HiValue);
#endif

        /// <summary>
        /// Returns the number of the packets passed by the user-settable packet filter.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="HiValue"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetAcceptCount")]
#if WIN64
        private static extern ulong LbAdpGetAcceptCount(IntPtr hLbAdp);
#else
        private static extern uint LbAdpGetAcceptCount(IntPtr hLbAdp, ref uint HiValue);
#endif

        /// <summary>
        /// Returns the number of packets rejected by the user-settable packet filter.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="HiValue"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetRejectCount")]
#if WIN64
        private static extern ulong LbAdpGetRejectCount(IntPtr hLbAdp);
#else
        private static extern uint LbAdpGetRejectCount(IntPtr hLbAdp, ref uint HiValue);
#endif

        /// <summary>
        /// Returns the number of the packets transferred to the application.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="HiValue"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetProcessCount")]
#if WIN64
        private static extern ulong LbAdpGetProcessCount(IntPtr hLbAdp);
#else
        private static extern uint LbAdpGetProcessCount(IntPtr hLbAdp, ref uint HiValue);
#endif

        /// <summary>
        /// Returns the number of the packets lost by the Packet Sniffer SDK internal driver.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="HiValue"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetLostCount")]
#if WIN64
        private static extern ulong LbAdpGetLostCount(IntPtr hLbAdp);
#else
        private static extern uint LbAdpGetLostCount(IntPtr hLbAdp, ref uint HiValue);
#endif

        /// <summary>
        /// Updates the user-settable filter statistics synchronously.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpUpdateUserStatistics")]
        private static extern int LbAdpUpdateUserStatistics(IntPtr hLbAdp);

        /// <summary>
        /// Sets the OnPacketReceive event.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="pfOnPacketReceive"></param>
        /// <param name="Param"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpSetOnPacketRecv")]
        private static extern IntPtr LbAdpSetOnPacketRecv(IntPtr hLbAdp, CallBackOnPacketReceive pfOnPacketReceive, IntPtr Param);

        /// <summary>
        /// Returns the status flag of the EthEmulation using.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetEthEmulation")]
        private static extern bool LbAdpGetEthEmulation(IntPtr hLbAdp);

        /// <summary>
        /// Sets the status flag of the EthEmulation using.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="bEthEmulation"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpSetEthEmulation")]
        private static extern bool LbAdpSetEthEmulation(IntPtr hLbAdp, bool bEthEmulation);

        /// <summary>
        /// Returns the status flag of the CalcCheckSum using.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetCalcCheckSum")]
        private static extern bool LbAdpGetCalcCheckSum(IntPtr hLbAdp);

        /// <summary>
        /// Sets the status flag of the CalcCheckSum using.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="bCalcCheckSum"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpSetCalcCheckSum")]
        private static extern bool LbAdpSetCalcCheckSum(IntPtr hLbAdp, bool bCalcCheckSum);

        /// <summary>
        /// Returns flag status of using High Precision Time.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetUseHighPrecisionTime")]
        private static extern bool LbAdpGetUseHighPrecisionTime(IntPtr hLbAdp);

        /// <summary>
        /// Sets flag status of using High Precision Time.
        /// </summary>
        /// <param name="hLbAdp"></param>
        /// <param name="bUseHighPrecision"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpSetUseHighPrecisionTime")]
        private static extern bool LbAdpSetUseHighPrecisionTime(IntPtr hLbAdp, bool bUseHighPrecision);

        /// <summary>
        /// Return the size of the packets pool which is used by PSSDK for transfering captured packets from the internal driver to application and back.
        /// </summary>
        /// <param name="hAdp"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpGetPacketPool")]
        private static extern uint LbAdpGetPacketPool(IntPtr hLbAdp);

        /// <summary>
        /// Set the size of the packets pool which is used by PSSDK for transfering captured packets from the internal driver to application and back.
        /// </summary>
        /// <param name="hAdp"></param>
        /// <param name="dwPacketPool"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "LbAdpSetPacketPool")]
        private static extern uint LbAdpSetPacketPool(IntPtr hLbAdp, uint dwPacketPool);

        #endregion

        #region HNLBAdapter events

        /// <summary>
        /// CallBack OnThreadBegin.
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        private delegate void CallBackOnThreadBegin(IntPtr Param, ref IntPtr ThParam);

        /// <summary>
        /// CallBack OnThreadEnd.
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        private delegate void CallBackOnThreadEnd(IntPtr Param, IntPtr ThParam);

        /// <summary>
        /// CallBack OnPacketReceive.
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        /// <param name="hPacket"></param>
        /// <param name="pPacketData"></param>
        /// <param name="IncPacketSize"></param>
        private delegate void CallBackOnPacketReceive(IntPtr Param, IntPtr ThParam, IntPtr hPacket, IntPtr pPacketData, uint IncPacketSize);

        /// <summary>
        /// CallBack OnConnect.
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        /// <param name="hLBSession"></param>
        /// <param name="hLBHosts"></param>
        /// <param name="Direction"></param>
        private delegate void CallBackOnConnect(IntPtr Param, IntPtr ThParam, IntPtr hLBSession, IntPtr hLBHosts, int Direction);

        /// <summary>
        /// CallBack OnDisconnect.
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        /// <param name="hLBSession"></param>
        /// <param name="Direction"></param>
        private delegate void CallBackOnDisconnect(IntPtr Param, IntPtr ThParam, IntPtr hLBSession, int Direction);

        /// <summary>
        /// CallBack OnTcpPacketReceive.
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        /// <param name="hLBSession"></param>
        /// <param name="Direction"></param>
        /// <param name="Pid"></param>
        /// <param name="hPacket"></param>
        /// <param name="pData"></param>
        /// <param name="DataLength"></param>
        private delegate void CallBackOnTcpPktReceive(IntPtr Param, IntPtr ThParam, IntPtr hLBSession, int Direction, int Pid, IntPtr hPacket, IntPtr pData, uint DataLength);

        /// <summary>
        /// CallBack OnUdpPacketReceive.
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        /// <param name="hLBHosts"></param>
        /// <param name="Direction"></param>
        /// <param name="Pid"></param>
        /// <param name="hPacket"></param>
        /// <param name="pData"></param>
        /// <param name="DataLength"></param>
        private delegate void CallBackOnUdpPktReceive(IntPtr Param, IntPtr ThParam, IntPtr hLBHosts, int Direction, int Pid, IntPtr hPacket, IntPtr pData, uint DataLength);

        /// <summary>
        /// CallBack variable OnThreadBegin.
        /// </summary>
        private CallBackOnThreadBegin pfOnThreadBegin;

        /// <summary>
        /// CallBack variable OnThreadEnd.
        /// </summary>
        private CallBackOnThreadEnd pfOnThreadEnd;

        /// <summary>
        /// CallBack variable OnPacketReceive.
        /// </summary>
        private CallBackOnPacketReceive pfOnPacketReceive;

        /// <summary>
        /// CallBack variable OnConnect.
        /// </summary>
        private CallBackOnConnect pfOnConnect;

        /// <summary>
        /// CallBack variable OnDisconnect.
        /// </summary>
        private CallBackOnDisconnect pfOnDisconnect;

        /// <summary>
        /// CallBack variable OnTcpPacketReceive.
        /// </summary>
        private CallBackOnTcpPktReceive pfOnTcpPktReceive;

        /// <summary>
        /// CallBack variable OnUdpPacketReceive.
        /// </summary>
        private CallBackOnUdpPktReceive pfOnUdpPktReceive;

        /// <summary>
        /// OnThreadBegin event Handler.
        /// </summary>
        public event OnThreadBeginEventHandler OnThreadBegin;

        /// <summary>
        /// OnThreadEnd event Handler.
        /// </summary>
        public event OnThreadEndEventHandler OnThreadEnd;

        /// <summary>
        /// OnPacketReceive event handler.
        /// </summary>
        public event OnPacketReceiveEventHandler OnPacketReceive;

        /// <summary>
        /// OnConnect event Handler.
        /// </summary>
        public event OnConnectEventHandler OnConnect;

        /// <summary>
        /// OnDisconnect event Handler.
        /// </summary>
        public event OnDisconnectEventHandler OnDisconnect;

        /// <summary>
        /// OnTcpPktReceive event Handler.
        /// </summary>
        public event OnTcpPktReceiveEventHandler OnTcpPktReceive;

        /// <summary>
        ///  OnUdpPktReceive event Handler.
        /// </summary>
        public event OnUdpPktReceiveEventHandler OnUdpPktReceive;

        #endregion

        /// <summary>
        /// IntPtr of the HNLBAdapter object
        /// </summary>
        private IntPtr hLbAdp = IntPtr.Zero;

        /// <summary>
        /// User (bpf) filter.
        /// </summary>
        private HNUserFilter userFilter = null;

        /// <summary>
        /// Receive packet queue.
        /// </summary>
        private HNQueue receiveQueue = null;

        /// <summary>
        /// Creates an HNLBAdapter object.
        /// </summary>
        public HNLBAdapter()
        {
            InitializeComponent();

            hLbAdp = LbAdpCreate();
            if (hLbAdp != IntPtr.Zero)
            {
                pfOnThreadBegin = new CallBackOnThreadBegin(this.DoOnThreadBegin);
                LbAdpSetOnThreadBegin(hLbAdp, pfOnThreadBegin, IntPtr.Zero);

                pfOnThreadEnd = new CallBackOnThreadEnd(this.DoOnThreadEnd);
                LbAdpSetOnThreadEnd(hLbAdp, pfOnThreadEnd, IntPtr.Zero);

                pfOnPacketReceive = new CallBackOnPacketReceive(this.DoOnPacketReceive);
                LbAdpSetOnPacketRecv(hLbAdp, pfOnPacketReceive, IntPtr.Zero);

                pfOnConnect = new CallBackOnConnect(this.DoOnConnect);
                LbAdpSetOnConnect(hLbAdp, pfOnConnect, IntPtr.Zero);

                pfOnDisconnect = new CallBackOnDisconnect(this.DoOnDisconnect);
                LbAdpSetOnDisconnect(hLbAdp, pfOnDisconnect, IntPtr.Zero);

                pfOnTcpPktReceive = new CallBackOnTcpPktReceive(this.DoOnTcpPktReceive);
                LbAdpSetOnTcpPacketRecv(hLbAdp, pfOnTcpPktReceive, IntPtr.Zero);

                pfOnUdpPktReceive = new CallBackOnUdpPktReceive(this.DoOnUdpPktReceive);
                LbAdpSetOnUdpPacketRecv(hLbAdp, pfOnUdpPktReceive, IntPtr.Zero);
            }
        }

        /// <summary>
        /// Destroys the HNLBAdapter object.
        /// </summary>
        ~HNLBAdapter()
        {
            if (hLbAdp != IntPtr.Zero) LbAdpDestroy(hLbAdp);
        }

        #region HNLBAdapter properties

        /// <summary>
        /// Checks if the HNLBAdapter object has been created correctly.
        /// </summary>
        [Browsable(false)]
        public bool IsValid
        {
            get
            {
                return (hLbAdp != IntPtr.Zero);
            }
        }

        /// <summary>
        /// Sets/Returns the handle of the Receive HNQueue object.
        /// </summary>
        public HNQueue ReceiveQueue
        {
            get
            {
                if (LbAdpGetReceiveQueue(hLbAdp) != IntPtr.Zero)
                {
                    return receiveQueue;
                }
                else
                {
                    receiveQueue = null;
                    return receiveQueue;
                }
            }
            set
            {
                if (value != null)
                {
                    receiveQueue = value;
                    LbAdpSetReceiveQueue(hLbAdp, receiveQueue.Handle);
                }
                else
                {
                    LbAdpSetReceiveQueue(hLbAdp, IntPtr.Zero);
                }
            }
        }

        /// <summary>
        /// Sets/Returns the status flag of the EthEmulation using.
        /// </summary>
        public bool EthEmulation
        {
            get
            {
                return LbAdpGetEthEmulation(hLbAdp);
            }
            set
            {
                LbAdpSetEthEmulation(hLbAdp, value);
            }
        }

        /// <summary>
        /// Sets/Returns the status flag of the CalcCheckSum using.
        /// </summary>
        public bool CalcCheckSum
        {
            get
            {
                return LbAdpGetCalcCheckSum(hLbAdp);
            }
            set
            {
                LbAdpSetCalcCheckSum(hLbAdp, value);
            }
        }
        
        /// <summary>
        /// Sets/Returns the handle of the HNUserFilter object.
        /// </summary>
        [Browsable(false)]
        public HNUserFilter UserFilter
        {
            get
            {
                if (LbAdpGetUserFilter(hLbAdp) != IntPtr.Zero)
                {
                    return userFilter;
                }
                else
                {
                    userFilter = null;
                    return userFilter;
                }
            }
            set
            {
                if (value != null)
                {
                    userFilter = value;
                    LbAdpSetUserFilter(hLbAdp, userFilter.Handle);
                }
                else
                {
                    LbAdpSetUserFilter(hLbAdp, IntPtr.Zero);
                }
            }
        }

        /// <summary>
        /// Sets/Returns the status flag of the user-settable packet filter using.
        /// </summary>
        public bool UserFilterActive
        {
            get
            {
                return LbAdpGetUserFilterActive(hLbAdp);
            }
            set
            {
                LbAdpSetUserFilterActive(hLbAdp, value);
            }
        }

        /// <summary>
        /// Sets/Returns the status flag of the FastBPF using.
        /// </summary>
        public bool UseFastUserFilter
        {
            get
            {
                return LbAdpGetUseFastUserFilter(hLbAdp);
            }
            set
            {
                LbAdpSetUseFastUserFilter(hLbAdp, value);
            }
        }

        /// <summary>
        /// Sets/Returns the status flag of the High Precision Time using.
        /// </summary>
        public bool UseHighPrecisionTime
        {
            get
            {
                return LbAdpGetUseHighPrecisionTime(hLbAdp);
            }
            set
            {
                LbAdpSetUseHighPrecisionTime(hLbAdp, value);
            }
        }

        /// <summary>
        /// Returns the maximal number of the threads allowed to be created for work with the loopback adapter.
        /// </summary>
        public int MaxThreadCount
        {
            get
            {
                return LbAdpGetMaxThreadCount(hLbAdp);
            }
        }

        /// <summary>
        /// Sets/Returns the number of threads created for work with the loopback adapter.
        /// </summary>
        public int ThreadCount
        {
            get
            {
                return LbAdpGetThreadCount(hLbAdp);
            }
            set
            {
                LbAdpSetThreadCount(hLbAdp, value);
            }
        }

        /// <summary>
        /// Returns the number of the packets received by the Packet Sniffer SDK internal driver from OS.
        /// </summary>
        [Browsable(false)]
        public uint RecvCount32
        {
            get
            {
#if WIN64
                return (uint)LbAdpGetRecvCount(hLbAdp);
#else
                uint HighValue = 0;
                return LbAdpGetRecvCount(hLbAdp, ref HighValue);
#endif
            }
        }

        /// <summary>
        /// Returns the number of the packets received by the Packet Sniffer SDK internal driver from OS.
        /// </summary>
        [Browsable(false)]
        public ulong RecvCount64
        {
            get
            {
#if WIN64
                return LbAdpGetRecvCount(hLbAdp);
#else
                uint LowValue = 0, HighValue = 0;
                LowValue = LbAdpGetRecvCount(hLbAdp, ref HighValue);
                return ((((ulong)HighValue) << 32) + LowValue);
#endif
            }
        }

        /// <summary>
        /// Returns the number of the packets passed by the user-settable packet filter.
        /// </summary>
        [Browsable(false)]
        public uint AcceptCount32
        {
            get
            {
#if WIN64
                return (uint)LbAdpGetAcceptCount(hLbAdp);
#else
                uint HighValue = 0;
                return LbAdpGetAcceptCount(hLbAdp, ref HighValue);
#endif
            }
        }

        /// <summary>
        /// Returns the number of the packets passed by the user-settable packet filter.
        /// </summary>
        [Browsable(false)]
        public ulong AcceptCount64
        {
            get
            {
#if WIN64
                return LbAdpGetAcceptCount(hLbAdp);
#else
                uint LowValue = 0, HighValue = 0;
                LowValue = LbAdpGetAcceptCount(hLbAdp, ref HighValue);
                return ((((ulong)HighValue) << 32) + LowValue);
#endif
            }
        }

        /// <summary>
        /// Returns the number of packets rejected by the user-settable packet filter.
        /// </summary>
        [Browsable(false)]
        public uint RejectCount32
        {
            get
            {
#if WIN64
                return (uint)LbAdpGetRejectCount(hLbAdp);
#else
                uint HighValue = 0;
                return LbAdpGetRejectCount(hLbAdp, ref HighValue);
#endif
            }
        }

        /// <summary>
        /// Returns the number of packets rejected by the user-settable packet filter.
        /// </summary>
        [Browsable(false)]
        public ulong RejectCount64
        {
            get
            {
#if WIN64
                return LbAdpGetRejectCount(hLbAdp);
#else
                uint LowValue = 0, HighValue = 0;
                LowValue = LbAdpGetRejectCount(hLbAdp, ref HighValue);
                return ((((ulong)HighValue) << 32) + LowValue);
#endif
            }
        }

        /// <summary>
        /// Returns the number of the packets transferred to the application.
        /// </summary>
        [Browsable(false)]
        public uint ProcessCount32
        {
            get
            {
#if WIN64
                return (uint)LbAdpGetProcessCount(hLbAdp);
#else
                uint HighValue = 0;
                return LbAdpGetProcessCount(hLbAdp, ref HighValue);
#endif
            }
        }

        /// <summary>
        /// Returns the number of the packets transferred to the application.
        /// </summary>
        [Browsable(false)]
        public ulong ProcessCount64
        {
            get
            {
#if WIN64
                return LbAdpGetProcessCount(hLbAdp);
#else
                uint LowValue = 0, HighValue = 0;
                LowValue = LbAdpGetProcessCount(hLbAdp, ref HighValue);
                return ((((ulong)HighValue) << 32) + LowValue);
#endif
            }
        }

        /// <summary>
        /// Returns the number of the packets lost by the Packet Sniffer SDK internal driver.
        /// </summary>
        [Browsable(false)]
        public uint LostCount32
        {
            get
            {
#if WIN64
                return (uint)LbAdpGetLostCount(hLbAdp);
#else
                uint HighValue = 0;
                return LbAdpGetLostCount(hLbAdp, ref HighValue);
#endif
            }
        }

        /// <summary>
        /// Returns the number of the packets lost by the Packet Sniffer SDK internal driver.
        /// </summary>
        [Browsable(false)]
        public ulong LostCount64
        {
            get
            {
#if WIN64
                return LbAdpGetLostCount(hLbAdp);
#else
                uint LowValue = 0, HighValue = 0;
                LowValue = LbAdpGetLostCount(hLbAdp, ref HighValue);
                return ((((ulong)HighValue) << 32) + LowValue);
#endif
            }
        }

        /// <summary>
        /// Returns the time of the latest opening of the loopback adapter.
        /// </summary>
        [Browsable(false)]
        public long OpenTime
        {
            get
            {
#if WIN64
                return LbAdpGetOpenTime(hLbAdp);
#else
                uint LowValue = 0; int HighValue = 0;
                LowValue = LbAdpGetOpenTime(hLbAdp, ref HighValue);
                return ((((long)HighValue) << 32) + LowValue);
#endif
            }
        }

        /// <summary>
        /// Set/Get TCP traffic capture flag.
        /// </summary>
        public bool CaptureTcp
        {
            get 
            {
                return LbAdpGetCaptureTcp(hLbAdp);
            }
            set
            {
                LbAdpSetCaptureTcp(hLbAdp, value);
            }
        }

        /// <summary>
        /// Set/Get UDP traffic capture flag.
        /// </summary>
        public bool CaptureUdp
        {
            get
            {
                return LbAdpGetCaptureUdp(hLbAdp);
            }
            set
            {
                LbAdpSetCaptureUdp(hLbAdp, value);
            }
        }

        /// <summary>
        /// Set/Get TCP ports filters using flag value.
        /// </summary>
        public bool UseTcpPortFilters
        {
            get
            {
                return LbAdpGetUseTcpPortFilters(hLbAdp);
            }
            set
            {
                LbAdpSetUseTcpPortFilters(hLbAdp, value);
            }
        }

        /// <summary>
        /// Set/Get UDP ports filters using flag value.
        /// </summary>
        public bool UseUdpPortFilters
        {
            get
            {
                return LbAdpGetUseUdpPortFilters(hLbAdp);
            }
            set
            {
                LbAdpSetUseUdpPortFilters(hLbAdp, value);
            }
        }

        /// <summary>
        /// Sets/Returns the size of the packets pool which is used by PSSDK for transfering captured packets from the internal driver to application and back.
        /// </summary>
        public uint PacketPool
        {
            get
            {
                return LbAdpGetPacketPool(hLbAdp);
            }
            set
            {
                LbAdpSetPacketPool(hLbAdp, value);
            }
        }

        #endregion

        #region HNLBAdapter methods

        /// <summary>
        /// Opens loopback adapter for TCP/UDP traffic capturing and tracking of TCP sessions.
        /// </summary>
        /// <returns></returns>
        public PSSDKRES OpenAdapter()
        {
            return (PSSDKRES)LbAdpOpenAdapter(hLbAdp);
        }

        /// <summary>
        /// Closes the loopback adapter, stops receiving of the local traffic and sessions tracking.
        /// </summary>
        /// <returns></returns>
        public PSSDKRES CloseAdapter()
        {
            return (PSSDKRES)LbAdpCloseAdapter(hLbAdp);
        }

        /// <summary>
        /// Updates the user-settable filter statistics synchronously.
        /// </summary>
        /// <returns></returns>
        public PSSDKRES UpdateUserStatistics()
        {
            return (PSSDKRES)LbAdpUpdateUserStatistics(hLbAdp);
        }

        /// <summary>
        /// Returns the process name by the process identifier (PID).
        /// </summary>
        /// <param name="ProcessID"></param>
        /// <param name="Name"></param>
        /// <returns></returns>
        public PSSDKRES Get_ProcessNameByID(int ProcessID, ref string Name)
        {
            StringBuilder StrBuf = new StringBuilder(260);
            int Res = LbAdpGetProcessNameByID(ProcessID, StrBuf, StrBuf.Capacity);
            Name = StrBuf.ToString();
            return (PSSDKRES)Res;
        }

        /// <summary>
        /// Returns the exefile name by the process identifier (PID).
        /// </summary>
        /// <param name="ProcessID"></param>
        /// <param name="Name"></param>
        /// <returns></returns>
        public PSSDKRES Get_ProcessFileByID(int ProcessID, ref string Name)
        {
            StringBuilder StrBuf = new StringBuilder(260);
            int Res = LbAdpGetProcessFileByID(ProcessID, StrBuf, StrBuf.Capacity);
            Name = StrBuf.ToString();
            return (PSSDKRES)Res;
        }

        /// <summary>
        /// Add a TCP port filter.
        /// </summary>
        /// <param name="Port"></param>
        /// <param name="PortType"></param>
        public void AddFilterTcpPort(ushort Port, HNLBPortFilter PortType)
        {
            LbAdpAddFilterTcpPort(hLbAdp, Port, (int)PortType);
        }

        /// <summary>
        /// Remove a TCP port filter.
        /// </summary>
        /// <param name="Port"></param>
        public void RemoveFilterTcpPort(ushort Port)
        {
            LbAdpRemoveFilterTcpPort(hLbAdp, Port);
        }

        /// <summary>
        /// Remove all TCP port filters.
        /// </summary>
        public void RemoveAllTcpPortFilters()
        {
            LbAdpRemoveAllTcpPortFilters(hLbAdp);
        }

        /// <summary>
        /// Add a UDP port filter.
        /// </summary>
        /// <param name="Port"></param>
        /// <param name="PortType"></param>
        public void AddFilterUdpPort(ushort Port, HNLBPortFilter PortType)
        {
            LbAdpAddFilterUdpPort(hLbAdp, Port, (int)PortType);
        }

        /// <summary>
        /// Remove a UDP port filter.
        /// </summary>
        /// <param name="Port"></param>
        public void RemoveFilterUdpPort(ushort Port)
        {
            LbAdpRemoveFilterUdpPort(hLbAdp, Port);
        }

        /// <summary>
        /// Remove all UDP port filters.
        /// </summary>
        public void RemoveAllUdpPortFilters()
        {
            LbAdpRemoveAllUdpPortFilters(hLbAdp);
        }

        #endregion

        #region HNLBAdapter callbacks

        /// <summary>
        /// Tracks the creating of the internal component thread.
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        private void DoOnThreadBegin(IntPtr Param, ref IntPtr ThParam)
        {
            if (OnThreadBegin != null)
                OnThreadBegin(this, ref ThParam);
        }

        /// <summary>
        /// Tracks the closing of the internal component thread.
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        private void DoOnThreadEnd(IntPtr Param, IntPtr ThParam)
        {
            if (OnThreadEnd != null)
                OnThreadEnd(this, ThParam);
        }

        /// <summary>
        /// Occurs immediately after a packet has been received by the loopback adapter.
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        /// <param name="hPacket"></param>
        /// <param name="pPacketData"></param>
        /// <param name="IncPacketSize"></param>
        private void DoOnPacketReceive(IntPtr Param, IntPtr ThParam, IntPtr hPacket, IntPtr pPacketData, uint IncPacketSize)
        {
            if (OnPacketReceive != null)
                OnPacketReceive(this, ThParam, hPacket, pPacketData, IncPacketSize);
        }

        /// <summary>
        /// Fires on the new TCP session is created.
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        /// <param name="hLBSession"></param>
        /// <param name="hLBHosts"></param>
        /// <param name="Direction"></param>
        private void DoOnConnect(IntPtr Param, IntPtr ThParam, IntPtr hLBSession, IntPtr hLBHosts, int Direction)
        {
            if (OnConnect != null)
                OnConnect(this, ThParam, hLBSession, hLBHosts, (HNLBDirection)Direction);
        }

        /// <summary>
        /// Fires when TCP session is closed.
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        /// <param name="hLBSession"></param>
        /// <param name="Direction"></param>
        private void DoOnDisconnect(IntPtr Param, IntPtr ThParam, IntPtr hLBSession, int Direction)
        {
            if (OnDisconnect != null)
                OnDisconnect(this, ThParam, hLBSession, (HNLBDirection)Direction);
        }

        /// <summary>
        /// Fires when an application receives or sends TCP data.
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        /// <param name="hLBSession"></param>
        /// <param name="Direction"></param>
        /// <param name="Pid"></param>
        /// <param name="hPacket"></param>
        /// <param name="pData"></param>
        /// <param name="DataLength"></param>
        private void DoOnTcpPktReceive(IntPtr Param, IntPtr ThParam, IntPtr hLBSession, int Direction, int Pid, IntPtr hPacket, IntPtr pData, uint DataLength)
        {
            if (OnTcpPktReceive != null)
                OnTcpPktReceive(this, ThParam, hLBSession, (HNLBDirection)Direction, Pid, hPacket, pData, DataLength);
        }

        /// <summary>
        /// Fires when an application receives or sends UDP data.
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        /// <param name="hLBHosts"></param>
        /// <param name="Direction"></param>
        /// <param name="Pid"></param>
        /// <param name="hPacket"></param>
        /// <param name="pData"></param>
        /// <param name="DataLength"></param>
        private void DoOnUdpPktReceive(IntPtr Param, IntPtr ThParam, IntPtr hLBHosts, int Direction, int Pid, IntPtr hPacket, IntPtr pData, uint DataLength)
        {
            if (OnUdpPktReceive != null)
                OnUdpPktReceive(this, ThParam, hLBHosts, (HNLBDirection)Direction, Pid, hPacket, pData, DataLength);
        }

        #endregion
    }
}
See also:HNLBAdapter, All wrappers in one ZIP archive