2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) INRIA - Allan CORNET
4 * Copyright (C) DIGITEO - 2011 - Allan CORNET
6 * This file must be used under the terms of the CeCILL.
7 * This source file is licensed as described in the file COPYING, which
8 * you should have received as part of this distribution. The terms
9 * are also available at
10 * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
14 /*--------------------------------------------------------------------------*/
18 #include "GetWindowsVersion.h"
19 #include "strdup_windows.h"
20 /*--------------------------------------------------------------------------*/
21 #define MAX_KEY_LENGTH 255
22 #define MAX_VALUE_NAME 16383
23 /*--------------------------------------------------------------------------*/
25 static BOOL WindowsOpenRegistry(char* _pstRoot, char* _pstKey, HKEY* _pKeyOut)
27 DWORD OpensKeyOptions = 0;
28 HKEY hKeyToOpen = NULL;
30 hKeyToOpen = GetHkeyrootFromString(_pstRoot);
31 if (hKeyToOpen == NULL)
36 #ifdef _WIN64 /* Scilab x64 on x64 windows */
37 OpensKeyOptions = KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE | KEY_WOW64_64KEY;
38 if ( RegOpenKeyEx(hKeyToOpen, _pstKey, 0, OpensKeyOptions, _pKeyOut) != ERROR_SUCCESS)
40 OpensKeyOptions = KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE | KEY_WOW64_32KEY;
41 if ( RegOpenKeyEx(hKeyToOpen, _pstKey, 0, OpensKeyOptions, _pKeyOut) != ERROR_SUCCESS)
47 if (IsWow64()) /* Scilab 32 bits on x64 windows */
49 OpensKeyOptions = KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE | KEY_WOW64_64KEY;
50 if ( RegOpenKeyEx(hKeyToOpen, _pstKey, 0, OpensKeyOptions, _pKeyOut) != ERROR_SUCCESS)
52 OpensKeyOptions = KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE | KEY_WOW64_32KEY;
53 if ( RegOpenKeyEx(hKeyToOpen, _pstKey, 0, OpensKeyOptions, _pKeyOut) != ERROR_SUCCESS)
59 else /* Scilab 32 bits on windows 32 bits */
61 OpensKeyOptions = KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE;
62 if ( RegOpenKeyEx(hKeyToOpen, _pstKey, 0, OpensKeyOptions, _pKeyOut) != ERROR_SUCCESS)
71 BOOL WindowsQueryRegistry(char *ParamIn1, char *ParamIn2, char *ParamIn3, char *ParamOut1, int *ParamOut2, BOOL *OuputIsREG_SZ)
77 if (WindowsOpenRegistry(ParamIn1, ParamIn2, &key) == FALSE)
82 if ( RegQueryValueEx(key, ParamIn3, NULL, &type, NULL, NULL) == ERROR_SUCCESS )
84 if ( (type == REG_EXPAND_SZ) || (type == REG_SZ) )
86 DWORD Length = PATH_MAX;
88 if (RegQueryValueEx(key, ParamIn3, NULL, &type, (LPBYTE)&Line, &Length) == ERROR_SUCCESS )
90 wsprintf(ParamOut1, "%s", Line);
91 *OuputIsREG_SZ = TRUE;
98 if (RegQueryValueEx(key, ParamIn3, NULL, &type, (LPBYTE)&Num, &size) == ERROR_SUCCESS )
101 *OuputIsREG_SZ = FALSE;
114 /*--------------------------------------------------------------------------*/
115 BOOL WindowsQueryRegistryValuesList(char *ParamIn1, char *ParamIn2, int dimMax, char **ListKeys)
120 if (WindowsOpenRegistry(ParamIn1, ParamIn2, &key) == FALSE)
125 for (i = 0; i < dimMax; i++)
127 TCHAR achKey[MAX_KEY_LENGTH];
128 DWORD cbName = MAX_KEY_LENGTH;
132 retCode = RegEnumValue(key, i,
140 if (retCode != ERROR_SUCCESS)
147 ListKeys[i] = strdup(achKey);
156 BOOL WindowsQueryRegistryKeysList(char *ParamIn1, char *ParamIn2, int dimMax, char **ListKeys)
161 if (WindowsOpenRegistry(ParamIn1, ParamIn2, &key) == FALSE)
166 for (i = 0; i < dimMax; i++)
168 TCHAR achKey[MAX_KEY_LENGTH];
169 DWORD cbName = MAX_KEY_LENGTH;
171 LONG Err = RegEnumKey(key, i, achKey, cbName);
172 if (Err != ERROR_SUCCESS)
179 ListKeys[i] = strdup(achKey);
187 /*--------------------------------------------------------------------------*/
188 HKEY GetHkeyrootFromString(char *string)
190 if ( strcmp(string, "HKEY_CLASSES_ROOT") == 0 || strcmp(string, "HKCR") == 0)
192 return HKEY_CLASSES_ROOT;
195 if ( strcmp(string, "HKEY_CURRENT_USER") == 0 || strcmp(string, "HKCU") == 0 )
197 return HKEY_CURRENT_USER;
200 if ( strcmp(string, "HKEY_LOCAL_MACHINE") == 0 || strcmp(string, "HKLM") == 0 )
202 return HKEY_LOCAL_MACHINE;
205 if ( strcmp(string, "HKEY_USERS") == 0 || strcmp(string, "HKU") == 0 )
210 if ( strcmp(string, "HKEY_DYN_DATA") == 0 || strcmp(string, "HKDD") == 0 )
212 return HKEY_DYN_DATA;
215 if ( strcmp(string, "HKEY_CURRENT_CONFIG") == 0 || strcmp(string, "HKCC") == 0 )
217 return HKEY_CURRENT_CONFIG;
222 /*--------------------------------------------------------------------------*/
223 static BOOL WindowsQueryRegistryNumberOfItemsInList(char *ParamIn1, char *ParamIn2, int* _piKeyNumber, int* _piValueNumber)
230 TCHAR achClass[PATH_MAX] = TEXT(""); // buffer for class name
231 DWORD cchClassName = PATH_MAX; // size of class string
232 DWORD cSubKeys = 0; // number of subkeys
233 DWORD cbMaxSubKey = 0; // longest subkey size
234 DWORD cchMaxClass = 0; // longest class string
235 DWORD cValues = 0; // number of values for key
236 DWORD cchMaxValue = 0; // longest value name
237 DWORD cbMaxValueData = 0; // longest value data
238 DWORD cbSecurityDescriptor = 0; // size of security descriptor
239 FILETIME ftLastWriteTime; // last write time
241 if (WindowsOpenRegistry(ParamIn1, ParamIn2, &key) == FALSE)
246 retCode = RegQueryInfoKey(
248 achClass, // buffer for class name
249 &cchClassName, // size of class string
251 &cSubKeys, // number of subkeys
252 &cbMaxSubKey, // longest subkey size
253 &cchMaxClass, // longest class string
254 &cValues, // number of values for this key
255 &cchMaxValue, // longest value name
256 &cbMaxValueData, // longest value data
257 &cbSecurityDescriptor, // security descriptor
258 &ftLastWriteTime); // last write time
260 if (retCode != ERROR_SUCCESS)
266 *_piValueNumber = cValues;
267 *_piKeyNumber = cSubKeys;
274 /*--------------------------------------------------------------------------*/
275 BOOL WindowsQueryRegistryNumberOfValuesInList(char *ParamIn1, char *ParamIn2, int *Number)
278 return WindowsQueryRegistryNumberOfItemsInList(ParamIn1, ParamIn2, &iKey, Number);
280 /*--------------------------------------------------------------------------*/
281 BOOL WindowsQueryRegistryNumberOfKeysInList(char *ParamIn1, char *ParamIn2, int *Number)
284 return WindowsQueryRegistryNumberOfItemsInList(ParamIn1, ParamIn2, Number, &iValue);
286 /*--------------------------------------------------------------------------*/