// Ext2Mgr.cpp : Defines the class behaviors for the application. // #include "stdafx.h" #include "Ext2Mgr.h" #include "Ext2MgrDlg.h" #include "Splash.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CExt2MgrApp BEGIN_MESSAGE_MAP(CExt2MgrApp, CWinApp) //{{AFX_MSG_MAP(CExt2MgrApp) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG ON_COMMAND(ID_HELP, CWinApp::OnHelp) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CExt2MgrApp construction CExt2MgrApp::CExt2MgrApp() { // TODO: add construction code here, // Place all significant initialization in InitInstance } ///////////////////////////////////////////////////////////////////////////// // The one and only CExt2MgrApp object CExt2MgrApp theApp; ///////////////////////////////////////////////////////////////////////////// // globals DWORD Checkpoint = 1; SERVICE_STATUS ServiceStatus; SERVICE_STATUS_HANDLE ServiceHandle; ///////////////////////////////////////////////////////////////////////////// // CExt2MgrApp initialization #if 0 void WINAPI ManagerServiceEntry(DWORD argc, char **argv); void ManagerServiceThread(void *arg); void ManagerStopService(); void WINAPI ManagerServiceCtrl(DWORD ctrlcode); #endif BOOLEAN ManagerReportStatus( SERVICE_STATUS_HANDLE Handle, SERVICE_STATUS* Status, DWORD State, DWORD Exitcode, DWORD Timeout ) { // If we're in the start state then we don't want the control manager // sending us control messages because they'll confuse us. if (State == SERVICE_START_PENDING) { Status->dwControlsAccepted = 0; } else { Status->dwControlsAccepted = SERVICE_ACCEPT_STOP; } // Save the new status we've been given Status->dwCurrentState = State; Status->dwWin32ExitCode = Exitcode; Status->dwWaitHint = Timeout; // Update the checkpoint variable to let the SCM know that we // haven't died if requests take a long time if ((State == SERVICE_RUNNING) || (State == SERVICE_STOPPED)) { Status->dwCheckPoint = 0; } else { Status->dwCheckPoint = Checkpoint++; } // Tell the SCM our new status return SetServiceStatus(Handle, Status); } void ManagerStopService() { ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING; theApp.m_pMainWnd->SendMessage(WM_TERMINATE_PROGRAM, 0, 0x1234); } void WINAPI ManagerCtrlService(DWORD ctrlcode) { switch (ctrlcode) { case SERVICE_CONTROL_STOP: // STOP : The service must stop ManagerStopService(); break; case SERVICE_CONTROL_INTERROGATE: // QUERY : Service control manager just wants to know our state break; default: // Control code not recognised break; } // Tell the control manager what we're up to. ManagerReportStatus( ServiceHandle, &ServiceStatus, ServiceStatus.dwCurrentState, NO_ERROR, 0); } VOID ManagerStartMain(VOID * arg) { BOOLEAN isService = (BOOLEAN) arg; CExt2MgrDlg* dlg = (CExt2MgrDlg*)theApp.m_pMainWnd; if (dlg) { if (!dlg->m_bQuiet) { CSplash* splash = new CSplash(IDB_ABOUT_SCREEN, RGB(128, 128, 128)); splash->ShowSplash(); dlg->m_splash = splash; } if (isService) { ManagerReportStatus( ServiceHandle, &ServiceStatus, SERVICE_RUNNING, NO_ERROR, 0 ); } dlg->DoModal(); } if (isService) { ManagerReportStatus( ServiceHandle, &ServiceStatus, SERVICE_STOPPED, NO_ERROR, 0 ); } } void WINAPI ManagerServiceEntry(DWORD argc, char**argv) { // register the service control handler ServiceHandle = RegisterServiceCtrlHandler( "Ext2Mgr", ManagerCtrlService ); if (ServiceHandle == 0) { return; } // setup standard service state values ServiceStatus.dwServiceType = SERVICE_WIN32 | SERVICE_INTERACTIVE_PROCESS; ServiceStatus.dwServiceSpecificExitCode = 0; // report our status to the SCM if (!ManagerReportStatus( ServiceHandle, &ServiceStatus, SERVICE_START_PENDING, NO_ERROR, 600000 )) { ManagerReportStatus( ServiceHandle, &ServiceStatus, SERVICE_STOPPED, NO_ERROR, 0); return; } // Now start the service for real _beginthread(ManagerStartMain, 0, (PVOID)TRUE); return; } VOID ManagerStartService(VOID *arg) { SERVICE_TABLE_ENTRY ManagerSeriveTable[] = { {"Ext2Mgr", (LPSERVICE_MAIN_FUNCTION)ManagerServiceEntry}, {NULL, NULL} }; // let service control dispatcher start Ext2Mgr StartServiceCtrlDispatcher(ManagerSeriveTable); } BOOL CExt2MgrApp::InitInstance() { AfxEnableControlContainer(); // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif HWND hWnd = ::FindWindow(NULL, "Ext2 Volume Manager"); if (hWnd) { if (::GetWindowLong(hWnd, DWL_USER) == EXT2_DIALOG_MAGIC) { ::ShowWindow(hWnd, SW_SHOW); ::SetForegroundWindow(hWnd); return FALSE; } } BOOLEAN bHide = FALSE; BOOLEAN bQuiet = FALSE; BOOLEAN bService = FALSE; BOOLEAN bInstall = FALSE; BOOLEAN bRemove = FALSE; BOOLEAN bStat = FALSE; char * cmds = GetCommandLine(); int i = (int)strlen(cmds); while (--i > 0) { if (cmds[i] == (char)' ') { cmds[i] = 0; if ( strlen(&cmds[i+1]) == 5 && _stricmp(&cmds[i+2], "hide") == 0 && (cmds[i+1] == '/' || cmds[i+1] == '-')) { bHide = TRUE; } else if (strlen(&cmds[i+1]) == 6 && _stricmp(&cmds[i+2], "quiet") == 0 && (cmds[i+1] == '/' || cmds[i+1] == '-')) { bHide = bQuiet = TRUE; } else if (strlen(&cmds[i+1]) == 8 && _stricmp(&cmds[i+2], "install") == 0 && (cmds[i+1] == '/' || cmds[i+1] == '-')) { bInstall = TRUE; } else if (strlen(&cmds[i+1]) == 7 && _stricmp(&cmds[i+2], "remove") == 0 && (cmds[i+1] == '/' || cmds[i+1] == '-')) { bRemove = TRUE; } else if (strlen(&cmds[i+1]) == 8 && _stricmp(&cmds[i+2], "service") == 0 && (cmds[i+1] == '/' || cmds[i+1] == '-')) { bHide = bService = TRUE; } else if (strlen(&cmds[i+1]) == 5 && _stricmp(&cmds[i+2], "stat") == 0 && (cmds[i+1] == '/' || cmds[i+1] == '-')) { bHide = bStat = TRUE; } } } if (bInstall) { Ext2SetManagerAsService(TRUE); return FALSE; } if (bRemove) { Ext2SetManagerAsService(FALSE); return FALSE; } CExt2MgrDlg theDlg; theDlg.m_bHide = bHide; theDlg.m_bQuiet = bQuiet = bHide; theDlg.m_bService = bService; theDlg.m_bStat = bStat; m_pMainWnd = &theDlg; if (bService) { ManagerStartService(NULL); } else { ManagerStartMain(NULL); } // Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application's message pump. return FALSE; }