1245 lines
39 KiB
C++
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;
|
|
}
|
|
}
|
|
|