winqueryreg can list subkey with argument "key"
[scilab.git] / scilab / modules / windows_tools / src / c / registry.c
index 05bc922..bb8a92e 100644 (file)
 #define MAX_KEY_LENGTH 255
 #define MAX_VALUE_NAME 16383
 /*--------------------------------------------------------------------------*/
-BOOL WindowsQueryRegistry(char *ParamIn1, char *ParamIn2, char *ParamIn3, char *ParamOut1, int *ParamOut2, BOOL *OuputIsREG_SZ)
+
+static BOOL WindowsOpenRegistry(char* _pstRoot, char* _pstKey, HKEY* _pKeyOut)
 {
-    BOOL bOK = TRUE;
-    HKEY key;
-    HKEY hKeyToOpen = NULL;
     DWORD OpensKeyOptions = 0;
-    DWORD type = 0;
+    HKEY hKeyToOpen = NULL;
 
-    hKeyToOpen = GetHkeyrootFromString(ParamIn1);
+    hKeyToOpen = GetHkeyrootFromString(_pstRoot);
+    if (hKeyToOpen == NULL)
+    {
+        return FALSE;
+    }
 
 #ifdef _WIN64 /* Scilab x64 on x64 windows */
-    OpensKeyOptions = KEY_QUERY_VALUE | KEY_WOW64_64KEY;
-    if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &key) != ERROR_SUCCESS)
+    OpensKeyOptions = KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE | KEY_WOW64_64KEY;
+    if ( RegOpenKeyEx(hKeyToOpen, _pstKey, 0, OpensKeyOptions, _pKeyOut) != ERROR_SUCCESS)
     {
-        OpensKeyOptions = KEY_QUERY_VALUE | KEY_WOW64_32KEY;
-        if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &key) != ERROR_SUCCESS)
+        OpensKeyOptions = KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE | KEY_WOW64_32KEY;
+        if ( RegOpenKeyEx(hKeyToOpen, _pstKey, 0, OpensKeyOptions, _pKeyOut) != ERROR_SUCCESS)
         {
             return FALSE;
         }
@@ -44,11 +46,11 @@ BOOL WindowsQueryRegistry(char *ParamIn1, char *ParamIn2, char *ParamIn3, char *
 #else
     if (IsWow64()) /* Scilab 32 bits on x64 windows */
     {
-        OpensKeyOptions = KEY_QUERY_VALUE | KEY_WOW64_64KEY;
-        if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &key) != ERROR_SUCCESS)
+        OpensKeyOptions = KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE | KEY_WOW64_64KEY;
+        if ( RegOpenKeyEx(hKeyToOpen, _pstKey, 0, OpensKeyOptions, _pKeyOut) != ERROR_SUCCESS)
         {
-            OpensKeyOptions = KEY_QUERY_VALUE | KEY_WOW64_32KEY;
-            if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &key) != ERROR_SUCCESS)
+            OpensKeyOptions = KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE | KEY_WOW64_32KEY;
+            if ( RegOpenKeyEx(hKeyToOpen, _pstKey, 0, OpensKeyOptions, _pKeyOut) != ERROR_SUCCESS)
             {
                 return FALSE;
             }
@@ -56,13 +58,26 @@ BOOL WindowsQueryRegistry(char *ParamIn1, char *ParamIn2, char *ParamIn3, char *
     }
     else /* Scilab 32 bits on windows 32 bits */
     {
-        OpensKeyOptions = KEY_QUERY_VALUE;
-        if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &key) != ERROR_SUCCESS)
+        OpensKeyOptions = KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE;
+        if ( RegOpenKeyEx(hKeyToOpen, _pstKey, 0, OpensKeyOptions, _pKeyOut) != ERROR_SUCCESS)
         {
             return FALSE;
         }
     }
 #endif
