[NETAPI32]
[reactos.git] / reactos / dll / win32 / netapi32 / browser.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: NetAPI DLL
4 * FILE: dll/win32/netapi32/browser.c
5 * PURPOSE: Computer Browser service interface code
6 * PROGRAMMERS: Eric Kohl (eric.kohl@reactos.org)
7 */
8
9 /* INCLUDES ******************************************************************/
10
11 #include "netapi32.h"
12
13 #include <rpc.h>
14 #include <lmbrowsr.h>
15 #include <lmserver.h>
16 #include "browser_c.h"
17
18
19 WINE_DEFAULT_DEBUG_CHANNEL(netapi32);
20
21 /* FUNCTIONS *****************************************************************/
22
23 handle_t __RPC_USER
24 BROWSER_IDENTIFY_HANDLE_bind(BROWSER_IDENTIFY_HANDLE pszSystemName)
25 {
26 handle_t hBinding = NULL;
27 LPWSTR pszStringBinding;
28 RPC_STATUS status;
29
30 TRACE("BROWSER_IDENTIFY_HANDLE_bind() called\n");
31
32 status = RpcStringBindingComposeW(NULL,
33 L"ncacn_np",
34 pszSystemName,
35 L"\\pipe\\browser",
36 NULL,
37 &pszStringBinding);
38 if (status)
39 {
40 TRACE("RpcStringBindingCompose returned 0x%x\n", status);
41 return NULL;
42 }
43
44 /* Set the binding handle that will be used to bind to the server. */
45 status = RpcBindingFromStringBindingW(pszStringBinding,
46 &hBinding);
47 if (status)
48 {
49 TRACE("RpcBindingFromStringBinding returned 0x%x\n", status);
50 }
51
52 status = RpcStringFreeW(&pszStringBinding);
53 if (status)
54 {
55 // TRACE("RpcStringFree returned 0x%x\n", status);
56 }
57
58 return hBinding;
59 }
60
61
62 void __RPC_USER
63 BROWSER_IDENTIFY_HANDLE_unbind(BROWSER_IDENTIFY_HANDLE pszSystemName,
64 handle_t hBinding)
65 {
66 RPC_STATUS status;
67
68 TRACE("BROWSER_IDENTIFY_HANDLE_unbind() called\n");
69
70 status = RpcBindingFree(&hBinding);
71 if (status)
72 {
73 TRACE("RpcBindingFree returned 0x%x\n", status);
74 }
75 }
76
77
78 NET_API_STATUS
79 WINAPI
80 I_BrowserDebugTrace(
81 _In_opt_ LPWSTR ServerName,
82 _In_ PCHAR Buffer)
83 {
84 NET_API_STATUS status;
85
86 TRACE("I_BrowserDebugTrace(%s %s)\n",
87 debugstr_w(ServerName), Buffer);
88
89 RpcTryExcept
90 {
91 status = I_BrowserrDebugTrace(ServerName,
92 Buffer);
93 }
94 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
95 {
96 status = I_RpcMapWin32Status(RpcExceptionCode());
97 }
98 RpcEndExcept;
99
100 return status;
101 }
102
103
104 NET_API_STATUS
105 WINAPI
106 I_BrowserQueryEmulatedDomains(
107 _In_opt_ LPWSTR ServerName,
108 _Out_ PBROWSER_EMULATED_DOMAIN *EmulatedDomains,
109 _Out_ LPDWORD EntriesRead)
110 {
111 BROWSER_EMULATED_DOMAIN_CONTAINER Container = {0, NULL};
112 NET_API_STATUS status;
113
114 TRACE("I_BrowserQueryEmulatedDomains(%s %p %p)\n",
115 debugstr_w(ServerName), EmulatedDomains, EntriesRead);
116
117 *EmulatedDomains = NULL;
118 *EntriesRead = 0;
119
120 RpcTryExcept
121 {
122 status = I_BrowserrQueryEmulatedDomains(ServerName,
123 &Container);
124
125 if (status == NERR_Success)
126 {
127 *EmulatedDomains = (PBROWSER_EMULATED_DOMAIN)Container.Buffer;
128 *EntriesRead = Container.EntriesRead;
129 }
130 }
131 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
132 {
133 status = I_RpcMapWin32Status(RpcExceptionCode());
134 }
135 RpcEndExcept;
136
137 return status;
138 }
139
140
141 NET_API_STATUS
142 WINAPI
143 I_BrowserQueryOtherDomains(
144 _In_opt_ LPCWSTR ServerName,
145 _Out_ LPBYTE *BufPtr,
146 _Out_ LPDWORD EntriesRead,
147 _Out_ LPDWORD TotalEntries)
148 {
149 SERVER_INFO_100_CONTAINER Level100Container = {0, NULL};
150 SERVER_ENUM_STRUCT EnumStruct;
151 NET_API_STATUS status;
152
153 TRACE("I_BrowserQueryOtherDomains(%s %p %p %p)\n",
154 debugstr_w(ServerName), BufPtr, EntriesRead, TotalEntries);
155
156 EnumStruct.Level = 100;
157 EnumStruct.ServerInfo.Level100 = &Level100Container;
158
159 RpcTryExcept
160 {
161 status = I_BrowserrQueryOtherDomains((PWSTR)ServerName,
162 &EnumStruct,
163 TotalEntries);
164
165 if (status == NERR_Success || status == ERROR_MORE_DATA)
166 {
167 *BufPtr = (LPBYTE)EnumStruct.ServerInfo.Level100->Buffer;
168 *EntriesRead = EnumStruct.ServerInfo.Level100->EntriesRead;
169 }
170 }
171 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
172 {
173 status = I_RpcMapWin32Status(RpcExceptionCode());
174 }
175 RpcEndExcept;
176
177 return status;
178 }
179
180
181 NET_API_STATUS
182 WINAPI
183 I_BrowserServerEnum(
184 _In_opt_ LPCWSTR ServerName,
185 _In_opt_ LPCWSTR Transport,
186 _In_opt_ LPCWSTR ClientName,
187 _In_ DWORD Level,
188 _Out_ LPBYTE *BufPtr,
189 _In_ DWORD PrefMaxLen,
190 _Out_ LPDWORD EntriesRead,
191 _Out_ LPDWORD TotalEntries,
192 _In_ DWORD ServerType,
193 _In_opt_ LPCWSTR Domain,
194 _Inout_opt_ LPDWORD ResumeHandle)
195 {
196 SERVER_INFO_100_CONTAINER Level100Container = {0, NULL};
197 SERVER_ENUM_STRUCT EnumStruct;
198 NET_API_STATUS status;
199
200 TRACE("I_BrowserServerEnum(%s %s %s %lu %p %lu %p %p %lu %s %p)\n",
201 debugstr_w(ServerName), debugstr_w(Transport), debugstr_w(ClientName),
202 Level, BufPtr, PrefMaxLen, EntriesRead, TotalEntries, ServerType,
203 debugstr_w(Domain), ResumeHandle);
204
205 EnumStruct.Level = 100;
206 EnumStruct.ServerInfo.Level100 = &Level100Container;
207
208 RpcTryExcept
209 {
210 status = I_BrowserrServerEnum((PWSTR)ServerName,
211 (PWSTR)Transport,
212 (PWSTR)ClientName,
213 &EnumStruct,
214 PrefMaxLen,
215 TotalEntries,
216 ServerType,
217 (PWSTR)Domain,
218 ResumeHandle);
219
220 if (status == NERR_Success || status == ERROR_MORE_DATA)
221 {
222 *BufPtr = (LPBYTE)EnumStruct.ServerInfo.Level100->Buffer;
223 *EntriesRead = EnumStruct.ServerInfo.Level100->EntriesRead;
224 }
225 }
226 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
227 {
228 status = I_RpcMapWin32Status(RpcExceptionCode());
229 }
230 RpcEndExcept;
231
232 return status;
233 }
234
235
236 NET_API_STATUS
237 WINAPI
238 I_BrowserQueryStatistics(
239 _In_opt_ LPCWSTR ServerName,
240 _Inout_ LPBROWSER_STATISTICS *Statistics)
241 {
242 NET_API_STATUS status;
243
244 TRACE("I_BrowserQueryStatistics(%s %p)\n",
245 debugstr_w(ServerName), Statistics);
246
247 RpcTryExcept
248 {
249 status = I_BrowserrQueryStatistics((PWSTR)ServerName,
250 Statistics);
251 }
252 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
253 {
254 status = I_RpcMapWin32Status(RpcExceptionCode());
255 }
256 RpcEndExcept;
257
258 return status;
259 }
260
261
262 NET_API_STATUS
263 WINAPI
264 I_BrowserResetStatistics(
265 _In_opt_ LPCWSTR ServerName)
266 {
267 NET_API_STATUS status;
268
269 TRACE("I_BrowserResetStatistics(%s)\n",
270 debugstr_w(ServerName));
271
272 RpcTryExcept
273 {
274 status = I_BrowserrResetStatistics((PWSTR)ServerName);
275 }
276 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
277 {
278 status = I_RpcMapWin32Status(RpcExceptionCode());
279 }
280 RpcEndExcept;
281
282 return status;
283 }
284
285
286 NET_API_STATUS
287 WINAPI
288 I_BrowserResetNetlogonState(
289 _In_ LPCWSTR ServerName)
290 {
291 NET_API_STATUS status;
292
293 TRACE("I_BrowserResetNetlogonState(%s)\n",
294 debugstr_w(ServerName));
295
296 RpcTryExcept
297 {
298 status = I_BrowserrResetNetlogonState((PWSTR)ServerName);
299 }
300 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
301 {
302 status = I_RpcMapWin32Status(RpcExceptionCode());
303 }
304 RpcEndExcept;
305
306 return status;
307 }
308
309
310 NET_API_STATUS
311 WINAPI
312 I_BrowserSetNetlogonState(
313 _In_ LPWSTR ServerName,
314 _In_ LPWSTR DomainName,
315 _In_ LPWSTR EmulatedServerName,
316 _In_ DWORD Role)
317 {
318 NET_API_STATUS status;
319
320 TRACE("I_BrowserSetNetlogonState(%s %s %s %lu)\n",
321 debugstr_w(ServerName), debugstr_w(ServerName),
322 debugstr_w(EmulatedServerName), Role);
323
324 RpcTryExcept
325 {
326 status = I_BrowserrSetNetlogonState(ServerName,
327 DomainName,
328 EmulatedServerName,
329 Role);
330 }
331 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
332 {
333 status = I_RpcMapWin32Status(RpcExceptionCode());
334 }
335 RpcEndExcept;
336
337 return status;
338 }
339
340
341 NET_API_STATUS
342 WINAPI
343 NetBrowserStatisticsGet(
344 _In_ LPWSTR ServerName,
345 _In_ DWORD Level,
346 _Out_ LPBYTE *Buffer)
347 {
348 BROWSER_STATISTICS_STRUCT StatisticsStruct;
349 BROWSER_STATISTICS_100_CONTAINER Level100Container = {0, NULL};
350 BROWSER_STATISTICS_101_CONTAINER Level101Container = {0, NULL};
351 NET_API_STATUS status;
352
353 TRACE("NetBrowserStatisticsGet(%s %lu %p)\n",
354 debugstr_w(ServerName), Level, Buffer);
355
356 if (Level != 100 && Level != 101)
357 return ERROR_INVALID_LEVEL;
358
359 StatisticsStruct.Level = Level;
360 switch (Level)
361 {
362 case 100:
363 StatisticsStruct.Statistics.Level100 = &Level100Container;
364 break;
365
366 case 101:
367 StatisticsStruct.Statistics.Level101 = &Level101Container;
368 break;
369 }
370
371 RpcTryExcept
372 {
373 status = NetrBrowserStatisticsGet(ServerName,
374 Level,
375 &StatisticsStruct);
376
377 switch (Level)
378 {
379 case 100:
380 if (StatisticsStruct.Statistics.Level100->Buffer != NULL)
381 {
382 *Buffer = (LPBYTE)StatisticsStruct.Statistics.Level100->Buffer;
383 }
384 break;
385
386 case 101:
387 if (StatisticsStruct.Statistics.Level101->Buffer != NULL)
388 {
389 *Buffer = (LPBYTE)StatisticsStruct.Statistics.Level101->Buffer;
390 }
391 break;
392 }
393 }
394 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
395 {
396 status = I_RpcMapWin32Status(RpcExceptionCode());
397 }
398 RpcEndExcept;
399
400 return status;
401 }
402
403
404 NET_API_STATUS
405 WINAPI
406 NetServerEnum(
407 _In_opt_ LMCSTR servername,
408 _In_ DWORD level,
409 _Out_ LPBYTE *bufptr,
410 _In_ DWORD prefmaxlen,
411 _Out_ LPDWORD entriesread,
412 _Out_ LPDWORD totalentries,
413 _In_ DWORD servertype,
414 _In_opt_ LMCSTR domain,
415 _Inout_opt_ LPDWORD resume_handle)
416 {
417 TRACE("NetServerEnum(%s %lu %p %lu %p %p %lu %s %p)\n",
418 debugstr_w(servername), level, bufptr, prefmaxlen, entriesread,
419 totalentries, servertype, debugstr_w(domain), resume_handle);
420
421 if (resume_handle != NULL)
422 *resume_handle = 0;
423
424 return NetServerEnumEx(servername,
425 level,
426 bufptr,
427 prefmaxlen,
428 entriesread,
429 totalentries,
430 servertype,
431 domain,
432 NULL);
433 }
434
435
436 NET_API_STATUS
437 WINAPI
438 NetServerEnumEx(
439 _In_opt_ LMCSTR ServerName,
440 _In_ DWORD Level,
441 _Out_ LPBYTE *Bufptr,
442 _In_ DWORD PrefMaxlen,
443 _Out_ LPDWORD EntriesRead,
444 _Out_ LPDWORD totalentries,
445 _In_ DWORD servertype,
446 _In_opt_ LMCSTR domain,
447 _In_opt_ LMCSTR FirstNameToReturn)
448 {
449 FIXME("NetServerEnumEx(%s %lu %p %lu %p %p %lu %s %s)\n",
450 debugstr_w(ServerName), Level, Bufptr, PrefMaxlen, EntriesRead, totalentries,
451 servertype, debugstr_w(domain), debugstr_w(FirstNameToReturn));
452
453 return ERROR_NO_BROWSER_SERVERS_FOUND;
454 }
455
456 /* EOF */