[ros-diffs] [ekohl] 30086: Implement removal of environment variables by removing all environment variables from the registry and re-adding the stored ones.

ekohl at svn.reactos.org ekohl at svn.reactos.org
Sat Nov 3 12:02:32 CET 2007


Author: ekohl
Date: Sat Nov  3 14:02:31 2007
New Revision: 30086

URL: http://svn.reactos.org/svn/reactos?rev=30086&view=rev
Log:
Implement removal of environment variables by removing all environment variables from the registry and re-adding the stored ones.

Modified:
    trunk/reactos/dll/cpl/sysdm/environment.c

Modified: trunk/reactos/dll/cpl/sysdm/environment.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/sysdm/environment.c?rev=30086&r1=30085&r2=30086&view=diff
==============================================================================
--- trunk/reactos/dll/cpl/sysdm/environment.c (original)
+++ trunk/reactos/dll/cpl/sysdm/environment.c Sat Nov  3 14:02:31 2007
@@ -484,7 +484,14 @@
     PVARIABLE_DATA VarData;
     LV_ITEM lvi;
     INT iItem;
-    HKEY hk;
+    HKEY hKey;
+    DWORD dwValueCount;
+    DWORD dwMaxValueNameLength;
+    LPTSTR *aValueArray;
+    DWORD dwNameLength;
+    DWORD i;
+    TCHAR szBuffer[256];
+    LPTSTR lpBuffer;
 
     memset(&lvi, 0x00, sizeof(lvi));
 
@@ -504,10 +511,76 @@
                        REG_OPTION_NON_VOLATILE,
                        KEY_WRITE | KEY_READ,
                        NULL,
-                       &hk,
+                       &hKey,
                        NULL))
     {
         return;
+    }
+
+    /* Get the number of values and the maximum value name length */
+    if (RegQueryInfoKey(hKey,
+                        NULL,
+                        NULL,
+                        NULL,
+                        NULL,
+                        NULL,
+                        NULL,
+                        &dwValueCount,
+                        &dwMaxValueNameLength,
+                        NULL,
+                        NULL,
+                        NULL))
+    {
+        RegCloseKey(hKey);
+        return;
+    }
+
+    if (dwValueCount > 0)
+    {
+        /* Allocate the value array */
+        aValueArray = GlobalAlloc(GPTR, dwValueCount * sizeof(LPTSTR));
+        if (aValueArray != NULL)
+        {
+            /* Get all value names */
+            for (i = 0; i < dwValueCount; i++)
+            {
+                dwNameLength = 256;
+                if (!RegEnumValue(hKey,
+                                  i,
+                                  szBuffer,
+                                  &dwNameLength,
+                                  NULL,
+                                  NULL,
+                                  NULL,
+                                  NULL))
+                {
+                    /* Allocate a value name buffer, fill it and attach it to the array */
+                    lpBuffer = (LPTSTR)GlobalAlloc(GPTR, (dwNameLength + 1) * sizeof(TCHAR));
+                    if (lpBuffer != NULL)
+                    {
+                        _tcscpy(lpBuffer, szBuffer);
+                        aValueArray[i] = lpBuffer;
+                    }
+                }
+            }
+
+            /* Delete all values */
+            for (i = 0; i < dwValueCount; i++)
+            {
+                if (aValueArray[i] != NULL)
+                {
+                    /* Delete the value*/
+                    RegDeleteValue(hKey,
+                                   aValueArray[i]);
+
+                    /* Free the value name */
+                    GlobalFree(aValueArray[i]);
+                }
+            }
+
+            /* Free the value array */
+            GlobalFree(aValueArray);
+        }
     }
 
     /* Loop through all variables */
@@ -518,14 +591,14 @@
         if (VarData != NULL)
         {
             /* Set the new value */
-            if (RegSetValueEx(hk,
+            if (RegSetValueEx(hKey,
                               VarData->lpName,
                               0,
                               VarData->dwType,
                               (LPBYTE)VarData->lpRawValue,
                               (DWORD)(_tcslen(VarData->lpRawValue) + 1) * sizeof(TCHAR)))
             {
-                RegCloseKey(hk);
+                RegCloseKey(hKey);
                 return;
             }
         }
@@ -535,7 +608,7 @@
         lvi.iItem = ++iItem;
     }
 
-    RegCloseKey(hk);
+    RegCloseKey(hKey);
 }
 
 




More information about the Ros-diffs mailing list