+    return TRUE;
+}
+
+BOOL WindowsQueryRegistry(char *ParamIn1, char *ParamIn2, char *ParamIn3, char *ParamOut1, int *ParamOut2, BOOL *OuputIsREG_SZ)
+{
+    BOOL bOK = TRUE;
+    HKEY key;
+    DWORD type = 0;
+
+    if (WindowsOpenRegistry(ParamIn1, ParamIn2, &key) == FALSE)
+    {
+        return FALSE;
+    }
 
     if ( RegQueryValueEx(key, ParamIn3, NULL, &type, NULL, NULL) == ERROR_SUCCESS )
     {
@@ -97,50 +112,16 @@ BOOL WindowsQueryRegistry(char *ParamIn1, char *ParamIn2, char *ParamIn3, char *
     return bOK;
 }
 /*--------------------------------------------------------------------------*/
-BOOL WindowsQueryRegistryList(char *ParamIn1, char *ParamIn2, int dimMax, char **ListKeys)
+BOOL WindowsQueryRegistryValuesList(char *ParamIn1, char *ParamIn2, int dimMax, char **ListKeys)
 {
-    BOOL bOK = TRUE;
     HKEY key;
-    HKEY hKeyToOpen = NULL;
-    DWORD OpensKeyOptions = 0;
     int i = 0;
 
-    hKeyToOpen = GetHkeyrootFromString(ParamIn1);
-
-#ifdef _WIN64 /* Scilab x64 on x64 windows */
-    OpensKeyOptions = KEY_READ  | KEY_WOW64_64KEY;
-    if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &key) != ERROR_SUCCESS )
-    {
-        OpensKeyOptions = KEY_READ  | KEY_WOW64_32KEY;
-        if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &key) != ERROR_SUCCESS )
-        {
-            return FALSE;
-        }
-    }
-#else
-    if (IsWow64())  /* Scilab 32 bits on x64 windows */
+    if (WindowsOpenRegistry(ParamIn1, ParamIn2, &key) == FALSE)
     {
-        OpensKeyOptions = KEY_READ  | KEY_WOW64_64KEY;
-        if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &key) != ERROR_SUCCESS )
-        {
-            OpensKeyOptions = KEY_READ  | KEY_WOW64_32KEY;
-            if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &key) != ERROR_SUCCESS )
-            {
-                return FALSE;
-            }
-        }
-    }
-    else /* Scilab 32 bits on windows 32 bits */
-    {
-        OpensKeyOptions = KEY_READ ;
-        if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &key) != ERROR_SUCCESS )
-        {
-            return FALSE;
-        }
+        return FALSE;
     }
 
-#endif
-
     for (i = 0; i < dimMax; i++)
     {
         TCHAR achKey[MAX_KEY_LENGTH];
@@ -158,9 +139,8 @@ BOOL WindowsQueryRegistryList(char *ParamIn1, char *ParamIn2, int dimMax, char *
 
         if (retCode != ERROR_SUCCESS)
         {
-            bOK = FALSE;
             RegCloseKey(key);
-            return bOK;
+            return FALSE;
         }
         else
         {
@@ -170,7 +150,39 @@ BOOL WindowsQueryRegistryList(char *ParamIn1, char *ParamIn2, int dimMax, char *
 
     RegCloseKey(key);
 
-    return bOK;
+    return TRUE;
+}
+
+BOOL WindowsQueryRegistryKeysList(char *ParamIn1, char *ParamIn2, int dimMax, char **ListKeys)
+{
+    HKEY key;
+    int i = 0;
+
+    if (WindowsOpenRegistry(ParamIn1, ParamIn2, &key) == FALSE)
+    {
+        return FALSE;
+    }
+
+    for (i = 0; i < dimMax; i++)
+    {
+        TCHAR achKey[MAX_KEY_LENGTH];
+        DWORD cbName = MAX_KEY_LENGTH;
+
+        LONG Err = RegEnumKey(key, i, achKey, cbName);
+        if (Err != ERROR_SUCCESS)
+        {
+            RegCloseKey(key);
+            return FALSE;
+        }
+        else
+        {
+            ListKeys[i] = strdup(achKey);
+        }
+    }
+
+    RegCloseKey(key);
+
+    return TRUE;
 }
 /*--------------------------------------------------------------------------*/
 HKEY GetHkeyrootFromString(char *string)
@@ -208,74 +220,42 @@ HKEY GetHkeyrootFromString(char *string)
     return NULL;
 }
 /*--------------------------------------------------------------------------*/
-BOOL WindowsQueryRegistryNumberOfElementsInList(char *ParamIn1, char *ParamIn2, int *Number)
+static BOOL WindowsQueryRegistryNumberOfItemsInList(char *ParamIn1, char *ParamIn2, int* _piKeyNumber, int* _piValueNumber)
 {
     BOOL bOK = TRUE;
 
-    HKEY hKeyToOpen;
-    HKEY hTestKey;
-    DWORD OpensKeyOptions = 0;
-
+    HKEY key;
     DWORD retCode = 0;
 
-    TCHAR    achClass[PATH_MAX] = TEXT("");  // buffer for class name
-    DWORD    cchClassName = PATH_MAX;    // size of class string
-    DWORD    cSubKeys = 0;               // number of subkeys
-    DWORD    cbMaxSubKey = 0;            // longest subkey size
-    DWORD    cchMaxClass = 0;            // longest class string
-    DWORD    cValues = 0;                // number of values for key
-    DWORD    cchMaxValue = 0;            // longest value name
-    DWORD    cbMaxValueData = 0;         // longest value data
-    DWORD    cbSecurityDescriptor = 0;  // size of security descriptor
-    FILETIME ftLastWriteTime;      // last write time
-
-    hKeyToOpen = GetHkeyrootFromString(ParamIn1);
+    TCHAR    achClass[PATH_MAX] = TEXT(""); // buffer for class name
+    DWORD    cchClassName = PATH_MAX;       // size of class string
+    DWORD    cSubKeys = 0;                  // number of subkeys
+    DWORD    cbMaxSubKey = 0;               // longest subkey size
+    DWORD    cchMaxClass = 0;               // longest class string
+    DWORD    cValues = 0;                   // number of values for key
+    DWORD    cchMaxValue = 0;               // longest value name
+    DWORD    cbMaxValueData = 0;            // longest value data
+    DWORD    cbSecurityDescriptor = 0;      // size of security descriptor
+    FILETIME ftLastWriteTime;               // last write time
 
-#ifdef _WIN64 /* Scilab x64 on x64 windows */
-    OpensKeyOptions = KEY_READ  | KEY_WOW64_64KEY;
-    if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &hTestKey) != ERROR_SUCCESS )
+    if (WindowsOpenRegistry(ParamIn1, ParamIn2, &key) == FALSE)
     {
-        OpensKeyOptions = KEY_READ  | KEY_WOW64_32KEY;
-        if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &hTestKey) != ERROR_SUCCESS )
-        {
-            return FALSE;
-        }
+        return FALSE;
     }
