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