BOOL InitApp (LPSTR pszCmdLineA) { BOOL fShow = FALSE; BOOL fQuiet = FALSE; BOOL fExit = FALSE; BOOL fInstall = FALSE; BOOL fUninstall = FALSE; BOOL fAutoInit = FALSE; BOOL fNetDetect = FALSE; BOOL fRenewMaps = FALSE; // Initialize our global variables and window classes // memset (&g, 0x00, sizeof(g)); g.fStartup = TRUE; // Parse the command-line // while (pszCmdLineA && *pszCmdLineA) { if ((*pszCmdLineA != '-') && (*pszCmdLineA != '/')) break; switch (*(++pszCmdLineA)) { case 'a': case 'A': fAutoInit = TRUE; break; case 'm': case 'M': fRenewMaps = TRUE; break; case 'n': case 'N': fNetDetect = TRUE; break; case 's': case 'S': fShow = TRUE; break; case 'q': case 'Q': fQuiet = TRUE; break; case 'e': case 'E': fExit = TRUE; break; case 'i': case 'I': fInstall = TRUE; break; case 'u': case 'U': fUninstall = TRUE; break; case ':': CopyAnsiToString(g.SmbName,pszCmdLineA); MapShareName(pszCmdLineA); break; case 'z': case 'Z': DoUnMapShare(TRUE); return(0); case 'x': case 'X': TestAndDoMapShare(SERVICE_START_PENDING); TestAndDoMapShare(SERVICE_RUNNING); return 0; } while (*pszCmdLineA && (*pszCmdLineA != ' ')) ++pszCmdLineA; if (*pszCmdLineA==' ') ++pszCmdLineA; } if (fInstall) Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup = TRUE); else if (fUninstall) Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup = FALSE); if (fInstall || fUninstall) { HKEY hk; if (RegCreateKeyEx (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, 0, NULL, 0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_WRITE, NULL, &hk, NULL) == 0) { DWORD dwSize = sizeof(g.fStartup); DWORD dwType = REG_DWORD; RegSetValueEx (hk, TEXT("ShowTrayIcon"), NULL, dwType, (PBYTE)&g.fStartup, dwSize); RegCloseKey (hk); } } // Only show up if there's not another version of this app around already. // for (HWND hSearch = GetWindow (GetDesktopWindow(), GW_CHILD); hSearch && IsWindow(hSearch); hSearch = GetWindow (hSearch, GW_HWNDNEXT)) { TCHAR szClassName[ cchRESOURCE ]; if (GetClassName (hSearch, szClassName, cchRESOURCE)) { if (!lstrcmpi (szClassName, cszCLASSNAME)) { if (fShow) PostMessage (hSearch, WM_COMMAND, M_ACTIVATE, 0); else if (fExit) PostMessage (hSearch, WM_COMMAND, M_TERMINATE_NOW, 0); else if (fUninstall) PostMessage (hSearch, WM_COMMAND, M_TERMINATE_NOW, 0); return FALSE; } } } if (fExit || fUninstall || fInstall) return FALSE; HKEY hk; if (RegOpenKeyEx (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, 0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk) == 0) { DWORD dwSize = sizeof(g.fStartup); DWORD dwType = REG_DWORD; RegQueryValueEx (hk, TEXT("ShowTrayIcon"), NULL, &dwType, (PBYTE)&g.fStartup, &dwSize); RegCloseKey (hk); } else if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, 0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk) == 0) { DWORD dwSize = sizeof(g.fStartup); DWORD dwType = REG_DWORD; RegQueryValueEx (hk, TEXT("ShowTrayIcon"), NULL, &dwType, (PBYTE)&g.fStartup, &dwSize); RegCloseKey (hk); } Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup); // Is this Windows NT? // OSVERSIONINFO Version; memset (&Version, 0x00, sizeof(Version)); Version.dwOSVersionInfoSize = sizeof(Version); if (GetVersionEx (&Version)) g.fIsWinNT = (Version.dwPlatformId == VER_PLATFORM_WIN32_NT) ? TRUE : FALSE; if (!g.fIsWinNT) lstrcpy (g.szHelpFile, TEXT("afs-light.hlp")); else lstrcpy (g.szHelpFile, TEXT("afs-nt.hlp")); // Initialize winsock etc // WSADATA Data; WSAStartup (0x0101, &Data); InitCommonControls(); RegisterCheckListClass(); osi_Init(); lock_InitializeMutex(&g.expirationCheckLock, "expiration check lock", 0); lock_InitializeMutex(&g.credsLock, "global creds lock", 0); KFW_AFS_wait_for_service_start(); if ( IsDebuggerPresent() ) { if ( !g.fIsWinNT ) OutputDebugString("No Service Present on non-NT systems\n"); else { if ( IsServiceRunning() ) OutputDebugString("AFSD Service started\n"); else { OutputDebugString("AFSD Service stopped\n"); if ( !IsServiceConfigured() ) OutputDebugString("AFSD Service not configured\n"); else if ( fAutoInit ) OutputDebugString("AFSD Service will be started\n"); } } } // If the service isn't started yet, and autoInit start the service if ( g.fIsWinNT && !IsServiceRunning() && IsServiceConfigured() && fAutoInit ) { SC_HANDLE hManager; if ((hManager = OpenSCManager( NULL, NULL, SC_MANAGER_CONNECT | SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_QUERY_LOCK_STATUS)) != NULL ) { SC_HANDLE hService; if ((hService = OpenService( hManager, TEXT("TransarcAFSDaemon"), SERVICE_QUERY_STATUS | SERVICE_START) ) != NULL) { if (StartService(hService, 0, 0)) { if ( IsDebuggerPresent() ) OutputDebugString("AFSD Service start successful\n"); fRenewMaps = TRUE; } else if ( IsDebuggerPresent() ) OutputDebugString("AFSD Service start failed\n"); CloseServiceHandle (hService); } CloseServiceHandle (hManager); } KFW_AFS_wait_for_service_start(); } KFW_initialize(); // Create a main window. All further initialization will be done during // processing of WM_INITDIALOG. // WNDCLASS wc; if (!GetClassInfo (NULL, WC_DIALOG, &wc)) // Get dialog class info return FALSE; wc.hInstance = THIS_HINST; wc.hIcon = TaLocale_LoadIcon (IDI_MAIN); wc.lpszClassName = cszCLASSNAME; wc.style |= CS_GLOBALCLASS; RegisterClass(&wc); g.hMain = ModelessDialog (IDD_MAIN, NULL, (DLGPROC)Main_DlgProc); if (g.hMain == NULL) return FALSE; // If the service isn't started yet, show our startup wizard. // if (!IsServiceRunning() && !fQuiet) { if (!g.fIsWinNT) Message (MB_ICONHAND, IDS_UNCONFIG_TITLE_95, IDS_UNCONFIG_DESC_95); else if (IsServiceConfigured()) ShowStartupWizard(); else if (!IsServerInstalled()) Message (MB_ICONHAND, IDS_UNCONFIG_TITLE, IDS_UNCONFIG_DESC); } if (IsServiceRunning()) { if ( fRenewMaps ) { if ( IsDebuggerPresent() ) OutputDebugString("Renewing Drive Maps\n"); DoMapShareChange(FALSE); } if (fShow) { if ( IsDebuggerPresent() ) OutputDebugString("Displaying Main window\n"); Main_Show (TRUE); } // If the root cell is reachable and we have no tokens // display the Obtain Tokens dialog to the user if ( fAutoInit ) { if ( IsDebuggerPresent() ) OutputDebugString("Obtaining Tokens (if needed)\n"); ObtainTokensFromUserIfNeeded(g.hMain); } } else if ( IsDebuggerPresent() ) OutputDebugString("AFSD Service Stopped\n"); if ( fNetDetect ) { // Start IP Address Change Monitor if ( IsDebuggerPresent() ) OutputDebugString("Activating Network Change Monitor\n"); IpAddrChangeMonitorInit(g.hMain); } Main_EnableRemindTimer(TRUE); return TRUE; }
void WizStarting_OnTimer (HWND hDlg) { SERVICE_STATUS Status; memset (&Status, 0x00, sizeof(Status)); Status.dwCurrentState = SERVICE_STOPPED; SC_HANDLE hManager; if ((hManager = OpenSCManager (NULL, NULL, GENERIC_READ)) != NULL) { SC_HANDLE hService; if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), GENERIC_READ)) != NULL) { QueryServiceStatus (hService, &Status); CloseServiceHandle (hService); TestAndDoMapShare(Status.dwCurrentState); } CloseServiceHandle (hManager); } if (Status.dwCurrentState == SERVICE_RUNNING) { g.pWizard->SetState (STEP_CREDS); } else if (Status.dwCurrentState != SERVICE_START_PENDING) { KillTimer (hDlg, ID_WIZARD_TIMER); ShowWindow (GetDlgItem (hDlg, IDC_START_FAIL), SW_SHOW); ShowWindow (GetDlgItem (hDlg, IDC_START_TRY), SW_HIDE); EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE); } }
void WizStarting_OnInitDialog (HWND hDlg) { ShowWindow (GetDlgItem (hDlg, IDC_START_FAIL), SW_HIDE); ShowWindow (GetDlgItem (hDlg, IDC_START_TRY), SW_SHOW); SC_HANDLE hManager; if ((hManager = OpenSCManager (NULL, NULL, SC_MANAGER_CONNECT | SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_QUERY_LOCK_STATUS)) != NULL) { SC_HANDLE hService; if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), SERVICE_QUERY_STATUS | SERVICE_START)) != NULL) { if (StartService (hService, 0, 0)) TestAndDoMapShare(SERVICE_START_PENDING); CloseServiceHandle (hService); } CloseServiceHandle (hManager); } SetTimer (hDlg, ID_WIZARD_TIMER, (ULONG)cmsecSERVICE, NULL); WizStarting_OnTimer (hDlg); }
void GeneralTab_OnTimer (HWND hDlg) { DWORD CurrentState = Config_GetServiceState(); DWORD DisplayState = GeneralTab_GetDisplayState(hDlg); TestAndDoMapShare(CurrentState); //Re map mounted drives if necessary BOOL fInEndState = ((CurrentState == SERVICE_RUNNING) || (CurrentState == SERVICE_STOPPED)); if (fInEndState && l.hStatus) { if (IsWindow (l.hStatus)) DestroyWindow (l.hStatus); l.hStatus = NULL; } else if (!fInEndState && !l.hStatus) { l.hStatus = ModelessDialog (IDD_STARTSTOP, GetParent (hDlg), (DLGPROC)Status_DlgProc); } if (CurrentState != DisplayState) { GeneralTab_OnRefresh (hDlg, FALSE); Main_RefreshAllTabs(); if (l.hStatus && IsWindow (l.hStatus)) PostMessage (l.hStatus, WM_COMMAND, IDINIT, 0); } BOOL fNeedFastRefresh = ((CurrentState == SERVICE_STOPPED) || (CurrentState == SERVICE_RUNNING)) ? FALSE : TRUE; BOOL fHaveFastRefresh = ((DisplayState == SERVICE_STOPPED) || (DisplayState == SERVICE_RUNNING)) ? FALSE : TRUE; if (fNeedFastRefresh != fHaveFastRefresh) { GeneralTab_FixRefreshTimer (hDlg, ((fNeedFastRefresh) ? cmsecFAST_REFRESH : cmsecIDLE_REFRESH)); } }
void GeneralTab_DoStartStop (HWND hDlg, BOOL fStart, BOOL fRestart) { BOOL fSuccess = FALSE; ULONG error = 0; SC_HANDLE hManager; if ((hManager = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS)) != NULL) { SC_HANDLE hService; if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), SERVICE_ALL_ACCESS)) != NULL) { if (fStart) { g.fNeedRestart = FALSE; if (StartService (hService, 0, 0)) TestAndDoMapShare(SERVICE_START_PENDING); fSuccess = TRUE; } else // (!fStart) { SERVICE_STATUS Status; if (ControlService (hService, SERVICE_CONTROL_STOP, &Status)) fSuccess = TRUE; if (g.Configuration.fLogonAuthent) DoUnMapShare(FALSE); } CloseServiceHandle (hService); } CloseServiceHandle (hManager); } if (fSuccess) { l.fWarnIfStopped = fStart; l.fWarnIfNotStopped = !fStart; l.fRestartIfStopped = fRestart && !fStart; l.fStarting = fStart; GeneralTab_OnTimer (hDlg); } else { l.fWarnIfStopped = FALSE; l.fWarnIfNotStopped = FALSE; l.fRestartIfStopped = FALSE; GeneralTab_OnTimer (hDlg); if (!error) error = GetLastError(); Message (MB_OK | MB_ICONHAND, GetErrorTitle(), ((fStart) ? IDS_SERVICE_FAIL_START : IDS_SERVICE_FAIL_STOP), TEXT("%08lX"), error); } }
BOOL CALLBACK Main_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) { static UINT msgCheckTerminate = 0; if (msgCheckTerminate == 0) msgCheckTerminate = RegisterWindowMessage (TEXT("AfsCredsCheckTerminate")); if (msg == msgCheckTerminate) { Main_OnCheckTerminate(); } else switch (msg) { case WM_INITDIALOG: g.hMain = hDlg; Main_OnInitDialog (hDlg); break; case WM_DESTROY: Creds_CloseLibraries(); ChangeTrayIcon (NIM_DELETE); break; case WM_ACTIVATEAPP: if (wp) { Main_RepopulateTabs (FALSE); } break; case WM_COMMAND: switch (LOWORD(wp)) { case IDOK: case IDCANCEL: Main_Show (FALSE); break; case M_ACTIVATE: if (g.fIsWinNT || IsServiceRunning()) { if (!lp) // Got here from "/show" parameter? switch tabs. { HWND hTab = GetDlgItem (g.hMain, IDC_TABS); TabCtrl_SetCurSel (hTab, 0); Main_OnSelectTab(); } Main_Show (TRUE); } else { Message (MB_ICONHAND, IDS_UNCONFIG_TITLE_95, IDS_UNCONFIG_DESC_95); } break; case M_TERMINATE: #ifndef UAC_COMPATIBLE if (g.fIsWinNT && IsServiceRunning()) ModalDialog (IDD_TERMINATE, NULL, (DLGPROC)Terminate_DlgProc); else #endif if (g.fIsWinNT) ModalDialog (IDD_TERMINATE_SMALL, NULL, (DLGPROC)Terminate_DlgProc); else // (!g.fIsWinNT) ModalDialog (IDD_TERMINATE_SMALL_95, NULL, (DLGPROC)Terminate_DlgProc); break; case M_TERMINATE_NOW: Quit(); break; case M_REMIND: Main_OnCheckMenuRemind(); break; } break; case WM_TIMER: Main_OnRemindTimer(); break; case WM_NOTIFY: switch (((NMHDR*)lp)->code) { case TCN_SELCHANGE: Main_OnSelectTab(); break; } break; case WM_TRAYICON: switch (lp) { case WM_LBUTTONDOWN: if (IsServiceRunning() || !IsServiceConfigured()) Main_Show (TRUE); else if (!g.fIsWinNT) Message (MB_ICONHAND, IDS_UNCONFIG_TITLE_95, IDS_UNCONFIG_DESC_95); else ShowStartupWizard(); break; case WM_RBUTTONDOWN: HMENU hm; if ((hm = TaLocale_LoadMenu (MENU_TRAYICON)) != 0) { POINT pt; GetCursorPos(&pt); HMENU hmDummy = CreateMenu(); InsertMenu (hmDummy, 0, MF_POPUP, (UINT)hm, NULL); BOOL fRemind = FALSE; lock_ObtainMutex(&g.credsLock); for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds) { if (g.aCreds[ iCreds ].fRemind) fRemind = TRUE; } lock_ReleaseMutex(&g.credsLock); CheckMenuItem (hm, M_REMIND, MF_BYCOMMAND | ((fRemind) ? MF_CHECKED : MF_UNCHECKED)); SetForegroundWindow(hDlg); TrackPopupMenu (GetSubMenu (hmDummy, 0), TPM_RIGHTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, NULL, hDlg, NULL); PostMessage(hDlg, WM_NULL, 0, 0); DestroyMenu (hmDummy); } break; case WM_MOUSEMOVE: Main_OnMouseOver(); break; } break; case WM_OBTAIN_TOKENS: if ( InterlockedIncrement (&g.fShowingMessage) != 1 ) InterlockedDecrement (&g.fShowingMessage); else ShowObtainCreds (wp, (char *)lp); GlobalFree((void *)lp); break; case WM_START_SERVICE: { SC_HANDLE hManager; if ((hManager = OpenSCManager ( NULL, NULL, SC_MANAGER_CONNECT | SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_QUERY_LOCK_STATUS)) != NULL) { SC_HANDLE hService; if ((hService = OpenService ( hManager, TEXT("TransarcAFSDaemon"), SERVICE_QUERY_STATUS | SERVICE_START)) != NULL) { if (StartService (hService, 0, 0)) TestAndDoMapShare(SERVICE_START_PENDING); if ( KFW_is_available() && KFW_AFS_wait_for_service_start() ) { #ifdef USE_MS2MIT KFW_import_windows_lsa(); #endif /* USE_MS2MIT */ KFW_AFS_renew_tokens_for_all_cells(); } CloseServiceHandle (hService); } CloseServiceHandle (hManager); } if (KFW_AFS_wait_for_service_start()) ObtainTokensFromUserIfNeeded(g.hMain); } break; } return FALSE; }