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
28 #include "wine/debug.h"
31 WINE_DEFAULT_DEBUG_CHANNEL(service
);
33 BOOL
check_multisz(LPCWSTR lpMultiSz
, DWORD cbSize
)
35 if (cbSize
== 0 || (cbSize
== sizeof(WCHAR
) && lpMultiSz
[0] == 0))
37 if ((cbSize
% sizeof(WCHAR
)) != 0 || cbSize
< 2*sizeof(WCHAR
))
39 if (lpMultiSz
[cbSize
/2 - 1] || lpMultiSz
[cbSize
/2 - 2])
44 DWORD
load_reg_string(HKEY hKey
, LPCWSTR szValue
, BOOL bExpand
, LPWSTR
*output
)
51 if ((err
= RegQueryValueExW(hKey
, szValue
, 0, &type
, NULL
, &size
)) != 0)
53 if (err
== ERROR_FILE_NOT_FOUND
)
57 if (!(type
== REG_SZ
|| (type
== REG_EXPAND_SZ
&& bExpand
)))
59 err
= ERROR_INVALID_DATATYPE
;
62 buf
= malloc(size
+ sizeof(WCHAR
));
63 if ((err
= RegQueryValueExW(hKey
, szValue
, 0, &type
, (LPBYTE
)buf
, &size
)) != 0)
65 buf
[size
/sizeof(WCHAR
)] = 0;
67 if (type
== REG_EXPAND_SZ
)
70 if (!(size
= ExpandEnvironmentStringsW(buf
, NULL
, 0)))
75 str
= malloc(size
* sizeof(WCHAR
));
76 ExpandEnvironmentStringsW(buf
, str
, size
);
85 WINE_ERR("Error %ld while reading value %s\n", err
, wine_dbgstr_w(szValue
));
90 DWORD
load_reg_multisz(HKEY hKey
, LPCWSTR szValue
, BOOL bAllowSingle
, LPWSTR
*output
)
97 if ((err
= RegQueryValueExW(hKey
, szValue
, 0, &type
, NULL
, &size
)) != 0)
99 if (err
== ERROR_FILE_NOT_FOUND
)
101 *output
= calloc(1, sizeof(WCHAR
));
102 return ERROR_SUCCESS
;
106 if (!((type
== REG_MULTI_SZ
) || ((type
== REG_SZ
) && bAllowSingle
)))
108 err
= ERROR_INVALID_DATATYPE
;
111 buf
= malloc(size
+ 2 * sizeof(WCHAR
));
112 if ((err
= RegQueryValueExW(hKey
, szValue
, 0, &type
, (LPBYTE
)buf
, &size
)) != 0)
114 buf
[size
/sizeof(WCHAR
)] = 0;
115 buf
[size
/sizeof(WCHAR
) + 1] = 0;
117 return ERROR_SUCCESS
;
120 WINE_ERR("Error %ld while reading value %s\n", err
, wine_dbgstr_w(szValue
));
125 DWORD
load_reg_dword(HKEY hKey
, LPCWSTR szValue
, DWORD
*output
)
131 size
= sizeof(DWORD
);
132 if ((err
= RegQueryValueExW(hKey
, szValue
, 0, &type
, (LPBYTE
)output
, &size
)) != 0)
134 if (err
== ERROR_FILE_NOT_FOUND
)
135 return ERROR_SUCCESS
;
138 if ((type
!= REG_DWORD
&& type
!= REG_BINARY
) || size
!= sizeof(DWORD
))
140 err
= ERROR_INVALID_DATATYPE
;
143 return ERROR_SUCCESS
;
146 WINE_ERR("Error %ld while reading value %s\n", err
, wine_dbgstr_w(szValue
));