2 * Services.exe - some utility functions
4 * Copyright 2007 Google (Mikolaj Zalewski)
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #define WIN32_LEAN_AND_MEAN
26 #include "wine/unicode.h"
27 #include "wine/debug.h"
30 WINE_DEFAULT_DEBUG_CHANNEL(service
);
32 LPWSTR
strdupW(LPCWSTR str
)
40 buf
= HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR
)*(len
+1));
47 BOOL
check_multisz(LPCWSTR lpMultiSz
, DWORD cbSize
)
49 if (cbSize
== 0 || (cbSize
== sizeof(WCHAR
) && lpMultiSz
[0] == 0))
51 if ((cbSize
% sizeof(WCHAR
)) != 0 || cbSize
< 2*sizeof(WCHAR
))
53 if (lpMultiSz
[cbSize
/2 - 1] || lpMultiSz
[cbSize
/2 - 2])
58 DWORD
load_reg_string(HKEY hKey
, LPCWSTR szValue
, BOOL bExpand
, LPWSTR
*output
)
65 if ((err
= RegQueryValueExW(hKey
, szValue
, 0, &type
, NULL
, &size
)) != 0)
67 if (err
== ERROR_FILE_NOT_FOUND
)
71 if (!(type
== REG_SZ
|| (type
== REG_EXPAND_SZ
&& bExpand
)))
73 err
= ERROR_INVALID_DATATYPE
;
76 buf
= HeapAlloc(GetProcessHeap(), 0, size
+ sizeof(WCHAR
));
77 if ((err
= RegQueryValueExW(hKey
, szValue
, 0, &type
, (LPBYTE
)buf
, &size
)) != 0)
79 buf
[size
/sizeof(WCHAR
)] = 0;
81 if (type
== REG_EXPAND_SZ
)
84 DWORD size
= ExpandEnvironmentStringsW(buf
, NULL
, 0);
90 str
= HeapAlloc(GetProcessHeap(), 0, size
* sizeof(WCHAR
));
91 ExpandEnvironmentStringsW(buf
, str
, size
);
92 HeapFree(GetProcessHeap(), 0, buf
);
100 WINE_ERR("Error %d while reading value %s\n", err
, wine_dbgstr_w(szValue
));
101 HeapFree(GetProcessHeap(), 0, buf
);
105 DWORD
load_reg_multisz(HKEY hKey
, LPCWSTR szValue
, BOOL bAllowSingle
, LPWSTR
*output
)
112 if ((err
= RegQueryValueExW(hKey
, szValue
, 0, &type
, NULL
, &size
)) != 0)
114 if (err
== ERROR_FILE_NOT_FOUND
)
116 *output
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(WCHAR
));
117 return ERROR_SUCCESS
;
121 if (!((type
== REG_MULTI_SZ
) || ((type
== REG_SZ
) && bAllowSingle
)))
123 err
= ERROR_INVALID_DATATYPE
;
126 buf
= HeapAlloc(GetProcessHeap(), 0, size
+ 2*sizeof(WCHAR
));
127 if ((err
= RegQueryValueExW(hKey
, szValue
, 0, &type
, (LPBYTE
)buf
, &size
)) != 0)
129 buf
[size
/sizeof(WCHAR
)] = 0;
130 buf
[size
/sizeof(WCHAR
) + 1] = 0;
132 return ERROR_SUCCESS
;
135 WINE_ERR("Error %d while reading value %s\n", err
, wine_dbgstr_w(szValue
));
136 HeapFree(GetProcessHeap(), 0, buf
);
140 DWORD
load_reg_dword(HKEY hKey
, LPCWSTR szValue
, DWORD
*output
)
146 size
= sizeof(DWORD
);
147 if ((err
= RegQueryValueExW(hKey
, szValue
, 0, &type
, (LPBYTE
)output
, &size
)) != 0)
149 if (err
== ERROR_FILE_NOT_FOUND
)
150 return ERROR_SUCCESS
;
153 if (type
!= REG_DWORD
|| size
!= sizeof(DWORD
))
155 err
= ERROR_INVALID_DATATYPE
;
158 return ERROR_SUCCESS
;
161 WINE_ERR("Error %d while reading value %s\n", err
, wine_dbgstr_w(szValue
));