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/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 if (!(size
= ExpandEnvironmentStringsW(buf
, NULL
, 0)))
89 str
= HeapAlloc(GetProcessHeap(), 0, size
* sizeof(WCHAR
));
90 ExpandEnvironmentStringsW(buf
, str
, size
);
91 HeapFree(GetProcessHeap(), 0, buf
);
99 WINE_ERR("Error %ld while reading value %s\n", err
, wine_dbgstr_w(szValue
));
100 HeapFree(GetProcessHeap(), 0, buf
);
104 DWORD
load_reg_multisz(HKEY hKey
, LPCWSTR szValue
, BOOL bAllowSingle
, LPWSTR
*output
)
111 if ((err
= RegQueryValueExW(hKey
, szValue
, 0, &type
, NULL
, &size
)) != 0)
113 if (err
== ERROR_FILE_NOT_FOUND
)
115 *output
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(WCHAR
));
116 return ERROR_SUCCESS
;
120 if (!((type
== REG_MULTI_SZ
) || ((type
== REG_SZ
) && bAllowSingle
)))
122 err
= ERROR_INVALID_DATATYPE
;
125 buf
= HeapAlloc(GetProcessHeap(), 0, size
+ 2*sizeof(WCHAR
));
126 if ((err
= RegQueryValueExW(hKey
, szValue
, 0, &type
, (LPBYTE
)buf
, &size
)) != 0)
128 buf
[size
/sizeof(WCHAR
)] = 0;
129 buf
[size
/sizeof(WCHAR
) + 1] = 0;
131 return ERROR_SUCCESS
;
134 WINE_ERR("Error %ld while reading value %s\n", err
, wine_dbgstr_w(szValue
));
135 HeapFree(GetProcessHeap(), 0, buf
);
139 DWORD
load_reg_dword(HKEY hKey
, LPCWSTR szValue
, DWORD
*output
)
145 size
= sizeof(DWORD
);
146 if ((err
= RegQueryValueExW(hKey
, szValue
, 0, &type
, (LPBYTE
)output
, &size
)) != 0)
148 if (err
== ERROR_FILE_NOT_FOUND
)
149 return ERROR_SUCCESS
;
152 if ((type
!= REG_DWORD
&& type
!= REG_BINARY
) || size
!= sizeof(DWORD
))
154 err
= ERROR_INVALID_DATATYPE
;
157 return ERROR_SUCCESS
;
160 WINE_ERR("Error %ld while reading value %s\n", err
, wine_dbgstr_w(szValue
));