//========================================================================== // 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: Driver.h // // AUTHOR: Andrey A. Moiseenko // // OVERVIEW CMaaDriver class. // ~~~~~~~~ // DATE: 26.10.2003 //========================================================================== #ifndef __MAARF_DRIVER_H #define __MAARF_DRIVER_H /* #ifdef _WIN64 // IA64 void KfRaiseIrql(IN KIRQL NewIrql); #endif */ //--------------------------------------------------------------------------- class CMaaTimeService { #ifdef _WIN9x _dword * m_SystemTimeAddress; #endif public: CMaaTimeService (); _dword GetTimeMs (); }; //--------------------------------------------------------------------------- /* class MyMutex { #ifdef _WINNT KMUTEX m_Mutex; int m_RecN; KIRQL m_Levels[100]; #endif public: MyMutex(); ~MyMutex(); void Lock(); void UnLock(); }; */ //--------------------------------------------------------------------------- class MyUserEvent { #ifdef _WINNT KEVENT * m_kEvent[32]; #endif public: MyUserEvent(); ~MyUserEvent(); void SetupUserEvent(HANDLE h); LONG SetUserEvent(); }; //--------------------------------------------------------------------------- struct CDrvLockVerifier { int Proc; const char * File; int Line; CDrvLockVerifier(); ~CDrvLockVerifier(); void AfterLock(const char * f, int l); void BeforeUnLock(const char * f, int l); }; class CDrvLock { bool m_bLog; #ifndef __unix__ NDIS_SPIN_LOCK m_Lock; #ifdef _WINNT KIRQL m_Irql; #endif #else int m_Flags; bool m_IsLocked; #endif CDrvLockVerifier v; public: CDrvLock(bool bLog = true); ~CDrvLock(); //void Lock(); void Lock2(const char * f, int l); //void UnLock(); void UnLock2(const char * f, int l); }; //--------------------------------------------------------------------------- class CTextLog { bool m_bFirst; char * m_Buf; int m_Size; int m_Start, m_Len; public: CTextLog(bool bFirst, int Size); ~CTextLog(); bool IsOK(); void Put(const char * msg); int Get(char * Buf, int MaxBufSize); char * GetBuffer(int * pSize) { if (pSize) { *pSize = m_Size; } return m_Buf; } }; //--------------------------------------------------------------------------- class CMaaService; class CMaaDriver; typedef int ( CMaaDriver::*pfMaaRFService )( int Service, _byte * pBufferIn, int SizeIn, _byte * pBufferOut, int SizeOut, int * SizeOutRet ); //--------------------------------------------------------------------------- class CMaaDriver : public CMaaDriverBase { BOOL m_fTimersAreStarted; public: CDrvLockVerifier m_GLockV; CDrvLock m_Lock, m_PrintDbgLock; //MyMutex m_Mutex; // 02.02.2007 MyUserEvent m_AdapterListChangedEvent; MyUserEvent m_PacketInterceptedEvent; MyUserEvent m_ConnectedEvent; CMaaDList < CDrvPacket::CDrvPacketPtr > m_InterceptedPacketsList; CDrvFrame * pEthFrame, * pFddiFrame, * pTokenRingFrame; _byte * m_pMemBlock; CMaaUnivHash < NDIS_HANDLE, SimpleString * > m_hAllProtocolsNames; CMaaTimeService m_TimeService; CMaaUnivHash < int, pfMaaRFService > m_hServices; CMaaDList m_TcpOptsList; CMaaUnivHash m_hTcpSRedirs2, m_hTcpRRedirs2; CMaaUnivHash<_IP, int> m_hOptIpIdHash; CMaaUnivHash m_hOptJournals; CTextLog m_FirstLog, m_LastLog; public: CMaaDriver (); ~CMaaDriver (); BOOL IsOK (); void StartAllTimers (); BOOL LoadConfig (); void OnValidAdapterAppeared(CMaaService * pAdapter); void OnAdapterClosed(); void OnSetConnectedEvent(); CDrvPacket * GetInterceptedPacket(); void SetupAdapterListChangedEvent(HANDLE h); void SetupPacketInterceptedEvent(HANDLE h); void SetupConnectedEvent(HANDLE h); void SetConnectedEvent(); void AddTcpOpt(CTcpOptimization * o); void RemoveTcpOpt(CTcpOptimization * o); void AddOptJournalDataLocked(int JournalId, int Id, _IP UserIp, int In, int Out, bool bNoSwap); int GetOptIdByIpActivity(_IP Ip); void Log(const char * txt); int IOControl ( int Service, _byte * pBufferIn, int SizeIn, _byte * pBufferOut, int SizeOut, int * SizeOutRet ); DWORD VIP_Set_Address ( WORD Something, DWORD Address, DWORD Mask ); private: int Srv_GetVersion ( int Service, _byte * pBufferIn, int SizeIn, _byte * pBufferOut, int SizeOut, int * SizeOutRet ); int Srv_GetAdapterList ( int Service, _byte * pBufferIn, int SizeIn, _byte * pBufferOut, int SizeOut, int * SizeOutRet ); int Srv_GetAdapterInfo ( int Service, _byte * pBufferIn, int SizeIn, _byte * pBufferOut, int SizeOut, int * SizeOutRet ); int Srv_GetPacket ( int Service, _byte * pBufferIn, int SizeIn, _byte * pBufferOut, int SizeOut, int * SizeOutRet ); int Srv_PutPacket ( int Service, _byte * pBufferIn, int SizeIn, _byte * pBufferOut, int SizeOut, int * SizeOutRet ); int Srv_SetEventHandle ( int Service, _byte * pBufferIn, int SizeIn, _byte * pBufferOut, int SizeOut, int * SizeOutRet ); int Srv_TcpOptimize(int Service, _byte * pBufferIn, int SizeIn, _byte * pBufferOut, int SizeOut, int * SizeOutRet); int Srv_LoginLogout(int Service, _byte * pBufferIn, int SizeIn, _byte * pBufferOut, int SizeOut, int * SizeOutRet); int Srv_GetJournalRecs(int Service, _byte * pBufferIn, int SizeIn, _byte * pBufferOut, int SizeOut, int * SizeOutRet); int Srv_GetLog(int Service, _byte * pBufferIn, int SizeIn, _byte * pBufferOut, int SizeOut, int * SizeOutRet); int Srv_GetTcpOptStr(int Service, _byte * pBufferIn, int SizeIn, _byte * pBufferOut, int SizeOut, int * SizeOutRet); int Srv_GetWanUpLinks(int Service, _byte * pBufferIn, int SizeIn, _byte * pBufferOut, int SizeOut, int * SizeOutRet); int Srv_Test1 ( int Service, _byte * pBufferIn, int SizeIn, _byte * pBufferOut, int SizeOut, int * SizeOutRet ); int Srv_Test2 ( int Service, _byte * pBufferIn, int SizeIn, _byte * pBufferOut, int SizeOut, int * SizeOutRet ); }; //--------------------------------------------------------------------------- extern CMaaDriver * pdo; //--------------------------------------------------------------------------- void Lock2(const char * f, int l); void UnLock2(const char * f, int l); /* inline void Lock () { pdo -> m_Lock.Lock (); //pdo->m_Mutex.Lock(); } inline void UnLock () { pdo -> m_Lock.UnLock (); //pdo->m_Mutex.UnLock(); } */ #endif //__MAARF_DRIVER_H