@@ -231,6 +231,8 @@ ScmReadString(HKEY hServiceKey,
231
231
DWORD dwError ;
232
232
DWORD dwSize ;
233
233
DWORD dwType ;
234
+ DWORD dwSizeNeeded ;
235
+ LPWSTR expanded = NULL ;
234
236
LPBYTE ptr = NULL ;
235
237
236
238
* lpValue = NULL ;
@@ -260,9 +262,22 @@ ScmReadString(HKEY hServiceKey,
260
262
261
263
if (dwType == REG_EXPAND_SZ )
262
264
{
263
- /* FIXME: ... */
264
- DPRINT1 ("Expand me!\n" );
265
- * lpValue = (LPWSTR )ptr ;
265
+ /* Expand the value... */
266
+ dwSizeNeeded = ExpandEnvironmentStringsW ((LPCWSTR )ptr , NULL , 0 );
267
+ if (dwSizeNeeded == 0 )
268
+ {
269
+ dwError = GetLastError ();
270
+ goto done ;
271
+ }
272
+ expanded = HeapAlloc (GetProcessHeap (), 0 , dwSizeNeeded );
273
+ if (dwSizeNeeded < ExpandEnvironmentStringsW ((LPCWSTR )ptr , expanded , dwSizeNeeded ))
274
+ {
275
+ dwError = GetLastError ();
276
+ goto done ;
277
+ }
278
+ * lpValue = expanded ;
279
+ HeapFree (GetProcessHeap (), 0 , ptr );
280
+ dwError = ERROR_SUCCESS ;
266
281
}
267
282
else
268
283
{
@@ -271,7 +286,10 @@ ScmReadString(HKEY hServiceKey,
271
286
272
287
done :;
273
288
if (dwError != ERROR_SUCCESS )
289
+ {
274
290
HeapFree (GetProcessHeap (), 0 , ptr );
291
+ HeapFree (GetProcessHeap (), 0 , expanded );
292
+ }
275
293
276
294
return dwError ;
277
295
}
0 commit comments