2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
16 #include <afsconfig.h>
17 #include <afs/param.h>
19 #include <afs/afskfw.h>
21 #include <WINNT\afsreg.h>
29 * PROTOTYPES _________________________________________________________________
33 void Advanced_OnInitDialog (HWND hDlg);
34 void Advanced_StartTimer (HWND hDlg);
35 void Advanced_OnServiceTimer (HWND hDlg);
36 void Advanced_OnOpenCPL (HWND hDlg);
37 void Advanced_OnChangeService (HWND hDlg, WORD wCmd);
38 void Advanced_OnStartup (HWND hDlg);
42 * ROUTINES ___________________________________________________________________
46 BOOL CALLBACK Advanced_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
52 GetClientRect (GetParent(hDlg), &rTab);
53 TabCtrl_AdjustRect (GetParent (hDlg), FALSE, &rTab);
54 SetWindowPos (hDlg, NULL, rTab.left, rTab.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
56 Advanced_OnInitDialog (hDlg);
60 Advanced_OnServiceTimer (hDlg);
66 case IDC_SERVICE_STOP:
67 case IDC_SERVICE_START:
68 case IDC_SERVICE_AUTO:
69 Advanced_OnChangeService (hDlg, LOWORD(wp));
73 Advanced_OnOpenCPL (hDlg);
77 Advanced_OnStartup (hDlg);
81 Advanced_DlgProc (hDlg, WM_HELP, 0, 0);
90 void Advanced_OnInitDialog (HWND hDlg)
92 CheckDlgButton (hDlg, IDC_STARTUP, g.fStartup);
93 Advanced_OnServiceTimer (hDlg);
94 Advanced_StartTimer (hDlg);
98 void Advanced_StartTimer (HWND hDlg)
100 KillTimer (hDlg, ID_SERVICE_TIMER);
101 SetTimer (hDlg, ID_SERVICE_TIMER, (ULONG)cmsecSERVICE, NULL);
105 void Advanced_OnServiceTimer (HWND hDlg)
111 QUERY_SERVICE_CONFIG Config;
114 memset (&Config, 0x00, sizeof(Config));
115 Config.Config.dwStartType = SERVICE_DEMAND_START;
117 SERVICE_STATUS Status;
118 memset (&Status, 0x00, sizeof(Status));
119 Status.dwCurrentState = SERVICE_STOPPED;
122 if ((hManager = OpenSCManager (NULL, NULL, GENERIC_READ)) != NULL)
125 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), GENERIC_READ)) != NULL)
128 DWORD dwSize = sizeof(Config);
129 QueryServiceConfig (hService, (QUERY_SERVICE_CONFIG*)&Config, sizeof(Config), &dwSize);
130 QueryServiceStatus (hService, &Status);
131 TestAndDoMapShare(Status.dwCurrentState);
133 CloseServiceHandle (hService);
136 CloseServiceHandle (hManager);
141 if ((Status.dwCurrentState == SERVICE_STOP_PENDING) ||
142 (Status.dwCurrentState == SERVICE_START_PENDING))
148 EnableWindow (GetDlgItem (hDlg, IDC_SERVICE_START), fFound && (Status.dwCurrentState == SERVICE_STOPPED));
149 EnableWindow (GetDlgItem (hDlg, IDC_SERVICE_STOP), fFound && (Status.dwCurrentState == SERVICE_RUNNING));
150 EnableWindow (GetDlgItem (hDlg, IDC_SERVICE_AUTO), fFound);
151 CheckDlgButton (hDlg, IDC_SERVICE_AUTO, fFound && (Config.Config.dwStartType == SERVICE_AUTO_START));
153 TCHAR szStatus[cchRESOURCE];
155 GetString (szStatus, IDS_SERVICE_BROKEN);
156 else if (Status.dwCurrentState == SERVICE_RUNNING)
157 GetString (szStatus, IDS_SERVICE_RUNNING);
158 else if (Status.dwCurrentState == SERVICE_STOPPED)
159 GetString (szStatus, IDS_SERVICE_STOPPED);
160 else if (Status.dwCurrentState == SERVICE_STOP_PENDING)
161 GetString (szStatus, IDS_SERVICE_STOPPING);
162 else if (Status.dwCurrentState == SERVICE_START_PENDING)
163 GetString (szStatus, IDS_SERVICE_STARTING);
165 GetString (szStatus, IDS_SERVICE_UNKNOWN);
166 TestAndDoMapShare(Status.dwCurrentState);
167 SetDlgItemText (hDlg, IDC_SERVICE_STATUS, szStatus);
169 if (fFinal && GetWindowLongPtr (hDlg, DWLP_USER))
171 SetWindowLongPtr (hDlg, DWLP_USER, 0);
172 Main_RepopulateTabs (FALSE);
177 KillTimer (hDlg, ID_SERVICE_TIMER);
182 void Advanced_OnChangeService (HWND hDlg, WORD wCmd)
184 BOOL fSuccess = FALSE;
186 SC_HANDLE hManager, hService;
190 case IDC_SERVICE_AUTO:
192 if ((hManager = OpenSCManager (NULL, NULL, SC_MANAGER_CONNECT |
193 SC_MANAGER_ENUMERATE_SERVICE |
194 SC_MANAGER_QUERY_LOCK_STATUS)) != NULL)
196 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"),
197 SERVICE_CHANGE_CONFIG | SERVICE_QUERY_CONFIG |
198 SERVICE_QUERY_STATUS)) != NULL)
200 StartType = (IsDlgButtonChecked (hDlg, wCmd)) ? SERVICE_AUTO_START : SERVICE_DEMAND_START;
201 if (ChangeServiceConfig (hService, SERVICE_NO_CHANGE, StartType,
202 SERVICE_NO_CHANGE, 0, 0, 0, 0, 0, 0, 0))
204 CloseServiceHandle (hService);
206 CloseServiceHandle (hManager);
210 case IDC_SERVICE_START:
211 if ((hManager = OpenSCManager (NULL, NULL, SC_MANAGER_CONNECT |
212 SC_MANAGER_ENUMERATE_SERVICE |
213 SC_MANAGER_QUERY_LOCK_STATUS )) != NULL)
215 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"),
216 SERVICE_QUERY_STATUS | SERVICE_START)) != NULL)
218 if (StartService (hService, 0, 0))
220 TestAndDoMapShare(SERVICE_START_PENDING);
221 if ( KFW_is_available() && KFW_AFS_wait_for_service_start() ) {
223 KFW_import_windows_lsa();
224 #endif /* USE_MS2MIT */
225 KFW_AFS_renew_tokens_for_all_cells();
229 CloseServiceHandle (hService);
231 CloseServiceHandle (hManager);
235 case IDC_SERVICE_STOP:
236 if ((hManager = OpenSCManager (NULL, NULL, SC_MANAGER_CONNECT |
237 SC_MANAGER_ENUMERATE_SERVICE |
238 SC_MANAGER_QUERY_LOCK_STATUS )) != NULL)
240 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"),
241 SERVICE_QUERY_STATUS | SERVICE_STOP)) != NULL)
243 SERVICE_STATUS Status;
244 TestAndDoUnMapShare();
245 ControlService (hService, SERVICE_CONTROL_STOP, &Status);
248 CloseServiceHandle (hService);
250 CloseServiceHandle (hManager);
256 if (wCmd == IDC_SERVICE_STOP)
257 SetWindowLongPtr (hDlg, DWLP_USER, TRUE);
258 Advanced_OnServiceTimer (hDlg);
259 Advanced_StartTimer (hDlg);
261 if ( wCmd == IDC_SERVICE_START && KRB5_is_available() && KRB5_wait_for_service_start() )
262 KRB5_AFS_renew_tokens_for_all_cells();
268 error = GetLastError();
273 case IDC_SERVICE_START:
274 ids = IDS_SERVICE_FAIL_START;
276 case IDC_SERVICE_STOP:
277 ids = IDS_SERVICE_FAIL_STOP;
280 ids = IDS_SERVICE_FAIL_CONFIG;
284 Message (MB_OK | MB_ICONHAND, IDS_SERVICE_ERROR, ids, TEXT("%08lX"), error);
289 void Advanced_OnOpenCPL (HWND hDlg)
291 SHELLEXECUTEINFO shellExecInfo;
293 memset(&shellExecInfo, 0, sizeof(shellExecInfo));
294 shellExecInfo.cbSize = sizeof(shellExecInfo);
295 shellExecInfo.nShow = SW_SHOWNORMAL;
296 shellExecInfo.hwnd = hDlg;
297 shellExecInfo.lpFile = "afs_config.exe";
298 ShellExecuteEx(&shellExecInfo);
302 void Advanced_OnStartup (HWND hDlg)
304 BOOL bSuccess = FALSE;
305 g.fStartup = IsDlgButtonChecked (hDlg, IDC_STARTUP);
308 if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, TEXT(AFSREG_CLT_SVC_PARAM_SUBKEY), 0, NULL, 0,
309 (IsWow64()?KEY_WOW64_64KEY:0)|KEY_WRITE, NULL, &hk, NULL) == 0)
311 DWORD dwSize = sizeof(g.fStartup);
312 DWORD dwType = REG_DWORD;
313 RegSetValueEx (hk, TEXT("ShowTrayIcon"), NULL, dwType, (PBYTE)&g.fStartup, dwSize);
316 bSuccess = Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup);
321 g.fStartup = !g.fStartup;
322 CheckDlgButton(hDlg, IDC_STARTUP, g.fStartup);
324 // Report error to user
325 Message (MB_OK | MB_ICONHAND, IDS_STARTUP_CHANGE_TITLE, IDS_STARTUP_CHANGE_ERROR);