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 <afs/param.h>
18 #include <afs/afskfw.h>
20 #include <WINNT\afsreg.h>
28 * PROTOTYPES _________________________________________________________________
32 void Advanced_OnInitDialog (HWND hDlg);
33 void Advanced_StartTimer (HWND hDlg);
34 void Advanced_OnServiceTimer (HWND hDlg);
35 void Advanced_OnOpenCPL (HWND hDlg);
36 void Advanced_OnChangeService (HWND hDlg, WORD wCmd);
37 void Advanced_OnStartup (HWND hDlg);
41 * ROUTINES ___________________________________________________________________
45 BOOL CALLBACK Advanced_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
51 GetClientRect (GetParent(hDlg), &rTab);
52 TabCtrl_AdjustRect (GetParent (hDlg), FALSE, &rTab);
53 SetWindowPos (hDlg, NULL, rTab.left, rTab.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
55 Advanced_OnInitDialog (hDlg);
59 Advanced_OnServiceTimer (hDlg);
65 case IDC_SERVICE_STOP:
66 case IDC_SERVICE_START:
67 case IDC_SERVICE_AUTO:
68 Advanced_OnChangeService (hDlg, LOWORD(wp));
72 Advanced_OnOpenCPL (hDlg);
76 Advanced_OnStartup (hDlg);
80 Advanced_DlgProc (hDlg, WM_HELP, 0, 0);
86 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_TAB_ADVANCED);
93 void Advanced_OnInitDialog (HWND hDlg)
95 CheckDlgButton (hDlg, IDC_STARTUP, g.fStartup);
96 Advanced_OnServiceTimer (hDlg);
97 Advanced_StartTimer (hDlg);
101 void Advanced_StartTimer (HWND hDlg)
103 KillTimer (hDlg, ID_SERVICE_TIMER);
104 SetTimer (hDlg, ID_SERVICE_TIMER, (ULONG)cmsecSERVICE, NULL);
108 void Advanced_OnServiceTimer (HWND hDlg)
114 QUERY_SERVICE_CONFIG Config;
117 memset (&Config, 0x00, sizeof(Config));
118 Config.Config.dwStartType = SERVICE_DEMAND_START;
120 SERVICE_STATUS Status;
121 memset (&Status, 0x00, sizeof(Status));
122 Status.dwCurrentState = SERVICE_STOPPED;
125 if ((hManager = OpenSCManager (NULL, NULL, GENERIC_READ)) != NULL)
128 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), GENERIC_READ)) != NULL)
131 DWORD dwSize = sizeof(Config);
132 QueryServiceConfig (hService, (QUERY_SERVICE_CONFIG*)&Config, sizeof(Config), &dwSize);
133 QueryServiceStatus (hService, &Status);
134 TestAndDoMapShare(Status.dwCurrentState);
136 CloseServiceHandle (hService);
139 CloseServiceHandle (hManager);
144 if ((Status.dwCurrentState == SERVICE_STOP_PENDING) ||
145 (Status.dwCurrentState == SERVICE_START_PENDING))
151 EnableWindow (GetDlgItem (hDlg, IDC_SERVICE_START), fFound && (Status.dwCurrentState == SERVICE_STOPPED));
152 EnableWindow (GetDlgItem (hDlg, IDC_SERVICE_STOP), fFound && (Status.dwCurrentState == SERVICE_RUNNING));
153 EnableWindow (GetDlgItem (hDlg, IDC_SERVICE_AUTO), fFound);
154 CheckDlgButton (hDlg, IDC_SERVICE_AUTO, fFound && (Config.Config.dwStartType == SERVICE_AUTO_START));
156 TCHAR szStatus[cchRESOURCE];
158 GetString (szStatus, IDS_SERVICE_BROKEN);
159 else if (Status.dwCurrentState == SERVICE_RUNNING)
160 GetString (szStatus, IDS_SERVICE_RUNNING);
161 else if (Status.dwCurrentState == SERVICE_STOPPED)
162 GetString (szStatus, IDS_SERVICE_STOPPED);
163 else if (Status.dwCurrentState == SERVICE_STOP_PENDING)
164 GetString (szStatus, IDS_SERVICE_STOPPING);
165 else if (Status.dwCurrentState == SERVICE_START_PENDING)
166 GetString (szStatus, IDS_SERVICE_STARTING);
168 GetString (szStatus, IDS_SERVICE_UNKNOWN);
169 TestAndDoMapShare(Status.dwCurrentState);
170 SetDlgItemText (hDlg, IDC_SERVICE_STATUS, szStatus);
172 if (fFinal && GetWindowLongPtr (hDlg, DWLP_USER))
174 SetWindowLongPtr (hDlg, DWLP_USER, 0);
175 Main_RepopulateTabs (FALSE);
180 KillTimer (hDlg, ID_SERVICE_TIMER);
185 void Advanced_OnChangeService (HWND hDlg, WORD wCmd)
187 BOOL fSuccess = FALSE;
189 SC_HANDLE hManager, hService;
193 case IDC_SERVICE_AUTO:
195 if ((hManager = OpenSCManager (NULL, NULL, SC_MANAGER_CONNECT |
196 SC_MANAGER_ENUMERATE_SERVICE |
197 SC_MANAGER_QUERY_LOCK_STATUS)) != NULL)
199 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"),
200 SERVICE_CHANGE_CONFIG | SERVICE_QUERY_CONFIG |
201 SERVICE_QUERY_STATUS)) != NULL)
203 StartType = (IsDlgButtonChecked (hDlg, wCmd)) ? SERVICE_AUTO_START : SERVICE_DEMAND_START;
204 if (ChangeServiceConfig (hService, SERVICE_NO_CHANGE, StartType,
205 SERVICE_NO_CHANGE, 0, 0, 0, 0, 0, 0, 0))
207 CloseServiceHandle (hService);
209 CloseServiceHandle (hManager);
213 case IDC_SERVICE_START:
214 if ((hManager = OpenSCManager (NULL, NULL, SC_MANAGER_CONNECT |
215 SC_MANAGER_ENUMERATE_SERVICE |
216 SC_MANAGER_QUERY_LOCK_STATUS )) != NULL)
218 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"),
219 SERVICE_QUERY_STATUS | SERVICE_START)) != NULL)
221 if (StartService (hService, 0, 0))
223 TestAndDoMapShare(SERVICE_START_PENDING);
224 if ( KFW_is_available() && KFW_AFS_wait_for_service_start() ) {
226 KFW_import_windows_lsa();
227 #endif /* USE_MS2MIT */
228 KFW_AFS_renew_tokens_for_all_cells();
232 CloseServiceHandle (hService);
234 CloseServiceHandle (hManager);
238 case IDC_SERVICE_STOP:
239 if ((hManager = OpenSCManager (NULL, NULL, SC_MANAGER_CONNECT |
240 SC_MANAGER_ENUMERATE_SERVICE |
241 SC_MANAGER_QUERY_LOCK_STATUS )) != NULL)
243 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"),
244 SERVICE_QUERY_STATUS | SERVICE_STOP)) != NULL)
246 SERVICE_STATUS Status;
247 TestAndDoUnMapShare();
248 ControlService (hService, SERVICE_CONTROL_STOP, &Status);
251 CloseServiceHandle (hService);
253 CloseServiceHandle (hManager);
259 if (wCmd == IDC_SERVICE_STOP)
260 SetWindowLongPtr (hDlg, DWLP_USER, TRUE);
261 Advanced_OnServiceTimer (hDlg);
262 Advanced_StartTimer (hDlg);
264 if ( wCmd == IDC_SERVICE_START && KRB5_is_available() && KRB5_wait_for_service_start() )
265 KRB5_AFS_renew_tokens_for_all_cells();
271 error = GetLastError();
276 case IDC_SERVICE_START:
277 ids = IDS_SERVICE_FAIL_START;
279 case IDC_SERVICE_STOP:
280 ids = IDS_SERVICE_FAIL_STOP;
283 ids = IDS_SERVICE_FAIL_CONFIG;
287 Message (MB_OK | MB_ICONHAND, IDS_SERVICE_ERROR, ids, TEXT("%08lX"), error);
292 void Advanced_OnOpenCPL (HWND hDlg)
294 SHELLEXECUTEINFO shellExecInfo;
296 memset(&shellExecInfo, 0, sizeof(shellExecInfo));
297 shellExecInfo.cbSize = sizeof(shellExecInfo);
298 shellExecInfo.nShow = SW_SHOWNORMAL;
299 shellExecInfo.hwnd = hDlg;
300 shellExecInfo.lpFile = "afs_config.exe";
301 ShellExecuteEx(&shellExecInfo);
305 void Advanced_OnStartup (HWND hDlg)
307 BOOL bSuccess = FALSE;
308 g.fStartup = IsDlgButtonChecked (hDlg, IDC_STARTUP);
311 if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, TEXT(AFSREG_CLT_SVC_PARAM_SUBKEY), 0, NULL, 0,
312 (IsWow64()?KEY_WOW64_64KEY:0)|KEY_WRITE, NULL, &hk, NULL) == 0)
314 DWORD dwSize = sizeof(g.fStartup);
315 DWORD dwType = REG_DWORD;
316 RegSetValueEx (hk, TEXT("ShowTrayIcon"), NULL, dwType, (PBYTE)&g.fStartup, dwSize);
319 bSuccess = Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup);
324 g.fStartup = !g.fStartup;
325 CheckDlgButton(hDlg, IDC_STARTUP, g.fStartup);
327 // Report error to user
328 Message (MB_OK | MB_ICONHAND, IDS_STARTUP_CHANGE_TITLE, IDS_STARTUP_CHANGE_ERROR);