ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

registry.c
Go to the documentation of this file.
00001 #include "iphlpapi_private.h"
00002 
00003 int GetLongestChildKeyName( HANDLE RegHandle ) {
00004   LONG Status;
00005   DWORD MaxAdapterName;
00006 
00007   Status = RegQueryInfoKeyW(RegHandle,
00008                 NULL,
00009                 NULL,
00010                 NULL,
00011                 NULL,
00012                 &MaxAdapterName,
00013                 NULL,
00014                 NULL,
00015                 NULL,
00016                 NULL,
00017                 NULL,
00018                 NULL);
00019   if (Status == ERROR_SUCCESS)
00020     return MaxAdapterName + 1;
00021   else
00022     return -1;
00023 }
00024 
00025 LONG OpenChildKeyRead( HANDLE RegHandle,
00026                PWCHAR ChildKeyName,
00027                PHKEY ReturnHandle ) {
00028   return RegOpenKeyExW( RegHandle,
00029             ChildKeyName,
00030             0,
00031             KEY_READ,
00032             ReturnHandle );
00033 }
00034 
00035 /*
00036  * Yields a malloced value that must be freed.
00037  */
00038 
00039 PWCHAR GetNthChildKeyName( HANDLE RegHandle, DWORD n ) {
00040   LONG Status;
00041   int MaxAdapterName = GetLongestChildKeyName( RegHandle );
00042   PWCHAR Value;
00043   DWORD ValueLen;
00044 
00045   if (MaxAdapterName == -1)
00046     return 0;
00047 
00048   ValueLen = MaxAdapterName;
00049   Value = (PWCHAR)HeapAlloc( GetProcessHeap(), 0, MaxAdapterName * sizeof(WCHAR) );
00050   if (!Value) return 0;
00051 
00052   Status = RegEnumKeyExW( RegHandle, n, Value, &ValueLen,
00053               NULL, NULL, NULL, NULL );
00054   if (Status != ERROR_SUCCESS) {
00055     HeapFree(GetProcessHeap(), 0, Value);
00056     return 0;
00057   } else {
00058     Value[ValueLen] = 0;
00059     return Value;
00060   }
00061 }
00062 
00063 void ConsumeChildKeyName( PWCHAR Name ) {
00064   if (Name) HeapFree( GetProcessHeap(), 0, Name );
00065 }
00066 
00067 PVOID QueryRegistryValue(HANDLE RegHandle, PWCHAR ValueName, LPDWORD RegistryType, LPDWORD Length)
00068 {
00069     PVOID ReadValue = NULL;
00070     DWORD Error;
00071 
00072     *Length = 0;
00073     *RegistryType = REG_NONE;
00074 
00075     while (TRUE)
00076     {
00077         Error = RegQueryValueExW(RegHandle, ValueName, NULL, RegistryType, ReadValue, Length);
00078         if (Error == ERROR_SUCCESS)
00079         {
00080             if (ReadValue) break;
00081         }
00082         else if (Error == ERROR_MORE_DATA)
00083         {
00084             HeapFree(GetProcessHeap(), 0, ReadValue);
00085         }
00086         else break;
00087         
00088         ReadValue = HeapAlloc(GetProcessHeap(), 0, *Length);
00089         if (!ReadValue) return NULL;
00090     }
00091 
00092     if (Error != ERROR_SUCCESS)
00093     {
00094         if (ReadValue) HeapFree(GetProcessHeap(), 0, ReadValue);
00095 
00096         *Length = 0;
00097         *RegistryType = REG_NONE;
00098         ReadValue = NULL;
00099     }
00100 
00101     return ReadValue;
00102 }
00103 
00104 PWCHAR TerminateReadString(PWCHAR String, DWORD Length)
00105 {
00106     PWCHAR TerminatedString;
00107     
00108     TerminatedString = HeapAlloc(GetProcessHeap(), 0, Length + sizeof(WCHAR));
00109     if (TerminatedString == NULL)
00110         return NULL;
00111 
00112     memcpy(TerminatedString, String, Length);
00113 
00114     TerminatedString[Length / sizeof(WCHAR)] = UNICODE_NULL;
00115     
00116     return TerminatedString;
00117 }
00118 
00119 PWCHAR QueryRegistryValueString( HANDLE RegHandle, PWCHAR ValueName )
00120 {
00121     PWCHAR String, TerminatedString;
00122     DWORD Type, Length;
00123     
00124     String = QueryRegistryValue(RegHandle, ValueName, &Type, &Length);
00125     if (!String) return NULL;
00126     if (Type != REG_SZ)
00127     {
00128         DbgPrint("Type mismatch for %S (%d != %d)\n", ValueName, Type, REG_SZ);
00129         //HeapFree(GetProcessHeap(), 0, String);
00130         //return NULL;
00131     }
00132     
00133     TerminatedString = TerminateReadString(String, Length);
00134     HeapFree(GetProcessHeap(), 0, String);
00135     if (!TerminatedString) return NULL;
00136     
00137     return TerminatedString;
00138 }
00139 
00140 void ConsumeRegValueString( PWCHAR Value ) {
00141   if (Value) HeapFree(GetProcessHeap(), 0, Value);
00142 }
00143 
00144 PWCHAR *QueryRegistryValueStringMulti( HANDLE RegHandle, PWCHAR ValueName ) {
00145     PWCHAR String, TerminatedString, Tmp;
00146     PWCHAR *Table;
00147     DWORD Type, Length, i, j;
00148     
00149     String = QueryRegistryValue(RegHandle, ValueName, &Type, &Length);
00150     if (!String) return NULL;
00151     if (Type != REG_MULTI_SZ)
00152     {
00153         DbgPrint("Type mismatch for %S (%d != %d)\n", ValueName, Type, REG_MULTI_SZ);
00154         //HeapFree(GetProcessHeap(), 0, String);
00155         //return NULL;
00156     }
00157     
00158     TerminatedString = TerminateReadString(String, Length);
00159     HeapFree(GetProcessHeap(), 0, String);
00160     if (!TerminatedString) return NULL;
00161 
00162     for (Tmp = TerminatedString, i = 0; *Tmp; Tmp++, i++) while (*Tmp) Tmp++;
00163     
00164     Table = HeapAlloc(GetProcessHeap(), 0, (i + 1) * sizeof(PWCHAR));
00165     if (!Table)
00166     {
00167         HeapFree(GetProcessHeap(), 0, TerminatedString);
00168         return NULL;
00169     }
00170     
00171     for (Tmp = TerminatedString, j = 0; *Tmp; Tmp++, j++)
00172     {
00173         PWCHAR Orig = Tmp;
00174         
00175         for (i = 0; *Tmp; i++, Tmp++);
00176         
00177         Table[j] = HeapAlloc(GetProcessHeap(), 0, i * sizeof(WCHAR));
00178         memcpy(Table[j], Orig, i * sizeof(WCHAR));
00179     }
00180     
00181     Table[j] = NULL;
00182     
00183     HeapFree(GetProcessHeap(), 0, TerminatedString);
00184     
00185     return Table;
00186 }

Generated on Sun May 27 2012 04:17:06 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.