8cb6157d9492520be9088e9fd4a2fb0676173519
[reactos.git] / dll / win32 / netapi32 / wksta_new.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: NetAPI DLL
4 * FILE: reactos/dll/win32/netapi32/wksta_new.c
5 * PURPOSE: Workstation service interface code
6 *
7 * PROGRAMMERS: Eric Kohl
8 */
9
10 /* INCLUDES ******************************************************************/
11
12 #include "netapi32.h"
13 #include "wkssvc_c.h"
14
15 WINE_DEFAULT_DEBUG_CHANNEL(netapi32);
16
17 /* FUNCTIONS *****************************************************************/
18
19 void __RPC_FAR * __RPC_USER midl_user_allocate(SIZE_T len)
20 {
21 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);
22 }
23
24
25 void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
26 {
27 HeapFree(GetProcessHeap(), 0, ptr);
28 }
29
30
31 handle_t __RPC_USER
32 WKSSVC_IDENTIFY_HANDLE_bind(WKSSVC_IDENTIFY_HANDLE pszSystemName)
33 {
34 handle_t hBinding = NULL;
35 LPWSTR pszStringBinding;
36 RPC_STATUS status;
37
38 TRACE("WKSSVC_IDENTIFY_HANDLE_bind() called\n");
39
40 status = RpcStringBindingComposeW(NULL,
41 L"ncacn_np",
42 pszSystemName,
43 L"\\pipe\\wkssvc",
44 NULL,
45 &pszStringBinding);
46 if (status)
47 {
48 TRACE("RpcStringBindingCompose returned 0x%x\n", status);
49 return NULL;
50 }
51
52 /* Set the binding handle that will be used to bind to the server. */
53 status = RpcBindingFromStringBindingW(pszStringBinding,
54 &hBinding);
55 if (status)
56 {
57 TRACE("RpcBindingFromStringBinding returned 0x%x\n", status);
58 }
59
60 status = RpcStringFreeW(&pszStringBinding);
61 if (status)
62 {
63 // TRACE("RpcStringFree returned 0x%x\n", status);
64 }
65
66 return hBinding;
67 }
68
69
70 void __RPC_USER
71 WKSSVC_IDENTIFY_HANDLE_unbind(WKSSVC_IDENTIFY_HANDLE pszSystemName,
72 handle_t hBinding)
73 {
74 RPC_STATUS status;
75
76 TRACE("WKSSVC_IDENTIFY_HANDLE_unbind() called\n");
77
78 status = RpcBindingFree(&hBinding);
79 if (status)
80 {
81 TRACE("RpcBindingFree returned 0x%x\n", status);
82 }
83 }
84
85
86 handle_t __RPC_USER
87 WKSSVC_IMPERSONATE_HANDLE_bind(WKSSVC_IMPERSONATE_HANDLE pszSystemName)
88 {
89 handle_t hBinding = NULL;
90 LPWSTR pszStringBinding;
91 RPC_STATUS status;
92
93 TRACE("WKSSVC_IMPERSONATE_HANDLE_bind() called\n");
94
95 status = RpcStringBindingComposeW(NULL,
96 L"ncacn_np",
97 pszSystemName,
98 L"\\pipe\\wkssvc",
99 NULL,
100 &pszStringBinding);
101 if (status)
102 {
103 TRACE("RpcStringBindingCompose returned 0x%x\n", status);
104 return NULL;
105 }
106
107 /* Set the binding handle that will be used to bind to the server. */
108 status = RpcBindingFromStringBindingW(pszStringBinding,
109 &hBinding);
110 if (status)
111 {
112 TRACE("RpcBindingFromStringBinding returned 0x%x\n", status);
113 }
114
115 status = RpcStringFreeW(&pszStringBinding);
116 if (status)
117 {
118 // TRACE("RpcStringFree returned 0x%x\n", status);
119 }
120
121 return hBinding;
122 }
123
124
125 void __RPC_USER
126 WKSSVC_IMPERSONATE_HANDLE_unbind(WKSSVC_IMPERSONATE_HANDLE pszSystemName,
127 handle_t hBinding)
128 {
129 RPC_STATUS status;
130
131 TRACE("WKSSVC_IMPERSONATE_HANDLE_unbind() called\n");
132
133 status = RpcBindingFree(&hBinding);
134 if (status)
135 {
136 TRACE("RpcBindingFree returned 0x%x\n", status);
137 }
138 }
139
140
141 NET_API_STATUS
142 WINAPI
143 NetAddAlternateComputerName(
144 _In_opt_ LPCWSTR Server,
145 _In_ LPCWSTR AlternateName,
146 _In_opt_ LPCWSTR DomainAccount,
147 _In_opt_ LPCWSTR DomainAccountPassword,
148 _In_ ULONG Reserved)
149 {
150 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword;
151 handle_t BindingHandle;
152 NET_API_STATUS status;
153
154 TRACE("NetAddAlternateComputerName(%s %s %s %s 0x%lx)\n",
155 debugstr_w(Server), debugstr_w(AlternateName), debugstr_w(DomainAccount),
156 debugstr_w(DomainAccountPassword), Reserved);
157
158 /* FIXME */
159 BindingHandle = NULL;
160 EncryptedPassword = NULL;
161
162 RpcTryExcept
163 {
164 status = NetrAddAlternateComputerName(BindingHandle,
165 (PWSTR)Server,
166 (PWSTR)AlternateName,
167 (PWSTR)DomainAccount,
168 EncryptedPassword,
169 Reserved);
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 NetEnumerateComputerNames(
184 _In_opt_ LPCWSTR Server,
185 _In_ NET_COMPUTER_NAME_TYPE NameType,
186 _In_ ULONG Reserved,
187 _Out_ PDWORD EntryCount,
188 _Out_ LPWSTR **ComputerNames)
189 {
190 PNET_COMPUTER_NAME_ARRAY ComputerNameArray = NULL;
191 ULONG BufferSize, i;
192 PWSTR *NameBuffer = NULL, Ptr;
193 NET_API_STATUS status;
194
195 TRACE("NetEnumerateComputerNames(%s %lu %lu %p %p)\n",
196 debugstr_w(Server), NameType, Reserved, EntryCount, ComputerNames);
197
198 RpcTryExcept
199 {
200 status = NetrEnumerateComputerNames((PWSTR)Server,
201 NameType,
202 Reserved,
203 &ComputerNameArray);
204 if (status == NERR_Success)
205 {
206 *EntryCount = ComputerNameArray->EntryCount;
207
208 BufferSize = 0;
209 for (i = 0; i < ComputerNameArray->EntryCount; i++)
210 {
211 BufferSize += ComputerNameArray->ComputerNames[i].Length + sizeof(WCHAR) + sizeof(PWSTR);
212 }
213
214 status = NetApiBufferAllocate(BufferSize, (PVOID*)&NameBuffer);
215 if (status == NERR_Success)
216 {
217 ZeroMemory(NameBuffer, BufferSize);
218
219 Ptr = (PWSTR)((ULONG_PTR)NameBuffer + ComputerNameArray->EntryCount * sizeof(PWSTR));
220 for (i = 0; i < ComputerNameArray->EntryCount; i++)
221 {
222 NameBuffer[i] = Ptr;
223 CopyMemory(Ptr,
224 ComputerNameArray->ComputerNames[i].Buffer,
225 ComputerNameArray->ComputerNames[i].Length);
226 Ptr = (PWSTR)((ULONG_PTR)Ptr + ComputerNameArray->ComputerNames[i].Length + sizeof(WCHAR));
227 }
228
229 *ComputerNames = NameBuffer;
230 }
231 }
232 }
233 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
234 {
235 status = I_RpcMapWin32Status(RpcExceptionCode());
236 }
237 RpcEndExcept;
238
239 return status;
240 }
241
242
243 #if 0
244 NET_API_STATUS
245 WINAPI
246 NetGetJoinInformation(
247 _In_ LPCWSTR lpServer,
248 _Out_ LPWSTR *lpNameBuffer,
249 _Out_ PNETSETUP_JOIN_STATUS BufferType)
250 {
251 NET_API_STATUS status;
252
253 TRACE("NetGetJoinInformation(%s %p %p)\n",
254 debugstr_w(lpServer), lpNameBuffer, BufferType);
255
256 if (lpNameBuffer == NULL || BufferType == NULL)
257 return ERROR_INVALID_PARAMETER;
258
259 RpcTryExcept
260 {
261 status = NetrGetJoinInformation((LPWSTR)lpServer,
262 lpNameBuffer,
263 BufferType);
264 }
265 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
266 {
267 status = I_RpcMapWin32Status(RpcExceptionCode());
268 }
269 RpcEndExcept;
270
271 return status;
272 }
273 #endif
274
275
276 NET_API_STATUS
277 WINAPI
278 NetGetJoinableOUs(
279 _In_ LPCWSTR lpServer,
280 _In_ LPCWSTR lpDomain,
281 _In_ LPCWSTR lpAccount,
282 _In_ LPCWSTR lpPassword,
283 _Out_ DWORD *OUCount,
284 _Out_ LPWSTR **OUs)
285 {
286 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword;
287 handle_t BindingHandle;
288 NET_API_STATUS status;
289
290 TRACE("NetGetJoinableOUs(%s %s %s %s %p %p)\n",
291 debugstr_w(lpServer), debugstr_w(lpDomain), debugstr_w(lpAccount),
292 debugstr_w(lpPassword), OUCount, OUs);
293
294 /* FIXME */
295 BindingHandle = NULL;
296 EncryptedPassword = NULL;
297
298 RpcTryExcept
299 {
300 status = NetrGetJoinableOUs2(BindingHandle,
301 (PWSTR)lpServer,
302 (PWSTR)lpDomain,
303 (PWSTR)lpAccount,
304 EncryptedPassword,
305 OUCount,
306 OUs);
307 }
308 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
309 {
310 status = I_RpcMapWin32Status(RpcExceptionCode());
311 }
312 RpcEndExcept;
313
314 return status;
315 }
316
317
318 NET_API_STATUS
319 WINAPI
320 NetJoinDomain(
321 _In_ LPCWSTR lpServer,
322 _In_ LPCWSTR lpDomain,
323 _In_ LPCWSTR lpAccountOU,
324 _In_ LPCWSTR lpAccount,
325 _In_ LPCWSTR lpPassword,
326 _In_ DWORD fJoinOptions)
327 {
328 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword;
329 handle_t BindingHandle;
330 NET_API_STATUS status;
331
332 TRACE("NetJoinDomain(%s %s %s %s 0x%lx)\n",
333 debugstr_w(lpServer), debugstr_w(lpDomain), debugstr_w(lpAccountOU),
334 debugstr_w(lpAccount), debugstr_w(lpPassword), fJoinOptions);
335
336 /* FIXME */
337 BindingHandle = NULL;
338 EncryptedPassword = NULL;
339
340 RpcTryExcept
341 {
342 status = NetrJoinDomain2(BindingHandle,
343 (PWSTR)lpServer,
344 (PWSTR)lpDomain,
345 (PWSTR)lpAccountOU,
346 (PWSTR)lpAccount,
347 EncryptedPassword,
348 fJoinOptions);
349 }
350 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
351 {
352 status = I_RpcMapWin32Status(RpcExceptionCode());
353 }
354 RpcEndExcept;
355
356 return status;
357 }
358
359
360 NET_API_STATUS
361 WINAPI
362 NetRemoveAlternateComputerName(
363 _In_opt_ LPCWSTR Server,
364 _In_ LPCWSTR AlternateName,
365 _In_opt_ LPCWSTR DomainAccount,
366 _In_opt_ LPCWSTR DomainAccountPassword,
367 _In_ ULONG Reserved)
368 {
369 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword;
370 handle_t BindingHandle;
371 NET_API_STATUS status;
372
373 TRACE("NetRemoveAlternateComputerName(%s %s %s %s 0x%lx)\n",
374 debugstr_w(Server), debugstr_w(AlternateName), debugstr_w(DomainAccount),
375 debugstr_w(DomainAccountPassword), Reserved);
376
377 /* FIXME */
378 BindingHandle = NULL;
379 EncryptedPassword = NULL;
380
381 RpcTryExcept
382 {
383 status = NetrRemoveAlternateComputerName(BindingHandle,
384 (PWSTR)Server,
385 (PWSTR)AlternateName,
386 (PWSTR)DomainAccount,
387 EncryptedPassword,
388 Reserved);
389 }
390 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
391 {
392 status = I_RpcMapWin32Status(RpcExceptionCode());
393 }
394 RpcEndExcept;
395
396 return status;
397 }
398
399
400 NET_API_STATUS
401 WINAPI
402 NetRenameMachineInDomain(
403 _In_ LPCWSTR lpServer,
404 _In_ LPCWSTR lpNewMachineName,
405 _In_ LPCWSTR lpAccount,
406 _In_ LPCWSTR lpPassword,
407 _In_ DWORD fRenameOptions)
408 {
409 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword;
410 handle_t BindingHandle;
411 NET_API_STATUS status;
412
413 TRACE("NetRenameMachineInDomain(%s %s %s %s 0x%lx)\n",
414 debugstr_w(lpServer), debugstr_w(lpNewMachineName), debugstr_w(lpAccount),
415 debugstr_w(lpPassword), fRenameOptions);
416
417 /* FIXME */
418 BindingHandle = NULL;
419 EncryptedPassword = NULL;
420
421 RpcTryExcept
422 {
423 status = NetrRenameMachineInDomain2(BindingHandle,
424 (PWSTR)lpServer,
425 (PWSTR)lpNewMachineName,
426 (PWSTR)lpAccount,
427 EncryptedPassword,
428 fRenameOptions);
429 }
430 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
431 {
432 status = I_RpcMapWin32Status(RpcExceptionCode());
433 }
434 RpcEndExcept;
435
436 return status;
437 }
438
439
440 NET_API_STATUS
441 WINAPI
442 NetSetPrimaryComputerName(
443 _In_opt_ LPCWSTR Server,
444 _In_ LPCWSTR PrimaryName,
445 _In_opt_ LPCWSTR DomainAccount,
446 _In_opt_ LPCWSTR DomainAccountPassword,
447 _In_ ULONG Reserved)
448 {
449 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword;
450 handle_t BindingHandle;
451 NET_API_STATUS status;
452
453 TRACE("NetSetPrimaryComputerName(%s %s %s %s %lu)\n",
454 debugstr_w(Server), debugstr_w(PrimaryName), debugstr_w(DomainAccount),
455 debugstr_w(DomainAccountPassword), Reserved);
456
457 /* FIXME */
458 BindingHandle = NULL;
459 EncryptedPassword = NULL;
460
461 RpcTryExcept
462 {
463 status = NetrSetPrimaryComputerName(BindingHandle,
464 (PWSTR)Server,
465 (PWSTR)PrimaryName,
466 (PWSTR)DomainAccount,
467 EncryptedPassword,
468 Reserved);
469 }
470 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
471 {
472 status = I_RpcMapWin32Status(RpcExceptionCode());
473 }
474 RpcEndExcept;
475
476 return status;
477 }
478
479
480 NET_API_STATUS
481 WINAPI
482 NetUnjoinDomain(
483 _In_ LPCWSTR lpServer,
484 _In_ LPCWSTR lpAccount,
485 _In_ LPCWSTR lpPassword,
486 _In_ DWORD fUnjoinOptions)
487 {
488 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword;
489 handle_t BindingHandle;
490 NET_API_STATUS status;
491
492 TRACE("NetUnjoinDomain(%s %s %s %s 0x%lx)\n",
493 debugstr_w(lpServer), debugstr_w(lpAccount),
494 debugstr_w(lpPassword), fUnjoinOptions);
495
496 /* FIXME */
497 BindingHandle = NULL;
498 EncryptedPassword = NULL;
499
500 RpcTryExcept
501 {
502 status = NetrUnjoinDomain2(BindingHandle,
503 (PWSTR)lpServer,
504 (PWSTR)lpAccount,
505 EncryptedPassword,
506 fUnjoinOptions);
507 }
508 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
509 {
510 status = I_RpcMapWin32Status(RpcExceptionCode());
511 }
512 RpcEndExcept;
513
514 return status;
515 }
516
517
518 NET_API_STATUS
519 WINAPI
520 NetUseAdd(
521 _In_ LMSTR UncServerName,
522 _In_ DWORD Level,
523 _In_ LPBYTE Buf,
524 _Out_ LPDWORD ParmError)
525 {
526 NET_API_STATUS status;
527
528 TRACE("NetUseAdd(%s %d %p %p)\n", debugstr_w(UncServerName),
529 Level, Buf, ParmError);
530
531 RpcTryExcept
532 {
533 status = NetrUseAdd(UncServerName,
534 Level,
535 (LPUSE_INFO)Buf,
536 ParmError);
537 }
538 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
539 {
540 status = I_RpcMapWin32Status(RpcExceptionCode());
541 }
542 RpcEndExcept;
543
544 return status;
545 }
546
547
548 NET_API_STATUS
549 WINAPI
550 NetUseDel(
551 _In_ LMSTR UncServerName,
552 _In_ LMSTR UseName,
553 _In_ DWORD ForceCond)
554 {
555 NET_API_STATUS status;
556
557 TRACE("NetUseDel(%s %s %d)\n", debugstr_w(UncServerName),
558 debugstr_w(UseName), ForceCond);
559
560 RpcTryExcept
561 {
562 status = NetrUseDel(UncServerName,
563 UseName,
564 ForceCond);
565 }
566 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
567 {
568 status = I_RpcMapWin32Status(RpcExceptionCode());
569 }
570 RpcEndExcept;
571
572 return status;
573 }
574
575
576 NET_API_STATUS
577 WINAPI
578 NetUseEnum(
579 _In_ LMSTR UncServerName,
580 _In_ DWORD Level,
581 _Out_ LPBYTE *BufPtr,
582 _In_ DWORD PreferedMaximumSize,
583 _Out_ LPDWORD EntriesRead,
584 _Out_ LPDWORD TotalEntries,
585 _Inout_ LPDWORD ResumeHandle)
586 {
587 USE_ENUM_STRUCT UseEnumInfo;
588 USE_INFO_0_CONTAINER Container0;
589 USE_INFO_1_CONTAINER Container1;
590 USE_INFO_2_CONTAINER Container2;
591 NET_API_STATUS status;
592
593 TRACE("NetUseEnum(%s, %d, %p, %d, %p, %p, %p)\n", debugstr_w(UncServerName),
594 Level, BufPtr, PreferedMaximumSize, EntriesRead, TotalEntries, ResumeHandle);
595
596 UseEnumInfo.Level = Level;
597 switch (Level)
598 {
599 case 0:
600 UseEnumInfo.UseInfo.Level0 = &Container0;
601 Container0.EntriesRead = 0;
602 Container0.Buffer = NULL;
603 break;
604
605 case 1:
606 UseEnumInfo.UseInfo.Level1 = &Container1;
607 Container1.EntriesRead = 0;
608 Container1.Buffer = NULL;
609 break;
610
611 case 2:
612 UseEnumInfo.UseInfo.Level2 = &Container2;
613 Container2.EntriesRead = 0;
614 Container2.Buffer = NULL;
615 break;
616
617 default:
618 return ERROR_INVALID_PARAMETER;
619 }
620
621 RpcTryExcept
622 {
623 status = NetrUseEnum(UncServerName,
624 &UseEnumInfo,
625 PreferedMaximumSize,
626 TotalEntries,
627 ResumeHandle);
628 if (status == NERR_Success || status == ERROR_MORE_DATA)
629 {
630 switch (Level)
631 {
632 case 0:
633 *BufPtr = (LPBYTE)UseEnumInfo.UseInfo.Level0->Buffer;
634 *EntriesRead = UseEnumInfo.UseInfo.Level0->EntriesRead;
635 break;
636
637 case 1:
638 *BufPtr = (LPBYTE)UseEnumInfo.UseInfo.Level1->Buffer;
639 *EntriesRead = UseEnumInfo.UseInfo.Level1->EntriesRead;
640 break;
641
642 case 2:
643 *BufPtr = (LPBYTE)UseEnumInfo.UseInfo.Level2->Buffer;
644 *EntriesRead = UseEnumInfo.UseInfo.Level2->EntriesRead;
645 break;
646 }
647 }
648 }
649 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
650 {
651 status = I_RpcMapWin32Status(RpcExceptionCode());
652 }
653 RpcEndExcept;
654
655 return status;
656 }
657
658
659 NET_API_STATUS
660 WINAPI
661 NetUseGetInfo(
662 _In_ LMSTR UncServerName,
663 _In_ LMSTR UseName,
664 _In_ DWORD Level,
665 _Out_ LPBYTE *BufPtr)
666 {
667 NET_API_STATUS status;
668
669 TRACE("NetUseGetInfo(%s, %s, %d, %p)\n", debugstr_w(UncServerName),
670 debugstr_w(UseName), Level, BufPtr);
671
672 *BufPtr = NULL;
673
674 RpcTryExcept
675 {
676 status = NetrUseGetInfo(UncServerName,
677 UseName,
678 Level,
679 (LPUSE_INFO)BufPtr);
680 }
681 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
682 {
683 status = I_RpcMapWin32Status(RpcExceptionCode());
684 }
685 RpcEndExcept;
686
687 return status;
688 }
689
690
691 NET_API_STATUS
692 WINAPI
693 NetValidateName(
694 _In_ LPCWSTR lpServer,
695 _In_ LPCWSTR lpName,
696 _In_ LPCWSTR lpAccount,
697 _In_ LPCWSTR lpPassword,
698 _In_ NETSETUP_NAME_TYPE NameType)
699 {
700 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword;
701 handle_t BindingHandle;
702 NET_API_STATUS status;
703
704 TRACE("NetValidateName(%s %s %s %s %u)\n",
705 debugstr_w(lpServer), debugstr_w(lpName), debugstr_w(lpAccount),
706 debugstr_w(lpPassword), NameType);
707
708 /* FIXME */
709 BindingHandle = NULL;
710 EncryptedPassword = NULL;
711
712 RpcTryExcept
713 {
714 status = NetrValidateName2(BindingHandle,
715 (PWSTR)lpServer,
716 (PWSTR)lpName,
717 (PWSTR)lpAccount,
718 EncryptedPassword,
719 NameType);
720 }
721 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
722 {
723 status = I_RpcMapWin32Status(RpcExceptionCode());
724 }
725 RpcEndExcept;
726
727 return status;
728 }
729
730
731 #if 0
732 NET_API_STATUS
733 WINAPI
734 NetWkstaGetInfo(
735 _In_ LPWSTR servername,
736 _In_ DWORD level,
737 _Out_ LPBYTE *bufptr)
738 {
739 NET_API_STATUS status;
740
741 TRACE("NetWkstaGetInfo(%s, %d, %p)\n",
742 debugstr_w(servername), level, bufptr);
743
744 if (bufptr == NULL)
745 return ERROR_INVALID_PARAMETER;
746
747 *bufptr = NULL;
748
749 RpcTryExcept
750 {
751 status = NetrWkstaGetInfo(servername,
752 level,
753 (LPWKSTA_INFO)bufptr);
754 }
755 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
756 {
757 status = I_RpcMapWin32Status(RpcExceptionCode());
758 }
759 RpcEndExcept;
760
761 return status;
762 }
763 #endif
764
765
766 NET_API_STATUS
767 WINAPI
768 NetWkstaSetInfo(
769 _In_ LPWSTR servername,
770 _In_ DWORD level,
771 _In_ LPBYTE buffer,
772 _Out_ LPDWORD parm_err)
773 {
774 NET_API_STATUS status;
775
776 TRACE("NetWkstaSetInfo(%s, %d, %p, %p)\n",
777 debugstr_w(servername), level, buffer, parm_err);
778
779 RpcTryExcept
780 {
781 status = NetrWkstaSetInfo(servername,
782 level,
783 (LPWKSTA_INFO)buffer,
784 parm_err);
785 }
786 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
787 {
788 status = I_RpcMapWin32Status(RpcExceptionCode());
789 }
790 RpcEndExcept;
791
792 return status;
793 }
794
795
796 NET_API_STATUS
797 WINAPI
798 NetWkstaTransportAdd(
799 _In_opt_ LPWSTR servername,
800 _In_ DWORD level,
801 _In_ LPBYTE buf,
802 _Out_ LPDWORD parm_err)
803 {
804 NET_API_STATUS status;
805
806 TRACE("NetWkstaTransportAdd(%s, %d, %p, %p)\n", debugstr_w(servername),
807 level, buf, parm_err);
808
809 RpcTryExcept
810 {
811 status = NetrWkstaTransportAdd(servername,
812 level,
813 (LPWKSTA_TRANSPORT_INFO_0)buf,
814 parm_err);
815 }
816 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
817 {
818 status = I_RpcMapWin32Status(RpcExceptionCode());
819 }
820 RpcEndExcept;
821
822 return status;
823 }
824
825
826 NET_API_STATUS
827 WINAPI
828 NetWkstaTransportDel(
829 _In_opt_ LPWSTR servername,
830 _In_ LPWSTR transportname,
831 _In_ DWORD ucond)
832 {
833 NET_API_STATUS status;
834
835 TRACE("NetWkstaTransportDel(%s, %s, %d)\n", debugstr_w(servername),
836 debugstr_w(transportname), ucond);
837
838 RpcTryExcept
839 {
840 status = NetrWkstaTransportDel(servername,
841 transportname,
842 ucond);
843 }
844 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
845 {
846 status = I_RpcMapWin32Status(RpcExceptionCode());
847 }
848 RpcEndExcept;
849
850 return status;
851 }
852
853
854 #if 0
855 NET_API_STATUS
856 WINAPI
857 NetWkstaTransportEnum(
858 _In_opt_ LPWSTR servername,
859 _In_ DWORD level,
860 _Out_ LPBYTE *bufptr,
861 _In_ DWORD prefmaxlen,
862 _Out_ LPDWORD entriesread,
863 _Out_ LPDWORD totalentries,
864 _Inout_ LPDWORD resumehandle)
865 {
866 WKSTA_TRANSPORT_ENUM_STRUCT TransportEnumInfo;
867 WKSTA_TRANSPORT_INFO_0_CONTAINER Container0;
868 NET_API_STATUS status;
869
870 TRACE("NetWkstaTransportEnum(%s, %d, %p, %d, %p, %p, %p)\n", debugstr_w(servername),
871 level, bufptr, prefmaxlen, entriesread, totalentries, resumehandle);
872
873 TransportEnumInfo.Level = level;
874 switch (level)
875 {
876 case 0:
877 TransportEnumInfo.WkstaTransportInfo.Level0 = &Container0;
878 Container0.EntriesRead = 0;
879 Container0.Buffer = NULL;
880 break;
881
882 default:
883 return ERROR_INVALID_PARAMETER;
884 }
885
886 RpcTryExcept
887 {
888 status = NetrWkstaTransportEnum(servername,
889 &TransportEnumInfo,
890 prefmaxlen,
891 totalentries,
892 resumehandle);
893 if (status == NERR_Success || status == ERROR_MORE_DATA)
894 {
895 switch (level)
896 {
897 case 0:
898 *bufptr = (LPBYTE)TransportEnumInfo.WkstaTransportInfo.Level0->Buffer;
899 *entriesread = TransportEnumInfo.WkstaTransportInfo.Level0->EntriesRead;
900 break;
901 }
902 }
903 }
904 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
905 {
906 status = I_RpcMapWin32Status(RpcExceptionCode());
907 }
908 RpcEndExcept;
909
910 return status;
911 }
912
913
914 NET_API_STATUS
915 WINAPI
916 NetWkstaUserEnum(
917 _In_ LPWSTR servername,
918 _In_ DWORD level,
919 _Out_ LPBYTE *bufptr,
920 _In_ DWORD prefmaxlen,
921 _Out_ LPDWORD entriesread,
922 _Out_ LPDWORD totalentries,
923 _Inout_ LPDWORD resumehandle)
924 {
925 WKSTA_USER_ENUM_STRUCT UserEnumInfo;
926 WKSTA_USER_INFO_0_CONTAINER Container0;
927 WKSTA_USER_INFO_1_CONTAINER Container1;
928 NET_API_STATUS status;
929
930 TRACE("NetWkstaUserEnum(%s, %d, %p, %d, %p, %p, %p)\n", debugstr_w(servername),
931 level, bufptr, prefmaxlen, entriesread, totalentries, resumehandle);
932
933 UserEnumInfo.Level = level;
934 switch (level)
935 {
936 case 0:
937 UserEnumInfo.WkstaUserInfo.Level0 = &Container0;
938 Container0.EntriesRead = 0;
939 Container0.Buffer = NULL;
940 break;
941
942 case 1:
943 UserEnumInfo.WkstaUserInfo.Level1 = &Container1;
944 Container1.EntriesRead = 0;
945 Container1.Buffer = NULL;
946 break;
947
948 default:
949 return ERROR_INVALID_PARAMETER;
950 }
951
952 RpcTryExcept
953 {
954 status = NetrWkstaUserEnum(servername,
955 &UserEnumInfo,
956 prefmaxlen,
957 totalentries,
958 resumehandle);
959 if (status == NERR_Success || status == ERROR_MORE_DATA)
960 {
961 switch (level)
962 {
963 case 0:
964 *bufptr = (LPBYTE)UserEnumInfo.WkstaUserInfo.Level0->Buffer;
965 *entriesread = UserEnumInfo.WkstaUserInfo.Level0->EntriesRead;
966 break;
967
968 case 1:
969 *bufptr = (LPBYTE)UserEnumInfo.WkstaUserInfo.Level1->Buffer;
970 *entriesread = UserEnumInfo.WkstaUserInfo.Level1->EntriesRead;
971 break;
972 }
973 }
974 }
975 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
976 {
977 status = I_RpcMapWin32Status(RpcExceptionCode());
978 }
979 RpcEndExcept;
980
981 return status;
982 }
983
984
985 NET_API_STATUS
986 WINAPI
987 NetWkstaUserGetInfo(
988 LPWSTR reserved,
989 _In_ DWORD level,
990 _Out_ PBYTE *bufptr)
991 {
992 NET_API_STATUS status;
993
994 TRACE("NetWkstaUserGetInfo(%s, %d, %p)\n",
995 debugstr_w(reserved), level, bufptr);
996
997 if (reserved != NULL)
998 return ERROR_INVALID_PARAMETER;
999
1000 *bufptr = NULL;
1001
1002 RpcTryExcept
1003 {
1004 status = NetrWkstaUserGetInfo(NULL,
1005 level,
1006 (LPWKSTA_USER_INFO)bufptr);
1007 }
1008 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
1009 {
1010 status = I_RpcMapWin32Status(RpcExceptionCode());
1011 }
1012 RpcEndExcept;
1013
1014 return status;
1015 }
1016 #endif
1017
1018
1019 NET_API_STATUS
1020 WINAPI
1021 NetWkstaUserSetInfo(
1022 LPWSTR reserved,
1023 _In_ DWORD level,
1024 _In_ LPBYTE buf,
1025 _Out_ LPDWORD parm_err)
1026 {
1027 NET_API_STATUS status;
1028
1029 TRACE("NetWkstaSetInfo(%s, %d, %p, %p)\n",
1030 debugstr_w(reserved), level, buf, parm_err);
1031
1032 if (reserved != NULL)
1033 return ERROR_INVALID_PARAMETER;
1034
1035 RpcTryExcept
1036 {
1037 status = NetrWkstaUserSetInfo(NULL,
1038 level,
1039 (LPWKSTA_USER_INFO)&buf,
1040 parm_err);
1041 }
1042 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
1043 {
1044 status = I_RpcMapWin32Status(RpcExceptionCode());
1045 }
1046 RpcEndExcept;
1047
1048 return status;
1049 }
1050
1051 /* EOF */