// // Application Verifier UI // Copyright (c) Microsoft Corporation, 2001 // // // // module: ChooseExe.cpp // author: CLupu // created: 04/13/2001 // // Description: // // "Launch the application to be verified" wizard page class. // #include "stdafx.h" #include "appverif.h" #include "StartApp.h" #include "AVUtil.h" #include "AVGlobal.h" #include "Log.h" #include "Debugger.h" #include "ChooseExe.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif HWND g_hWndOutput; BOOL g_bDebuggeeExited = TRUE; // // Help IDs // static DWORD MyHelpIds[] = { 0, 0 }; ///////////////////////////////////////////////////////////////////////////// // CStartAppPage property page IMPLEMENT_DYNCREATE(CStartAppPage, CAppverifPage) CStartAppPage::CStartAppPage() : CAppverifPage(CStartAppPage::IDD) { //{{AFX_DATA_INIT(CStartAppPage) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_nIssues = 0; m_bAppRun = FALSE; } CStartAppPage::~CStartAppPage() { } void CStartAppPage::DoDataExchange(CDataExchange* pDX) { CAppverifPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CStartAppPage) DDX_Control(pDX, IDC_EXE_NAME, m_ExeName); DDX_Control(pDX, IDC_RUNAPP_NEXTDESCR_STATIC, m_NextDescription); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CStartAppPage, CAppverifPage) //{{AFX_MSG_MAP(CStartAppPage) ON_MESSAGE( WM_HELP, OnHelp ) ON_WM_CONTEXTMENU() ON_BN_CLICKED(IDC_RUNAPP, OnRunApp) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// ULONG CStartAppPage::GetDialogId() const { return IDD_STARTAPP_PAGE; } ///////////////////////////////////////////////////////////////////////////// int g_nMessages = 0; TCHAR g_szMsg[1024]; void _cdecl LogMessage( MSGLEVEL mlevel, LPTSTR pszFmt, ... ) { va_list arglist; int off = 0; switch ( mlevel ) { case LOG_ERROR: lstrcpy( g_szMsg, _T("ERR: ") ); off = sizeof( _T("ERR: ") ) / sizeof( TCHAR ) - 1; break; case LOG_WARNING: lstrcpy( g_szMsg, _T("WRN: ") ); off = sizeof( _T("ERR: ") ) / sizeof( TCHAR ) - 1; break; case LOG_INFO: break; } va_start( arglist, pszFmt ); _vsntprintf( g_szMsg + off, 1023 - off, pszFmt, arglist ); g_szMsg[1023] = 0; // ensure null termination va_end( arglist ); TCHAR* psz = g_szMsg + lstrlen(g_szMsg) - 1; while ( *psz == _T('\n') || *psz == _T('\r') ) { *psz = 0; psz--; } if ( g_hWndOutput != NULL ) { SendMessage(g_hWndOutput, LB_ADDSTRING, 0, (LPARAM)g_szMsg); SendMessage(g_hWndOutput, LB_SETCURSEL, g_nMessages, 0); SendMessage(g_hWndOutput, LB_SETTOPINDEX, g_nMessages++, 0); } lstrcat( g_szMsg, _T("\r\n") ); OutputDebugString( g_szMsg ); } BOOL GetShortName( LPCTSTR lpszCmd, LPTSTR lpszShortName ) { LPCTSTR psz = lpszCmd; LPCTSTR pszStart = lpszCmd; LPCTSTR pszEnd; BOOL bBraket = FALSE; // // Skip over spaces... // while ( *psz == _T(' ') || *psz == _T('\t') ) { psz++; } if ( *psz == _T('\"') ) { bBraket = TRUE; psz++; pszStart = psz; } while ( *psz != 0 ) { if ( *psz == _T('\"') ) { pszEnd = psz; break; } else if ( *psz == _T('\\') ) { pszStart = psz + 1; } else if ( *psz == _T(' ') && !bBraket ) { pszEnd = psz; break; } psz++; } if ( *psz == 0 ) { pszEnd = psz; } RtlCopyMemory( lpszShortName, pszStart, (pszEnd - pszStart) * sizeof(TCHAR) ); lpszShortName[pszEnd - pszStart] = 0; return TRUE; } BOOL CStartAppPage::RunProgram() { HANDLE hThread; DWORD dwThreadId; LPARAM lParam; SetEnvironmentVariable( _T("VERIFIER_FILE_LOG"), VERIFIER_FILE_LOG_NAME ); if ( g_dwRegFlags & RTL_VRF_FLG_APPCOMPAT_CHECKS ) { SetEnvironmentVariable( _T("__COMPAT_LAYER"), APPVERIFIER_LAYER_NAME ); #if DBG SetEnvironmentVariable( _T("SHIM_FILE_LOG"), _T("dbg_av.txt") ); SetEnvironmentVariable( _T("SHIM_DEBUG_LEVEL"), _T("2") ); #endif // DBG } // // Get the short name. // GetShortName( g_szAppFullPath, g_szAppShortName ); if ( g_szAppShortName[0] == 0 ) { LogMessage( LOG_ERROR, _T("[RunProgram] No app is selected to run.") ); return FALSE; } InitFileLogSupport( VERIFIER_FILE_LOG_NAME ); // // Create the debugger thread. // lParam = (LPARAM)g_dwRegFlags; hThread = CreateThread( NULL, 0, ExecuteAppThread, (LPVOID)lParam, 0, &dwThreadId ); if ( hThread == NULL ) { LogMessage( LOG_ERROR, _T("[RunProgram] Failed to create the debugger thread.") ); return FALSE; } while ( 1 ) { MSG msg; DWORD dwRes; dwRes = MsgWaitForMultipleObjects( 1, &hThread, FALSE, INFINITE, QS_ALLINPUT ); if ( dwRes == WAIT_OBJECT_0 ) { break; } else if ( dwRes == WAIT_OBJECT_0 + 1 ) { // // There are some messages in message queue. // while ( PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE) ) { DispatchMessageA(&msg); } } else { break; } } CloseHandle( hThread ); m_bAppRun = TRUE; SetEnvironmentVariable( _T("__COMPAT_LAYER"), NULL ); return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CStartAppPage message handlers ///////////////////////////////////////////////////////////// LONG CStartAppPage::OnHelp( WPARAM wParam, LPARAM lParam ) { LONG lResult = 0; LPHELPINFO lpHelpInfo = (LPHELPINFO)lParam; ::WinHelp( (HWND) lpHelpInfo->hItemHandle, g_szAVHelpFile, HELP_WM_HELP, (DWORD_PTR) MyHelpIds ); return lResult; } ///////////////////////////////////////////////////////////////////////////// void CStartAppPage::OnContextMenu(CWnd* pWnd, CPoint point) { ::WinHelp( pWnd->m_hWnd, g_szAVHelpFile, HELP_CONTEXTMENU, (DWORD_PTR) MyHelpIds ); } void CStartAppPage::OnRunApp() { m_pParentSheet->EnableWindow(FALSE); RunProgram(); m_pParentSheet->EnableWindow(TRUE); m_pParentSheet->SetWizardButtons( PSWIZB_BACK | PSWIZB_NEXT ); } ///////////////////////////////////////////////////////////////////////////// LRESULT CStartAppPage::OnWizardNext() { GoingToNextPageNotify( IDD_VIEWLOG_PAGE ); return IDD_VIEWLOG_PAGE; } ///////////////////////////////////////////////////////////////////////////// BOOL CStartAppPage::OnSetActive() { ASSERT_VALID( m_pParentSheet ); if ( m_bAppRun ) { m_pParentSheet->SetWizardButtons( PSWIZB_BACK | PSWIZB_NEXT ); } else { m_pParentSheet->SetWizardButtons( PSWIZB_BACK ); } m_ExeName.SetWindowText(g_szAppFullPath); return CAppverifPage::OnSetActive(); } ///////////////////////////////////////////////////////////////////////////// BOOL CStartAppPage::OnInitDialog() { CAppverifPage::OnInitDialog(); g_hWndOutput = GetDlgItem(IDC_OUTPUT)->m_hWnd; AVSetWindowText( m_NextDescription, IDS_RUNAPP_NEXTDESCR_STATIC ); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } ///////////////////////////////////////////////////////////////////////////// // CStartAppPage message handlers