//========================================================================== // PRODUCT: RusRoute - MaaSoftware routing firewall software driver // (C) Copyright Moiseenko A.A., MaaSoftware, 2003-2008. All Rights Reserved. // http://www.maasoftware.ru http://www.maasoftware.com // http://www.rusroute.ru http://www.rusroute.com // support@maasoftware.ru //========================================================================== // FILE: Service.cpp // // AUTHOR: Andrey A. Moiseenko // // OVERVIEW Common adapter services. // ~~~~~~~~ // DATE: 28.10.2003 //========================================================================== #ifndef __MAARF_SERVICE_H #define __MAARF_SERVICE_H class CMaaAdapterBase { public: CMaaAdapterBase () {} virtual ~CMaaAdapterBase () {} virtual BOOL IsOK () { return TRUE; } }; class CMaaService : public CMaaAdapterBase { int m_InfoObtained; public: //CDrvLock m_aLock; // TODO: Use this m_aLock void aLock(); void aUnLock(); enum eInfo { eInfoPermanentMac = 1, eInfoCurrentMac = 2, eInfoMaxFrameSize = 4 }; void OnInfoObtained ( eInfo Info ); CMaaPtr < CDrvPacket > m_DrvPackets; CMaaDList < CDrvPacket > m_FreeList, m_InterceptedPackets, m_RecvQueue; MyUserEvent m_PacketInterceptedEvent; MyUserEvent m_ConnectedEvent; void AddInterceptedPacket(CDrvPacket *p, bool bSetEvent); void SetInterceptedPacketEventsIfNeed(bool bContextIsLocked, bool bForce = false); CDrvPacket * GetInterceptedPacket(); void ReturnInterceptedPacket(CDrvPacket * p); void SetupPacketInterceptedEvent(HANDLE h); void SetupConnectedEvent(HANDLE h); void SetConnectedEvent(); private: #ifndef __unix__ NDIS_HANDLE m_PacketPoolHandle, m_BufferPoolHandle; _byte * m_PagesStart, * m_PagesEnd; int m_TotalBuffSize; #endif //__unix__ int m_IsError; int m_ChgFlg; public: int m_fIpChanging;//, m_fInternal; //CMaaDList < CDrvPacket > m_SendList, m_RecvList; CMaaAdapterInfo & m_Info; // NDIS_SPIN_LOCK m_SpinLock; int m_MaxFrameSize, m_FrameLimit; CDrvFrame * m_pFrame; public: CMaaService ( CMaaAdapterInfo * pAdapterInfo ); ~CMaaService (); void Init (); BOOL IsOK (); CDrvPacket * GetFreePacket ( int IsReceive, int IsInternal = 0 ); // IsReceive = 1 for receiving, 0 for sending ( it needs only for error settings ) void PreUnBind(); void ReturnPacket ( CDrvPacket * Packet );//, int IsInternal = 0 ); void InitPacket ( CDrvPacket & p ); #ifndef __unix__ int IsMyPacket ( PNDIS_PACKET Packet ); int IsMyContext ( void * addr ); // Get Free packet and copy ArbitraryPacket to it CDrvPacket * DublicatePacket ( PNDIS_PACKET ArbitraryPacket, int IsReceive ); #ifdef _WINNT // NULL if error PNDIS_BUFFER AllocateBuffer ( void * Address, int Length ); #endif #endif //__unix__ void OnSendPacket ( PNDIS_PACKET Packet, PNDIS_STATUS Status ); void OnRecvPacket ( CDrvPacket * Packet, PNDIS_STATUS Status ); void OnRecvComplete(); bool TryToOptimize(CDrvPacket * MyPacket); void DefferPacket ( CDrvPacket * Packet ); int PutPacket(CRusRoute_Packet0 &p); int PutPacket(CDrvPacket * MyPacket, int Dir, CMaaService * pMyPacketService); }; #endif __MAARF_SERVICE_H