Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenregistry.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
1.7.6.1
|