6 #include "afs_config.h"
10 #include "../afsd/fs_utils.h"
12 #define __CM_CONFIG_INTERFACES_ONLY__
13 #include "../afsd/cm_config.h"
15 #define __CM_IOCTL_INTERFACES_ONLY__
16 #include "../afsd/cm_ioctl.h"
21 #define cREALLOC_PREFS 32
23 #define cSERVERPREFS_CHUNK 256
25 #define PIOCTL_MAXSIZE 2048
29 * REGISTRY ___________________________________________________________________
33 static TCHAR cszLANMANDEVICE[] = TEXT("\\Device\\LanmanRedirector\\");
34 const TCHAR AFSConfigKeyName[] = TEXT("SYSTEM\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters");
38 * ROUTINES ___________________________________________________________________
42 static DWORD log2 (DWORD dwValue)
44 for (DWORD dwLog = 0; (DWORD)(1<<dwLog) < dwValue; ++dwLog)
49 DWORD Config_GetServiceState (void)
53 TCHAR szGateway[ cchRESOURCE ] = TEXT("");
54 Config_GetGatewayName (szGateway);
55 return (szGateway[0]) ? SERVICE_RUNNING : SERVICE_STOPPED;
58 SERVICE_STATUS Status;
59 memset (&Status, 0x00, sizeof(Status));
62 if ((hManager = OpenSCManager (NULL, NULL, GENERIC_READ)) != NULL)
65 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), GENERIC_READ)) != NULL)
67 QueryServiceStatus (hService, &Status);
68 CloseServiceHandle (hService);
71 CloseServiceHandle (hManager);
74 return Status.dwCurrentState;
79 * Configuration Routine ______________________________________________________
83 void Config_GetGatewayFlag (BOOL *pfFlag)
85 if (!Config_ReadNum (TEXT("IsGateway"), (DWORD*)pfFlag))
90 BOOL Config_SetGatewayFlag (BOOL fFlag, ULONG *pStatus)
92 Config_WriteNum (TEXT("IsGateway"), fFlag);
93 g.fNeedRestart = TRUE;
98 void Config_GetGatewayName (LPTSTR pszName)
100 if (!Config_ReadString (TEXT("Gateway"), pszName, MAX_PATH))
101 GetString (pszName, IDS_GATEWAY_UNKNOWN);
103 GetString (pszName, IDS_GATEWAY_UNKNOWN);
107 BOOL Config_SetGatewayName (LPCTSTR pszName, ULONG *pStatus)
109 TCHAR szBogus[ cchRESOURCE ];
110 GetString (szBogus, IDS_GATEWAY_UNKNOWN);
111 if (!lstrcmpi (szBogus, pszName))
113 Config_WriteString (TEXT("Gateway"), TEXT(""));
117 Config_WriteString (TEXT("Gateway"), pszName);
124 void Config_FixGatewayDrives (void)
126 // Zip through the user's network drives and reconnect
127 // them as necessary.
129 for (TCHAR chDrive = chDRIVE_A; chDrive <= chDRIVE_Z; ++chDrive)
131 TCHAR szSubmount[ MAX_PATH ];
132 if (!GetDriveSubmount (chDrive, szSubmount))
135 // We've got a mapping into AFS! Remove it, rather forcefully.
137 TCHAR szDrive[] = "@:";
138 szDrive[0] = chDrive;
139 WNetCancelConnection (szDrive, TRUE);
142 // Now recreate our drive mappings, based on the user's already-
143 // specified preferences.
146 QueryDriveMapList (&List);
148 for (size_t ii = 0; ii < 26; ++ii)
150 if (!List.aDriveMap[ii].szMapping[0])
152 ActivateDriveMap (List.aDriveMap[ii].chDrive, List.aDriveMap[ii].szMapping, List.aDriveMap[ii].szSubmount, List.aDriveMap[ii].fPersistent);
157 void Config_GetCellName (LPTSTR pszName)
159 if (!Config_ReadString (TEXT("Cell"), pszName, MAX_PATH))
160 GetString (pszName, IDS_CELL_UNKNOWN);
162 GetString (pszName, IDS_CELL_UNKNOWN);
166 BOOL Config_ContactGateway (LPTSTR pszGateway, LPTSTR pszCell)
170 BYTE OutData[ PIOCTL_MAXSIZE ];
171 memset (OutData, 0x00, sizeof(OutData));
173 struct ViceIoctl IOInfo;
176 IOInfo.out = (char *)OutData;
177 IOInfo.out_size = PIOCTL_MAXSIZE;
179 TCHAR szOldGateway[ MAX_PATH ];
180 Config_GetGatewayName (szOldGateway);
181 Config_SetGatewayName (pszGateway);
184 if ((status = pioctl (0, VIOC_GET_WS_CELL, &IOInfo, 1)) == 0)
188 lstrcpy (pszCell, (LPCTSTR)OutData);
193 Config_SetGatewayName (szOldGateway);
199 BOOL Config_SetCellName (LPCTSTR pszName, ULONG *pStatus)
201 TCHAR szBogus[ cchRESOURCE ];
202 GetString (szBogus, IDS_CELL_UNKNOWN);
203 if (lstrcmpi (szBogus, pszName))
205 Config_WriteString (TEXT("Cell"), pszName);
206 g.fNeedRestart = TRUE;
212 void Config_GetAuthentFlag (BOOL *pfFlag)
217 if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Control\\NetworkProvider\\Order"), 0, KEY_QUERY_VALUE, &hk) == ERROR_SUCCESS)
221 TCHAR szProviders[ MAX_PATH ] = TEXT("");
222 DWORD dwSize = sizeof(szProviders);
224 if (RegQueryValueEx (hk, TEXT("ProviderOrder"), NULL, NULL, (PBYTE)szProviders, &dwSize) == ERROR_SUCCESS)
226 for (LPTSTR pch = szProviders; *pch; )
228 if (!lstrncmpi (pch, TEXT("TransarcAFSDaemon"), lstrlen(TEXT("TransarcAFSDaemon"))))
231 for ( ; *pch && (*pch != TEXT(',')); ++pch)
233 for ( ; *pch == TEXT(','); ++pch)
240 else // (!g.fIsWinNT)
242 TCHAR szLHS[ MAX_PATH ] = TEXT("");
243 DWORD dwSize = sizeof(szLHS);
245 if (RegQueryValueEx (hk, TEXT("TransarcAFSDaemon"), NULL, NULL, (PBYTE)szLHS, &dwSize) == ERROR_SUCCESS)
252 BOOL Config_SetAuthentFlag (BOOL fFlag, ULONG *pStatus)
259 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)
263 TCHAR szOldProviders[ MAX_PATH ] = TEXT("");
264 TCHAR szNewProviders[ MAX_PATH ] = TEXT("");
265 DWORD dwSize = sizeof(szOldProviders);
266 RegQueryValueEx (hk, TEXT("ProviderOrder"), NULL, NULL, (PBYTE)szOldProviders, &dwSize);
268 for (LPTSTR pch = szOldProviders; *pch; )
271 if (!lstrncmpi (pch, TEXT("TransarcAFSDaemon"), lstrlen(TEXT("TransarcAFSDaemon"))))
279 LPTSTR pchOut = &szNewProviders[ lstrlen(szNewProviders) ];
280 if (szNewProviders[0])
281 *pchOut++ = TEXT(',');
282 for ( ; *pch && (*pch != TEXT(',')); )
284 *pchOut = TEXT('\0');
287 for ( ; *pch && (*pch != TEXT(',')); ++pch)
289 for ( ; *pch == TEXT(','); ++pch)
295 if (szNewProviders[0])
296 lstrcat (szNewProviders, TEXT(","));
297 lstrcat (szNewProviders, TEXT("TransarcAFSDaemon"));
300 if ((status = RegSetValueEx (hk, TEXT("ProviderOrder"), NULL, REG_SZ, (PBYTE)szNewProviders, sizeof(TCHAR)*(1+lstrlen(szNewProviders)))) == ERROR_SUCCESS)
303 else // (!g.fIsWinNT)
305 TCHAR szLHS[ cchRESOURCE ] = TEXT("TransarcAFSDaemon");
306 TCHAR szRHS[ cchRESOURCE ] = TEXT("");
310 if ((status = RegSetValueEx (hk, szLHS, NULL, REG_SZ, (PBYTE)szRHS, sizeof(TCHAR)*(lstrlen(szRHS)+1))) == 0)
315 RegDeleteValue (hk, szLHS);
326 Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_AUTHENT, TEXT("%ld"), status);
331 void Config_GetTrayIconFlag (BOOL *pfFlag)
333 if (!Config_ReadNum (TEXT("ShowTrayIcon"), (DWORD*)pfFlag))
338 BOOL Config_SetTrayIconFlag (BOOL fFlag, ULONG *pStatus)
340 Config_WriteNum (TEXT("ShowTrayIcon"), fFlag);
342 for (HWND hSearch = GetWindow (GetDesktopWindow(), GW_CHILD);
343 hSearch && IsWindow(hSearch);
344 hSearch = GetWindow (hSearch, GW_HWNDNEXT))
346 TCHAR szClassName[ cchRESOURCE ];
347 if (GetClassName (hSearch, szClassName, cchRESOURCE))
349 if (!lstrcmpi (szClassName, TEXT("AfsCreds")))
354 if (hSearch && IsWindow(hSearch))
356 UINT msgCheckTerminate = RegisterWindowMessage (TEXT("AfsCredsCheckTerminate"));
357 PostMessage (hSearch, msgCheckTerminate, 0, 0);
359 else if (fFlag && !(hSearch && IsWindow(hSearch)))
361 WinExec (TEXT("AfsCreds.exe /quiet"), SW_SHOW);
368 PSERVERPREFS Config_GetServerPrefs (BOOL fVLServers)
370 PSERVERPREFS pPrefs = New (SERVERPREFS);
371 memset (pPrefs, 0x00, sizeof(SERVERPREFS));
372 pPrefs->fVLServers = fVLServers;
374 if (Config_GetServiceState() == SERVICE_RUNNING)
376 // We retrieve server prefs in batches--start that loop now.
379 for (int iOffset = 0; ; )
381 cm_SPrefRequest_t InData;
382 memset (&InData, 0x00, sizeof(InData));
383 InData.offset = iOffset;
384 InData.flags = (pPrefs->fVLServers) ? CM_SPREF_VLONLY : 0;
385 InData.num_servers = cSERVERPREFS_CHUNK;
387 BYTE OutDataStorage[ sizeof(cm_SPrefInfo_t) + cSERVERPREFS_CHUNK * sizeof(cm_SPref_t) ];
388 memset (OutDataStorage, 0x00, sizeof(OutDataStorage));
389 cm_SPrefInfo_t *pOutData = (cm_SPrefInfo_t *)OutDataStorage;
391 struct ViceIoctl IOInfo;
392 IOInfo.in_size = sizeof(InData);
393 IOInfo.in = (char *)&InData;
394 IOInfo.out = (char *)pOutData;
395 IOInfo.out_size = sizeof(cm_SPrefInfo_t) + cSERVERPREFS_CHUNK * sizeof(cm_SPref_t);
397 if (pioctl (0, VIOC_GETSPREFS, &IOInfo, 1) != 0)
400 if (!REALLOC (pPrefs->aPrefs, pPrefs->cPrefs, iOut + pOutData->num_servers, cREALLOC_PREFS))
403 for (size_t ii = 0; ii < pOutData->num_servers; ++ii)
405 pPrefs->aPrefs[ iOut ].ipServer = pOutData->servers[ ii ].host.s_addr;
406 pPrefs->aPrefs[ iOut ].iRank = pOutData->servers[ ii ].rank;
410 if ((iOffset = pOutData->next_offset) == 0)
419 BOOL Config_SetServerPrefs (PSERVERPREFS pPrefs, ULONG *pStatus)
427 for (size_t ii = 0; ii < pPrefs->cPrefs; ++ii)
429 if (pPrefs->aPrefs[ ii ].fChanged)
435 if (Config_GetServiceState() != SERVICE_RUNNING)
438 status = ERROR_SERVICE_NOT_ACTIVE;
442 size_t cbInDataStorage = sizeof(cm_SSetPref_t) + cChanged * sizeof(cm_SPref_t);
444 PBYTE pInDataStorage;
445 if ((pInDataStorage = (PBYTE)Allocate (cbInDataStorage)) == NULL)
448 status = ERROR_NOT_ENOUGH_MEMORY;
452 memset (pInDataStorage, 0x00, sizeof(cbInDataStorage));
454 cm_SSetPref_t *pInData = (cm_SSetPref_t*)pInDataStorage;
455 pInData->flags = (pPrefs->fVLServers) ? CM_SPREF_VLONLY : 0;
456 pInData->num_servers = cChanged;
459 for (ii = 0; ii < pPrefs->cPrefs; ++ii)
461 if (pPrefs->aPrefs[ ii ].fChanged)
463 pInData->servers[ iOut ].host.s_addr = pPrefs->aPrefs[ ii ].ipServer;
464 pInData->servers[ iOut ].rank = (unsigned short)pPrefs->aPrefs[ ii ].iRank;
469 BYTE OutDataStorage[ PIOCTL_MAXSIZE ];
471 struct ViceIoctl IOInfo;
472 IOInfo.in_size = cbInDataStorage;
473 IOInfo.in = (char *)pInData;
474 IOInfo.out = (char *)OutDataStorage;
475 IOInfo.out_size = PIOCTL_MAXSIZE;
477 if ((status = pioctl (0, VIOC_SETSPREFS, &IOInfo, 1)) != 0)
482 Free (pInDataStorage);
491 Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_PREFS, TEXT("%ld"), status);
496 void Config_FreeServerPrefs (PSERVERPREFS pPrefs)
499 Free (pPrefs->aPrefs);
500 memset (pPrefs, 0xFD, sizeof(SERVERPREFS));
505 void Config_GetCacheSize (ULONG *pckCache)
507 if (!Config_ReadNum (TEXT("CacheSize"), (DWORD*)pckCache))
508 *pckCache = CM_CONFIGDEFAULT_CACHESIZE;
512 BOOL Config_SetCacheSize (ULONG ckCache, ULONG *pStatus)
517 if (Config_GetServiceState() == SERVICE_RUNNING)
520 Config_GetCacheSize (&ckCacheNow);
521 if (ckCacheNow > ckCache)
523 Message (MB_ICONHAND, GetErrorTitle(), IDS_SHRINKCACHE);
527 struct ViceIoctl IOInfo;
528 IOInfo.in_size = sizeof(ULONG);
529 IOInfo.in = (char *)&ckCache;
530 IOInfo.out = (char *)0;
533 if ((status = pioctl (0, VIOCSETCACHESIZE, &IOInfo, 1)) != 0)
541 Config_WriteNum (TEXT("CacheSize"), ckCache);
547 Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_CACHE, TEXT("%ld"), status);
553 void Config_GetChunkSize (ULONG *pckChunk)
555 if (!Config_ReadNum (TEXT("ChunkSize"), (DWORD*)pckChunk))
556 *pckChunk = CM_CONFIGDEFAULT_CHUNKSIZE;
557 *pckChunk = max (*pckChunk, 10);
558 *pckChunk = (1 << ((*pckChunk)-10));
562 BOOL Config_SetChunkSize (ULONG ckChunk, ULONG *pStatus)
564 Config_WriteNum (TEXT("ChunkSize"), log2(ckChunk * 1024));
565 g.fNeedRestart = TRUE;
571 void Config_GetStatEntries (ULONG *pcEntries)
573 if (!Config_ReadNum (TEXT("Stats"), (DWORD*)pcEntries))
574 *pcEntries = CM_CONFIGDEFAULT_STATS;
578 BOOL Config_SetStatEntries (ULONG cEntries, ULONG *pStatus)
580 Config_WriteNum (TEXT("Stats"), cEntries);
581 g.fNeedRestart = TRUE;
587 void Config_GetProbeInt (ULONG *pcsecProbe)
590 // TODO: NEED REGISTRY SETTING
594 BOOL Config_SetProbeInt (ULONG csecProbe, ULONG *pStatus)
599 // TODO: NEED REGISTRY SETTING
600 if (Config_GetServiceState() == SERVICE_RUNNING)
602 struct chservinfo checkserv;
603 memset (&checkserv, 0x00, sizeof(checkserv));
604 checkserv.magic = 0x12345678;
605 checkserv.tinterval = csecProbe;
607 BYTE OutData[ PIOCTL_MAXSIZE ];
608 memset (OutData, 0x00, sizeof(OutData));
610 struct ViceIoctl IOInfo;
611 IOInfo.in_size = sizeof(checkserv);
612 IOInfo.in = (char *)&checkserv;
613 IOInfo.out = (char *)OutData;
614 IOInfo.out_size = PIOCTL_MAXSIZE;
616 if ((status = pioctl (0, VIOCCKSERV, &IOInfo, 1)) != 0)
625 Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_PROBE, TEXT("%ld"), status);
631 void Config_GetNumThreads (ULONG *pcThreads)
633 if (!Config_ReadNum (TEXT("ServerThreads"), (DWORD*)pcThreads))
634 *pcThreads = CM_CONFIGDEFAULT_SVTHREADS;
638 BOOL Config_SetNumThreads (ULONG cThreads, ULONG *pStatus)
640 Config_WriteNum (TEXT("ServerThreads"), cThreads);
641 g.fNeedRestart = TRUE;
647 void Config_GetNumDaemons (ULONG *pcDaemons)
649 if (!Config_ReadNum (TEXT("Daemons"), (DWORD*)pcDaemons))
650 *pcDaemons = CM_CONFIGDEFAULT_DAEMONS;
654 BOOL Config_SetNumDaemons (ULONG cDaemons, ULONG *pStatus)
656 Config_WriteNum (TEXT("Daemons"), cDaemons);
657 g.fNeedRestart = TRUE;
663 void Config_GetSysName (LPTSTR pszName)
665 if (!Config_ReadString (TEXT("SysName"), pszName, MAX_PATH))
666 lstrcpy (pszName, TEXT("i386_nt40"));
670 BOOL Config_SetSysName (LPCTSTR pszName, ULONG *pStatus)
675 if (Config_GetServiceState() == SERVICE_RUNNING)
679 TCHAR szData[ PIOCTL_MAXSIZE ];
681 memset (&InData, 0x00, sizeof(InData));
682 InData.cbData = lstrlen(pszName);
683 lstrcpy (InData.szData, pszName);
685 BYTE OutData[ PIOCTL_MAXSIZE ];
686 memset (OutData, 0x00, sizeof(OutData));
688 struct ViceIoctl IOInfo;
689 IOInfo.in_size = sizeof(ULONG) +lstrlen(pszName) +1;
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_WriteString (TEXT("SysName"), pszName);
708 Message (MB_ICONHAND, GetErrorTitle(), IDS_FAILCONFIG_SYSNAME, TEXT("%ld"), status);
714 void Config_GetRootVolume (LPTSTR pszName)
716 if (!Config_ReadString (TEXT("RootVolume"), pszName, MAX_PATH))
717 lstrcpy (pszName, TEXT("root.afs"));
721 BOOL Config_SetRootVolume (LPCTSTR pszName, ULONG *pStatus)
723 Config_WriteString (TEXT("RootVolume"), pszName);
724 g.fNeedRestart = TRUE;
730 void Config_GetMountRoot (LPTSTR pszPath)
732 if (!Config_ReadString (TEXT("MountRoot"), pszPath, MAX_PATH))
733 lstrcpy (pszPath, TEXT("/afs"));
737 BOOL Config_SetMountRoot (LPCTSTR pszPath, ULONG *pStatus)
739 Config_WriteString (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_ReadString (TEXT("CachePath"), pszCachePath, MAX_PATH)) {
786 TCHAR szPath[MAX_PATH];
787 GetWindowsDirectory(szPath, sizeof(szPath));
788 szPath[2] = 0; /* get drive letter only */
789 strcat(szPath, "\\AFSCache");
791 lstrcpy (pszCachePath, szPath);
795 BOOL Config_SetCachePath(LPCTSTR pszPath, ULONG *pStatus)
797 Config_WriteString (TEXT("CachePath"), pszPath);
798 g.fNeedRestart = TRUE;
802 void Config_GetLanAdapter (ULONG *pnLanAdapter)
804 if (!Config_ReadNum (TEXT("LANadapter"), (DWORD*)pnLanAdapter))
808 BOOL Config_SetLanAdapter (ULONG nLanAdapter, ULONG *pStatus)
810 Config_WriteNum (TEXT("LANadapter"), nLanAdapter);
811 g.fNeedRestart = TRUE;
815 void Config_GetTrapOnPanic (BOOL *pfFlag)
817 if (!Config_ReadNum (TEXT("TrapOnPanic"), (DWORD*)pfFlag))
821 BOOL Config_SetTrapOnPanic (BOOL fFlag, ULONG *pStatus)
823 Config_WriteNum (TEXT("TrapOnPanic"), fFlag);
824 g.fNeedRestart = TRUE;
828 void Config_GetTraceBufferSize (ULONG *pnBufSize)
830 if (!Config_ReadNum (TEXT("TraceBufferSize"), (DWORD*)pnBufSize))
834 BOOL Config_SetTraceBufferSize (ULONG nBufSize, ULONG *pStatus)
836 Config_WriteNum (TEXT("TraceBufferSize"), nBufSize);
837 g.fNeedRestart = TRUE;
841 void Config_GetLoginRetryInterval (ULONG *pnInterval)
843 if (!Config_ReadNum (TEXT("LoginRetryInterval"), (DWORD*)pnInterval))
847 BOOL Config_SetLoginRetryInterval (ULONG nInterval, ULONG *pStatus)
849 Config_WriteNum (TEXT("LoginRetryInterval"), nInterval);
853 void Config_GetFailLoginsSilently (BOOL *pfFlag)
855 if (!Config_ReadNum (TEXT("FailLoginsSilently"), (DWORD*)pfFlag))
859 BOOL Config_SetFailLoginsSilently (BOOL fFlag, ULONG *pStatus)
861 Config_WriteNum (TEXT("FailLoginsSilently"), fFlag);
865 void Config_GetReportSessionStartups (BOOL *pfFlag)
867 if (!Config_ReadNum (TEXT("ReportSessionStartups"), (DWORD*)pfFlag))
871 BOOL Config_SetReportSessionStartups (BOOL fFlag, ULONG *pStatus)
873 Config_WriteNum (TEXT("ReportSessionStartups"), fFlag);
877 void Config_GetGlobalDriveList (DRIVEMAPLIST *pDriveList)
879 // Read the GlobalAutoMapper registry key
880 TCHAR szDriveToMapTo[5];
882 TCHAR szKeyName[256];
886 DWORD dwSubMountSize;
887 TCHAR szSubMount[256];
893 memset(pDriveList, 0, sizeof(DRIVEMAPLIST));
895 lstrcpy(szKeyName, AFSConfigKeyName);
896 lstrcat(szKeyName, TEXT("\\GlobalAutoMapper"));
898 dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_QUERY_VALUE, &hKey);
899 if (dwResult != ERROR_SUCCESS)
902 // Get the drive map list so we can lookup the paths that go with our submounts
903 DRIVEMAPLIST DriveMapList;
904 memset(&DriveMapList, 0, sizeof(DRIVEMAPLIST));
905 QueryDriveMapList (&DriveMapList);
908 dwDriveSize = sizeof(szDriveToMapTo);
909 dwSubMountSize = sizeof(szSubMount);
911 dwResult = RegEnumValue(hKey, dwIndex++, szDriveToMapTo, &dwDriveSize, 0, &dwType, (BYTE*)szSubMount, &dwSubMountSize);
912 if (dwResult != ERROR_SUCCESS)
915 szDriveToMapTo[0] = _totupper(szDriveToMapTo[0]);
917 int nCurDrive = szDriveToMapTo[0] - TEXT('A');
919 pDriveList->aDriveMap[nCurDrive].chDrive = szDriveToMapTo[0];
920 lstrcpy(pDriveList->aDriveMap[nCurDrive].szSubmount, szSubMount);
922 // Find the path that goes with this submount
923 SubmountToPath (&DriveMapList, pDriveList->aDriveMap[nCurDrive].szMapping, szSubMount, FALSE);
926 FreeDriveMapList(&DriveMapList);
933 * Configuration Read/Modify Functions ________________________________________
935 * Temporarily these just modify the local Registry.
936 * In the near future, they will modify the Registry on the
937 * gateway, if a gateway is being used.
941 BOOL Config_ReadNum (LPCTSTR pszLHS, DWORD *pdwRHS)
944 if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, AFSConfigKeyName, 0, KEY_QUERY_VALUE, &hk) != ERROR_SUCCESS)
947 DWORD dwSize = sizeof(*pdwRHS);
948 if (RegQueryValueEx (hk, pszLHS, NULL, NULL, (PBYTE)pdwRHS, &dwSize) != ERROR_SUCCESS)
959 BOOL Config_ReadString (LPCTSTR pszLHS, LPTSTR pszRHS, size_t cchMax)
962 if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, AFSConfigKeyName, 0, KEY_QUERY_VALUE, &hk) != ERROR_SUCCESS)
965 DWORD dwSize = sizeof(TCHAR) * cchMax;
966 if (RegQueryValueEx (hk, pszLHS, NULL, NULL, (PBYTE)pszRHS, &dwSize) != ERROR_SUCCESS)
977 void Config_WriteNum (LPCTSTR pszLHS, DWORD dwRHS)
981 if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, AFSConfigKeyName, 0, TEXT("container"), 0, KEY_SET_VALUE, NULL, &hk, &dwDisp) == ERROR_SUCCESS)
983 RegSetValueEx (hk, pszLHS, NULL, REG_DWORD, (PBYTE)&dwRHS, sizeof(dwRHS));
989 void Config_WriteString (LPCTSTR pszLHS, LPCTSTR pszRHS)
993 if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, AFSConfigKeyName, 0, TEXT("container"), 0, KEY_SET_VALUE, NULL, &hk, &dwDisp) == ERROR_SUCCESS)
995 RegSetValueEx (hk, pszLHS, NULL, REG_SZ, (PBYTE)pszRHS, sizeof(TCHAR) * (1+lstrlen(pszRHS)));