BazisLib::Win32::NetworkFilterBase Class Reference

Allows filtering network connections on WINSOCK level. More...

#include <netfilter.h>

Inherited by BazisLib::Network::Filters::_DummyNetworkFilter, and BazisLib::Network::Filters::BasicHTTPFilter.

Collaboration diagram for BazisLib::Win32::NetworkFilterBase:

Collaboration graph
[legend]

List of all members.

Classes

struct  SystemSocketContext
struct  WinsockPointers

Public Member Functions

 NetworkFilterBase ()
ActionStatus InstallFilter (BazisLib::Network::Filters::FilterMode mode, IDLLPatcher *pPatcher)
ActionStatus UninstallFilter (IDLLPatcher *pPatcher)
 ~NetworkFilterBase ()

Protected Member Functions

void SignalDataReceivedEvent (void *pSystemContext)
 Fires the 'receive ready' event.
virtual BazisLib::ActionStatus OnStartConnect (BazisLib::Network::_PlatformSpecificInternetAddress *pAddr, void **ppUserContext)
virtual void OnDisconnect (void *pSystemContext, void *pUserContext)
virtual size_t OnSend (void *pSystemContext, void *pSystemContext2, void *pBuf, size_t MaxSize, void *pUserContext, bool ForceBlockingMode)
virtual size_t OnReceive (void *pSystemContext, void *pSystemContext2, void *pBuf, size_t MaxSize, void *pUserContext, bool ForceBlockingMode)
virtual void FreeUserContext (void *p)

Private Types

enum  { FilteredEventReceive = 0, FilteredEventCount }
enum  { SystemSockReceivedData = 0x0002 }
typedef int len
typedef int int flags
typedef int len
typedef int int flags
typedef struct sockaddr * name
typedef struct sockaddr int namelen
typedef std::map< SOCKET,
SystemSocketContext * > 
ContextMap
typedef int(WSAAPI * WSAConnect_ptr )(IN SOCKET s, IN const struct sockaddr FAR *name, IN int namelen, IN LPWSABUF lpCallerData, OUT LPWSABUF lpCalleeData, IN LPQOS lpSQOS, IN LPQOS lpGQOS)
typedef SOCKET(WSAAPI * socket_ptr )(IN int af, IN int type, IN int protocol)
typedef int(WSAAPI * WSAEventSelect_ptr )(IN SOCKET s, IN WSAEVENT hEventObject, IN long lNetworkEvents)
typedef int(WSAAPI * WSAEnumNetworkEvents_ptr )(IN SOCKET s, IN WSAEVENT hEventObject, OUT LPWSANETWORKEVENTS lpNetworkEvents)

Private Member Functions

