2 * COPYRIGHT: See COPYING in the top level directory
4 * FILE: reactos/dll/win32/netapi32/wksta_new.c
5 * PURPOSE: Workstation service interface code
7 * PROGRAMMERS: Eric Kohl
10 /* INCLUDES ******************************************************************/
15 WINE_DEFAULT_DEBUG_CHANNEL(netapi32
);
17 /* FUNCTIONS *****************************************************************/
19 void __RPC_FAR
* __RPC_USER
midl_user_allocate(SIZE_T len
)
21 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
25 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
27 HeapFree(GetProcessHeap(), 0, ptr
);
32 WKSSVC_IDENTIFY_HANDLE_bind(WKSSVC_IDENTIFY_HANDLE pszSystemName
)
34 handle_t hBinding
= NULL
;
35 LPWSTR pszStringBinding
;
38 TRACE("WKSSVC_IDENTIFY_HANDLE_bind() called\n");
40 status
= RpcStringBindingComposeW(NULL
,
48 TRACE("RpcStringBindingCompose returned 0x%x\n", status
);
52 /* Set the binding handle that will be used to bind to the server. */
53 status
= RpcBindingFromStringBindingW(pszStringBinding
,
57 TRACE("RpcBindingFromStringBinding returned 0x%x\n", status
);
60 status
= RpcStringFreeW(&pszStringBinding
);
63 // TRACE("RpcStringFree returned 0x%x\n", status);
71 WKSSVC_IDENTIFY_HANDLE_unbind(WKSSVC_IDENTIFY_HANDLE pszSystemName
,
76 TRACE("WKSSVC_IDENTIFY_HANDLE_unbind() called\n");
78 status
= RpcBindingFree(&hBinding
);
81 TRACE("RpcBindingFree returned 0x%x\n", status
);
87 WKSSVC_IMPERSONATE_HANDLE_bind(WKSSVC_IMPERSONATE_HANDLE pszSystemName
)
89 handle_t hBinding
= NULL
;
90 LPWSTR pszStringBinding
;
93 TRACE("WKSSVC_IMPERSONATE_HANDLE_bind() called\n");
95 status
= RpcStringBindingComposeW(NULL
,
103 TRACE("RpcStringBindingCompose returned 0x%x\n", status
);
107 /* Set the binding handle that will be used to bind to the server. */
108 status
= RpcBindingFromStringBindingW(pszStringBinding
,
112 TRACE("RpcBindingFromStringBinding returned 0x%x\n", status
);
115 status
= RpcStringFreeW(&pszStringBinding
);
118 // TRACE("RpcStringFree returned 0x%x\n", status);
126 WKSSVC_IMPERSONATE_HANDLE_unbind(WKSSVC_IMPERSONATE_HANDLE pszSystemName
,
131 TRACE("WKSSVC_IMPERSONATE_HANDLE_unbind() called\n");
133 status
= RpcBindingFree(&hBinding
);
136 TRACE("RpcBindingFree returned 0x%x\n", status
);
143 NetAddAlternateComputerName(
144 _In_opt_ LPCWSTR Server
,
145 _In_ LPCWSTR AlternateName
,
146 _In_opt_ LPCWSTR DomainAccount
,
147 _In_opt_ LPCWSTR DomainAccountPassword
,
150 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword
;
151 handle_t BindingHandle
;
152 NET_API_STATUS status
;
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
);
159 BindingHandle
= NULL
;
160 EncryptedPassword
= NULL
;
164 status
= NetrAddAlternateComputerName(BindingHandle
,
166 (PWSTR
)AlternateName
,
167 (PWSTR
)DomainAccount
,
171 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
173 status
= I_RpcMapWin32Status(RpcExceptionCode());
183 NetEnumerateComputerNames(
184 _In_opt_ LPCWSTR Server
,
185 _In_ NET_COMPUTER_NAME_TYPE NameType
,
187 _Out_ PDWORD EntryCount
,
188 _Out_ LPWSTR
**ComputerNames
)
190 PNET_COMPUTER_NAME_ARRAY ComputerNameArray
= NULL
;
192 PWSTR
*NameBuffer
= NULL
, Ptr
;
193 NET_API_STATUS status
;
195 TRACE("NetEnumerateComputerNames(%s %lu %lu %p %p)\n",
196 debugstr_w(Server
), NameType
, Reserved
, EntryCount
, ComputerNames
);
200 status
= NetrEnumerateComputerNames((PWSTR
)Server
,
204 if (status
== NERR_Success
)
206 *EntryCount
= ComputerNameArray
->EntryCount
;
209 for (i
= 0; i
< ComputerNameArray
->EntryCount
; i
++)
211 BufferSize
+= ComputerNameArray
->ComputerNames
[i
].Length
+ sizeof(WCHAR
) + sizeof(PWSTR
);
214 status
= NetApiBufferAllocate(BufferSize
, (PVOID
*)&NameBuffer
);
215 if (status
== NERR_Success
)
217 ZeroMemory(NameBuffer
, BufferSize
);
219 Ptr
= (PWSTR
)((ULONG_PTR
)NameBuffer
+ ComputerNameArray
->EntryCount
* sizeof(PWSTR
));
220 for (i
= 0; i
< ComputerNameArray
->EntryCount
; i
++)
224 ComputerNameArray
->ComputerNames
[i
].Buffer
,
225 ComputerNameArray
->ComputerNames
[i
].Length
);
226 Ptr
= (PWSTR
)((ULONG_PTR
)Ptr
+ ComputerNameArray
->ComputerNames
[i
].Length
+ sizeof(WCHAR
));
229 *ComputerNames
= NameBuffer
;
233 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
235 status
= I_RpcMapWin32Status(RpcExceptionCode());
246 NetGetJoinInformation(
249 PNETSETUP_JOIN_STATUS type
)
251 NET_API_STATUS status
;
253 TRACE("NetGetJoinInformation(%s %p %p)\n", debugstr_w(Server
),
256 if (Name
== NULL
|| type
== NULL
)
257 return ERROR_INVALID_PARAMETER
;
261 status
= NetrGetJoinInformation((LPWSTR
)Server
,
265 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
267 status
= I_RpcMapWin32Status(RpcExceptionCode());
279 _In_ LPCWSTR lpServer
,
280 _In_ LPCWSTR lpDomain
,
281 _In_ LPCWSTR lpAccount
,
282 _In_ LPCWSTR lpPassword
,
283 _Out_ DWORD
*OUCount
,
286 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword
;
287 handle_t BindingHandle
;
288 NET_API_STATUS status
;
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
);
295 BindingHandle
= NULL
;
296 EncryptedPassword
= NULL
;
300 status
= NetrGetJoinableOUs2(BindingHandle
,
308 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
310 status
= I_RpcMapWin32Status(RpcExceptionCode());
321 _In_ LPCWSTR lpServer
,
322 _In_ LPCWSTR lpDomain
,
323 _In_ LPCWSTR lpAccountOU
,
324 _In_ LPCWSTR lpAccount
,
325 _In_ LPCWSTR lpPassword
,
326 _In_ DWORD fJoinOptions
)
328 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword
;
329 handle_t BindingHandle
;
330 NET_API_STATUS status
;
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
);
337 BindingHandle
= NULL
;
338 EncryptedPassword
= NULL
;
342 status
= NetrJoinDomain2(BindingHandle
,
350 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
352 status
= I_RpcMapWin32Status(RpcExceptionCode());
362 NetRemoveAlternateComputerName(
363 _In_opt_ LPCWSTR Server
,
364 _In_ LPCWSTR AlternateName
,
365 _In_opt_ LPCWSTR DomainAccount
,
366 _In_opt_ LPCWSTR DomainAccountPassword
,
369 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword
;
370 handle_t BindingHandle
;
371 NET_API_STATUS status
;
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
);
378 BindingHandle
= NULL
;
379 EncryptedPassword
= NULL
;
383 status
= NetrRemoveAlternateComputerName(BindingHandle
,
385 (PWSTR
)AlternateName
,
386 (PWSTR
)DomainAccount
,
390 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
392 status
= I_RpcMapWin32Status(RpcExceptionCode());
402 NetRenameMachineInDomain(
403 _In_ LPCWSTR lpServer
,
404 _In_ LPCWSTR lpNewMachineName
,
405 _In_ LPCWSTR lpAccount
,
406 _In_ LPCWSTR lpPassword
,
407 _In_ DWORD fRenameOptions
)
409 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword
;
410 handle_t BindingHandle
;
411 NET_API_STATUS status
;
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
);
418 BindingHandle
= NULL
;
419 EncryptedPassword
= NULL
;
423 status
= NetrRenameMachineInDomain2(BindingHandle
,
425 (PWSTR
)lpNewMachineName
,
430 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
432 status
= I_RpcMapWin32Status(RpcExceptionCode());
442 NetSetPrimaryComputerName(
443 _In_opt_ LPCWSTR Server
,
444 _In_ LPCWSTR PrimaryName
,
445 _In_opt_ LPCWSTR DomainAccount
,
446 _In_opt_ LPCWSTR DomainAccountPassword
,
449 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword
;
450 handle_t BindingHandle
;
451 NET_API_STATUS status
;
453 TRACE("NetSetPrimaryComputerName(%s %s %s %s %lu)\n",
454 debugstr_w(Server
), debugstr_w(PrimaryName
), debugstr_w(DomainAccount
),
455 debugstr_w(DomainAccountPassword
), Reserved
);
458 BindingHandle
= NULL
;
459 EncryptedPassword
= NULL
;
463 status
= NetrSetPrimaryComputerName(BindingHandle
,
466 (PWSTR
)DomainAccount
,
470 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
472 status
= I_RpcMapWin32Status(RpcExceptionCode());
483 _In_ LPCWSTR lpServer
,
484 _In_ LPCWSTR lpAccount
,
485 _In_ LPCWSTR lpPassword
,
486 _In_ DWORD fUnjoinOptions
)
488 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword
;
489 handle_t BindingHandle
;
490 NET_API_STATUS status
;
492 TRACE("NetUnjoinDomain(%s %s %s %s 0x%lx)\n",
493 debugstr_w(lpServer
), debugstr_w(lpAccount
),
494 debugstr_w(lpPassword
), fUnjoinOptions
);
497 BindingHandle
= NULL
;
498 EncryptedPassword
= NULL
;
502 status
= NetrUnjoinDomain2(BindingHandle
,
508 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
510 status
= I_RpcMapWin32Status(RpcExceptionCode());
526 NET_API_STATUS status
;
528 TRACE("NetUseAdd(%s %d %p %p)\n", debugstr_w(UncServerName
),
529 Level
, Buf
, ParmError
);
533 status
= NetrUseAdd(UncServerName
,
538 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
540 status
= I_RpcMapWin32Status(RpcExceptionCode());
555 NET_API_STATUS status
;
557 TRACE("NetUseDel(%s %s %d)\n", debugstr_w(UncServerName
),
558 debugstr_w(UseName
), ForceCond
);
562 status
= NetrUseDel(UncServerName
,
566 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
568 status
= I_RpcMapWin32Status(RpcExceptionCode());
582 DWORD PreferedMaximumSize
,
584 LPDWORD TotalEntries
,
585 LPDWORD ResumeHandle
)
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
;
593 TRACE("NetUseEnum(%s, %d, %p, %d, %p, %p, %p)\n", debugstr_w(UncServerName
),
594 Level
, BufPtr
, PreferedMaximumSize
, EntriesRead
, TotalEntries
, ResumeHandle
);
596 UseEnumInfo
.Level
= Level
;
600 UseEnumInfo
.UseInfo
.Level0
= &Container0
;
601 Container0
.EntriesRead
= 0;
602 Container0
.Buffer
= NULL
;
606 UseEnumInfo
.UseInfo
.Level1
= &Container1
;
607 Container1
.EntriesRead
= 0;
608 Container1
.Buffer
= NULL
;
612 UseEnumInfo
.UseInfo
.Level2
= &Container2
;
613 Container2
.EntriesRead
= 0;
614 Container2
.Buffer
= NULL
;
618 return ERROR_INVALID_PARAMETER
;
623 status
= NetrUseEnum(UncServerName
,
628 if (status
== NERR_Success
|| status
== ERROR_MORE_DATA
)
633 *BufPtr
= (LPBYTE
)UseEnumInfo
.UseInfo
.Level0
->Buffer
;
634 *EntriesRead
= UseEnumInfo
.UseInfo
.Level0
->EntriesRead
;
638 *BufPtr
= (LPBYTE
)UseEnumInfo
.UseInfo
.Level1
->Buffer
;
639 *EntriesRead
= UseEnumInfo
.UseInfo
.Level1
->EntriesRead
;
643 *BufPtr
= (LPBYTE
)UseEnumInfo
.UseInfo
.Level2
->Buffer
;
644 *EntriesRead
= UseEnumInfo
.UseInfo
.Level2
->EntriesRead
;
649 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
651 status
= I_RpcMapWin32Status(RpcExceptionCode());
662 _In_ LPCWSTR lpServer
,
664 _In_ LPCWSTR lpAccount
,
665 _In_ LPCWSTR lpPassword
,
666 _In_ NETSETUP_NAME_TYPE NameType
)
668 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword
;
669 handle_t BindingHandle
;
670 NET_API_STATUS status
;
672 TRACE("NetValidateName(%s %s %s %s %u)\n",
673 debugstr_w(lpServer
), debugstr_w(lpName
), debugstr_w(lpAccount
),
674 debugstr_w(lpPassword
), NameType
);
677 BindingHandle
= NULL
;
678 EncryptedPassword
= NULL
;
682 status
= NetrValidateName2(BindingHandle
,
689 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
691 status
= I_RpcMapWin32Status(RpcExceptionCode());
707 NET_API_STATUS status
;
709 TRACE("NetUseGetInfo(%s, %s, %d, %p)\n", debugstr_w(UncServerName
),
710 debugstr_w(UseName
), Level
, BufPtr
);
716 status
= NetrUseGetInfo(UncServerName
,
721 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
723 status
= I_RpcMapWin32Status(RpcExceptionCode());
739 NET_API_STATUS status
;
741 TRACE("NetWkstaGetInfo(%s, %d, %p)\n", debugstr_w(servername
),
745 return ERROR_INVALID_PARAMETER
;
751 status
= NetrWkstaGetInfo(servername
,
753 (LPWKSTA_INFO
)bufptr
);
755 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
757 status
= I_RpcMapWin32Status(RpcExceptionCode());
774 NET_API_STATUS status
;
776 TRACE("NetWkstaSetInfo(%s, %d, %p, %p)\n", debugstr_w(servername
),
777 level
, buffer
, parm_err
);
781 status
= NetrWkstaSetInfo(servername
,
783 (LPWKSTA_INFO
)buffer
,
786 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
788 status
= I_RpcMapWin32Status(RpcExceptionCode());
798 NetWkstaTransportAdd(
804 NET_API_STATUS status
;
806 TRACE("NetWkstaTransportAdd(%s, %d, %p, %p)\n", debugstr_w(servername
),
807 level
, buf
, parm_err
);
811 status
= NetrWkstaTransportAdd(servername
,
813 (LPWKSTA_TRANSPORT_INFO_0
)buf
,
816 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
818 status
= I_RpcMapWin32Status(RpcExceptionCode());
828 NetWkstaTransportDel(
830 LPWSTR transportname
,
833 NET_API_STATUS status
;
835 TRACE("NetWkstaTransportDel(%s, %s, %d)\n", debugstr_w(servername
),
836 debugstr_w(transportname
), ucond
);
840 status
= NetrWkstaTransportDel(servername
,
844 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
846 status
= I_RpcMapWin32Status(RpcExceptionCode());
857 NetWkstaTransportEnum(
863 LPDWORD totalentries
,
864 LPDWORD resumehandle
)
866 WKSTA_TRANSPORT_ENUM_STRUCT TransportEnumInfo
;
867 WKSTA_TRANSPORT_INFO_0_CONTAINER Container0
;
868 NET_API_STATUS status
;
870 TRACE("NetWkstaTransportEnum(%s, %d, %p, %d, %p, %p, %p)\n", debugstr_w(servername
),
871 level
, bufptr
, prefmaxlen
, entriesread
, totalentries
, resumehandle
);
873 TransportEnumInfo
.Level
= level
;
877 TransportEnumInfo
.WkstaTransportInfo
.Level0
= &Container0
;
878 Container0
.EntriesRead
= 0;
879 Container0
.Buffer
= NULL
;
883 return ERROR_INVALID_PARAMETER
;
888 status
= NetrWkstaTransportEnum(servername
,
893 if (status
== NERR_Success
|| status
== ERROR_MORE_DATA
)
898 *bufptr
= (LPBYTE
)TransportEnumInfo
.WkstaTransportInfo
.Level0
->Buffer
;
899 *entriesread
= TransportEnumInfo
.WkstaTransportInfo
.Level0
->EntriesRead
;
904 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
906 status
= I_RpcMapWin32Status(RpcExceptionCode());
922 LPDWORD totalentries
,
923 LPDWORD resumehandle
)
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
;
930 TRACE("NetWkstaUserEnum(%s, %d, %p, %d, %p, %p, %p)\n", debugstr_w(servername
),
931 level
, bufptr
, prefmaxlen
, entriesread
, totalentries
, resumehandle
);
933 UserEnumInfo
.Level
= level
;
937 UserEnumInfo
.WkstaUserInfo
.Level0
= &Container0
;
938 Container0
.EntriesRead
= 0;
939 Container0
.Buffer
= NULL
;
943 UserEnumInfo
.WkstaUserInfo
.Level1
= &Container1
;
944 Container1
.EntriesRead
= 0;
945 Container1
.Buffer
= NULL
;
949 return ERROR_INVALID_PARAMETER
;
954 status
= NetrWkstaUserEnum(servername
,
959 if (status
== NERR_Success
|| status
== ERROR_MORE_DATA
)
964 *bufptr
= (LPBYTE
)UserEnumInfo
.WkstaUserInfo
.Level0
->Buffer
;
965 *entriesread
= UserEnumInfo
.WkstaUserInfo
.Level0
->EntriesRead
;
969 *bufptr
= (LPBYTE
)UserEnumInfo
.WkstaUserInfo
.Level1
->Buffer
;
970 *entriesread
= UserEnumInfo
.WkstaUserInfo
.Level1
->EntriesRead
;
975 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
977 status
= I_RpcMapWin32Status(RpcExceptionCode());
992 NET_API_STATUS status
;
994 TRACE("NetWkstaUserGetInfo(%s, %d, %p)\n", debugstr_w(reserved
),
997 if (reserved
!= NULL
)
998 return ERROR_INVALID_PARAMETER
;
1004 status
= NetrWkstaUserGetInfo(NULL
,
1006 (LPWKSTA_USER_INFO
)bufptr
);
1008 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1010 status
= I_RpcMapWin32Status(RpcExceptionCode());
1021 NetWkstaUserSetInfo(
1027 NET_API_STATUS status
;
1029 TRACE("NetWkstaSetInfo(%s, %d, %p, %p)\n", debugstr_w(reserved
),
1030 level
, buf
, parm_err
);
1032 if (reserved
!= NULL
)
1033 return ERROR_INVALID_PARAMETER
;
1037 status
= NetrWkstaUserSetInfo(NULL
,
1039 (LPWKSTA_USER_INFO
)&buf
,
1042 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1044 status
= I_RpcMapWin32Status(RpcExceptionCode());