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
14 #include <afs/param.h>
18 #include "afs_config.h"
19 #include <WINNT\afsreg.h>
23 #include "../afsd/fs_utils.h"
25 #define __CM_CONFIG_INTERFACES_ONLY__
26 #include "../afsd/cm_config.h"
28 #include "../afsd/cm_nls.h"
29 #define __CM_IOCTL_INTERFACES_ONLY__
30 #include "../afsd/cm_ioctl.h"
35 #define cREALLOC_PREFS 32
37 #define cSERVERPREFS_CHUNK 256
39 #define PIOCTL_MAXSIZE 2048
44 * ROUTINES ___________________________________________________________________
48 static DWORD log2 (DWORD dwValue)
51 for (dwLog = 0; (DWORD)(1<<dwLog) < dwValue; ++dwLog)
56 DWORD Config_GetServiceState (void)
60 TCHAR szGateway[ cchRESOURCE ] = TEXT("");
61 Config_GetGatewayName (szGateway);
62 return (szGateway[0]) ? SERVICE_RUNNING : SERVICE_STOPPED;
65 SERVICE_STATUS Status;
66 memset (&Status, 0x00, sizeof(Status));
69 if ((hManager = OpenSCManager (NULL, NULL, GENERIC_READ)) != NULL)
72 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), GENERIC_READ)) != NULL)
74 QueryServiceStatus (hService, &Status);
75 CloseServiceHandle (hService);
78 CloseServiceHandle (hManager);
81 return Status.dwCurrentState;
86 * Configuration Routine ______________________________________________________
90 void Config_GetGatewayFlag (BOOL *pfFlag)
92 if (!Config_ReadGlobalNum (TEXT("IsGateway"), (DWORD*)pfFlag))
97 BOOL Config_SetGatewayFlag (BOOL fFlag, ULONG *pStatus)
99 Config_WriteGlobalNum (TEXT("IsGateway"), fFlag);
100 g.fNeedRestart = TRUE;
105 void Config_GetGatewayName (LPTSTR pszName)
107 if (!Config_ReadGlobalString (TEXT("Gateway"), pszName, MAX_PATH))
108 GetString (pszName, IDS_GATEWAY_UNKNOWN);
110 GetString (pszName, IDS_GATEWAY_UNKNOWN);
114 BOOL Config_SetGatewayName (LPCTSTR pszName, ULONG *pStatus)
116 TCHAR szBogus[ cchRESOURCE ];
117 GetString (szBogus, IDS_GATEWAY_UNKNOWN);
118 if (!lstrcmpi (szBogus, pszName))
120 Config_WriteGlobalString (TEXT("Gateway"), TEXT(""));
124 Config_WriteGlobalString (TEXT("Gateway"), pszName);
131 void Config_FixGatewayDrives (void)
133 // Zip through the user's network drives and reconnect
134 // them as necessary.
136 for (TCHAR chDrive = chDRIVE_A; chDrive <= chDRIVE_Z; ++chDrive)
138 TCHAR szSubmount[ MAX_PATH ];
139 if (!GetDriveSubmount (chDrive, szSubmount))
142 // We've got a mapping into AFS! Remove it, rather forcefully.
144 TCHAR szDrive[] = "@:";
145 szDrive[0] = chDrive;
146 WNetCancelConnection (szDrive, TRUE);
149 // Now recreate our drive mappings, based on the user's already-
150 // specified preferences.
153 QueryDriveMapList (&List);
155 for (size_t ii = 0; ii < 26; ++ii)
157 if (!List.aDriveMap[ii].szMapping[0])
159 ActivateDriveMap (List.aDriveMap[ii].chDrive, List.aDriveMap[ii].szMapping, List.aDriveMap[ii].szSubmount, List.aDriveMap[ii].fPersistent);
164 void Config_GetCellName (LPTSTR pszName)
166 if (!Config_ReadGlobalString (TEXT("Cell"), pszName, MAX_PATH))
167 GetString (pszName, IDS_CELL_UNKNOWN);
169 GetString (pszName, IDS_CELL_UNKNOWN);
173 BOOL Config_ContactGateway (LPTSTR pszGateway, LPTSTR pszCell)
175 // pszCell is MAX_PATH
178 BYTE OutData[ PIOCTL_MAXSIZE ];
179 memset (OutData, 0x00, sizeof(OutData));
181 struct ViceIoctl IOInfo;
184 IOInfo.out = (char *)OutData;
185 IOInfo.out_size = PIOCTL_MAXSIZE;
187 TCHAR szOldGateway[ MAX_PATH ];
188 Config_GetGatewayName (szOldGateway);
189 Config_SetGatewayName (pszGateway);
192 if ((status = pioctl (0, VIOC_GET_WS_CELL, &IOInfo, 1)) == 0)
194 OutData[min(PIOCTL_MAXSIZE, MAX_PATH) - 1] = '\0';
197 lstrcpy (pszCell, (LPCTSTR)OutData);
202 Config_SetGatewayName (szOldGateway);
208 BOOL Config_SetCellName (LPCTSTR pszName, ULONG *pStatus)
210 TCHAR szBogus[ cchRESOURCE ];
211 GetString (szBogus, IDS_CELL_UNKNOWN);
212 if (lstrcmpi (szBogus, pszName))
214 Config_WriteGlobalString (TEXT("Cell"), pszName);
215 g.fNeedRestart = TRUE;
221 /* These two functions are not needed as of the 1.2.2a updates.
222 The old implementation used to 'bind' afslogon.dll to the credentials manager
223 when the Integrated Logon was selected.
225 With version 1.2.2a afslogon.dll is always 'bound' to the credentials manager; therefore,
226 the binding operation is done during installation. Note: the Integrated Logon is
227 selected by an entry in the registry (LogonOptions).
229 void Config_GetAuthentFlag (BOOL *pfFlag)
234 if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\NetworkProvider\\Order"), 0, KEY_QUERY_VALUE, &hk) == ERROR_SUCCESS)
238 TCHAR szProviders[ MAX_PATH ] = TEXT("");
239 DWORD dwSize = sizeof(szProviders);
241 if (RegQueryValueEx (hk, TEXT("ProviderOrder"), NULL, NULL, (PBYTE)szProviders, &dwSize) == ERROR_SUCCESS)
243 for (LPTSTR pch = szProviders; *pch; )
245 if (!lstrncmpi (pch, TEXT("TransarcAFSDaemon"), lstrlen(TEXT("TransarcAFSDaemon"))))
248 for ( ; *pch && (*pch != TEXT(',')); ++pch)
250 for ( ; *pch == TEXT(','); ++pch)
257 else // (!g.fIsWinNT)
259 TCHAR szLHS[ MAX_PATH ] = TEXT("");
260 DWORD dwSize = sizeof(szLHS);
262 if (RegQueryValueEx (hk, TEXT("TransarcAFSDaemon"), NULL, NULL, (PBYTE)szLHS, &dwSize) == ERROR_SUCCESS)
269 BOOL Config_SetAuthentFlag (BOOL fFlag, ULONG *pStatus)
276 if ((status = RegCreateKeyEx (HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\NetworkProvider\\Order"), 0, TEXT("container"), 0, KEY_QUERY_VALUE | KEY_SET_VALUE, NULL, &hk, &dwDisp)) == ERROR_SUCCESS)
280 TCHAR szOldProviders[ MAX_PATH ] = TEXT("");
281 TCHAR szNewProviders[ MAX_PATH ] = TEXT("");
282 DWORD dwSize = sizeof(szOldProviders);
283 RegQueryValueEx (hk, TEXT("ProviderOrder"), NULL, NULL, (PBYTE)szOldProviders, &dwSize);
285 for (LPTSTR pch = szOldProviders; *pch; )
288 if (!lstrncmpi (pch, TEXT("TransarcAFSDaemon"), lstrlen(TEXT("TransarcAFSDaemon"))))
296 LPTSTR pchOut = &szNewProviders[ lstrlen(szNewProviders) ];
297 if (szNewProviders[0])
298 *pchOut++ = TEXT(',');
299 for ( ; *pch && (*pch != TEXT(',')); )
301 *pchOut = TEXT('\0');
304 for ( ; *pch && (*pch != TEXT(',')); ++pch)
306 for ( ; *pch == TEXT(','); ++pch)
312 if (szNewProviders[0])
313 lstrcat (szNewProviders, TEXT(","));
314 lstrcat (szNewProviders, TEXT("TransarcAFSDaemon"));
317 if ((status = RegSetValueEx (hk, TEXT("ProviderOrder"), NULL, REG_SZ, (PBYTE)szNewProviders, sizeof(TCHAR)*(1+lstrlen(szNewProviders)))) == ERROR_SUCCESS)
320 else // (!g.fIsWinNT)
322 TCHAR szLHS[ cchRESOURCE ] = TEXT("TransarcAFSDaemon");
323 TCHAR szRHS[ cchRESOURCE ] = TEXT("");
327 if ((status = RegSetValueEx (hk, szLHS, NULL, REG_SZ, (PBYTE)szRHS, sizeof(TCHAR)*(lstrlen(szRHS)+1))) == 0)
332 RegDeleteValue (hk, szLHS);
343 Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_AUTHENT, TEXT("%ld"), status);
348 void Config_GetTrayIconFlag (BOOL *pfFlag)
350 if (!Config_ReadUserNum (TEXT("ShowTrayIcon"), (DWORD*)pfFlag))
355 BOOL Config_SetTrayIconFlag (BOOL fFlag, ULONG *pStatus)
357 Config_WriteUserNum (TEXT("ShowTrayIcon"), fFlag);
360 for (hSearch = GetWindow (GetDesktopWindow(), GW_CHILD);
361 hSearch && IsWindow(hSearch);
362 hSearch = GetWindow (hSearch, GW_HWNDNEXT))
364 TCHAR szClassName[ cchRESOURCE ];
365 if (GetClassName (hSearch, szClassName, cchRESOURCE))
367 if (!lstrcmpi (szClassName, TEXT("AfsCreds")))
372 if (hSearch && IsWindow(hSearch))
374 UINT msgCheckTerminate = RegisterWindowMessage (TEXT("AfsCredsCheckTerminate"));
375 PostMessage (hSearch, msgCheckTerminate, 0, 0);
377 else if (fFlag && !(hSearch && IsWindow(hSearch)))
379 WinExec (TEXT("AfsCreds.exe /quiet"), SW_SHOW);
386 PSERVERPREFS Config_GetServerPrefs (BOOL fVLServers)
388 PSERVERPREFS pPrefs = New (SERVERPREFS);
389 memset (pPrefs, 0x00, sizeof(SERVERPREFS));
390 pPrefs->fVLServers = fVLServers;
392 if (Config_GetServiceState() == SERVICE_RUNNING)
394 // We retrieve server prefs in batches--start that loop now.
397 for (int iOffset = 0; ; )
399 cm_SPrefRequest_t InData;
400 memset (&InData, 0x00, sizeof(InData));
401 InData.offset = iOffset;
402 InData.flags = (pPrefs->fVLServers) ? CM_SPREF_VLONLY : 0;
403 InData.num_servers = cSERVERPREFS_CHUNK;
405 BYTE OutDataStorage[ sizeof(cm_SPrefInfo_t) + cSERVERPREFS_CHUNK * sizeof(cm_SPref_t) ];
406 memset (OutDataStorage, 0x00, sizeof(OutDataStorage));
407 cm_SPrefInfo_t *pOutData = (cm_SPrefInfo_t *)OutDataStorage;
409 struct ViceIoctl IOInfo;
410 IOInfo.in_size = sizeof(InData);
411 IOInfo.in = (char *)&InData;
412 IOInfo.out = (char *)pOutData;
413 IOInfo.out_size = sizeof(cm_SPrefInfo_t) + cSERVERPREFS_CHUNK * sizeof(cm_SPref_t);
415 if (pioctl (0, VIOC_GETSPREFS, &IOInfo, 1) != 0)
418 if (!REALLOC (pPrefs->aPrefs, pPrefs->cPrefs, iOut + pOutData->num_servers, cREALLOC_PREFS))
421 for (size_t ii = 0; ii < pOutData->num_servers; ++ii)
423 pPrefs->aPrefs[ iOut ].ipServer = pOutData->servers[ ii ].host.s_addr;
424 pPrefs->aPrefs[ iOut ].iRank = pOutData->servers[ ii ].rank;
428 if ((iOffset = pOutData->next_offset) == 0)
437 BOOL Config_SetServerPrefs (PSERVERPREFS pPrefs, ULONG *pStatus)
446 for (ii = 0; ii < pPrefs->cPrefs; ++ii)
448 if (pPrefs->aPrefs[ ii ].fChanged)
454 if (Config_GetServiceState() != SERVICE_RUNNING)
457 status = ERROR_SERVICE_NOT_ACTIVE;
461 size_t cbInDataStorage = sizeof(cm_SSetPref_t) + cChanged * sizeof(cm_SPref_t);
463 PBYTE pInDataStorage;
464 if ((pInDataStorage = (PBYTE)Allocate (cbInDataStorage)) == NULL)
467 status = ERROR_NOT_ENOUGH_MEMORY;
471 memset (pInDataStorage, 0x00, sizeof(cbInDataStorage));
473 cm_SSetPref_t *pInData = (cm_SSetPref_t*)pInDataStorage;
474 pInData->flags = (pPrefs->fVLServers) ? CM_SPREF_VLONLY : 0;
475 pInData->num_servers = cChanged;
478 for (ii = 0; ii < pPrefs->cPrefs; ++ii)
480 if (pPrefs->aPrefs[ ii ].fChanged)
482 pInData->servers[ iOut ].host.s_addr = pPrefs->aPrefs[ ii ].ipServer;
483 pInData->servers[ iOut ].rank = (unsigned short)pPrefs->aPrefs[ ii ].iRank;
488 BYTE OutDataStorage[ PIOCTL_MAXSIZE ];
490 struct ViceIoctl IOInfo;
491 IOInfo.in_size = cbInDataStorage;
492 IOInfo.in = (char *)pInData;
493 IOInfo.out = (char *)OutDataStorage;
494 IOInfo.out_size = PIOCTL_MAXSIZE;
496 if ((status = pioctl (0, VIOC_SETSPREFS, &IOInfo, 1)) != 0)
501 Free (pInDataStorage);
510 Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_PREFS, TEXT("%ld"), status);
515 void Config_FreeServerPrefs (PSERVERPREFS pPrefs)
518 Free (pPrefs->aPrefs);
519 memset (pPrefs, 0xFD, sizeof(SERVERPREFS));
524 void Config_GetCacheSize (ULONG *pckCache)
526 if (!Config_ReadGlobalNum (TEXT("CacheSize"), (DWORD*)pckCache))
527 *pckCache = CM_CONFIGDEFAULT_CACHESIZE;
531 BOOL Config_SetCacheSize (ULONG ckCache, ULONG *pStatus)
533 Config_WriteGlobalNum (TEXT("CacheSize"), ckCache);
534 g.fNeedRestart = TRUE;
540 void Config_GetChunkSize (ULONG *pckChunk)
542 if (!Config_ReadGlobalNum (TEXT("ChunkSize"), (DWORD*)pckChunk))
543 *pckChunk = CM_CONFIGDEFAULT_CHUNKSIZE;
544 *pckChunk = max (*pckChunk, 10);
545 *pckChunk = (1 << ((*pckChunk)-10));
549 BOOL Config_SetChunkSize (ULONG ckChunk, ULONG *pStatus)
551 Config_WriteGlobalNum (TEXT("ChunkSize"), log2(ckChunk * 1024));
552 g.fNeedRestart = TRUE;
558 void Config_GetStatEntries (ULONG *pcEntries)
560 if (!Config_ReadGlobalNum (TEXT("Stats"), (DWORD*)pcEntries))
561 *pcEntries = CM_CONFIGDEFAULT_STATS;
565 BOOL Config_SetStatEntries (ULONG cEntries, ULONG *pStatus)
567 Config_WriteGlobalNum (TEXT("Stats"), cEntries);
568 g.fNeedRestart = TRUE;
574 void Config_GetProbeInt (ULONG *pcsecProbe)
577 // TODO: NEED REGISTRY SETTING
581 BOOL Config_SetProbeInt (ULONG csecProbe, ULONG *pStatus)
586 // TODO: NEED REGISTRY SETTING
587 if (Config_GetServiceState() == SERVICE_RUNNING)
589 struct chservinfo checkserv;
590 memset (&checkserv, 0x00, sizeof(checkserv));
591 checkserv.magic = 0x12345678;
592 checkserv.tinterval = csecProbe;
594 BYTE OutData[ PIOCTL_MAXSIZE ];
595 memset (OutData, 0x00, sizeof(OutData));
597 struct ViceIoctl IOInfo;
598 IOInfo.in_size = sizeof(checkserv);
599 IOInfo.in = (char *)&checkserv;
600 IOInfo.out = (char *)OutData;
601 IOInfo.out_size = PIOCTL_MAXSIZE;
603 if ((status = pioctl (0, VIOCCKSERV, &IOInfo, 1)) != 0)
612 Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_PROBE, TEXT("%ld"), status);
618 void Config_GetNumThreads (ULONG *pcThreads)
620 if (!Config_ReadGlobalNum (TEXT("ServerThreads"), (DWORD*)pcThreads))
621 *pcThreads = CM_CONFIGDEFAULT_SVTHREADS;
625 BOOL Config_SetNumThreads (ULONG cThreads, ULONG *pStatus)
627 Config_WriteGlobalNum (TEXT("ServerThreads"), cThreads);
628 g.fNeedRestart = TRUE;
634 void Config_GetNumDaemons (ULONG *pcDaemons)
636 if (!Config_ReadGlobalNum (TEXT("Daemons"), (DWORD*)pcDaemons))
637 *pcDaemons = CM_CONFIGDEFAULT_DAEMONS;
641 BOOL Config_SetNumDaemons (ULONG cDaemons, ULONG *pStatus)
643 Config_WriteGlobalNum (TEXT("Daemons"), cDaemons);
644 g.fNeedRestart = TRUE;
650 void Config_GetSysName (LPTSTR pszName)
652 if (!Config_ReadGlobalString (TEXT("SysName"), pszName, MAX_PATH))
653 lstrcpy (pszName, TEXT("i386_nt40"));
657 BOOL Config_SetSysName (LPCTSTR pszName, ULONG *pStatus)
662 if (Config_GetServiceState() == SERVICE_RUNNING)
666 TCHAR szData[ PIOCTL_MAXSIZE ];
668 memset (&InData, 0x00, sizeof(InData));
669 USHORT i=0, j=0, len=lstrlen(pszName);
672 Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_SYSNAME, TEXT("A sysname must be specified"));
676 while ( pszName[i] ) {
677 if ( !isspace(pszName[i]) ) {
678 InData.szData[j++] = pszName[i];
679 } else if (InData.szData[j-1] != '\0') {
680 InData.szData[j++] = '\0';
685 InData.szData[j++] = '\0';
686 InData.cbData++; /* one word */
688 BYTE OutData[ PIOCTL_MAXSIZE ];
689 memset (OutData, 0x00, sizeof(OutData));
691 struct ViceIoctl IOInfo;
692 IOInfo.in_size = sizeof(ULONG) + j;
693 IOInfo.in = (char *)&InData;
694 IOInfo.out = (char *)OutData;
695 IOInfo.out_size = PIOCTL_MAXSIZE;
697 if ((status = pioctl (0, VIOC_AFS_SYSNAME, &IOInfo, 1)) != 0)
705 Config_WriteGlobalString (TEXT("SysName"), pszName);
711 Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_SYSNAME, TEXT("%ld"), status);
717 void Config_GetRootVolume (LPTSTR pszName)
719 if (!Config_ReadGlobalString (TEXT("RootVolume"), pszName, MAX_PATH))
720 lstrcpy (pszName, TEXT("root.afs"));
724 BOOL Config_SetRootVolume (LPCTSTR pszName, ULONG *pStatus)
726 Config_WriteGlobalString (TEXT("RootVolume"), pszName);
727 g.fNeedRestart = TRUE;
733 void Config_GetMountRoot (LPTSTR pszPath)
735 if (!Config_ReadGlobalString (TEXT("MountRoot"), pszPath, MAX_PATH))
736 lstrcpy (pszPath, TEXT("/afs"));
740 BOOL Config_SetMountRoot (LPCTSTR pszPath, ULONG *pStatus)
742 Config_WriteGlobalString (TEXT("MountRoot"), pszPath);
743 g.fNeedRestart = TRUE;
748 BOOL Config_GetCacheInUse (ULONG *pckCacheInUse, ULONG *pStatus)
755 if (Config_GetServiceState() != SERVICE_RUNNING)
758 status = ERROR_SERVICE_NOT_ACTIVE;
762 BYTE OutData[ PIOCTL_MAXSIZE ];
763 memset (OutData, 0x00, sizeof(OutData));
765 struct ViceIoctl IOInfo;
767 IOInfo.in = (char *)0;
768 IOInfo.out = (char *)OutData;
769 IOInfo.out_size = PIOCTL_MAXSIZE;
771 if ((status = pioctl (0, VIOCGETCACHEPARMS, &IOInfo, 1)) != 0)
777 *pckCacheInUse = ((LONG*)OutData)[1];
786 void Config_GetCachePath (LPTSTR pszCachePath)
788 if (!Config_ReadGlobalString (TEXT("CachePath"), pszCachePath, MAX_PATH)) {
790 TCHAR szPath[ MAX_PATH ] = TEXT("");
792 if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Environment"), 0, KEY_QUERY_VALUE, &hk) == ERROR_SUCCESS)
794 DWORD dwSize = sizeof(szPath);
797 if (RegQueryValueEx (hk, TEXT("TEMP"), NULL, &dwType, (PBYTE)szPath, &dwSize) == ERROR_SUCCESS)
799 if ( dwType == REG_EXPAND_SZ ) {
800 TCHAR szTemp[ MAX_PATH ];
801 lstrcpy(szTemp, szPath);
802 ExpandEnvironmentStrings(szTemp, szPath, MAX_PATH);
806 lstrcat(szPath, "\\AFSCache");
810 GetWindowsDirectory(szPath, sizeof(szPath));
811 lstrcat(szPath, "\\TEMP\\AFSCache");
813 lstrcpy (pszCachePath, szPath);
817 BOOL Config_SetCachePath(LPCTSTR pszPath, ULONG *pStatus)
819 Config_WriteGlobalString (TEXT("CachePath"), pszPath);
820 g.fNeedRestart = TRUE;
824 void Config_GetLanAdapter (ULONG *pnLanAdapter)
826 if (!Config_ReadGlobalNum (TEXT("LANadapter"), (DWORD*)pnLanAdapter))
830 BOOL Config_SetLanAdapter (ULONG nLanAdapter, ULONG *pStatus)
832 Config_WriteGlobalNum (TEXT("LANadapter"), nLanAdapter);
833 g.fNeedRestart = TRUE;
837 void Config_GetTrapOnPanic (BOOL *pfFlag)
839 if (!Config_ReadGlobalNum (TEXT("TrapOnPanic"), (DWORD*)pfFlag))
843 BOOL Config_SetTrapOnPanic (BOOL fFlag, ULONG *pStatus)
845 Config_WriteGlobalNum (TEXT("TrapOnPanic"), fFlag);
846 g.fNeedRestart = TRUE;
850 void Config_GetTraceBufferSize (ULONG *pnBufSize)
852 if (!Config_ReadGlobalNum (TEXT("TraceBufferSize"), (DWORD*)pnBufSize))
856 BOOL Config_SetTraceBufferSize (ULONG nBufSize, ULONG *pStatus)
858 Config_WriteGlobalNum (TEXT("TraceBufferSize"), nBufSize);
859 g.fNeedRestart = TRUE;
863 void Config_GetLoginRetryInterval (ULONG *pnInterval)
865 if (!Config_ReadGlobalNum (TEXT("LoginRetryInterval"), (DWORD*)pnInterval))
869 BOOL Config_SetLoginRetryInterval (ULONG nInterval, ULONG *pStatus)
871 Config_WriteGlobalNum (TEXT("LoginRetryInterval"), nInterval);
875 void Config_GetFailLoginsSilently (BOOL *pfFlag)
877 if (!Config_ReadGlobalNum (TEXT("FailLoginsSilently"), (DWORD*)pfFlag))
881 BOOL Config_SetFailLoginsSilently (BOOL fFlag, ULONG *pStatus)
883 Config_WriteGlobalNum (TEXT("FailLoginsSilently"), fFlag);
887 void Config_GetReportSessionStartups (BOOL *pfFlag)
889 if (!Config_ReadGlobalNum (TEXT("ReportSessionStartups"), (DWORD*)pfFlag))
893 BOOL Config_SetReportSessionStartups (BOOL fFlag, ULONG *pStatus)
895 Config_WriteGlobalNum (TEXT("ReportSessionStartups"), fFlag);