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 #define __CM_IOCTL_INTERFACES_ONLY__
29 #include "../afsd/cm_ioctl.h"
34 #define cREALLOC_PREFS 32
36 #define cSERVERPREFS_CHUNK 256
38 #define PIOCTL_MAXSIZE 2048
43 * ROUTINES ___________________________________________________________________
47 static DWORD log2 (DWORD dwValue)
50 for (dwLog = 0; (DWORD)(1<<dwLog) < dwValue; ++dwLog)
55 DWORD Config_GetServiceState (void)
59 TCHAR szGateway[ cchRESOURCE ] = TEXT("");
60 Config_GetGatewayName (szGateway);
61 return (szGateway[0]) ? SERVICE_RUNNING : SERVICE_STOPPED;
64 SERVICE_STATUS Status;
65 memset (&Status, 0x00, sizeof(Status));
68 if ((hManager = OpenSCManager (NULL, NULL, GENERIC_READ)) != NULL)
71 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), GENERIC_READ)) != NULL)
73 QueryServiceStatus (hService, &Status);
74 CloseServiceHandle (hService);
77 CloseServiceHandle (hManager);
80 return Status.dwCurrentState;
85 * Configuration Routine ______________________________________________________
89 void Config_GetGatewayFlag (BOOL *pfFlag)
91 if (!Config_ReadGlobalNum (TEXT("IsGateway"), (DWORD*)pfFlag))
96 BOOL Config_SetGatewayFlag (BOOL fFlag, ULONG *pStatus)
98 Config_WriteGlobalNum (TEXT("IsGateway"), fFlag);
99 g.fNeedRestart = TRUE;
104 void Config_GetGatewayName (LPTSTR pszName)
106 if (!Config_ReadGlobalString (TEXT("Gateway"), pszName, MAX_PATH))
107 GetString (pszName, IDS_GATEWAY_UNKNOWN);
109 GetString (pszName, IDS_GATEWAY_UNKNOWN);
113 BOOL Config_SetGatewayName (LPCTSTR pszName, ULONG *pStatus)
115 TCHAR szBogus[ cchRESOURCE ];
116 GetString (szBogus, IDS_GATEWAY_UNKNOWN);
117 if (!lstrcmpi (szBogus, pszName))
119 Config_WriteGlobalString (TEXT("Gateway"), TEXT(""));
123 Config_WriteGlobalString (TEXT("Gateway"), pszName);
130 void Config_FixGatewayDrives (void)
132 // Zip through the user's network drives and reconnect
133 // them as necessary.
135 for (TCHAR chDrive = chDRIVE_A; chDrive <= chDRIVE_Z; ++chDrive)
137 TCHAR szSubmount[ MAX_PATH ];
138 if (!GetDriveSubmount (chDrive, szSubmount))
141 // We've got a mapping into AFS! Remove it, rather forcefully.
143 TCHAR szDrive[] = "@:";
144 szDrive[0] = chDrive;
145 WNetCancelConnection (szDrive, TRUE);
148 // Now recreate our drive mappings, based on the user's already-
149 // specified preferences.
152 QueryDriveMapList (&List);
154 for (size_t ii = 0; ii < 26; ++ii)
156 if (!List.aDriveMap[ii].szMapping[0])
158 ActivateDriveMap (List.aDriveMap[ii].chDrive, List.aDriveMap[ii].szMapping, List.aDriveMap[ii].szSubmount, List.aDriveMap[ii].fPersistent);
163 void Config_GetCellName (LPTSTR pszName)
165 if (!Config_ReadGlobalString (TEXT("Cell"), pszName, MAX_PATH))
166 GetString (pszName, IDS_CELL_UNKNOWN);
168 GetString (pszName, IDS_CELL_UNKNOWN);
172 BOOL Config_ContactGateway (LPTSTR pszGateway, LPTSTR pszCell)
176 BYTE OutData[ PIOCTL_MAXSIZE ];
177 memset (OutData, 0x00, sizeof(OutData));
179 struct ViceIoctl IOInfo;
182 IOInfo.out = (char *)OutData;
183 IOInfo.out_size = PIOCTL_MAXSIZE;
185 TCHAR szOldGateway[ MAX_PATH ];
186 Config_GetGatewayName (szOldGateway);
187 Config_SetGatewayName (pszGateway);
190 if ((status = pioctl (0, VIOC_GET_WS_CELL, &IOInfo, 1)) == 0)
194 lstrcpy (pszCell, (LPCTSTR)OutData);
199 Config_SetGatewayName (szOldGateway);
205 BOOL Config_SetCellName (LPCTSTR pszName, ULONG *pStatus)
207 TCHAR szBogus[ cchRESOURCE ];
208 GetString (szBogus, IDS_CELL_UNKNOWN);
209 if (lstrcmpi (szBogus, pszName))
211 Config_WriteGlobalString (TEXT("Cell"), pszName);
212 g.fNeedRestart = TRUE;
218 /* These two functions are not needed as of the 1.2.2a updates.
219 The old implementation used to 'bind' afslogon.dll to the credentials manager
220 when the Integrated Logon was selected.
222 With version 1.2.2a afslogon.dll is always 'bound' to the credentials manager; therefore,
223 the binding operation is done during installation. Note: the Integrated Logon is
224 selected by an entry in the registry (LogonOptions).
226 void Config_GetAuthentFlag (BOOL *pfFlag)
231 if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\NetworkProvider\\Order"), 0, KEY_QUERY_VALUE, &hk) == ERROR_SUCCESS)
235 TCHAR szProviders[ MAX_PATH ] = TEXT("");
236 DWORD dwSize = sizeof(szProviders);
238 if (RegQueryValueEx (hk, TEXT("ProviderOrder"), NULL, NULL, (PBYTE)szProviders, &dwSize) == ERROR_SUCCESS)
240 for (LPTSTR pch = szProviders; *pch; )
242 if (!lstrncmpi (pch, TEXT("TransarcAFSDaemon"), lstrlen(TEXT("TransarcAFSDaemon"))))
245 for ( ; *pch && (*pch != TEXT(',')); ++pch)
247 for ( ; *pch == TEXT(','); ++pch)
254 else // (!g.fIsWinNT)
256 TCHAR szLHS[ MAX_PATH ] = TEXT("");
257 DWORD dwSize = sizeof(szLHS);
259 if (RegQueryValueEx (hk, TEXT("TransarcAFSDaemon"), NULL, NULL, (PBYTE)szLHS, &dwSize) == ERROR_SUCCESS)
266 BOOL Config_SetAuthentFlag (BOOL fFlag, ULONG *pStatus)
273 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)
277 TCHAR szOldProviders[ MAX_PATH ] = TEXT("");
278 TCHAR szNewProviders[ MAX_PATH ] = TEXT("");
279 DWORD dwSize = sizeof(szOldProviders);
280 RegQueryValueEx (hk, TEXT("ProviderOrder"), NULL, NULL, (PBYTE)szOldProviders, &dwSize);
282 for (LPTSTR pch = szOldProviders; *pch; )
285 if (!lstrncmpi (pch, TEXT("TransarcAFSDaemon"), lstrlen(TEXT("TransarcAFSDaemon"))))
293 LPTSTR pchOut = &szNewProviders[ lstrlen(szNewProviders) ];
294 if (szNewProviders[0])
295 *pchOut++ = TEXT(',');
296 for ( ; *pch && (*pch != TEXT(',')); )
298 *pchOut = TEXT('\0');
301 for ( ; *pch && (*pch != TEXT(',')); ++pch)
303 for ( ; *pch == TEXT(','); ++pch)
309 if (szNewProviders[0])
310 lstrcat (szNewProviders, TEXT(","));
311 lstrcat (szNewProviders, TEXT("TransarcAFSDaemon"));
314 if ((status = RegSetValueEx (hk, TEXT("ProviderOrder"), NULL, REG_SZ, (PBYTE)szNewProviders, sizeof(TCHAR)*(1+lstrlen(szNewProviders)))) == ERROR_SUCCESS)
317 else // (!g.fIsWinNT)
319 TCHAR szLHS[ cchRESOURCE ] = TEXT("TransarcAFSDaemon");
320 TCHAR szRHS[ cchRESOURCE ] = TEXT("");
324 if ((status = RegSetValueEx (hk, szLHS, NULL, REG_SZ, (PBYTE)szRHS, sizeof(TCHAR)*(lstrlen(szRHS)+1))) == 0)
329 RegDeleteValue (hk, szLHS);
340 Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_AUTHENT, TEXT("%ld"), status);
345 void Config_GetTrayIconFlag (BOOL *pfFlag)
347 if (!Config_ReadUserNum (TEXT("ShowTrayIcon"), (DWORD*)pfFlag))
352 BOOL Config_SetTrayIconFlag (BOOL fFlag, ULONG *pStatus)
354 Config_WriteUserNum (TEXT("ShowTrayIcon"), fFlag);
357 for (hSearch = GetWindow (GetDesktopWindow(), GW_CHILD);
358 hSearch && IsWindow(hSearch);
359 hSearch = GetWindow (hSearch, GW_HWNDNEXT))
361 TCHAR szClassName[ cchRESOURCE ];
362 if (GetClassName (hSearch, szClassName, cchRESOURCE))
364 if (!lstrcmpi (szClassName, TEXT("AfsCreds")))
369 if (hSearch && IsWindow(hSearch))
371 UINT msgCheckTerminate = RegisterWindowMessage (TEXT("AfsCredsCheckTerminate"));
372 PostMessage (hSearch, msgCheckTerminate, 0, 0);
374 else if (fFlag && !(hSearch && IsWindow(hSearch)))
376 WinExec (TEXT("AfsCreds.exe /quiet"), SW_SHOW);
383 PSERVERPREFS Config_GetServerPrefs (BOOL fVLServers)
385 PSERVERPREFS pPrefs = New (SERVERPREFS);
386 memset (pPrefs, 0x00, sizeof(SERVERPREFS));
387 pPrefs->fVLServers = fVLServers;
389 if (Config_GetServiceState() == SERVICE_RUNNING)
391 // We retrieve server prefs in batches--start that loop now.
394 for (int iOffset = 0; ; )
396 cm_SPrefRequest_t InData;
397 memset (&InData, 0x00, sizeof(InData));
398 InData.offset = iOffset;
399 InData.flags = (pPrefs->fVLServers) ? CM_SPREF_VLONLY : 0;
400 InData.num_servers = cSERVERPREFS_CHUNK;
402 BYTE OutDataStorage[ sizeof(cm_SPrefInfo_t) + cSERVERPREFS_CHUNK * sizeof(cm_SPref_t) ];
403 memset (OutDataStorage, 0x00, sizeof(OutDataStorage));
404 cm_SPrefInfo_t *pOutData = (cm_SPrefInfo_t *)OutDataStorage;
406 struct ViceIoctl IOInfo;
407 IOInfo.in_size = sizeof(InData);
408 IOInfo.in = (char *)&InData;
409 IOInfo.out = (char *)pOutData;
410 IOInfo.out_size = sizeof(cm_SPrefInfo_t) + cSERVERPREFS_CHUNK * sizeof(cm_SPref_t);
412 if (pioctl (0, VIOC_GETSPREFS, &IOInfo, 1) != 0)
415 if (!REALLOC (pPrefs->aPrefs, pPrefs->cPrefs, iOut + pOutData->num_servers, cREALLOC_PREFS))
418 for (size_t ii = 0; ii < pOutData->num_servers; ++ii)
420 pPrefs->aPrefs[ iOut ].ipServer = pOutData->servers[ ii ].host.s_addr;
421 pPrefs->aPrefs[ iOut ].iRank = pOutData->servers[ ii ].rank;
425 if ((iOffset = pOutData->next_offset) == 0)
434 BOOL Config_SetServerPrefs (PSERVERPREFS pPrefs, ULONG *pStatus)
443 for (ii = 0; ii < pPrefs->cPrefs; ++ii)
445 if (pPrefs->aPrefs[ ii ].fChanged)
451 if (Config_GetServiceState() != SERVICE_RUNNING)
454 status = ERROR_SERVICE_NOT_ACTIVE;
458 size_t cbInDataStorage = sizeof(cm_SSetPref_t) + cChanged * sizeof(cm_SPref_t);
460 PBYTE pInDataStorage;
461 if ((pInDataStorage = (PBYTE)Allocate (cbInDataStorage)) == NULL)
464 status = ERROR_NOT_ENOUGH_MEMORY;
468 memset (pInDataStorage, 0x00, sizeof(cbInDataStorage));
470 cm_SSetPref_t *pInData = (cm_SSetPref_t*)pInDataStorage;
471 pInData->flags = (pPrefs->fVLServers) ? CM_SPREF_VLONLY : 0;
472 pInData->num_servers = cChanged;
475 for (ii = 0; ii < pPrefs->cPrefs; ++ii)
477 if (pPrefs->aPrefs[ ii ].fChanged)
479 pInData->servers[ iOut ].host.s_addr = pPrefs->aPrefs[ ii ].ipServer;
480 pInData->servers[ iOut ].rank = (unsigned short)pPrefs->aPrefs[ ii ].iRank;
485 BYTE OutDataStorage[ PIOCTL_MAXSIZE ];
487 struct ViceIoctl IOInfo;
488 IOInfo.in_size = cbInDataStorage;
489 IOInfo.in = (char *)pInData;
490 IOInfo.out = (char *)OutDataStorage;
491 IOInfo.out_size = PIOCTL_MAXSIZE;
493 if ((status = pioctl (0, VIOC_SETSPREFS, &IOInfo, 1)) != 0)
498 Free (pInDataStorage);
507 Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_PREFS, TEXT("%ld"), status);
512 void Config_FreeServerPrefs (PSERVERPREFS pPrefs)
515 Free (pPrefs->aPrefs);
516 memset (pPrefs, 0xFD, sizeof(SERVERPREFS));
521 void Config_GetCacheSize (ULONG *pckCache)
523 if (!Config_ReadGlobalNum (TEXT("CacheSize"), (DWORD*)pckCache))
524 *pckCache = CM_CONFIGDEFAULT_CACHESIZE;
528 BOOL Config_SetCacheSize (ULONG ckCache, ULONG *pStatus)
530 Config_WriteGlobalNum (TEXT("CacheSize"), ckCache);
531 g.fNeedRestart = TRUE;
537 void Config_GetChunkSize (ULONG *pckChunk)
539 if (!Config_ReadGlobalNum (TEXT("ChunkSize"), (DWORD*)pckChunk))
540 *pckChunk = CM_CONFIGDEFAULT_CHUNKSIZE;
541 *pckChunk = max (*pckChunk, 10);
542 *pckChunk = (1 << ((*pckChunk)-10));
546 BOOL Config_SetChunkSize (ULONG ckChunk, ULONG *pStatus)
548 Config_WriteGlobalNum (TEXT("ChunkSize"), log2(ckChunk * 1024));
549 g.fNeedRestart = TRUE;
555 void Config_GetStatEntries (ULONG *pcEntries)
557 if (!Config_ReadGlobalNum (TEXT("Stats"), (DWORD*)pcEntries))
558 *pcEntries = CM_CONFIGDEFAULT_STATS;
562 BOOL Config_SetStatEntries (ULONG cEntries, ULONG *pStatus)
564 Config_WriteGlobalNum (TEXT("Stats"), cEntries);
565 g.fNeedRestart = TRUE;
571 void Config_GetProbeInt (ULONG *pcsecProbe)
574 // TODO: NEED REGISTRY SETTING
578 BOOL Config_SetProbeInt (ULONG csecProbe, ULONG *pStatus)
583 // TODO: NEED REGISTRY SETTING
584 if (Config_GetServiceState() == SERVICE_RUNNING)
586 struct chservinfo checkserv;
587 memset (&checkserv, 0x00, sizeof(checkserv));
588 checkserv.magic = 0x12345678;
589 checkserv.tinterval = csecProbe;
591 BYTE OutData[ PIOCTL_MAXSIZE ];
592 memset (OutData, 0x00, sizeof(OutData));
594 struct ViceIoctl IOInfo;
595 IOInfo.in_size = sizeof(checkserv);
596 IOInfo.in = (char *)&checkserv;
597 IOInfo.out = (char *)OutData;
598 IOInfo.out_size = PIOCTL_MAXSIZE;
600 if ((status = pioctl (0, VIOCCKSERV, &IOInfo, 1)) != 0)
609 Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_PROBE, TEXT("%ld"), status);
615 void Config_GetNumThreads (ULONG *pcThreads)
617 if (!Config_ReadGlobalNum (TEXT("ServerThreads"), (DWORD*)pcThreads))
618 *pcThreads = CM_CONFIGDEFAULT_SVTHREADS;
622 BOOL Config_SetNumThreads (ULONG cThreads, ULONG *pStatus)
624 Config_WriteGlobalNum (TEXT("ServerThreads"), cThreads);
625 g.fNeedRestart = TRUE;
631 void Config_GetNumDaemons (ULONG *pcDaemons)
633 if (!Config_ReadGlobalNum (TEXT("Daemons"), (DWORD*)pcDaemons))
634 *pcDaemons = CM_CONFIGDEFAULT_DAEMONS;
638 BOOL Config_SetNumDaemons (ULONG cDaemons, ULONG *pStatus)
640 Config_WriteGlobalNum (TEXT("Daemons"), cDaemons);
641 g.fNeedRestart = TRUE;
647 void Config_GetSysName (LPTSTR pszName)
649 if (!Config_ReadGlobalString (TEXT("SysName"), pszName, MAX_PATH))
650 lstrcpy (pszName, TEXT("i386_nt40"));
654 BOOL Config_SetSysName (LPCTSTR pszName, ULONG *pStatus)
659 if (Config_GetServiceState() == SERVICE_RUNNING)
663 TCHAR szData[ PIOCTL_MAXSIZE ];
665 memset (&InData, 0x00, sizeof(InData));
666 USHORT i=0, j=0, len=lstrlen(pszName);
669 Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_SYSNAME, TEXT("A sysname must be specified"));
673 while ( pszName[i] ) {
674 if ( !isspace(pszName[i]) ) {
675 InData.szData[j++] = pszName[i];
676 } else if (InData.szData[j-1] != '\0') {
677 InData.szData[j++] = '\0';
682 InData.szData[j++] = '\0';
683 InData.cbData++; /* one word */
685 BYTE OutData[ PIOCTL_MAXSIZE ];
686 memset (OutData, 0x00, sizeof(OutData));
688 struct ViceIoctl IOInfo;
689 IOInfo.in_size = sizeof(ULONG) + j;
690 IOInfo.in = (char *)&InData;
691 IOInfo.out = (char *)OutData;
692 IOInfo.out_size = PIOCTL_MAXSIZE;
694 if ((status = pioctl (0, VIOC_AFS_SYSNAME, &IOInfo, 1)) != 0)
702 Config_WriteGlobalString (TEXT("SysName"), pszName);
708 Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_SYSNAME, TEXT("%ld"), status);
714 void Config_GetRootVolume (LPTSTR pszName)
716 if (!Config_ReadGlobalString (TEXT("RootVolume"), pszName, MAX_PATH))
717 lstrcpy (pszName, TEXT("root.afs"));
721 BOOL Config_SetRootVolume (LPCTSTR pszName, ULONG *pStatus)
723 Config_WriteGlobalString (TEXT("RootVolume"), pszName);
724 g.fNeedRestart = TRUE;
730 void Config_GetMountRoot (LPTSTR pszPath)
732 if (!Config_ReadGlobalString (TEXT("MountRoot"), pszPath, MAX_PATH))
733 lstrcpy (pszPath, TEXT("/afs"));
737 BOOL Config_SetMountRoot (LPCTSTR pszPath, ULONG *pStatus)
739 Config_WriteGlobalString (TEXT("MountRoot"), pszPath);
740 g.fNeedRestart = TRUE;
745 BOOL Config_GetCacheInUse (ULONG *pckCacheInUse, ULONG *pStatus)
752 if (Config_GetServiceState() != SERVICE_RUNNING)
755 status = ERROR_SERVICE_NOT_ACTIVE;
759 BYTE OutData[ PIOCTL_MAXSIZE ];
760 memset (OutData, 0x00, sizeof(OutData));
762 struct ViceIoctl IOInfo;
764 IOInfo.in = (char *)0;
765 IOInfo.out = (char *)OutData;
766 IOInfo.out_size = PIOCTL_MAXSIZE;
768 if ((status = pioctl (0, VIOCGETCACHEPARMS, &IOInfo, 1)) != 0)
774 *pckCacheInUse = ((LONG*)OutData)[1];
783 void Config_GetCachePath (LPTSTR pszCachePath)
785 if (!Config_ReadGlobalString (TEXT("CachePath"), pszCachePath, MAX_PATH)) {
787 TCHAR szPath[ MAX_PATH ] = TEXT("");
789 if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Environment"), 0, KEY_QUERY_VALUE, &hk) == ERROR_SUCCESS)
791 DWORD dwSize = sizeof(szPath);
794 if (RegQueryValueEx (hk, TEXT("TEMP"), NULL, &dwType, (PBYTE)szPath, &dwSize) == ERROR_SUCCESS)
796 if ( dwType == REG_EXPAND_SZ ) {
797 TCHAR szTemp[ MAX_PATH ];
798 lstrcpy(szTemp, szPath);
799 ExpandEnvironmentStrings(szTemp, szPath, MAX_PATH);
803 lstrcat(szPath, "\\AFSCache");
807 GetWindowsDirectory(szPath, sizeof(szPath));
808 lstrcat(szPath, "\\TEMP\\AFSCache");
810 lstrcpy (pszCachePath, szPath);
814 BOOL Config_SetCachePath(LPCTSTR pszPath, ULONG *pStatus)
816 Config_WriteGlobalString (TEXT("CachePath"), pszPath);
817 g.fNeedRestart = TRUE;
821 void Config_GetLanAdapter (ULONG *pnLanAdapter)
823 if (!Config_ReadGlobalNum (TEXT("LANadapter"), (DWORD*)pnLanAdapter))
827 BOOL Config_SetLanAdapter (ULONG nLanAdapter, ULONG *pStatus)
829 Config_WriteGlobalNum (TEXT("LANadapter"), nLanAdapter);
830 g.fNeedRestart = TRUE;
834 void Config_GetTrapOnPanic (BOOL *pfFlag)
836 if (!Config_ReadGlobalNum (TEXT("TrapOnPanic"), (DWORD*)pfFlag))
840 BOOL Config_SetTrapOnPanic (BOOL fFlag, ULONG *pStatus)
842 Config_WriteGlobalNum (TEXT("TrapOnPanic"), fFlag);
843 g.fNeedRestart = TRUE;
847 void Config_GetTraceBufferSize (ULONG *pnBufSize)
849 if (!Config_ReadGlobalNum (TEXT("TraceBufferSize"), (DWORD*)pnBufSize))
853 BOOL Config_SetTraceBufferSize (ULONG nBufSize, ULONG *pStatus)
855 Config_WriteGlobalNum (TEXT("TraceBufferSize"), nBufSize);
856 g.fNeedRestart = TRUE;
860 void Config_GetLoginRetryInterval (ULONG *pnInterval)
862 if (!Config_ReadGlobalNum (TEXT("LoginRetryInterval"), (DWORD*)pnInterval))
866 BOOL Config_SetLoginRetryInterval (ULONG nInterval, ULONG *pStatus)
868 Config_WriteGlobalNum (TEXT("LoginRetryInterval"), nInterval);
872 void Config_GetFailLoginsSilently (BOOL *pfFlag)
874 if (!Config_ReadGlobalNum (TEXT("FailLoginsSilently"), (DWORD*)pfFlag))
878 BOOL Config_SetFailLoginsSilently (BOOL fFlag, ULONG *pStatus)
880 Config_WriteGlobalNum (TEXT("FailLoginsSilently"), fFlag);
884 void Config_GetReportSessionStartups (BOOL *pfFlag)
886 if (!Config_ReadGlobalNum (TEXT("ReportSessionStartups"), (DWORD*)pfFlag))
890 BOOL Config_SetReportSessionStartups (BOOL fFlag, ULONG *pStatus)
892 Config_WriteGlobalNum (TEXT("ReportSessionStartups"), fFlag);