1 #include "iphlpapi_private.h"
3 int GetLongestChildKeyName( HANDLE RegHandle
) {
7 Status
= RegQueryInfoKeyW(RegHandle
,
19 if (Status
== ERROR_SUCCESS
)
20 return MaxAdapterName
+ 1;
25 LONG
OpenChildKeyRead( HANDLE RegHandle
,
27 PHKEY ReturnHandle
) {
28 return RegOpenKeyExW( RegHandle
,
36 * Yields a malloced value that must be freed.
39 PWCHAR
GetNthChildKeyName( HANDLE RegHandle
, DWORD n
) {
41 int MaxAdapterName
= GetLongestChildKeyName( RegHandle
);
45 if (MaxAdapterName
== -1)
48 ValueLen
= MaxAdapterName
;
49 Value
= (PWCHAR
)HeapAlloc( GetProcessHeap(), 0, MaxAdapterName
* sizeof(WCHAR
) );
52 Status
= RegEnumKeyExW( RegHandle
, n
, Value
, &ValueLen
,
53 NULL
, NULL
, NULL
, NULL
);
54 if (Status
!= ERROR_SUCCESS
) {
55 HeapFree(GetProcessHeap(), 0, Value
);
63 void ConsumeChildKeyName( PWCHAR Name
) {
64 if (Name
) HeapFree( GetProcessHeap(), 0, Name
);
67 PVOID
QueryRegistryValue(HANDLE RegHandle
, PWCHAR ValueName
, LPDWORD RegistryType
, LPDWORD Length
)
69 PVOID ReadValue
= NULL
;
73 *RegistryType
= REG_NONE
;
77 Error
= RegQueryValueExW(RegHandle
, ValueName
, NULL
, RegistryType
, ReadValue
, Length
);
78 if (Error
== ERROR_SUCCESS
)
82 else if (Error
== ERROR_MORE_DATA
)
84 HeapFree(GetProcessHeap(), 0, ReadValue
);
88 ReadValue
= HeapAlloc(GetProcessHeap(), 0, *Length
);
89 if (!ReadValue
) return NULL
;
92 if (Error
!= ERROR_SUCCESS
)
94 if (ReadValue
) HeapFree(GetProcessHeap(), 0, ReadValue
);
97 *RegistryType
= REG_NONE
;
104 PWCHAR
TerminateReadString(PWCHAR String
, DWORD Length
)
106 PWCHAR TerminatedString
;
108 TerminatedString
= HeapAlloc(GetProcessHeap(), 0, Length
+ sizeof(WCHAR
));
109 if (TerminatedString
== NULL
)
112 memcpy(TerminatedString
, String
, Length
);
114 TerminatedString
[Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
116 return TerminatedString
;
119 PWCHAR
QueryRegistryValueString( HANDLE RegHandle
, PWCHAR ValueName
)
121 PWCHAR String
, TerminatedString
;
124 String
= QueryRegistryValue(RegHandle
, ValueName
, &Type
, &Length
);
125 if (!String
) return NULL
;
128 DbgPrint("Type mismatch for %S (%d != %d)\n", ValueName
, Type
, REG_SZ
);
129 //HeapFree(GetProcessHeap(), 0, String);
133 TerminatedString
= TerminateReadString(String
, Length
);
134 HeapFree(GetProcessHeap(), 0, String
);
135 if (!TerminatedString
) return NULL
;
137 return TerminatedString
;
140 void ConsumeRegValueString( PWCHAR Value
) {
141 if (Value
) HeapFree(GetProcessHeap(), 0, Value
);
144 PWCHAR
*QueryRegistryValueStringMulti( HANDLE RegHandle
, PWCHAR ValueName
) {
145 PWCHAR String
, TerminatedString
, Tmp
;
147 DWORD Type
, Length
, i
, j
;
149 String
= QueryRegistryValue(RegHandle
, ValueName
, &Type
, &Length
);
150 if (!String
) return NULL
;
151 if (Type
!= REG_MULTI_SZ
)
153 DbgPrint("Type mismatch for %S (%d != %d)\n", ValueName
, Type
, REG_MULTI_SZ
);
154 //HeapFree(GetProcessHeap(), 0, String);
158 TerminatedString
= TerminateReadString(String
, Length
);
159 HeapFree(GetProcessHeap(), 0, String
);
160 if (!TerminatedString
) return NULL
;
162 for (Tmp
= TerminatedString
, i
= 0; *Tmp
; Tmp
++, i
++) while (*Tmp
) Tmp
++;
164 Table
= HeapAlloc(GetProcessHeap(), 0, (i
+ 1) * sizeof(PWCHAR
));
167 HeapFree(GetProcessHeap(), 0, TerminatedString
);
171 for (Tmp
= TerminatedString
, j
= 0; *Tmp
; Tmp
++, j
++)
175 for (i
= 0; *Tmp
; i
++, Tmp
++);
177 Table
[j
] = HeapAlloc(GetProcessHeap(), 0, i
* sizeof(WCHAR
));
178 memcpy(Table
[j
], Orig
, i
* sizeof(WCHAR
));
183 HeapFree(GetProcessHeap(), 0, TerminatedString
);