per-user-registry-20040320
[openafs.git] / src / WINNT / client_config / RegistrySupport.cpp
1 /*det
2  * Configuration Read/Modify Functions ________________________________________
3  *
4  * Temporarily these just modify the local Registry.
5  * In the near future, they will modify the Registry on the
6  * gateway, if a gateway is being used.
7  *
8  */
9
10 #include <windows.h>
11 #include <tchar.h>
12 //#include <ctype.h>
13 #include <stdlib.h>
14 #include <drivemap.h>
15
16 BOOL Config_ReadString (LPCTSTR pszLHS, LPTSTR pszRHS, size_t cchMax);
17
18 /*
19  * REGISTRY ___________________________________________________________________
20  *
21  */
22
23 extern const TCHAR AFSDConfigKeyName[] = TEXT("SYSTEM\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters");
24 extern const TCHAR AFSClientKeyName[] = TEXT("SOFTWARE\\OpenAFS\\Client");
25
26 void Config_GetGlobalDriveList (DRIVEMAPLIST *pDriveList)
27 {
28    // Read the GlobalAutoMapper registry key
29    TCHAR szDriveToMapTo[5];
30    DWORD dwResult;
31    TCHAR szKeyName[256];
32    HKEY hKey;
33    DWORD dwIndex = 0;
34    DWORD dwDriveSize;
35    DWORD dwSubMountSize;
36    TCHAR szSubMount[256];
37    DWORD dwType;
38
39    if (!pDriveList)
40       return;
41
42    memset(pDriveList, 0, sizeof(DRIVEMAPLIST));
43
44    lstrcpy(szKeyName, AFSDConfigKeyName);
45    lstrcat(szKeyName, TEXT("\\GlobalAutoMapper"));
46
47    dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_QUERY_VALUE, &hKey);
48    if (dwResult != ERROR_SUCCESS)
49       return;
50
51    // Get the drive map list so we can lookup the paths that go with our submounts
52         DRIVEMAPLIST DriveMapList;
53    memset(&DriveMapList, 0, sizeof(DRIVEMAPLIST));
54    QueryDriveMapList (&DriveMapList);
55
56    while (1) {
57       dwDriveSize = sizeof(szDriveToMapTo);
58       dwSubMountSize = sizeof(szSubMount);
59       
60       dwResult = RegEnumValue(hKey, dwIndex++, szDriveToMapTo, &dwDriveSize, 0, &dwType, (BYTE*)szSubMount, &dwSubMountSize);
61       if (dwResult != ERROR_SUCCESS)
62          break;
63       
64       szDriveToMapTo[0] = _totupper(szDriveToMapTo[0]);
65         
66       int nCurDrive = szDriveToMapTo[0] - TEXT('A');
67         
68       pDriveList->aDriveMap[nCurDrive].chDrive = szDriveToMapTo[0];
69       lstrcpy(pDriveList->aDriveMap[nCurDrive].szSubmount, szSubMount);
70
71       // Find the path that goes with this submount
72       SubmountToPath (&DriveMapList, pDriveList->aDriveMap[nCurDrive].szMapping, szSubMount, FALSE);
73    }        
74
75    FreeDriveMapList(&DriveMapList);
76
77    RegCloseKey(hKey);
78 }
79
80 BOOL Config_ReadGlobalNum (LPCTSTR pszLHS, DWORD *pdwRHS)
81 {
82    HKEY hk;
83    if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, AFSDConfigKeyName, 0, KEY_QUERY_VALUE, &hk) != ERROR_SUCCESS)
84       return FALSE;
85
86    DWORD dwSize = sizeof(*pdwRHS);
87    if (RegQueryValueEx (hk, pszLHS, NULL, NULL, (PBYTE)pdwRHS, &dwSize) != ERROR_SUCCESS)
88       {
89       RegCloseKey (hk);
90       return FALSE;
91       }
92
93    RegCloseKey (hk);
94    return TRUE;
95 }
96
97
98 BOOL Config_ReadGlobalString (LPCTSTR pszLHS, LPTSTR pszRHS, size_t cchMax)
99 {
100    HKEY hk;
101    if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, AFSDConfigKeyName, 0, KEY_QUERY_VALUE, &hk) != ERROR_SUCCESS)
102       return FALSE;
103
104    DWORD dwSize = sizeof(TCHAR) * cchMax;
105    if (RegQueryValueEx (hk, pszLHS, NULL, NULL, (PBYTE)pszRHS, &dwSize) != ERROR_SUCCESS)
106       {
107       RegCloseKey (hk);
108       return FALSE;
109       }
110
111    RegCloseKey (hk);
112    return TRUE;
113 }
114
115
116 void Config_WriteGlobalNum (LPCTSTR pszLHS, DWORD dwRHS)
117 {
118    HKEY hk;
119    DWORD dwDisp;
120    if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, AFSDConfigKeyName, 0, TEXT("container"), 0, KEY_SET_VALUE, NULL, &hk, &dwDisp) == ERROR_SUCCESS)
121       {
122       RegSetValueEx (hk, pszLHS, NULL, REG_DWORD, (PBYTE)&dwRHS, sizeof(dwRHS));
123       RegCloseKey (hk);
124       }
125 }
126
127
128 void Config_WriteGlobalString (LPCTSTR pszLHS, LPCTSTR pszRHS)
129 {
130    HKEY hk;
131    DWORD dwDisp;
132    if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, AFSDConfigKeyName, 0, TEXT("container"), 0, KEY_SET_VALUE, NULL, &hk, &dwDisp) == ERROR_SUCCESS)
133       {
134       RegSetValueEx (hk, pszLHS, NULL, REG_SZ, (PBYTE)pszRHS, sizeof(TCHAR) * (1+lstrlen(pszRHS)));
135       RegCloseKey (hk);
136       }
137 }
138
139
140 BOOL Config_ReadUserNum (LPCTSTR pszLHS, DWORD *pdwRHS)
141 {
142    HKEY hk;
143     if (RegOpenKeyEx (HKEY_CURRENT_USER, AFSClientKeyName, 0, KEY_QUERY_VALUE, &hk) != ERROR_SUCCESS)
144         if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, AFSClientKeyName, 0, KEY_QUERY_VALUE, &hk) != ERROR_SUCCESS)
145             return FALSE;
146
147    DWORD dwSize = sizeof(*pdwRHS);
148    if (RegQueryValueEx (hk, pszLHS, NULL, NULL, (PBYTE)pdwRHS, &dwSize) != ERROR_SUCCESS)
149       {
150       RegCloseKey (hk);
151       return FALSE;
152       }
153
154    RegCloseKey (hk);
155    return TRUE;
156 }
157
158
159 BOOL Config_ReadUserString (LPCTSTR pszLHS, LPTSTR pszRHS, size_t cchMax)
160 {
161    HKEY hk;
162     if (RegOpenKeyEx (HKEY_CURRENT_USER, AFSClientKeyName, 0, KEY_QUERY_VALUE, &hk) != ERROR_SUCCESS)
163         if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, AFSClientKeyName, 0, KEY_QUERY_VALUE, &hk) != ERROR_SUCCESS)
164             return FALSE;
165
166    DWORD dwSize = sizeof(TCHAR) * cchMax;
167    if (RegQueryValueEx (hk, pszLHS, NULL, NULL, (PBYTE)pszRHS, &dwSize) != ERROR_SUCCESS)
168       {
169       RegCloseKey (hk);
170       return FALSE;
171       }
172
173    RegCloseKey (hk);
174    return TRUE;
175 }
176
177
178 void Config_WriteUserNum (LPCTSTR pszLHS, DWORD dwRHS)
179 {
180    HKEY hk;
181    DWORD dwDisp;
182    if (RegCreateKeyEx (HKEY_CURRENT_USER, AFSClientKeyName, 0, TEXT("container"), 0, KEY_SET_VALUE, NULL, &hk, &dwDisp) == ERROR_SUCCESS)
183       {
184       RegSetValueEx (hk, pszLHS, NULL, REG_DWORD, (PBYTE)&dwRHS, sizeof(dwRHS));
185       RegCloseKey (hk);
186       }
187 }
188
189
190 void Config_WriteUserString (LPCTSTR pszLHS, LPCTSTR pszRHS)
191 {
192    HKEY hk;
193    DWORD dwDisp;
194    if (RegCreateKeyEx (HKEY_CURRENT_USER, AFSClientKeyName, 0, TEXT("container"), 0, KEY_SET_VALUE, NULL, &hk, &dwDisp) == ERROR_SUCCESS)
195       {
196       RegSetValueEx (hk, pszLHS, NULL, REG_SZ, (PBYTE)pszRHS, sizeof(TCHAR) * (1+lstrlen(pszRHS)));
197       RegCloseKey (hk);
198       }
199 }
200
201