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
11 #include <afs/param.h>
15 #include "afs_config.h"
16 #include <WINNT\afsreg.h>
20 #include "../afsd/fs_utils.h"
22 #define __CM_CONFIG_INTERFACES_ONLY__
23 #include "../afsd/cm_config.h"
25 #define __CM_IOCTL_INTERFACES_ONLY__
26 #include "../afsd/cm_ioctl.h"
31 #define cREALLOC_PREFS 32
33 #define cSERVERPREFS_CHUNK 256
35 #define PIOCTL_MAXSIZE 2048
40 * ROUTINES ___________________________________________________________________
44 static DWORD log2 (DWORD dwValue)
47 for (dwLog = 0; (DWORD)(1<<dwLog) < dwValue; ++dwLog)
52 DWORD Config_GetServiceState (void)
56 TCHAR szGateway[ cchRESOURCE ] = TEXT("");
57 Config_GetGatewayName (szGateway);
58 return (szGateway[0]) ? SERVICE_RUNNING : SERVICE_STOPPED;
61 SERVICE_STATUS Status;
62 memset (&Status, 0x00, sizeof(Status));
65 if ((hManager = OpenSCManager (NULL, NULL, GENERIC_READ)) != NULL)
68 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), GENERIC_READ)) != NULL)
70 QueryServiceStatus (hService, &Status);
71 CloseServiceHandle (hService);
74 CloseServiceHandle (hManager);
77 return Status.dwCurrentState;
82 * Configuration Routine ______________________________________________________
86 void Config_GetGatewayFlag (BOOL *pfFlag)
88 if (!Config_ReadGlobalNum (TEXT("IsGateway"), (DWORD*)pfFlag))
93 BOOL Config_SetGatewayFlag (BOOL fFlag, ULONG *pStatus)
95 Config_WriteGlobalNum (TEXT("IsGateway"), fFlag);
96 g.fNeedRestart = TRUE;
101 void Config_GetGatewayName (LPTSTR pszName)
103 if (!Config_ReadGlobalString (TEXT("Gateway"), pszName, MAX_PATH))
104 GetString (pszName, IDS_GATEWAY_UNKNOWN);
106 GetString (pszName, IDS_GATEWAY_UNKNOWN);
110 BOOL Config_SetGatewayName (LPCTSTR pszName, ULONG *pStatus)
112 TCHAR szBogus[ cchRESOURCE ];
113 GetString (szBogus, IDS_GATEWAY_UNKNOWN);
114 if (!lstrcmpi (szBogus, pszName))
116 Config_WriteGlobalString (TEXT("Gateway"), TEXT(""));
120 Config_WriteGlobalString (TEXT("Gateway"), pszName);
127 void Config_FixGatewayDrives (void)
129 // Zip through the user's network drives and reconnect
130 // them as necessary.
132 for (TCHAR chDrive = chDRIVE_A; chDrive <= chDRIVE_Z; ++chDrive)
134 TCHAR szSubmount[ MAX_PATH ];
135 if (!GetDriveSubmount (chDrive, szSubmount))
138 // We've got a mapping into AFS! Remove it, rather forcefully.
140 TCHAR szDrive[] = "@:";
141 szDrive[0] = chDrive;
142 WNetCancelConnection (szDrive, TRUE);
145 // Now recreate our drive mappings, based on the user's already-
146 // specified preferences.
149 QueryDriveMapList (&List);
151 for (size_t ii = 0; ii < 26; ++ii)
153 if (!List.aDriveMap[ii].szMapping[0])
155 ActivateDriveMap (List.aDriveMap[ii].chDrive, List.aDriveMap[ii].szMapping, List.aDriveMap[ii].szSubmount, List.aDriveMap[ii].fPersistent);
160 void Config_GetCellName (LPTSTR pszName)
162 if (!Config_ReadGlobalString (TEXT("Cell"), pszName, MAX_PATH))
163 GetString (pszName, IDS_CELL_UNKNOWN);
165 GetString (pszName, IDS_CELL_UNKNOWN);
169 BOOL Config_ContactGateway (LPTSTR pszGateway, LPTSTR pszCell)
173 BYTE OutData[ PIOCTL_MAXSIZE ];
174 memset (OutData, 0x00, sizeof(OutData));
176 struct ViceIoctl IOInfo;
179 IOInfo.out = (char *)OutData;
180 IOInfo.out_size = PIOCTL_MAXSIZE;
182 TCHAR szOldGateway[ MAX_PATH ];
183 Config_GetGatewayName (szOldGateway);
184 Config_SetGatewayName (pszGateway);
187 if ((status = pioctl (0, VIOC_GET_WS_CELL, &IOInfo, 1)) == 0)
191 lstrcpy (pszCell, (LPCTSTR)OutData);
196 Config_SetGatewayName (szOldGateway);
202 BOOL Config_SetCellName (LPCTSTR pszName, ULONG *pStatus)
204 TCHAR szBogus[ cchRESOURCE ];
205 GetString (szBogus, IDS_CELL_UNKNOWN);
206 if (lstrcmpi (szBogus, pszName))
208 Config_WriteGlobalString (TEXT("Cell"), pszName);
209 g.fNeedRestart = TRUE;
215 /* These two functions are not needed as of the 1.2.2a updates.
216 The old implementation used to 'bind' afslogon.dll to the credentials manager
217 when the Integrated Logon was selected.
219 With version 1.2.2a afslogon.dll is always 'bound' to the credentials manager; therefore,
220 the binding operation is done during installation. Note: the Integrated Logon is
221 selected by an entry in the registry (LogonOptions).
223 void Config_GetAuthentFlag (BOOL *pfFlag)
228 if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\NetworkProvider\\Order"), 0, KEY_QUERY_VALUE, &hk) == ERROR_SUCCESS)
232 TCHAR szProviders[ MAX_PATH ] = TEXT("");
233 DWORD dwSize = sizeof(szProviders);
235 if (RegQueryValueEx (hk, TEXT("ProviderOrder"), NULL, NULL, (PBYTE)szProviders, &dwSize) == ERROR_SUCCESS)
237 for (LPTSTR pch = szProviders; *pch; )
239 if (!lstrncmpi (pch, TEXT("TransarcAFSDaemon"), lstrlen(TEXT("TransarcAFSDaemon"))))
242 for ( ; *pch && (*pch != TEXT(',')); ++pch)
244 for ( ; *pch == TEXT(','); ++pch)
251 else // (!g.fIsWinNT)
253 TCHAR szLHS[ MAX_PATH ] = TEXT("");
254 DWORD dwSize = sizeof(szLHS);
256 if (RegQueryValueEx (hk, TEXT("TransarcAFSDaemon"), NULL, NULL, (PBYTE)szLHS, &dwSize) == ERROR_SUCCESS)
263 BOOL Config_SetAuthentFlag (BOOL fFlag, ULONG *pStatus)
270 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)
274 TCHAR szOldProviders[ MAX_PATH ] = TEXT("");
275 TCHAR szNewProviders[ MAX_PATH ] = TEXT("");
276 DWORD dwSize = sizeof(szOldProviders);
277 RegQueryValueEx (hk, TEXT("ProviderOrder"), NULL, NULL, (PBYTE)szOldProviders, &dwSize);
279 for (LPTSTR pch = szOldProviders; *pch; )
282 if (!lstrncmpi (pch, TEXT("TransarcAFSDaemon"), lstrlen(TEXT("TransarcAFSDaemon"))))
290 LPTSTR pchOut = &szNewProviders[ lstrlen(szNewProviders) ];
291 if (szNewProviders[0])
292 *pchOut++ = TEXT(',');
293 for ( ; *pch && (*pch != TEXT(',')); )
295 *pchOut = TEXT('\0');
298 for ( ; *pch && (*pch != TEXT(',')); ++pch)
300 for ( ; *pch == TEXT(','); ++pch)
306 if (szNewProviders[0])
307 lstrcat (szNewProviders, TEXT(","));
308 lstrcat (szNewProviders, TEXT("TransarcAFSDaemon"));
311 if ((status = RegSetValueEx (hk, TEXT("ProviderOrder"), NULL, REG_SZ, (PBYTE)szNewProviders, sizeof(TCHAR)*(1+lstrlen(szNewProviders)))) == ERROR_SUCCESS)
314 else // (!g.fIsWinNT)
316 TCHAR szLHS[ cchRESOURCE ] = TEXT("TransarcAFSDaemon");
317 TCHAR szRHS[ cchRESOURCE ] = TEXT("");
321 if ((status = RegSetValueEx (hk, szLHS, NULL, REG_SZ, (PBYTE)szRHS, sizeof(TCHAR)*(lstrlen(szRHS)+1))) == 0)
326 RegDeleteValue (hk, szLHS);
337 Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_AUTHENT, TEXT("%ld"), status);
342 void Config_GetTrayIconFlag (BOOL *pfFlag)
344 if (!Config_ReadUserNum (TEXT("ShowTrayIcon"), (DWORD*)pfFlag))
349 BOOL Config_SetTrayIconFlag (BOOL fFlag, ULONG *pStatus)
351 Config_WriteUserNum (TEXT("ShowTrayIcon"), fFlag);
354 for (hSearch = GetWindow (GetDesktopWindow(), GW_CHILD);
355 hSearch && IsWindow(hSearch);
356 hSearch = GetWindow (hSearch, GW_HWNDNEXT))
358 TCHAR szClassName[ cchRESOURCE ];
359 if (GetClassName (hSearch, szClassName, cchRESOURCE))
361 if (!lstrcmpi (szClassName, TEXT("AfsCreds")))
366 if (hSearch && IsWindow(hSearch))
368 UINT msgCheckTerminate = RegisterWindowMessage (TEXT("AfsCredsCheckTerminate"));
369 PostMessage (hSearch, msgCheckTerminate, 0, 0);
371 else if (fFlag && !(hSearch && IsWindow(hSearch)))
373 WinExec (TEXT("AfsCreds.exe /quiet"), SW_SHOW);
380 PSERVERPREFS Config_GetServerPrefs (BOOL fVLServers)
382 PSERVERPREFS pPrefs = New (SERVERPREFS);
383 memset (pPrefs, 0x00, sizeof(SERVERPREFS));
384 pPrefs->fVLServers = fVLServers;
386 if (Config_GetServiceState() == SERVICE_RUNNING)
388 // We retrieve server prefs in batches--start that loop now.
391 for (int iOffset = 0; ; )
393 cm_SPrefRequest_t InData;
394 memset (&InData, 0x00, sizeof(InData));
395 InData.offset = iOffset;
396 InData.flags = (pPrefs->fVLServers) ? CM_SPREF_VLONLY : 0;
397 InData.num_servers = cSERVERPREFS_CHUNK;
399 BYTE OutDataStorage[ sizeof(cm_SPrefInfo_t) + cSERVERPREFS_CHUNK * sizeof(cm_SPref_t) ];
400 memset (OutDataStorage, 0x00, sizeof(OutDataStorage));
401 cm_SPrefInfo_t *pOutData = (cm_SPrefInfo_t *)OutDataStorage;
403 struct ViceIoctl IOInfo;
404 IOInfo.in_size = sizeof(InData);
405 IOInfo.in = (char *)&InData;
406 IOInfo.out = (char *)pOutData;
407 IOInfo.out_size = sizeof(cm_SPrefInfo_t) + cSERVERPREFS_CHUNK * sizeof(cm_SPref_t);
409 if (pioctl (0, VIOC_GETSPREFS, &IOInfo, 1) != 0)
412 if (!REALLOC (pPrefs->aPrefs, pPrefs->cPrefs, iOut + pOutData->num_servers, cREALLOC_PREFS))
415 for (size_t ii = 0; ii < pOutData->num_servers; ++ii)
417 pPrefs->aPrefs[ iOut ].ipServer = pOutData->servers[ ii ].host.s_addr;
418 pPrefs->aPrefs[ iOut ].iRank = pOutData->servers[ ii ].rank;
422 if ((iOffset = pOutData->next_offset) == 0)
431 BOOL Config_SetServerPrefs (PSERVERPREFS pPrefs, ULONG *pStatus)
440 for (ii = 0; ii < pPrefs->cPrefs; ++ii)
442 if (pPrefs->aPrefs[ ii ].fChanged)
448 if (Config_GetServiceState() != SERVICE_RUNNING)
451 status = ERROR_SERVICE_NOT_ACTIVE;
455 size_t cbInDataStorage = sizeof(cm_SSetPref_t) + cChanged * sizeof(cm_SPref_t);
457 PBYTE pInDataStorage;
458 if ((pInDataStorage = (PBYTE)Allocate (cbInDataStorage)) == NULL)
461 status = ERROR_NOT_ENOUGH_MEMORY;
465 memset (pInDataStorage, 0x00, sizeof(cbInDataStorage));
467 cm_SSetPref_t *pInData = (cm_SSetPref_t*)pInDataStorage;
468 pInData->flags = (pPrefs->fVLServers) ? CM_SPREF_VLONLY : 0;
469 pInData->num_servers = cChanged;
472 for (ii = 0; ii < pPrefs->cPrefs; ++ii)
474 if (pPrefs->aPrefs[ ii ].fChanged)
476 pInData->servers[ iOut ].host.s_addr = pPrefs->aPrefs[ ii ].ipServer;
477 pInData->servers[ iOut ].rank = (unsigned short)pPrefs->aPrefs[ ii ].iRank;
482 BYTE OutDataStorage[ PIOCTL_MAXSIZE ];
484 struct ViceIoctl IOInfo;
485 IOInfo.in_size = cbInDataStorage;
486 IOInfo.in = (char *)pInData;
487 IOInfo.out = (char *)OutDataStorage;
488 IOInfo.out_size = PIOCTL_MAXSIZE;
490 if ((status = pioctl (0, VIOC_SETSPREFS, &IOInfo, 1)) != 0)
495 Free (pInDataStorage);
504 Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_PREFS, TEXT("%ld"), status);
509 void Config_FreeServerPrefs (PSERVERPREFS pPrefs)
512 Free (pPrefs->aPrefs);
513 memset (pPrefs, 0xFD, sizeof(SERVERPREFS));
518 void Config_GetCacheSize (ULONG *pckCache)
520 if (!Config_ReadGlobalNum (TEXT("CacheSize"), (DWORD*)pckCache))
521 *pckCache = CM_CONFIGDEFAULT_CACHESIZE;
525 BOOL Config_SetCacheSize (ULONG ckCache, ULONG *pStatus)
527 Config_WriteGlobalNum (TEXT("CacheSize"), ckCache);
528 g.fNeedRestart = TRUE;
534 void Config_GetChunkSize (ULONG *pckChunk)
536 if (!Config_ReadGlobalNum (TEXT("ChunkSize"), (DWORD*)pckChunk))
537 *pckChunk = CM_CONFIGDEFAULT_CHUNKSIZE;
538 *pckChunk = max (*pckChunk, 10);
539 *pckChunk = (1 << ((*pckChunk)-10));
543 BOOL Config_SetChunkSize (ULONG ckChunk, ULONG *pStatus)
545 Config_WriteGlobalNum (TEXT("ChunkSize"), log2(ckChunk * 1024));
546 g.fNeedRestart = TRUE;
552 void Config_GetStatEntries (ULONG *pcEntries)
554 if (!Config_ReadGlobalNum (TEXT("Stats"), (DWORD*)pcEntries))
555 *pcEntries = CM_CONFIGDEFAULT_STATS;
559 BOOL Config_SetStatEntries (ULONG cEntries, ULONG *pStatus)
561 Config_WriteGlobalNum (TEXT("Stats"), cEntries);
562 g.fNeedRestart = TRUE;
568 void Config_GetProbeInt (ULONG *pcsecProbe)
571 // TODO: NEED REGISTRY SETTING
575 BOOL Config_SetProbeInt (ULONG csecProbe, ULONG *pStatus)
580 // TODO: NEED REGISTRY SETTING
581 if (Config_GetServiceState() == SERVICE_RUNNING)
583 struct chservinfo checkserv;
584 memset (&checkserv, 0x00, sizeof(checkserv));
585 checkserv.magic = 0x12345678;
586 checkserv.tinterval = csecProbe;
588 BYTE OutData[ PIOCTL_MAXSIZE ];
589 memset (OutData, 0x00, sizeof(OutData));
591 struct ViceIoctl IOInfo;
592 IOInfo.in_size = sizeof(checkserv);
593 IOInfo.in = (char *)&checkserv;
594 IOInfo.out = (char *)OutData;
595 IOInfo.out_size = PIOCTL_MAXSIZE;
597 if ((status = pioctl (0, VIOCCKSERV, &IOInfo, 1)) != 0)
606 Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_PROBE, TEXT("%ld"), status);
612 void Config_GetNumThreads (ULONG *pcThreads)
614 if (!Config_ReadGlobalNum (TEXT("ServerThreads"), (DWORD*)pcThreads))
615 *pcThreads = CM_CONFIGDEFAULT_SVTHREADS;
619 BOOL Config_SetNumThreads (ULONG cThreads, ULONG *pStatus)
621 Config_WriteGlobalNum (TEXT("ServerThreads"), cThreads);
622 g.fNeedRestart = TRUE;
628 void Config_GetNumDaemons (ULONG *pcDaemons)
630 if (!Config_ReadGlobalNum (TEXT("Daemons"), (DWORD*)pcDaemons))
631 *pcDaemons = CM_CONFIGDEFAULT_DAEMONS;
635 BOOL Config_SetNumDaemons (ULONG cDaemons, ULONG *pStatus)
637 Config_WriteGlobalNum (TEXT("Daemons"), cDaemons);
638 g.fNeedRestart = TRUE;
644 void Config_GetSysName (LPTSTR pszName)
646 if (!Config_ReadGlobalString (TEXT("SysName"), pszName, MAX_PATH))
647 lstrcpy (pszName, TEXT("i386_nt40"));
651 BOOL Config_SetSysName (LPCTSTR pszName, ULONG *pStatus)
656 if (Config_GetServiceState() == SERVICE_RUNNING)
660 TCHAR szData[ PIOCTL_MAXSIZE ];
662 memset (&InData, 0x00, sizeof(InData));
663 USHORT i=0, j=0, len=lstrlen(pszName);
666 Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_SYSNAME, TEXT("A sysname must be specified"));
670 while ( pszName[i] ) {
671 if ( !isspace(pszName[i]) ) {
672 InData.szData[j++] = pszName[i];
673 } else if (InData.szData[j-1] != '\0') {
674 InData.szData[j++] = '\0';
679 InData.szData[j++] = '\0';
680 InData.cbData++; /* one word */
682 BYTE OutData[ PIOCTL_MAXSIZE ];
683 memset (OutData, 0x00, sizeof(OutData));
685 struct ViceIoctl IOInfo;
686 IOInfo.in_size = sizeof(ULONG) + j;
687 IOInfo.in = (char *)&InData;
688 IOInfo.out = (char *)OutData;
689 IOInfo.out_size = PIOCTL_MAXSIZE;
691 if ((status = pioctl (0, VIOC_AFS_SYSNAME, &IOInfo, 1)) != 0)
699 Config_WriteGlobalString (TEXT("SysName"), pszName);
705 Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_SYSNAME, TEXT("%ld"), status);
711 void Config_GetRootVolume (LPTSTR pszName)
713 if (!Config_ReadGlobalString (TEXT("RootVolume"), pszName, MAX_PATH))
714 lstrcpy (pszName, TEXT("root.afs"));
718 BOOL Config_SetRootVolume (LPCTSTR pszName, ULONG *pStatus)
720 Config_WriteGlobalString (TEXT("RootVolume"), pszName);
721 g.fNeedRestart = TRUE;
727 void Config_GetMountRoot (LPTSTR pszPath)
729 if (!Config_ReadGlobalString (TEXT("MountRoot"), pszPath, MAX_PATH))
730 lstrcpy (pszPath, TEXT("/afs"));
734 BOOL Config_SetMountRoot (LPCTSTR pszPath, ULONG *pStatus)
736 Config_WriteGlobalString (TEXT("MountRoot"), pszPath);
737 g.fNeedRestart = TRUE;
742 BOOL Config_GetCacheInUse (ULONG *pckCacheInUse, ULONG *pStatus)
749 if (Config_GetServiceState() != SERVICE_RUNNING)
752 status = ERROR_SERVICE_NOT_ACTIVE;
756 BYTE OutData[ PIOCTL_MAXSIZE ];
757 memset (OutData, 0x00, sizeof(OutData));
759 struct ViceIoctl IOInfo;
761 IOInfo.in = (char *)0;
762 IOInfo.out = (char *)OutData;
763 IOInfo.out_size = PIOCTL_MAXSIZE;
765 if ((status = pioctl (0, VIOCGETCACHEPARMS, &IOInfo, 1)) != 0)
771 *pckCacheInUse = ((LONG*)OutData)[1];
780 void Config_GetCachePath (LPTSTR pszCachePath)
782 if (!Config_ReadGlobalString (TEXT("CachePath"), pszCachePath, MAX_PATH)) {
784 TCHAR szPath[ MAX_PATH ] = TEXT("");
786 if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Environment"), 0, KEY_QUERY_VALUE, &hk) == ERROR_SUCCESS)
788 DWORD dwSize = sizeof(szPath);
791 if (RegQueryValueEx (hk, TEXT("TEMP"), NULL, &dwType, (PBYTE)szPath, &dwSize) == ERROR_SUCCESS)
793 if ( dwType == REG_EXPAND_SZ ) {
794 TCHAR szTemp[ MAX_PATH ];
795 lstrcpy(szTemp, szPath);
796 ExpandEnvironmentStrings(szTemp, szPath, MAX_PATH);
800 lstrcat(szPath, "\\AFSCache");
804 GetWindowsDirectory(szPath, sizeof(szPath));
805 lstrcat(szPath, "\\TEMP\\AFSCache");
807 lstrcpy (pszCachePath, szPath);
811 BOOL Config_SetCachePath(LPCTSTR pszPath, ULONG *pStatus)
813 Config_WriteGlobalString (TEXT("CachePath"), pszPath);
814 g.fNeedRestart = TRUE;
818 void Config_GetLanAdapter (ULONG *pnLanAdapter)
820 if (!Config_ReadGlobalNum (TEXT("LANadapter"), (DWORD*)pnLanAdapter))
824 BOOL Config_SetLanAdapter (ULONG nLanAdapter, ULONG *pStatus)
826 Config_WriteGlobalNum (TEXT("LANadapter"), nLanAdapter);
827 g.fNeedRestart = TRUE;
831 void Config_GetTrapOnPanic (BOOL *pfFlag)
833 if (!Config_ReadGlobalNum (TEXT("TrapOnPanic"), (DWORD*)pfFlag))
837 BOOL Config_SetTrapOnPanic (BOOL fFlag, ULONG *pStatus)
839 Config_WriteGlobalNum (TEXT("TrapOnPanic"), fFlag);
840 g.fNeedRestart = TRUE;
844 void Config_GetTraceBufferSize (ULONG *pnBufSize)
846 if (!Config_ReadGlobalNum (TEXT("TraceBufferSize"), (DWORD*)pnBufSize))
850 BOOL Config_SetTraceBufferSize (ULONG nBufSize, ULONG *pStatus)
852 Config_WriteGlobalNum (TEXT("TraceBufferSize"), nBufSize);
853 g.fNeedRestart = TRUE;
857 void Config_GetLoginRetryInterval (ULONG *pnInterval)
859 if (!Config_ReadGlobalNum (TEXT("LoginRetryInterval"), (DWORD*)pnInterval))
863 BOOL Config_SetLoginRetryInterval (ULONG nInterval, ULONG *pStatus)
865 Config_WriteGlobalNum (TEXT("LoginRetryInterval"), nInterval);
869 void Config_GetFailLoginsSilently (BOOL *pfFlag)
871 if (!Config_ReadGlobalNum (TEXT("FailLoginsSilently"), (DWORD*)pfFlag))
875 BOOL Config_SetFailLoginsSilently (BOOL fFlag, ULONG *pStatus)
877 Config_WriteGlobalNum (TEXT("FailLoginsSilently"), fFlag);
881 void Config_GetReportSessionStartups (BOOL *pfFlag)
883 if (!Config_ReadGlobalNum (TEXT("ReportSessionStartups"), (DWORD*)pfFlag))
887 BOOL Config_SetReportSessionStartups (BOOL fFlag, ULONG *pStatus)
889 Config_WriteGlobalNum (TEXT("ReportSessionStartups"), fFlag);