typedef int (WSAAPI *recv_ptr)(SOCKET s
typedef __out_bcount (len) char *buf
typedef int (WSAAPI *send_ptr)(SOCKET s
typedef __in_bcount (len) const char *buf
typedef int (WSAAPI *connect_ptr)(SOCKET s
typedef int (WSAAPI *closesocket_ptr)(SOCKET s)
SystemSocketContextGetSystemContextForSocket (SOCKET s)
void * GetUserContextForSocket (SOCKET s)
void FreeAndRemoveContextForSocket (SOCKET s)

Static Private Member Functions

static int WSAAPI recv_override (SOCKET s, __out_bcount(len) char *buf, int len, int flags)
static int WSAAPI send_override (SOCKET s, __in_bcount(len) const char *buf, int len, int flags)
static int WSAAPI connect_override (SOCKET s, const struct sockaddr *name, int namelen)
static int WSAAPI WSAConnect_override (IN SOCKET s, IN const struct sockaddr FAR *name, IN int namelen, IN LPWSABUF lpCallerData, OUT LPWSABUF lpCalleeData, IN LPQOS lpSQOS, IN LPQOS lpGQOS)
static int WSAAPI closesocket_override (SOCKET s)
static SOCKET WSAAPI socket_override (IN int af, IN int type, IN int protocol)
static int WSAAPI WSAEventSelect_override (IN SOCKET s, IN WSAEVENT hEventObject, IN long lNetworkEvents)
static int WSAAPI WSAEnumNetworkEvents_override (IN SOCKET s, IN WSAEVENT hEventObject, OUT LPWSANETWORKEVENTS lpNetworkEvents)

Private Attributes

ContextMap m_UserContextMap
InProcessMutex m_ContextMapMutex
WinsockPointers m_OriginalPointers

Static Private Attributes

static NetworkFilterBasem_pInstalledFilter


Detailed Description

Allows filtering network connections on WINSOCK level.

This class is a basic network filter for WIN32 environment. It acts by replacing import table pointers to WINSOCK functions by its own function pointers, using IDLLPatcher interface for that. The IDLLPatcher should be provided by caller.

Remarks:
As WINSOCK2 provides lots of functinality to work in different asynchronous and event-driven modes, not all of it is supported by this filter class. Basically, if the application uses some synchronization-related functions other than included in WinsockPointers structure, the filter may not work correctly. Present version supports the following strategies:
  • Classic blocking mode without synchronization (WINSOCK v1)
  • Sending/receiving with synchronization using WSAEventSelect()
  • Using WSAEnumNetworkEvents() to get socket event state
The following strategies/cases are NOT supported:
  • When the application first calls recv() that blocks, then send(), that sends some data, OnRecv() will be called before OnSend(), that may prevent the event sequence from being processed correctly (if OnRecv() in child class relies on some flags set by OnSend()).
  • When the application uses WSARecv()/WSASend()/WSARecvEx()/WSASendEx()/ReadFile()/WriteFile() with sockets.
Attention:
As the current version does not support ALL winsock strategies, consider it to be EXPERIMENTAL and NOT compatible with ALL winsock-based apps.

Member Typedef Documentation

typedef int int BazisLib::Win32::NetworkFilterBase::flags [private]

typedef int int BazisLib::Win32::NetworkFilterBase::flags [private]

typedef struct sockaddr* BazisLib::Win32::NetworkFilterBase::name [read, private]

typedef struct sockaddr int BazisLib::Win32::NetworkFilterBase::namelen [read, private]

typedef SOCKET(WSAAPI * BazisLib::Win32::NetworkFilterBase::socket_ptr)(IN int af, IN int type, IN int protocol) [private]

typedef int(WSAAPI * BazisLib::Win32::NetworkFilterBase::WSAConnect_ptr)(IN SOCKET s, IN const struct sockaddr FAR *name, IN int namelen, IN LPWSABUF lpCallerData, OUT LPWSABUF lpCalleeData, IN LPQOS lpSQOS, IN LPQOS lpGQOS) [private]

typedef int(WSAAPI * BazisLib::Win32::NetworkFilterBase::WSAEnumNetworkEvents_ptr)(IN SOCKET s, IN WSAEVENT hEventObject, OUT LPWSANETWORKEVENTS lpNetworkEvents) [private]

typedef int(WSAAPI * BazisLib::Win32::NetworkFilterBase::WSAEventSelect_ptr)(IN SOCKET s, IN WSAEVENT hEventObject, IN long lNetworkEvents) [private]


Member Enumeration Documentation

anonymous enum [private]

Enumerator:
FilteredEventReceive 
FilteredEventCount 

anonymous enum [private]

Enumerator:
SystemSockReceivedData 


Constructor & Destructor Documentation

BazisLib::Win32::NetworkFilterBase::NetworkFilterBase (  ) 

BazisLib::Win32::NetworkFilterBase::~NetworkFilterBase (  ) 


Member Function Documentation

typedef BazisLib::Win32::NetworkFilterBase::__in_bcount ( len   )  const [private]

typedef BazisLib::Win32::NetworkFilterBase::__out_bcount ( len   )  [private]

static int WSAAPI BazisLib::Win32::NetworkFilterBase::closesocket_override ( SOCKET  s  )  [static, private]

static int WSAAPI BazisLib::Win32::NetworkFilterBase::connect_override ( SOCKET  s,
const struct sockaddr *  name,
int  namelen 
) [static, private]

void BazisLib::Win32::NetworkFilterBase::FreeAndRemoveContextForSocket ( SOCKET  s  )  [private]

virtual void BazisLib::Win32::NetworkFilterBase::FreeUserContext ( void *  p  )  [inline, protected, virtual]

SystemSocketContext* BazisLib::Win32::NetworkFilterBase::GetSystemContextForSocket ( SOCKET  s  )  [private]

void* BazisLib::Win32::NetworkFilterBase::GetUserContextForSocket ( SOCKET  s  )  [private]

ActionStatus BazisLib::Win32::NetworkFilterBase::InstallFilter ( BazisLib::Network::Filters::FilterMode  mode,
IDLLPatcher pPatcher 
)

typedef BazisLib::Win32::NetworkFilterBase::int ( WSAAPI *  closesocket_ptr  )  [private]

typedef BazisLib::Win32::NetworkFilterBase::int ( WSAAPI *  connect_ptr  )  [private]

typedef BazisLib::Win32::NetworkFilterBase::int ( WSAAPI *  send_ptr  )  [private]

typedef BazisLib::Win32::NetworkFilterBase::int ( WSAAPI *  recv_ptr  )  [private]

virtual void BazisLib::Win32::NetworkFilterBase::OnDisconnect ( void *  pSystemContext,
void *  pUserContext 
) [protected, virtual]

virtual size_t BazisLib::Win32::NetworkFilterBase::OnReceive ( void *  pSystemContext,
void *  pSystemContext2,
void *  pBuf,
size_t  MaxSize,
void *  pUserContext,
bool  ForceBlockingMode 
) [protected, virtual]

virtual size_t BazisLib::Win32::NetworkFilterBase::OnSend ( void *  pSystemContext,
void *  pSystemContext2,
void *  pBuf,
size_t  MaxSize,
void *  pUserContext,
bool  ForceBlockingMode 
) [protected, virtual]

virtual BazisLib::ActionStatus BazisLib::Win32::NetworkFilterBase::OnStartConnect ( BazisLib::Network::_PlatformSpecificInternetAddress pAddr,
void **  ppUserContext 
) [protected, virtual]

static int WSAAPI BazisLib::Win32::NetworkFilterBase::recv_override ( SOCKET  s,
__out_bcount(len) char *  buf,
int  len,
int  flags 
) [static, private]

static int WSAAPI BazisLib::Win32::NetworkFilterBase::send_override ( SOCKET  s,
__in_bcount(len) const char *  buf,
int  len,
int  flags 
) [static, private]

void BazisLib::Win32::NetworkFilterBase::SignalDataReceivedEvent ( void *  pSystemContext  )  [protected]

Fires the 'receive ready' event.

This method should be called, for example, from OnSend() handler if the 'receive ready' event needs to be signaled before actual data is received from the remote side.

static SOCKET WSAAPI BazisLib::Win32::NetworkFilterBase::socket_override ( IN int  af,
IN int  type,
IN int  protocol 
) [static, private]

ActionStatus BazisLib::Win32::NetworkFilterBase::UninstallFilter ( IDLLPatcher pPatcher  ) 

static int WSAAPI BazisLib::Win32::NetworkFilterBase::WSAConnect_override ( IN SOCKET  s,
IN const struct sockaddr FAR *  name,
IN int  namelen,
IN LPWSABUF  lpCallerData,
OUT LPWSABUF  lpCalleeData,
IN LPQOS  lpSQOS,
IN LPQOS  lpGQOS 
) [static, private]

static int WSAAPI BazisLib::Win32::NetworkFilterBase::WSAEnumNetworkEvents_override ( IN SOCKET  s,
IN WSAEVENT  hEventObject,
OUT LPWSANETWORKEVENTS  lpNetworkEvents 
) [static, private]

static int WSAAPI BazisLib::Win32::NetworkFilterBase::WSAEventSelect_override ( IN SOCKET  s,
IN WSAEVENT  hEventObject,
IN long  lNetworkEvents 
) [static, private]


Member Data Documentation


The documentation for this class was generated from the following file:
SourceForge.net Logo