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

1245 lines
39 KiB
C++

// emshell.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "emshell.h"
#include "MainFrm.h"
#include "emshellDoc.h"
#include "emshellView.h"
#include "genparse.h"
#include <atlbase.h>
#include <comdef.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern BSTR CopyBSTR( LPBYTE pb, ULONG cb );
extern const TCHAR* gtcFileOpenFlags;
const TCHAR* gtcPollSessionsFreq = _T("PollSessionsFreq");
const TCHAR* gtcWindowHeight = _T("WindowHeight");
const TCHAR* gtcWindowWidth = _T("WindowWidth");
const TCHAR* gtcRecursive = _T("Recursive");
const TCHAR* gtcCommandSet = _T("CommandSet");
const TCHAR* gtcMiniDump = _T("MiniDump");
const TCHAR* gtcUserDump = _T("UserDump");
const TCHAR* gtcNotifyAdmin = _T("NotifyAdmin");
const TCHAR* gtcMsinfoDump = _T("MsinfoDump");
const TCHAR* gtcAdminName = _T("AdminName");
const TCHAR* gtcAltSymbolPath = _T("AltSymbolPath");
const TCHAR* gtcSelectedCommandSet = _T("SelectedCommandSet");
const TCHAR* gtcPassword = _T("Password");
const TCHAR* gtcPort = _T("Port");
const TCHAR* gtcUsername = _T("Username");
const TCHAR* gtcShowMSInfoDlg = _T("ShowMSInfoDlg");
const TCHAR* gtcEmDir = _T("emdir");
const TCHAR* gtcNoDebugProcesses = _T("NoDebugProcesses");
const TCHAR* gtcWildCardNoDebugServices = _T("WildCardNoDebugServices");
const TCHAR* gtcNoDebugServices = _T("NoDebugServices");
const TCHAR* gtcNoDbgDefSvcList = _T("EMSVC;RPCSS;IISADMIN");
const TCHAR* gtcNoDbgDefProcList = _T("EM.EXE;WINLOGON.EXE;EXPLORER.EXE;CSRSS.EXE;SMSS.EXE");
const TCHAR* gtcWldCrdDefList = _T("LSASS;SERVICES ;SVCHOST;SERVICES.EXE");
const TCHAR* gtcDefPassword = _T("microsoftvi");
const TCHAR* gtcDefPort = _T("70");
const TCHAR* gtcDefUsername = _T("em");
const TCHAR* gtcDefAltSymbolPath = _T("");
const TCHAR* gtcDefSelectedCommandSet = _T("");
const TCHAR* gtcDefAdminName = _T("");
const DWORD gnDefWindowWidth = 240;
const DWORD gnDefWindowHeight = 320;
const DWORD gnDefSessionRefreshRate = 30;
const DWORD gnDefUserDumpFlag = 0;
const DWORD gnDefShowMSInfoDlgFlag = 1;
const DWORD gnDefRecursiveFlag = 0;
const DWORD gnDefNotifyAdminFlag = 0;
const DWORD gnDefMSInfoDumpFlag = 0;
const DWORD gnDefMiniDumpFlag = 1;
const DWORD gnDefCommandSetFlag = 0;
/////////////////////////////////////////////////////////////////////////////
// CEmshellApp
BEGIN_MESSAGE_MAP(CEmshellApp, CWinApp)
//{{AFX_MSG_MAP(CEmshellApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
//}}AFX_MSG_MAP
// Standard file based document commands
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
// Standard print setup command
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CEmshellApp construction
CEmshellApp::CEmshellApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
m_dwSessionRefreshRate = gnDefSessionRefreshRate;
m_dwWindowWidth = gnDefWindowWidth;
m_dwWindowHeight = gnDefWindowHeight;
m_dwRecursive = gnDefRecursiveFlag;
m_dwMiniDump = gnDefMiniDumpFlag;
m_dwUserDump = gnDefUserDumpFlag;
m_dwMsinfoDump = gnDefMSInfoDumpFlag;
m_dwShowMSInfoDlg = gnDefShowMSInfoDlgFlag;
m_SessionSettings.dwCommandSet = gnDefCommandSetFlag;
m_SessionSettings.dwNotifyAdmin = gnDefNotifyAdminFlag;
m_SessionSettings.dwProduceMiniDump = gnDefMiniDumpFlag;
m_SessionSettings.dwProduceUserDump = gnDefUserDumpFlag;
m_SessionSettings.dwRecursiveMode = gnDefRecursiveFlag;
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CEmshellApp object
CEmshellApp theApp;
/////////////////////////////////////////////////////////////////////////////
#ifdef _DEBUG
void
TestCommandLine
(
LPCTSTR pszCmdLine
)
{
CGenCommandLine parser;
CString sText;
TCHAR *szCmdLines[] = {
L"-ntx",
L"-ntx -pid 45 -mfc, -ntx -vc6 -lib",
L"-server /tcp /port=325",
NULL
};
for (int i=0 ; szCmdLines[i] ; i++) {
parser.Initialize( szCmdLines[i] );
OutputDebugString ( szCmdLines[i] );
OutputDebugString ( L"\n" );
while ( parser.GetNext() != NULL ) {
LPCTSTR pszToken = parser.GetToken();
LPCTSTR pszValue = parser.GetValue();
sText.Format( TEXT("Token:%s, Value:%s\n"), (pszToken), (pszValue) );
OutputDebugString ( sText );
}
OutputDebugString ( L"\n" );
}
}
#endif // #ifdef _DEBUG
/////////////////////////////////////////////////////////////////////////////
// CEmshellApp initialization
BOOL CEmshellApp::InitInstance()
{
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
#ifdef _DEBUG
TestCommandLine(GetCommandLine());
#endif
//CoInitializeEx(NULL, COINIT_MULTITHREADED);
CoInitialize(NULL);
//CoInitializeEx( NULL, COINIT_MULTITHREADED );
// ::AfxOleInit();
if ( !InitEmshell() ) {
return false;
}
if(ReadDataFromRegistry() != ERROR_SUCCESS && CreateEmShellRegEntries() != ERROR_SUCCESS ) {
MessageBox( NULL, _T("Registry entry not found.\nPlease re-install the application"), _T("Registry corrupted"), MB_OK);
return FALSE;
}
//Get the path to CDB from the registry
GetCDBPathFromRegistry();
//Synchronize the session dlg data with the registry
UpdateSessionData();
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
bool CEmshellApp::InitEmshell
(
int nCmdShow /* = SW_SHOW */
)
{
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CEmshellDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CEmshellView));
AddDocTemplate(pDocTemplate);
return ( AfxGetApp()->OnCmdMsg(ID_FILE_NEW, 0, NULL, NULL) > 0);
}
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
virtual void OnOK();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// App command to run the dialog
void CEmshellApp::OnAppAbout()
{
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
/////////////////////////////////////////////////////////////////////////////
// CEmshellApp message handlers
void CAboutDlg::OnOK()
{
// TODO: Add extra validation here
CDialog::OnOK();
}
int CEmshellApp::ExitInstance()
{
//Uninitialize the COM services
//Taken out since were now using AfxOleInit
CoUninitialize();
SetEmShellRegOptions( TRUE );
return CWinApp::ExitInstance();
}
int CEmshellApp::DisplayErrMsgFromHR(HRESULT hr, UINT nType)
{
void* pMsgBuf;
DWORD dwSize = 0;
int nRetVal = 0;
CString strCaption;
CString strTemp;
CString strMessage;
do {
dwSize = ::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
hr,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &pMsgBuf,
0,
NULL) ;
if (dwSize == 0) break;
strMessage = (LPTSTR) pMsgBuf;
strMessage += "\n";
strCaption.LoadString(IDS_ERRORMSG);
//If we know the message, let's give them a description of what's going on
switch( LOWORD( hr ) ) {
case RPC_S_SERVER_UNAVAILABLE:
strMessage += "\n\n";
//Notify the user that the connection has failed.
strTemp.LoadString( IDS_ERROR_CONNECTION_TERMINATED );
strMessage += strTemp;
break;
}
nRetVal = MessageBox(::AfxGetMainWnd()->m_hWnd, strMessage, strCaption, nType);
//Release the buffer given to us from FormatMessage()
LocalFree(pMsgBuf);
} while (FALSE);
return nRetVal;
}
int CEmshellApp::DisplayErrMsgFromString(CString strMessage, UINT nType)
{
int nRetVal = 0;
CString strCaption;
strCaption.LoadString(IDS_ERRORMSG);
nRetVal = MessageBox(::AfxGetMainWnd()->m_hWnd, strMessage, strCaption, nType);
return nRetVal;
}
void CEmshellApp::GetEmObjectTypeString(LONG lType, CString &csStatusStr)
{
int nId = -1;
csStatusStr = _T("");
switch(lType)
{
case EMOBJ_SERVICE:
nId = IDS_EMOBJECT_TYPE_SERVICE;
break;
case EMOBJ_PROCESS:
nId = IDS_EMOBJECT_TYPE_PROCESS;
break;
case EMOBJ_LOGFILE:
nId = IDS_EMOBJECT_TYPE_LOGFILE;
break;
case EMOBJ_MINIDUMP:
nId = IDS_EMOBJECT_TYPE_MINIDUMP;
break;
case EMOBJ_USERDUMP:
nId = IDS_EMOBJECT_TYPE_USERDUMP;
break;
case EMOBJ_UNKNOWNOBJECT:
nId = IDS_EMOBJECT_TYPE_UNKNOWNOBJECT;
break;
default:
break;
}
csStatusStr.LoadString(nId);
}
PEmObject CEmshellApp::AllocEmObject()
{
PEmObject pEmObject = NULL;
pEmObject = new EmObject;
if (pEmObject == NULL) DisplayErrMsgFromHR(E_OUTOFMEMORY);
return pEmObject;
}
void CEmshellApp::DeAllocEmObject(PEmObject pEmObj)
{
_ASSERTE(pEmObj != NULL);
delete pEmObj;
}
void CEmshellApp::GetStatusString(LONG lStatus, CString &csStatusStr)
{
int nId = -1;
csStatusStr = _T("");
switch(lStatus)
{
case STAT_SESS_NOT_STARTED_RUNNING:
nId = IDS_STAT_SESS_NOT_STARTED_RUNNING;
break;
case STAT_SESS_NOT_STARTED_FILECREATED_SUCCESSFULLY:
nId = IDS_STAT_SESS_NOT_STARTED_FILECREATED_SUCCESSFULLY;
break;
case STAT_SESS_NOT_STARTED_FILECREATION_FAILED:
nId = IDS_STAT_SESS_NOT_STARTED_FILECREATION_FAILED;
break;
case STAT_SESS_NOT_STARTED_NOTRUNNING:
nId = IDS_STAT_SESS_NOT_STARTED_NOTRUNNING;
break;
case STAT_SESS_DEBUG_IN_PROGRESS_NONE:
nId = IDS_STAT_SESS_DEBUG_IN_PROGRESS_NONE;
break;
case STAT_SESS_DEBUG_IN_PROGRESS_FILECREATED_SUCESSFULLY:
nId = IDS_STAT_SESS_DEBUG_IN_PROGRESS_FILECREATED_SUCESSFULLY;
break;
case STAT_SESS_DEBUG_IN_PROGRESS_FILECREATION_FAILED:
nId = IDS_STAT_SESS_DEBUG_IN_PROGRESS_FILECREATION_FAILED;
break;
case STAT_SESS_DEBUG_IN_PROGRESS_ORPHAN_NONE:
nId = IDS_STAT_SESS_DEBUG_IN_PROGRESS_ORPHAN_NONE;
break;
case STAT_SESS_DEBUG_IN_PROGRESS_ORPHAN_FILECREATED_SUCESSFULLY:
nId = IDS_STAT_SESS_DEBUG_IN_PROGRESS_ORPHAN_FILECREATED_SUCESSFULLY;
break;
case STAT_SESS_DEBUG_IN_PROGRESS_ORPHAN_FILECREATION_FAILED:
nId = IDS_STAT_SESS_DEBUG_IN_PROGRESS_ORPHAN_FILECREATION_FAILED;
break;
case STAT_SESS_STOPPED_SUCCESS:
nId = IDS_STAT_SESS_STOPPED_SUCCESS;
break;
case STAT_SESS_STOPPED_FAILED:
nId = IDS_STAT_SESS_STOPPED_FAILED;
break;
case STAT_SESS_STOPPED_ORPHAN_SUCCESS:
nId = IDS_STAT_SESS_STOPPED_ORPHAN_SUCCESS;
break;
case STAT_SESS_STOPPED_ORPHAN_FAILED:
nId = IDS_STAT_SESS_STOPPED_ORPHAN_FAILED;
break;
case STAT_SESS_STOPPED_DEBUGGEE_KILLED:
nId = IDS_STAT_SESS_STOPPED_DEBUGGEE_KILLED;
break;
case STAT_SESS_STOPPED_DEBUGGEE_EXITED:
nId = IDS_STAT_SESS_STOPPED_DEBUGGEE_EXITED;
break;
case STAT_SESS_STOPPED_EXCEPTION_OCCURED:
nId = IDS_STAT_SESS_STOPPED_EXCEPTION_OCCURED;
break;
case STAT_SESS_STOPPED_ORPHAN_DEBUGGEE_KILLED:
nId = IDS_STAT_SESS_STOPPED_ORPHAN_DEBUGGEE_KILLED;
break;
case STAT_SESS_STOPPED_ORPHAN_DEBUGGEE_EXITED:
nId = IDS_STAT_SESS_STOPPED_ORPHAN_DEBUGGEE_EXITED;
break;
case STAT_SESS_STOPPED_ORPHAN_EXCEPTION_OCCURED:
nId = IDS_STAT_SESS_STOPPED_ORPHAN_EXCEPTION_OCCURED;
break;
case STAT_SESS_STOPPED_ACCESSVIOLATION_OCCURED:
nId = IDS_STAT_SESS_STOPPED_ACCESSVIOLATION_OCCURED;
break;
case STAT_SESS_STOPPED_ORPHAN_ACCESSVIOLATION_OCCURED:
nId = IDS_STAT_SESS_STOPPED_ORPHAN_ACCESSVIOLATION_OCCURED;
break;
default:
return;
}
csStatusStr.LoadString(nId);
}
void CEmshellApp::GetCDBPathFromRegistry()
{
CRegKey emshell;
LONG lRes = NULL;
DWORD dwSize = 0;
LPTSTR pString = NULL;
do {
//Open the key
lRes = emshell.Open( HKEY_LOCAL_MACHINE, EMSVC_SESSION_KEY );
if( lRes != ERROR_SUCCESS ) break;
//Get the size of the string in the registry
lRes = emshell.QueryValue( pString, gtcEmDir, &dwSize);
if ( lRes != ERROR_FILE_NOT_FOUND ) {
pString = m_strApplicationPath.GetBuffer( dwSize + sizeof( TCHAR ));
lRes = emshell.QueryValue( pString, gtcEmDir, &dwSize );
m_strApplicationPath.ReleaseBuffer();
if( lRes != ERROR_SUCCESS ) break;
}
} while( FALSE );
if ( lRes != ERROR_SUCCESS ) {
MessageBox(NULL, _T("Unable to get application install path from registry.\n Using help might not function properly."), _T("Registry operation failed"), MB_OK);
}
}
DWORD CEmshellApp::ReadDataFromRegistry ( HKEY hKey, LPCTSTR lpKey )
{
CRegKey emshell;
DWORD dwSize = 0;
LPTSTR pString = NULL;
LONG lRes = NULL;
do {
//Open the key
lRes = emshell.Open( hKey, lpKey );
if( lRes != ERROR_SUCCESS ) break;
lRes = emshell.QueryValue( m_dwWindowHeight, gtcWindowHeight );
if( lRes == ERROR_FILE_NOT_FOUND ) {
m_dwWindowHeight = gnDefWindowHeight;
if( lRes = CreateKeyAndSetData( hKey, lpKey, gtcWindowHeight, m_dwWindowHeight ) != ERROR_SUCCESS ) {
break;
}
}
lRes = emshell.QueryValue( m_dwWindowWidth, gtcWindowWidth );
if( lRes == ERROR_FILE_NOT_FOUND ) {
m_dwWindowWidth = gnDefWindowWidth;
if( lRes = CreateKeyAndSetData( hKey, lpKey, gtcWindowWidth, m_dwWindowWidth ) != ERROR_SUCCESS ) {
break;
}
}
lRes = emshell.QueryValue( m_dwShowMSInfoDlg, gtcShowMSInfoDlg );
if( lRes == ERROR_FILE_NOT_FOUND ) {
m_dwShowMSInfoDlg = gnDefShowMSInfoDlgFlag;
if( lRes = CreateKeyAndSetData( hKey, lpKey, gtcShowMSInfoDlg, m_dwShowMSInfoDlg ) != ERROR_SUCCESS ) {
break;
}
}
lRes = emshell.QueryValue( m_dwSessionRefreshRate, gtcPollSessionsFreq );
if( lRes == ERROR_FILE_NOT_FOUND ) {
m_dwSessionRefreshRate = gnDefSessionRefreshRate;
if( lRes = CreateKeyAndSetData( hKey, lpKey, gtcPollSessionsFreq, m_dwSessionRefreshRate ) != ERROR_SUCCESS ) {
break;
}
}
lRes = emshell.QueryValue( m_dwRecursive, gtcRecursive );
if( lRes == ERROR_FILE_NOT_FOUND ) {
m_dwRecursive = gnDefRecursiveFlag;
if( lRes = CreateKeyAndSetData( hKey, lpKey, gtcRecursive, m_dwRecursive ) != ERROR_SUCCESS ) {
break;
}
}
lRes = emshell.QueryValue( m_dwNotifyAdmin, gtcNotifyAdmin );
if( lRes == ERROR_FILE_NOT_FOUND ) {
m_dwNotifyAdmin = gnDefNotifyAdminFlag;
if( lRes = CreateKeyAndSetData( hKey, lpKey, gtcNotifyAdmin, m_dwNotifyAdmin ) != ERROR_SUCCESS ) {
break;
}
}
lRes = emshell.QueryValue( m_dwCommandSet, gtcCommandSet );
if( lRes == ERROR_FILE_NOT_FOUND ) {
m_dwCommandSet = gnDefCommandSetFlag;
if( lRes = CreateKeyAndSetData( hKey, lpKey, gtcCommandSet, m_dwCommandSet ) != ERROR_SUCCESS ) {
break;
}
}
lRes = emshell.QueryValue( m_dwMiniDump, gtcMiniDump );
if( lRes == ERROR_FILE_NOT_FOUND ) {
m_dwMiniDump = gnDefMiniDumpFlag;
if( lRes = CreateKeyAndSetData( hKey, lpKey, gtcMiniDump, m_dwMiniDump ) != ERROR_SUCCESS ) {
break;
}
}
lRes = emshell.QueryValue( m_dwUserDump, gtcUserDump );
if( lRes == ERROR_FILE_NOT_FOUND ) {
m_dwUserDump = gnDefUserDumpFlag;
if( lRes = CreateKeyAndSetData( hKey, lpKey, gtcUserDump, m_dwUserDump ) != ERROR_SUCCESS ) {
break;
}
}
lRes = emshell.QueryValue( m_dwMsinfoDump, gtcMsinfoDump );
if( lRes == ERROR_FILE_NOT_FOUND ) {
m_dwMsinfoDump = gnDefMSInfoDumpFlag;
if( lRes = CreateKeyAndSetData( hKey, lpKey, gtcMsinfoDump, m_dwMsinfoDump ) != ERROR_SUCCESS ) {
break;
}
}
dwSize = 0;
//Get the size of the string in the registry
lRes = emshell.QueryValue( pString, gtcAdminName, &dwSize);
if ( lRes == ERROR_FILE_NOT_FOUND ) {
//Create the entry
if( lRes = CreateKeyAndSetData( hKey, lpKey, gtcAdminName, gtcDefAdminName ) != ERROR_SUCCESS ) {
break;
}
} else {
pString = m_strAdminName.GetBuffer( dwSize + sizeof( TCHAR ));
lRes = emshell.QueryValue( pString, gtcAdminName, &dwSize );
m_strAdminName.ReleaseBuffer();
if( lRes != ERROR_SUCCESS ) break;
}
dwSize = 0;
//Get the size of the string in the registry
lRes = emshell.QueryValue( pString, gtcAltSymbolPath, &dwSize);
if ( lRes == ERROR_FILE_NOT_FOUND ) {
//Create the entry
if( lRes = CreateKeyAndSetData( hKey, lpKey, gtcAltSymbolPath, gtcDefAltSymbolPath ) != ERROR_SUCCESS ) {
break;
}
} else {
pString = m_strAltSymbolPath.GetBuffer( dwSize + sizeof( TCHAR ));
lRes = emshell.QueryValue( pString, gtcAltSymbolPath, &dwSize );
m_strAltSymbolPath.ReleaseBuffer();
if( lRes != ERROR_SUCCESS ) break;
}
dwSize = 0;
//Get the size of the string in the registry
lRes = emshell.QueryValue( pString, gtcSelectedCommandSet, &dwSize);
if ( lRes == ERROR_FILE_NOT_FOUND ) {
//Create the entry
if( lRes = CreateKeyAndSetData( hKey, lpKey, gtcSelectedCommandSet, gtcDefSelectedCommandSet ) != ERROR_SUCCESS ) {
break;
}
} else {
pString = m_strCommandSet.GetBuffer( dwSize + sizeof( TCHAR ));
lRes = emshell.QueryValue( pString, gtcSelectedCommandSet, &dwSize );
m_strCommandSet.ReleaseBuffer();
if( lRes != ERROR_SUCCESS ) break;
}
dwSize = 0;
//Get the size of the string in the registry
lRes = emshell.QueryValue( pString, gtcPassword, &dwSize);
if ( lRes == ERROR_FILE_NOT_FOUND ) {
//Create the entry
if( lRes = CreateKeyAndSetData( hKey, lpKey, gtcPassword, gtcDefPassword ) != ERROR_SUCCESS ) {
break;
}
} else {
pString = m_strPassword.GetBuffer( dwSize + sizeof( TCHAR ));
lRes = emshell.QueryValue( pString, gtcPassword, &dwSize );
m_strPassword.ReleaseBuffer();
if( lRes != ERROR_SUCCESS ) break;
}
dwSize = 0;
//Get the size of the string in the registry
lRes = emshell.QueryValue( pString, gtcPort, &dwSize);
if ( lRes == ERROR_FILE_NOT_FOUND ) {
//Create the entry
if( lRes = CreateKeyAndSetData( hKey, lpKey, gtcPort, gtcDefPort ) != ERROR_SUCCESS ) {
break;
}
} else {
pString = m_strPort.GetBuffer( dwSize + sizeof( TCHAR ));
lRes = emshell.QueryValue( pString, gtcPort, &dwSize );
m_strPort.ReleaseBuffer();
if( lRes != ERROR_SUCCESS ) break;
}
dwSize = 0;
//Get the size of the string in the registry
lRes = emshell.QueryValue( pString, gtcUsername, &dwSize);
if ( lRes == ERROR_FILE_NOT_FOUND ) {
//Create the entry
if( lRes = CreateKeyAndSetData( hKey, lpKey, gtcUsername, gtcDefUsername ) != ERROR_SUCCESS ) {
break;
}
} else {
pString = m_strUsername.GetBuffer( dwSize + sizeof( TCHAR ));
lRes = emshell.QueryValue( pString, gtcUsername, &dwSize );
m_strUsername.ReleaseBuffer();
if( lRes != ERROR_SUCCESS ) break;
}
dwSize = 0;
//Get the size of the string in the registry
lRes = emshell.QueryValue( pString, gtcNoDebugProcesses, &dwSize);
if ( lRes == ERROR_FILE_NOT_FOUND ) {
//Create the entry
if( lRes = CreateKeyAndSetData( hKey, lpKey, gtcNoDebugProcesses, gtcNoDbgDefProcList ) != ERROR_SUCCESS ) {
break;
}
} else {
pString = m_strIgnoreProcesses.GetBuffer( dwSize + sizeof( TCHAR ));
lRes = emshell.QueryValue( pString, gtcNoDebugProcesses, &dwSize );
m_strIgnoreProcesses.ReleaseBuffer();
if( lRes != ERROR_SUCCESS ) break;
}
dwSize = 0;
//Get the size of the string in the registry
lRes = emshell.QueryValue( pString, gtcWildCardNoDebugServices, &dwSize);
if ( lRes == ERROR_FILE_NOT_FOUND ) {
//Create the entry
if( lRes = CreateKeyAndSetData( hKey, lpKey, gtcWildCardNoDebugServices, gtcWldCrdDefList ) != ERROR_SUCCESS ) {
break;
}
} else {
pString = m_strWildCardIgnoreServices.GetBuffer( dwSize + sizeof( TCHAR ));
lRes = emshell.QueryValue( pString, gtcWildCardNoDebugServices, &dwSize );
m_strWildCardIgnoreServices.ReleaseBuffer();
if( lRes != ERROR_SUCCESS ) break;
}
dwSize = 0;
//Get the size of the string in the registry
lRes = emshell.QueryValue( pString, gtcNoDebugServices, &dwSize);
if ( lRes == ERROR_FILE_NOT_FOUND ) {
//Create the entry
if( lRes = CreateKeyAndSetData( hKey, lpKey, gtcNoDebugServices, gtcNoDbgDefSvcList ) != ERROR_SUCCESS ) {
break;
}
} else {
pString = m_strIgnoreServices.GetBuffer( dwSize + sizeof( TCHAR ) );
lRes = emshell.QueryValue( pString, gtcNoDebugServices, &dwSize );
m_strIgnoreServices.ReleaseBuffer();
if( lRes != ERROR_SUCCESS ) break;
}
} while ( FALSE );
if ( lRes != ERROR_SUCCESS ) {
MessageBox(NULL, _T("Unable to set registry values."), _T("Registry operation failed"), MB_OK);
}
return lRes;
}
DWORD
CEmshellApp::CreateEmShellRegEntries
(
HKEY hKey /* = HKEY_CURRENT_USER */,
LPCTSTR lpszKey /* = _T("Software\\Microsoft\\EM\\shell") */
)
{
LONG lRes = 0L;
if( (lRes = CreateKeyAndSetData( hKey, lpszKey, gtcPollSessionsFreq, m_dwSessionRefreshRate ) != ERROR_SUCCESS) ||
(lRes = CreateKeyAndSetData( hKey, lpszKey, gtcWindowHeight, m_dwWindowHeight ) != ERROR_SUCCESS) ||
(lRes = CreateKeyAndSetData( hKey, lpszKey, gtcWindowWidth, m_dwWindowWidth ) != ERROR_SUCCESS) ||
(lRes = CreateKeyAndSetData( hKey, lpszKey, gtcRecursive, m_dwRecursive ) != ERROR_SUCCESS) ||
(lRes = CreateKeyAndSetData( hKey, lpszKey, gtcCommandSet, m_dwCommandSet ) != ERROR_SUCCESS) ||
(lRes = CreateKeyAndSetData( hKey, lpszKey, gtcMiniDump, m_dwMiniDump ) != ERROR_SUCCESS) ||
(lRes = CreateKeyAndSetData( hKey, lpszKey, gtcUserDump, m_dwUserDump ) != ERROR_SUCCESS) ||
(lRes = CreateKeyAndSetData( hKey, lpszKey, gtcNotifyAdmin, m_dwNotifyAdmin ) != ERROR_SUCCESS) ||
(lRes = CreateKeyAndSetData( hKey, lpszKey, gtcMsinfoDump, m_dwMsinfoDump ) != ERROR_SUCCESS) ||
(lRes = CreateKeyAndSetData( hKey, lpszKey, gtcAdminName, m_strAdminName ) != ERROR_SUCCESS) ||
(lRes = CreateKeyAndSetData( hKey, lpszKey, gtcAltSymbolPath, m_strAltSymbolPath ) != ERROR_SUCCESS) ||
(lRes = CreateKeyAndSetData( hKey, lpszKey, gtcSelectedCommandSet, m_strCommandSet ) != ERROR_SUCCESS) ||
(lRes = CreateKeyAndSetData( hKey, lpszKey, gtcPassword, m_strPassword ) != ERROR_SUCCESS) ||
(lRes = CreateKeyAndSetData( hKey, lpszKey, gtcPort, m_strPort ) != ERROR_SUCCESS) ||
(lRes = CreateKeyAndSetData( hKey, lpszKey, gtcUsername, m_strUsername ) != ERROR_SUCCESS) ||
(lRes = CreateKeyAndSetData( hKey, lpszKey, gtcShowMSInfoDlg, m_dwShowMSInfoDlg ) != ERROR_SUCCESS)
) {
MessageBox(NULL, _T("Unable to set registry values."), _T("Registry operation failed"), MB_OK);
}
return lRes;
}
DWORD
CEmshellApp::CreateKeyAndSetData
(
HKEY hKeyParent,
LPCTSTR lpszKeyName,
LPCTSTR lpszNamedValue,
LPCTSTR lpValue,
LPTSTR lpszClass /* = REG_NONE */
)
{
CRegKey registry;
do {
if( registry.Create(hKeyParent, lpszKeyName, lpszClass) != ERROR_SUCCESS ) {
return GetLastError();
}
if( registry.SetValue( lpValue, lpszNamedValue ) != ERROR_SUCCESS ) {
return GetLastError();
}
}
while( false );
if( HKEY(registry) != NULL ) {
registry.Close();
}
return 0L; // Successful
}
DWORD
CEmshellApp::CreateKeyAndSetData
(
HKEY hKeyParent,
LPCTSTR lpszKeyName,
LPCTSTR lpszNamedValue,
DWORD dwValue,
LPTSTR lpszClass /* = REG_NONE */
)
{
CRegKey registry;
do {
if( registry.Create(hKeyParent, lpszKeyName) != ERROR_SUCCESS ) {
return GetLastError();
}
if( registry.SetValue( dwValue, lpszNamedValue ) != ERROR_SUCCESS ) {
return GetLastError();
}
}
while( false );
if( HKEY(registry) != NULL ) {
registry.Close();
}
return 0L; // Successful
}
void
CEmshellApp::GetEmShellRegOptions
(
BOOL bReadFromRegistry /* = FALSE */,
DWORD *pdwPollingSessionsFreq /* = NULL */,
DWORD *pdwWindowHeight /* = NULL */,
DWORD *pdwWindowWidth /* = NULL */,
DWORD *pdwRecursive /* = NULL */,
DWORD *pdwCommandSet /* = NULL */,
DWORD *pdwMiniDump /* = NULL */,
DWORD *pdwUserDump /* = NULL */,
DWORD *pdwNotifyAdmin /* = NULL */,
DWORD *pdwMsinfoDump /* = NULL */,
CString *pstrAdminName /* = NULL */,
CString *pstrAltSymbolPath /* = NULL */,
CString *pstrCommandSet /* = NULL */,
CString *pstrPassword /* = NULL */,
CString *pstrPort /* = NULL */,
CString *pstrUsername /* = NULL */,
DWORD *pdwShowMSInfoDlg /* = NULL */
)
{
if( bReadFromRegistry ) { ReadDataFromRegistry(); }
if( pdwPollingSessionsFreq ) *pdwPollingSessionsFreq = m_dwSessionRefreshRate; // MilliSeconds
if( pdwWindowHeight ) *pdwWindowHeight = m_dwWindowHeight;
if( pdwWindowWidth ) *pdwWindowWidth = m_dwWindowWidth;
if( pdwRecursive ) *pdwRecursive = m_dwRecursive;
if( pdwCommandSet ) *pdwCommandSet = m_dwCommandSet;
if( pdwMiniDump ) *pdwMiniDump = m_dwMiniDump;
if( pdwUserDump ) *pdwUserDump = m_dwUserDump;
if( pdwNotifyAdmin ) *pdwNotifyAdmin = m_dwNotifyAdmin;
if( pdwMsinfoDump ) *pdwMsinfoDump = m_dwMsinfoDump;
if( pstrAdminName ) *pstrAdminName = m_strAdminName;
if( pstrAltSymbolPath ) *pstrAltSymbolPath = m_strAltSymbolPath;
if( pstrCommandSet ) *pstrCommandSet = m_strCommandSet;
if( pstrPassword ) *pstrPassword = m_strPassword;
if( pstrPort ) *pstrPort = m_strPort;
if( pstrUsername ) *pstrUsername = m_strUsername;
if( pdwShowMSInfoDlg ) *pdwShowMSInfoDlg = m_dwShowMSInfoDlg;
}
void
CEmshellApp::SetEmShellRegOptions
(
const BOOL bUpdateRegistry /* = FALSE */,
const DWORD *pdwPollingSessionsFreq /* = NULL */,
const DWORD *pdwWindowHeight /* = NULL */,
const DWORD *pdwWindowWidth /* = NULL */,
const DWORD *pdwRecursive /* = NULL */,
const DWORD *pdwCommandSet /* = NULL */,
const DWORD *pdwMiniDump /* = NULL */,
const DWORD *pdwUserDump /* = NULL */,
const DWORD *pdwNotifyAdmin /* = NULL */,
const DWORD *pdwMsinfoDump /* = NULL */,
CString *pstrAdminName /* = NULL */,
CString *pstrAltSymbolPath /* = NULL */,
CString *pstrCommandSet /* = NULL */,
CString *pstrPassword /* = NULL */,
CString *pstrPort /* = NULL */,
CString *pstrUsername /* = NULL */,
const DWORD *pdwShowMSInfoDlg /* = NULL */
)
{
if( pdwPollingSessionsFreq ) m_dwSessionRefreshRate = *pdwPollingSessionsFreq; // will be stored as secs.
if( pdwWindowHeight ) m_dwWindowHeight = *pdwWindowHeight;
if( pdwWindowWidth ) m_dwWindowWidth = *pdwWindowWidth;
if( pdwRecursive ) m_dwRecursive = *pdwRecursive;
if( pdwCommandSet ) m_dwCommandSet = *pdwCommandSet;
if( pdwMiniDump ) m_dwMiniDump = *pdwMiniDump;
if( pdwUserDump ) m_dwUserDump = *pdwUserDump;
if( pdwNotifyAdmin ) m_dwNotifyAdmin = *pdwNotifyAdmin;
if( pdwMsinfoDump ) m_dwMsinfoDump = *pdwMsinfoDump;
if( pstrAdminName ) m_strAdminName = *pstrAdminName;
if( pstrAltSymbolPath ) m_strAltSymbolPath = *pstrAltSymbolPath;
if( pstrCommandSet ) m_strCommandSet = *pstrCommandSet;
if( pstrPassword ) m_strPassword = *pstrPassword;
if( pstrPort ) m_strPort = *pstrPort;
if( pstrUsername ) m_strUsername = *pstrUsername;
if( pdwShowMSInfoDlg ) m_dwShowMSInfoDlg = *pdwShowMSInfoDlg;
if( bUpdateRegistry ) { CreateEmShellRegEntries(); }
}
void __stdcall _com_issue_error( HRESULT hr )
{
throw _com_error ( hr );
}
BOOL CEmshellApp::AskForPath( CString &strDirPath )
{
LPITEMIDLIST lpItemIDlist = NULL;
UINT nFlags = BIF_NEWDIALOGSTYLE;
BOOL bRetVal = FALSE;
TCHAR szDisplayName[_MAX_PATH];
TCHAR szBuffer[_MAX_PATH];
CString strTitle;
BROWSEINFO browseInfo;
LPMALLOC lpMalloc; // pointer to IMalloc
strTitle.LoadString( IDS_EXPORT_FILES_CAPTION );
//Initialize the browseinfo object
browseInfo.hwndOwner = ::AfxGetMainWnd()->m_hWnd; // set root at Desktop
browseInfo.pidlRoot = NULL;
browseInfo.pszDisplayName = szDisplayName;
browseInfo.lpszTitle = strTitle; // passed in
browseInfo.ulFlags = nFlags; // also passed in
browseInfo.lpfn = NULL; // not used
browseInfo.lParam = 0; // not used
do {
if (::SHGetMalloc(&lpMalloc) != NOERROR) break; // failed to get allocator
if ((lpItemIDlist = ::SHBrowseForFolder(&browseInfo)) != NULL)
{
// Get the path of the selected folder from the item ID list.
if (::SHGetPathFromIDList(lpItemIDlist, szBuffer)) {
// At this point, szBuffer contains the path the user chose.
if (szBuffer[0] == '\0') {
strTitle.LoadString( IDS_EXPORT_FAILED_GET_DIRECTORY );
((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromString( strTitle );
break;
}
// We have a path in szBuffer!
// Return it.
strDirPath = szBuffer;
bRetVal = TRUE;
}
}
else {
break;
}
if ( strDirPath[strDirPath.GetLength() - 1 ] != CString( _T("\\") ) )
strDirPath += _T("\\");
} while ( FALSE );
if ( lpItemIDlist ) {
lpMalloc->Free( lpItemIDlist );
lpItemIDlist = NULL;
}
if ( lpMalloc ) {
lpMalloc->Release();
lpMalloc = NULL;
}
return bRetVal;
}
HRESULT CEmshellApp::ExportLog( PEmObject pEmObject, CString strDirPath, IEmManager* pEmManager )
{
char lpszLogData[ISTREAM_BUFFER_SIZE];
BSTR bstrEmObject = NULL;
HRESULT hr = E_FAIL;
IStream* pIEmStream = NULL;
ULONG lRead = 0L;
size_t tWritten = 0;
FILE* pLogFile = NULL;
CString strMessage;
do {
//Initialize the bstrEmObject for the call to the server
bstrEmObject = CopyBSTR ( (LPBYTE)pEmObject, sizeof( EmObject ) );
if( bstrEmObject == NULL ){
hr = E_OUTOFMEMORY;
break;
}
//Get an IStream* file pointer for the currently selected item.
hr = pEmManager->GetEmFileInterface( bstrEmObject, (IStream **)&pIEmStream );
if( FAILED( hr ) ) break;
//Append the filename to the directory name
strDirPath += pEmObject->szName;
CFileFind finder;
BOOL bFound = finder.FindFile( strDirPath );
if ( bFound ) {
strMessage.LoadString( IDS_FILEOVERWRITE_CONFIRMATION );
//Ask the user if they want to overwrite, if not break.
if (((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromString(strMessage, MB_YESNO) == IDNO) break;
}
//Set the cursor to a wait cursor
CWaitCursor wait;
//Create the file in the selected directory
pLogFile = _tfopen( strDirPath, gtcFileOpenFlags );
if ( pLogFile == NULL ) {
hr = HRESULT_FROM_WIN32( GetLastError() );
break;
}
//Read the stream into the file
do {
hr = pIEmStream->Read( (void *)lpszLogData, ISTREAM_BUFFER_SIZE, &lRead );
if ( lRead == 0 || FAILED( hr ) ) break;
tWritten = fwrite( lpszLogData, sizeof( char ), lRead, pLogFile );
if ( tWritten == 0 ) {
hr = E_FAIL;
break;
}
} while (TRUE);
if ( FAILED( hr ) ) break;
} while ( FALSE );
if ( FAILED( hr ) ) {
((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR( hr );
}
if ( pIEmStream ) {
SAFE_RELEASEIX( pIEmStream );
}
if ( pLogFile ) {
fclose( pLogFile );
pLogFile = NULL;
}
return( hr );
}
BOOL CEmshellApp::CanDisplayProcess(TCHAR *pszName)
{
BOOL bRetVal = TRUE;
TCHAR* pszIgnoreProcesses = new TCHAR[m_strIgnoreProcesses.GetLength() + sizeof(TCHAR)];
TCHAR* token = NULL;
wcscpy( pszIgnoreProcesses, m_strIgnoreProcesses );
//Tokenize and iterate through each element in the string comparing the
//element with the service name
token = wcstok( pszIgnoreProcesses, _T(";") );
while( token != NULL )
{
if ( !_wcsicmp( token, pszName ) ) {
bRetVal = FALSE;
break;
}
/* Get next token: */
token = wcstok( NULL, _T(";") );
}
delete[] pszIgnoreProcesses;
return bRetVal;
}
BOOL CEmshellApp::CanDisplayService(TCHAR *pszName, TCHAR *pszSecName)
{
BOOL bRetVal = TRUE;
TCHAR* pszIgnoreServices = new TCHAR[m_strIgnoreServices.GetLength() + sizeof(TCHAR)];
ASSERT( pszIgnoreServices != NULL );
if( pszIgnoreServices == NULL ) return bRetVal;
TCHAR* pszWildCardIgnoreServices = new TCHAR[m_strWildCardIgnoreServices.GetLength() + sizeof(TCHAR)];
ASSERT( pszWildCardIgnoreServices != NULL );
if( pszWildCardIgnoreServices == NULL ) {
delete pszWildCardIgnoreServices;
return bRetVal;
}
TCHAR* token = NULL;
do {
wcscpy( pszWildCardIgnoreServices, m_strWildCardIgnoreServices );
//Tokenize and iterate through each element in the string looking for each
//element within the service name
token = wcstok( pszWildCardIgnoreServices, _T(";") );
while( token != NULL )
{
if ( wcsstr( _wcslwr( pszName ), _wcslwr( token ) ) ) {
bRetVal = FALSE;
break;
}
/* Get next token: */
token = wcstok( NULL, _T(";") );
}
//Break out if we know we can't show it.
if ( !bRetVal ) break;
wcscpy( pszIgnoreServices, m_strIgnoreServices );
//Tokenize and iterate through each element in the string comparing the
//element with the service name
token = wcstok( pszIgnoreServices, _T(";") );
while( token != NULL )
{
if ( !_wcsicmp( token, pszSecName ) ) {
bRetVal = FALSE;
break;
}
/* Get next token: */
token = wcstok( NULL, _T(";") );
}
} while ( FALSE );
delete[] pszIgnoreServices;
delete[] pszWildCardIgnoreServices;
return bRetVal;
}
void CEmshellApp::UpdateSessionData( BOOL bUpdate )
{
if( bUpdate ) {
//Write out the session info to the app registry entries
m_dwCommandSet = m_SessionSettings.dwCommandSet;
m_dwMiniDump = m_SessionSettings.dwProduceMiniDump;
m_dwRecursive = m_SessionSettings.dwRecursiveMode;
m_dwUserDump = m_SessionSettings.dwProduceUserDump;
m_dwNotifyAdmin = m_SessionSettings.dwNotifyAdmin;
m_strAdminName = m_SessionSettings.strAdminName;
m_strAltSymbolPath = m_SessionSettings.strAltSymbolPath;
m_strCommandSet = m_SessionSettings.strCommandSet;
m_strPassword = m_SessionSettings.strPassword;
m_strUsername = m_SessionSettings.strUsername;
m_strPort = m_SessionSettings.strPort;
//Flush the changes to the registry
CreateEmShellRegEntries();
}
else {
//Retrieve the session info from the app registry entries
m_SessionSettings.dwCommandSet = m_dwCommandSet;
m_SessionSettings.dwProduceMiniDump = m_dwMiniDump;
m_SessionSettings.dwRecursiveMode = m_dwRecursive;
m_SessionSettings.dwProduceUserDump = m_dwUserDump;
m_SessionSettings.dwNotifyAdmin = m_dwNotifyAdmin;
m_SessionSettings.strAdminName = m_strAdminName;
m_SessionSettings.strAltSymbolPath = m_strAltSymbolPath;
m_SessionSettings.strCommandSet = m_strCommandSet;
m_SessionSettings.strPassword = m_strPassword;
m_SessionSettings.strUsername = m_strUsername;
m_SessionSettings.strPort = m_strPort;
}
}