|
|
#ifndef __SVCOBJDEF_H
#define __SVCOBJDEF_H
#include "genthread.h"
#include "evenhand.h"
#include "gencriticalsection.h"
#include "EmErr.h"
typedef struct tagSession {
HRESULT hrDebug;
PGENTHREAD pThread; PEmObject pEmObj;
} EMSession, *PEMSession, **PPEMSession;
typedef CMap < unsigned char*, unsigned char*, PEMSession, PEMSession > SessionsTable;
// DbgPrompt doesn't allow buffers greater than 512 bytes
// so limit these strings.
#define MAX_COMMAND 512
class CExcepMonSessionManager { public: HRESULT AdoptThisSession( unsigned char *pGuid); HRESULT OrphanThisSession ( IN unsigned char *pGuid );
HRESULT IsSessionOrphaned ( IN unsigned char *pGuid );
CExcepMonSessionManager (); ~CExcepMonSessionManager (); void CleanUp();
HRESULT AddSession ( IN PEmObject pEmObj, OUT PEMSession *ppNewEmSess );
HRESULT RemoveSession ( IN unsigned char *pGuidStream );
HRESULT GetSession ( IN unsigned char *pGuid, OUT PPEMSession ppEmSess );
HRESULT GetSession ( IN UINT nPid, IN BSTR bstrImageName, OUT PEMSession *ppEmSess );
HRESULT GetSessionStatus ( IN unsigned char *pGuid, OUT LONG *plSessStaus = NULL, OUT HRESULT *plHr = NULL );
HRESULT SetSessionStatus ( IN unsigned char *pGuid, IN LONG lSessStaus, IN HRESULT lHr, IN LPCTSTR lpszErrText = NULL, IN bool bRetainOrphanState = true, IN bool bSetEndTime = false );
HRESULT StopAllThreads ( void ) ;
HRESULT UpdateSessObject ( IN unsigned char *pGuid, IN PEmObject pEmObj );
HRESULT UpdateSessObject ( IN unsigned char *pGuid, IN DWORD dwEmObjFlds, IN PEmObject pEmObj );
HRESULT UpdateSessObject ( IN unsigned char *pGuid, IN DWORD dwEmObjFlds, IN short type = EMOBJ_UNKNOWNOBJECT, IN short type2 = SessType_Automatic, IN unsigned char *pguidstream = NULL, IN LONG nId = 0, IN TCHAR *pszName = NULL, IN TCHAR *pszSecName = NULL, IN LONG nStatus = STAT_SESS_NONE_STAT_NONE, IN DATE dateStart = 0L, IN DATE dateEnd = 0L, IN TCHAR *pszBucket1 = NULL, IN DWORD dwBucket1 = 0L, IN HRESULT hr = E_FAIL );
HRESULT IsAlreadyBeingDebugged(PEmObject pEmObj);
HRESULT GetNumberOfStoppedSessions(DWORD *pdwNumOfStoppedSessions); HRESULT GetNumberOfSessions(DWORD *pdwNumOfSessions);
HRESULT GetFirstStoppedSession ( OUT POSITION *ppos, OUT unsigned char **ppGuid, OUT PEMSession *ppEmSess );
HRESULT GetNextStoppedSession ( IN OUT POSITION *ppos, OUT unsigned char **ppGuid, OUT PEMSession *ppEmSess );
BOOL IsPortInUse ( IN UINT nPort );
HRESULT GetFirstSession ( OUT POSITION *ppos, OUT PEMSession *ppEmSess );
HRESULT GetNextSession ( IN OUT POSITION *ppos, OUT PEMSession *ppEmSess );
HRESULT PersistSessions ( IN LPCTSTR lpFilePath );
HRESULT InitSessionsFromLog ( IN LPCTSTR lpFilePath, IN EmStatusHiWord lStatusHi = STAT_SESS_NONE, IN EmStatusLoWord lStatusLo = STAT_NONE );
HRESULT AddLoggedSession ( IN PEmObject pEmObj );
protected:
HRESULT InternalStopAllThreads ( void ); HRESULT InternalRemoveSession ( PEMSession pEMSession );
private: SessionsTable m_SessTable; PGenCriticalSection m_pcs; };
//
// Debug Service
//
typedef enum eDBGServiceRequested { DBGService_None, DBGService_CreateMiniDump, DBGService_CreateUserDump, DBGService_Stop, DBGService_Cancel, DBGService_Go, DBGService_HandleException, DBGService_Error } eDBGServiceRequested;
class CEMSessionThread : public CGenThread {
public:
UINT m_nPort; SessionType eDBGSessType; HANDLE m_hEvent; HANDLE m_hCDBStarted;
eDBGServiceRequested eDBGServie;
// Interface pointers..
IDebugClient *m_pDBGClient; IDebugControl *m_pDBGControl; IDebugSymbols *m_pDBGSymbols;
PEmObject m_pEmSessObj;
EventCallbacks m_EventCallbacks;
STARTUPINFO m_sp; PROCESS_INFORMATION m_pi;
FILE *m_pEcxFile;
CExcepMonSessionManager *m_pASTManager;
public: HRESULT CancelDebugging(); CEMSessionThread(PEmObject pEmObj); ~CEMSessionThread();
DWORD Run ( void ); HRESULT CreateDumpFile( BOOL bMiniDump ); HRESULT StopDebugging( ); HRESULT OnException( PEXCEPTION_RECORD64 pException ); HRESULT OnProcessExit( ULONG nExitCode ); HRESULT CanContinue(); HRESULT KeepDebuggeeRunning(); HRESULT BreakIn(); HRESULT Execute(); HRESULT StopServer();
HRESULT InitAutomaticSession( BOOL bRecursive, BSTR bstrEcxFilePath, BSTR bstrNotificationString, BSTR bstrAltSymPath, BOOL bGenerateMiniDump, BOOL bGenerateUserDump );
HRESULT InitManualSession( BSTR bstrEcxFilePath, UINT nPortNumber, BSTR bstrUserName, BSTR bstrPassword, BOOL bBlockIncomingIPConnections, BSTR bstrAltSymPath );
protected: HRESULT GetServerConnectString( LPTSTR, DWORD ); HRESULT GetClientConnectString( LPTSTR, DWORD ); HRESULT StartCDBServer( LPTSTR ); HRESULT StartAutomaticExcepMonitoring( char * ); HRESULT StartManualExcepMonitoring( char * ); HRESULT GetCmd( eDBGServiceRequested, char *,DWORD &); HRESULT NotifyAdmin(LPCTSTR lpszData); HRESULT GetDescriptionFromEmObj(const PEmObject pEmObj, LPTSTR lpszDesc, ULONG cchDesc, LPCTSTR lpszHeader = NULL) const; HRESULT ExecuteCommandsTillGo( DWORD *pdwRes );
private: BOOL m_bContinueSession; BOOL m_bRecursive; BSTR m_bstrEcxFilePath; BSTR m_bstrNotificationString; BSTR m_bstrAltSymPath; BOOL m_bGenerateMiniDump; BOOL m_bGenerateUserDump;
BOOL m_bBlockIncomingIPConnections; BSTR m_bstrUserName; BSTR m_bstrPassword;
};
#endif // __SVCOBJDEF_H
|