-#else
-    if (IsWow64()) /* Scilab 32 bits on x64 windows */
-    {
-        OpensKeyOptions = KEY_READ  | KEY_WOW64_64KEY;
-        if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &hTestKey) != ERROR_SUCCESS )
-        {
-            OpensKeyOptions = KEY_READ  | KEY_WOW64_32KEY;
-            if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &hTestKey) != ERROR_SUCCESS )
-            {
-                return FALSE;
-            }
-        }
-    }
-    else /* Scilab 32 bits on windows 32 bits */
-    {
-        OpensKeyOptions = KEY_READ ;
-        if ( RegOpenKeyEx(hKeyToOpen, ParamIn2, 0, OpensKeyOptions, &hTestKey) != ERROR_SUCCESS )
-        {
-            return FALSE;
-        }
-    }
-#endif
+
     retCode = RegQueryInfoKey(
-                  hTestKey,                // key handle
-                  achClass,                // buffer for class name
-                  &cchClassName,           // size of class string
-                  NULL,                    // reserved
-                  &cSubKeys,               // number of subkeys
-                  &cbMaxSubKey,            // longest subkey size
-                  &cchMaxClass,            // longest class string
-                  &cValues,                // number of values for this key
-                  &cchMaxValue,            // longest value name
-                  &cbMaxValueData,         // longest value data
-                  &cbSecurityDescriptor,   // security descriptor
-                  &ftLastWriteTime);       // last write time
+                  key,                      // key handle
+                  achClass,                 // buffer for class name
+                  &cchClassName,            // size of class string
+                  NULL,                     // reserved
+                  &cSubKeys,                // number of subkeys
+                  &cbMaxSubKey,             // longest subkey size
+                  &cchMaxClass,             // longest class string
+                  &cValues,                 // number of values for this key
+                  &cchMaxValue,             // longest value name
+                  &cbMaxValueData,          // longest value data
+                  &cbSecurityDescriptor,    // security descriptor
+                  &ftLastWriteTime);        // last write time
 
     if (retCode != ERROR_SUCCESS)
     {
@@ -283,11 +263,24 @@ BOOL WindowsQueryRegistryNumberOfElementsInList(char *ParamIn1, char *ParamIn2,
     }
     else
     {
-        *Number = cValues;
+        *_piValueNumber = cValues;
+        *_piKeyNumber   = cSubKeys;
     }
 
-    RegCloseKey(hKeyToOpen);
+    RegCloseKey(key);
 
     return bOK;
 }
 /*--------------------------------------------------------------------------*/
+BOOL WindowsQueryRegistryNumberOfValuesInList(char *ParamIn1, char *ParamIn2, int *Number)
+{
+    int iKey = 0;
+    return WindowsQueryRegistryNumberOfItemsInList(ParamIn1, ParamIn2, &iKey, Number);
+}
+/*--------------------------------------------------------------------------*/
+BOOL WindowsQueryRegistryNumberOfKeysInList(char *ParamIn1, char *ParamIn2, int *Number)
+{
+    int iValue = 0;
+    return WindowsQueryRegistryNumberOfItemsInList(ParamIn1, ParamIn2, Number, &iValue);
+}
+/*--------------------------------------------------------------------------*/