mirror of
				https://github.com/bobranten/Ext4Fsd.git
				synced 2025-10-30 21:38:31 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			302 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			302 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // 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
 | |
| 
 | |
| 
 | |
| BOOL
 | |
| 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 __cdecl
 | |
| ManagerStartMain(VOID * arg)
 | |
| {
 | |
|     BOOL isService = (BOOL) arg;
 | |
|     CExt2MgrDlg* dlg = (CExt2MgrDlg*)theApp.m_pMainWnd;
 | |
| 
 | |
|     if (dlg) {
 | |
| 
 | |
|         /* always be quiet ! */
 | |
|         if (0 && !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();
 | |
| 
 | |
|         Ext2StopPipeSrv();
 | |
|     }
 | |
| 
 | |
|     if (isService) {
 | |
|         ManagerReportStatus(
 | |
|                 ServiceHandle,
 | |
|                 &ServiceStatus,
 | |
|                 SERVICE_STOPPED,
 | |
|                 NO_ERROR, 0   );
 | |
|     }
 | |
| }
 | |
| 
 | |
| void NTAPI
 | |
| 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();
 | |
| 
 | |
|     HWND hWnd = ::FindWindow(NULL, "Ext2 Volume Manager");
 | |
|     if (hWnd) {
 | |
|         if (::GetWindowLongPtr(hWnd, DWLP_USER) == EXT2_DIALOG_MAGIC) {
 | |
|             ::ShowWindow(hWnd, SW_SHOW);
 | |
|             ::SetForegroundWindow(hWnd);
 | |
|             return FALSE;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     BOOL bHide = FALSE;
 | |
|     BOOL bQuiet = FALSE;
 | |
|     BOOL bService = FALSE;
 | |
|     BOOL bInstall = FALSE;
 | |
|     BOOL bRemove = FALSE;
 | |
|     BOOL 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;
 | |
|     }
 | |
| 
 | |
|     Ext2IsX64System();
 | |
| 
 | |
|     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;
 | |
| }
 |