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
27 #include "wine/unicode.h"
28 #include "wine/debug.h"
31 WINE_DEFAULT_DEBUG_CHANNEL(service
);
33 LPWSTR
strdupW(LPCWSTR str
)
41 buf
= HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR
)*(len
+1));
48 BOOL
check_multisz(LPCWSTR lpMultiSz
, DWORD cbSize
)
50 if (cbSize
== 0 || (cbSize
== sizeof(WCHAR
) && lpMultiSz
[0] == 0))
52 if ((cbSize
% sizeof(WCHAR
)) != 0 || cbSize
< 2*sizeof(WCHAR
))
54 if (lpMultiSz
[cbSize
/2 - 1] || lpMultiSz
[cbSize
/2 - 2])
59 DWORD
load_reg_string(HKEY hKey
, LPCWSTR szValue
, BOOL bExpand
, LPWSTR
*output
)
66 if ((err
= RegQueryValueExW(hKey
, szValue
, 0, &type
, NULL
, &size
)) != 0)
68 if (err
== ERROR_FILE_NOT_FOUND
)
72 if (!(type
== REG_SZ
|| (type
== REG_EXPAND_SZ
&& bExpand
)))
74 err
= ERROR_INVALID_DATATYPE
;
77 buf
= HeapAlloc(GetProcessHeap(), 0, size
+ sizeof(WCHAR
));
78 if ((err
= RegQueryValueExW(hKey
, szValue
, 0, &type
, (LPBYTE
)buf
, &size
)) != 0)
80 buf
[size
/sizeof(WCHAR
)] = 0;
82 if (type
== REG_EXPAND_SZ
)
85 DWORD size
= ExpandEnvironmentStringsW(buf
, NULL
, 0);
91 str
= HeapAlloc(GetProcessHeap(), 0, size
* sizeof(WCHAR
));
92 ExpandEnvironmentStringsW(buf
, str
, size
);
93 HeapFree(GetProcessHeap(), 0, buf
);
101 WINE_ERR("Error %d while reading value %s\n", err
, wine_dbgstr_w(szValue
));
102 HeapFree(GetProcessHeap(), 0, buf
);
106 DWORD
load_reg_multisz(HKEY hKey
, LPCWSTR szValue
, BOOL bAllowSingle
, LPWSTR
*output
)
113 if ((err
= RegQueryValueExW(hKey
, szValue
, 0, &type
, NULL
, &size
)) != 0)
115 if (err
== ERROR_FILE_NOT_FOUND
)
117 *output
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(WCHAR
));
118 return ERROR_SUCCESS
;
122 if (!((type
== REG_MULTI_SZ
) || ((type
== REG_SZ
) && bAllowSingle
)))
124 err
= ERROR_INVALID_DATATYPE
;
127 buf
= HeapAlloc(GetProcessHeap(), 0, size
+ 2*sizeof(WCHAR
));
128 if ((err
= RegQueryValueExW(hKey
, szValue
, 0, &type
, (LPBYTE
)buf
, &size
)) != 0)
130 buf
[size
/sizeof(WCHAR
)] = 0;
131 buf
[size
/sizeof(WCHAR
) + 1] = 0;
133 return ERROR_SUCCESS
;
136 WINE_ERR("Error %d while reading value %s\n", err
, wine_dbgstr_w(szValue
));
137 HeapFree(GetProcessHeap(), 0, buf
);
141 DWORD
load_reg_dword(HKEY hKey
, LPCWSTR szValue
, DWORD
*output
)
147 size
= sizeof(DWORD
);
148 if ((err
= RegQueryValueExW(hKey
, szValue
, 0, &type
, (LPBYTE
)output
, &size
)) != 0)
150 if (err
== ERROR_FILE_NOT_FOUND
)
151 return ERROR_SUCCESS
;
154 if (type
!= REG_DWORD
|| size
!= sizeof(DWORD
))
156 err
= ERROR_INVALID_DATATYPE
;
159 return ERROR_SUCCESS
;
162 WINE_ERR("Error %d while reading value %s\n", err
, wine_dbgstr_w(szValue
));