Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wine-mirror
GitHub Repository: wine-mirror/wine
Path: blob/master/dlls/activeds/activeds_main.c
8791 views
1
/*
2
* Implementation of the Active Directory Service Interface
3
*
4
* Copyright 2005 Detlef Riekenberg
5
* Copyright 2019 Dmitry Timoshkov
6
*
7
* This library is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
11
*
12
* This library is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with this library; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20
*/
21
22
#include <stdarg.h>
23
24
#define COBJMACROS
25
26
#include "windef.h"
27
#include "winbase.h"
28
#include "winuser.h"
29
30
#include "objbase.h"
31
#include "initguid.h"
32
#include "iads.h"
33
#include "adshlp.h"
34
#include "adserr.h"
35
36
#include "wine/debug.h"
37
38
WINE_DEFAULT_DEBUG_CHANNEL(activeds);
39
40
/*****************************************************
41
* ADsGetObject [ACTIVEDS.3]
42
*/
43
HRESULT WINAPI ADsGetObject(LPCWSTR path, REFIID riid, void **obj)
44
{
45
HRESULT hr;
46
47
TRACE("(%s, %s, %p)\n", debugstr_w(path), wine_dbgstr_guid(riid), obj);
48
49
hr = ADsOpenObject(path, NULL, NULL, ADS_SECURE_AUTHENTICATION, riid, obj);
50
if (hr != S_OK && hr != E_ADS_BAD_PATHNAME)
51
hr = ADsOpenObject(path, NULL, NULL, 0, riid, obj);
52
return hr;
53
}
54
55
/*****************************************************
56
* ADsBuildEnumerator [ACTIVEDS.4]
57
*/
58
HRESULT WINAPI ADsBuildEnumerator(IADsContainer * pADsContainer, IEnumVARIANT** ppEnumVariant)
59
{
60
FIXME("(%p)->(%p)!stub\n",pADsContainer, ppEnumVariant);
61
return E_NOTIMPL;
62
}
63
64
/*****************************************************
65
* ADsFreeEnumerator [ACTIVEDS.5]
66
*/
67
HRESULT WINAPI ADsFreeEnumerator(IEnumVARIANT* pEnumVariant)
68
{
69
FIXME("(%p)!stub\n",pEnumVariant);
70
return E_NOTIMPL;
71
}
72
73
/*****************************************************
74
* ADsEnumerateNext [ACTIVEDS.6]
75
*/
76
HRESULT WINAPI ADsEnumerateNext(IEnumVARIANT* pEnumVariant, ULONG cElements, VARIANT* pvar, ULONG * pcElementsFetched)
77
{
78
FIXME("(%p)->(%lu, %p, %p)!stub\n",pEnumVariant, cElements, pvar, pcElementsFetched);
79
return E_NOTIMPL;
80
}
81
82
/*****************************************************
83
* ADsBuildVarArrayStr [ACTIVEDS.7]
84
*/
85
HRESULT WINAPI ADsBuildVarArrayStr(LPWSTR *str, DWORD count, VARIANT *var)
86
{
87
HRESULT hr;
88
SAFEARRAY *sa;
89
LONG idx, end = count;
90
91
TRACE("(%p, %lu, %p)\n", str, count, var);
92
93
if (!var) return E_ADS_BAD_PARAMETER;
94
95
sa = SafeArrayCreateVector(VT_VARIANT, 0, count);
96
if (!sa) return E_OUTOFMEMORY;
97
98
VariantInit(var);
99
for (idx = 0; idx < end; idx++)
100
{
101
VARIANT item;
102
103
V_VT(&item) = VT_BSTR;
104
V_BSTR(&item) = SysAllocString(str[idx]);
105
if (!V_BSTR(&item))
106
{
107
hr = E_OUTOFMEMORY;
108
goto fail;
109
}
110
111
hr = SafeArrayPutElement(sa, &idx, &item);
112
SysFreeString(V_BSTR(&item));
113
if (hr != S_OK) goto fail;
114
}
115
116
V_VT(var) = VT_ARRAY | VT_VARIANT;
117
V_ARRAY(var) = sa;
118
return S_OK;
119
120
fail:
121
SafeArrayDestroy(sa);
122
return hr;
123
}
124
125
/*****************************************************
126
* ADsBuildVarArrayInt [ACTIVEDS.8]
127
*/
128
HRESULT WINAPI ADsBuildVarArrayInt(LPDWORD values, DWORD count, VARIANT* var)
129
{
130
HRESULT hr;
131
SAFEARRAY *sa;
132
LONG idx, end = count;
133
134
TRACE("(%p, %lu, %p)\n", values, count, var);
135
136
if (!var) return E_ADS_BAD_PARAMETER;
137
138
sa = SafeArrayCreateVector(VT_VARIANT, 0, count);
139
if (!sa) return E_OUTOFMEMORY;
140
141
VariantInit(var);
142
for (idx = 0; idx < end; idx++)
143
{
144
VARIANT item;
145
146
V_VT(&item) = VT_I4;
147
V_UI4(&item) = values[idx];
148
149
hr = SafeArrayPutElement(sa, &idx, &item);
150
if (hr != S_OK)
151
{
152
SafeArrayDestroy(sa);
153
return hr;
154
}
155
}
156
157
V_VT(var) = VT_ARRAY | VT_VARIANT;
158
V_ARRAY(var) = sa;
159
return S_OK;
160
}
161
162
/*****************************************************
163
* ADsOpenObject [ACTIVEDS.9]
164
*/
165
HRESULT WINAPI ADsOpenObject(LPCWSTR path, LPCWSTR user, LPCWSTR password, DWORD reserved, REFIID riid, void **obj)
166
{
167
HRESULT hr;
168
HKEY hkey, hprov;
169
WCHAR provider[MAX_PATH], progid[MAX_PATH];
170
DWORD idx = 0;
171
172
TRACE("(%s,%s,%lu,%s,%p)\n", debugstr_w(path), debugstr_w(user), reserved, debugstr_guid(riid), obj);
173
174
if (!path || !riid || !obj)
175
return E_INVALIDARG;
176
177
hr = E_FAIL;
178
179
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\ADs\\Providers", 0, KEY_READ, &hkey))
180
return hr;
181
182
for (;;)
183
{
184
if (RegEnumKeyW(hkey, idx++, provider, ARRAY_SIZE(provider)))
185
break;
186
187
TRACE("provider %s\n", debugstr_w(provider));
188
189
if (!wcsnicmp(path, provider, wcslen(provider)) && path[wcslen(provider)] == ':')
190
{
191
LONG size;
192
193
if (RegOpenKeyExW(hkey, provider, 0, KEY_READ, &hprov))
194
break;
195
196
size = ARRAY_SIZE(progid);
197
if (!RegQueryValueW(hprov, NULL, progid, &size))
198
{
199
CLSID clsid;
200
201
if (CLSIDFromProgID(progid, &clsid) == S_OK)
202
{
203
IADsOpenDSObject *adsopen;
204
IDispatch *disp;
205
206
TRACE("ns %s => clsid %s\n", debugstr_w(progid), wine_dbgstr_guid(&clsid));
207
if (CoCreateInstance(&clsid, 0, CLSCTX_INPROC_SERVER, &IID_IADsOpenDSObject, (void **)&adsopen) == S_OK)
208
{
209
BSTR bpath, buser, bpassword;
210
211
bpath = SysAllocString(path);
212
buser = SysAllocString(user);
213
bpassword = SysAllocString(password);
214
215
hr = IADsOpenDSObject_OpenDSObject(adsopen, bpath, buser, bpassword, reserved, &disp);
216
if (hr == S_OK)
217
{
218
hr = IDispatch_QueryInterface(disp, riid, obj);
219
IDispatch_Release(disp);
220
}
221
222
SysFreeString(bpath);
223
SysFreeString(buser);
224
SysFreeString(bpassword);
225
226
IADsOpenDSObject_Release(adsopen);
227
}
228
}
229
}
230
231
RegCloseKey(hprov);
232
break;
233
}
234
}
235
236
RegCloseKey(hkey);
237
238
return hr;
239
}
240
241
/*****************************************************
242
* ADsSetLastError [ACTIVEDS.12]
243
*/
244
VOID WINAPI ADsSetLastError(DWORD dwErr, LPWSTR pszError, LPWSTR pszProvider)
245
{
246
FIXME("(%ld,%p,%p)!stub\n", dwErr, pszError, pszProvider);
247
}
248
249
/*****************************************************
250
* ADsGetLastError [ACTIVEDS.13]
251
*/
252
HRESULT WINAPI ADsGetLastError(LPDWORD perror, LPWSTR errorbuf, DWORD errorbuflen, LPWSTR namebuf, DWORD namebuflen)
253
{
254
FIXME("(%p,%p,%ld,%p,%ld)!stub\n", perror, errorbuf, errorbuflen, namebuf, namebuflen);
255
return E_NOTIMPL;
256
}
257
258
/*****************************************************
259
* AllocADsMem [ACTIVEDS.14]
260
*/
261
LPVOID WINAPI AllocADsMem(DWORD cb)
262
{
263
return malloc(cb);
264
}
265
266
/*****************************************************
267
* FreeADsMem [ACTIVEDS.15]
268
*/
269
BOOL WINAPI FreeADsMem(LPVOID pMem)
270
{
271
free(pMem);
272
return TRUE;
273
}
274
275
/*****************************************************
276
* ReallocADsMem [ACTIVEDS.16]
277
*/
278
LPVOID WINAPI ReallocADsMem(LPVOID pOldMem, DWORD cbOld, DWORD cbNew)
279
{
280
return realloc(pOldMem, cbNew);
281
}
282
283
/*****************************************************
284
* AllocADsStr [ACTIVEDS.17]
285
*/
286
LPWSTR WINAPI AllocADsStr(LPWSTR pStr)
287
{
288
TRACE("(%p)\n", pStr);
289
return wcsdup(pStr);
290
}
291
292
/*****************************************************
293
* FreeADsStr [ACTIVEDS.18]
294
*/
295
BOOL WINAPI FreeADsStr(LPWSTR pStr)
296
{
297
TRACE("(%p)\n", pStr);
298
299
return FreeADsMem(pStr);
300
}
301
302
/*****************************************************
303
* ReallocADsStr [ACTIVEDS.19]
304
*/
305
BOOL WINAPI ReallocADsStr(LPWSTR *ppStr, LPWSTR pStr)
306
{
307
FIXME("(%p,%p)!stub\n",*ppStr, pStr);
308
return FALSE;
309
}
310
311
/*****************************************************
312
* ADsEncodeBinaryData [ACTIVEDS.20]
313
*/
314
HRESULT WINAPI ADsEncodeBinaryData(PBYTE pbSrcData, DWORD dwSrcLen, LPWSTR *ppszDestData)
315
{
316
FIXME("(%p,%ld,%p)!stub\n", pbSrcData, dwSrcLen, *ppszDestData);
317
return E_NOTIMPL;
318
}
319
320