windows-nt/Source/XPSP1/NT/sdktools/debuggers/excepmon/emsvc/svcobjdef.h
2020-09-26 16:20:57 +08:00

301 lines
6.2 KiB
C++

#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