ReactOS 0.4.16-dev-477-g6ada597
rpcserver.c File Reference
#include "precomp.h"
#include "lmerr.h"
Include dependency graph for rpcserver.c:

Go to the source code of this file.

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (wkssvc)
 
DWORD WINAPI RpcThreadRoutine (LPVOID lpParameter)
 
void __RPC_FAR *__RPC_USER midl_user_allocate (SIZE_T len)
 
void __RPC_USER midl_user_free (void __RPC_FAR *ptr)
 
static NET_API_STATUS NetpGetClientLogonId (_Out_ PLUID LogonId)
 
unsigned long __stdcall NetrWkstaGetInfo (WKSSVC_IDENTIFY_HANDLE ServerName, unsigned long Level, LPWKSTA_INFO *WkstaInfo)
 
unsigned long __stdcall NetrWkstaSetInfo (WKSSVC_IDENTIFY_HANDLE ServerName, unsigned long Level, LPWKSTA_INFO WkstaInfo, unsigned long *ErrorParameter)
 
unsigned long __stdcall NetrWkstaUserEnum (WKSSVC_IDENTIFY_HANDLE ServerName, LPWKSTA_USER_ENUM_STRUCT UserInfo, unsigned long PreferredMaximumLength, unsigned long *TotalEntries, unsigned long *ResumeHandle)
 
unsigned long __stdcall NetrWkstaUserGetInfo (WKSSVC_IDENTIFY_HANDLE Unused, unsigned long Level, LPWKSTA_USER_INFO *UserInfo)
 
unsigned long __stdcall NetrWkstaUserSetInfo (WKSSVC_IDENTIFY_HANDLE Unused, unsigned long Level, LPWKSTA_USER_INFO UserInfo, unsigned long *ErrorParameter)
 
unsigned long __stdcall NetrWkstaTransportEnum (WKSSVC_IDENTIFY_HANDLE ServerName, LPWKSTA_TRANSPORT_ENUM_STRUCT TransportInfo, unsigned long PreferredMaximumLength, unsigned long *TotalEntries, unsigned long *ResumeHandle)
 
unsigned long __stdcall NetrWkstaTransportAdd (WKSSVC_IDENTIFY_HANDLE ServerName, unsigned long Level, LPWKSTA_TRANSPORT_INFO_0 TransportInfo, unsigned long *ErrorParameter)
 
unsigned long __stdcall NetrWkstaTransportDel (WKSSVC_IDENTIFY_HANDLE ServerName, wchar_t *TransportName, unsigned long ForceLevel)
 
unsigned long __stdcall NetrUseAdd (WKSSVC_IMPERSONATE_HANDLE ServerName, unsigned long Level, LPUSE_INFO InfoStruct, unsigned long *ErrorParameter)
 
unsigned long __stdcall NetrUseGetInfo (WKSSVC_IMPERSONATE_HANDLE ServerName, wchar_t *UseName, unsigned long Level, LPUSE_INFO InfoStruct)
 
unsigned long __stdcall NetrUseDel (WKSSVC_IMPERSONATE_HANDLE ServerName, wchar_t *UseName, unsigned long ForceLevel)
 
unsigned long __stdcall NetrUseEnum (WKSSVC_IDENTIFY_HANDLE ServerName, LPUSE_ENUM_STRUCT InfoStruct, unsigned long PreferredMaximumLength, unsigned long *TotalEntries, unsigned long *ResumeHandle)
 
unsigned long __stdcall NetrMessageBufferSend (void)
 
unsigned long __stdcall NetrWorkstationStatisticsGet (WKSSVC_IDENTIFY_HANDLE ServerName, wchar_t *ServiceName, unsigned long Level, unsigned long Options, LPSTAT_WORKSTATION_0 *Buffer)
 
unsigned long __stdcall NetrLogonDomainNameAdd (WKSSVC_IDENTIFY_HANDLE DomainName)
 
unsigned long __stdcall NetrLogonDomainNameDel (WKSSVC_IDENTIFY_HANDLE DomainName)
 
unsigned long __stdcall NetrJoinDomain (void)
 
unsigned long __stdcall NetrUnjoinDomain (void)
 
unsigned long __stdcall NetrValidateName (void)
 
unsigned long __stdcall NetrRenameMachineInDomain (void)
 
unsigned long __stdcall NetrGetJoinInformation (WKSSVC_IMPERSONATE_HANDLE ServerName, wchar_t **NameBuffer, PNETSETUP_JOIN_STATUS BufferType)
 
unsigned long __stdcall NetrGetJoinableOUs (void)
 
unsigned long __stdcall NetrJoinDomain2 (handle_t RpcBindingHandle, wchar_t *ServerName, wchar_t *DomainNameParam, wchar_t *MachineAccountOU, wchar_t *AccountName, PJOINPR_ENCRYPTED_USER_PASSWORD Password, unsigned long Options)
 
unsigned long __stdcall NetrUnjoinDomain2 (handle_t RpcBindingHandle, wchar_t *ServerName, wchar_t *AccountName, PJOINPR_ENCRYPTED_USER_PASSWORD Password, unsigned long Options)
 
unsigned long __stdcall NetrRenameMachineInDomain2 (handle_t RpcBindingHandle, wchar_t *ServerName, wchar_t *MachineName, wchar_t *AccountName, PJOINPR_ENCRYPTED_USER_PASSWORD Password, unsigned long Options)
 
unsigned long __stdcall NetrValidateName2 (handle_t RpcBindingHandle, wchar_t *ServerName, wchar_t *NameToValidate, wchar_t *AccountName, PJOINPR_ENCRYPTED_USER_PASSWORD Password, NETSETUP_NAME_TYPE NameType)
 
unsigned long __stdcall NetrGetJoinableOUs2 (handle_t RpcBindingHandle, wchar_t *ServerName, wchar_t *DomainNameParam, wchar_t *AccountName, PJOINPR_ENCRYPTED_USER_PASSWORD Password, unsigned long *OUCount, wchar_t ***OUs)
 
unsigned long __stdcall NetrAddAlternateComputerName (handle_t RpcBindingHandle, wchar_t *ServerName, wchar_t *AlternateName, wchar_t *DomainAccount, PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword, unsigned long Reserved)
 
unsigned long __stdcall NetrRemoveAlternateComputerName (handle_t RpcBindingHandle, wchar_t *ServerName, wchar_t *AlternateName, wchar_t *DomainAccount, PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword, unsigned long Reserved)
 
unsigned long __stdcall NetrSetPrimaryComputerName (handle_t RpcBindingHandle, wchar_t *ServerName, wchar_t *PrimaryName, wchar_t *DomainAccount, PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword, unsigned long Reserved)
 
unsigned long __stdcall NetrEnumerateComputerNames (WKSSVC_IMPERSONATE_HANDLE ServerName, NET_COMPUTER_NAME_TYPE NameType, unsigned long Reserved, PNET_COMPUTER_NAME_ARRAY *ComputerNames)
 

Function Documentation

◆ midl_user_allocate()

void __RPC_FAR *__RPC_USER midl_user_allocate ( SIZE_T  len)

Definition at line 68 of file rpcserver.c.

69{
71}
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
GLenum GLsizei len
Definition: glext.h:6722

◆ midl_user_free()

void __RPC_USER midl_user_free ( void __RPC_FAR ptr)

Definition at line 74 of file rpcserver.c.

75{
77}
#define HeapFree(x, y, z)
Definition: compat.h:735
static PVOID ptr
Definition: dispmode.c:27

◆ NetpGetClientLogonId()

static NET_API_STATUS NetpGetClientLogonId ( _Out_ PLUID  LogonId)
static

Definition at line 82 of file rpcserver.c.

84{
85 HANDLE ThreadToken = NULL;
86 TOKEN_STATISTICS Statistics;
88 NTSTATUS NtStatus;
89 NET_API_STATUS ApiStatus = NERR_Success;
90
91 ApiStatus = RpcImpersonateClient(NULL);
92 if (ApiStatus != NERR_Success)
93 return ApiStatus;
94
97 TRUE,
98 &ThreadToken);
99 if (!NT_SUCCESS(NtStatus))
100 {
101 ApiStatus = RtlNtStatusToDosError(NtStatus);
102 goto done;
103 }
104
105 NtStatus = NtQueryInformationToken(ThreadToken,
107 (PVOID)&Statistics,
108 sizeof(Statistics),
109 &Length);
110 if (!NT_SUCCESS(NtStatus))
111 {
112 ApiStatus = RtlNtStatusToDosError(NtStatus);
113 goto done;
114 }
115
116 TRACE("Client LUID: %lx\n", Statistics.AuthenticationId.LowPart);
117 RtlCopyLuid(LogonId, &Statistics.AuthenticationId);
118
119done:
120 if (ThreadToken != NULL)
121 NtClose(ThreadToken);
122
124
125 return ApiStatus;
126}
LONG NTSTATUS
Definition: precomp.h:26
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
NTSYSAPI ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)
NTSYSAPI void WINAPI RtlCopyLuid(PLUID, const LUID *)
#define NERR_Success
Definition: lmerr.h:5
DWORD NET_API_STATUS
Definition: ms-dtyp.idl:91
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3402
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
_IRQL_requires_same_ _In_ PLSA_STRING _In_ SECURITY_LOGON_TYPE _In_ ULONG _In_ ULONG _In_opt_ PTOKEN_GROUPS _In_ PTOKEN_SOURCE _Out_ PVOID _Out_ PULONG _Inout_ PLUID LogonId
NTSTATUS NTAPI NtOpenThreadToken(_In_ HANDLE ThreadHandle, _In_ ACCESS_MASK DesiredAccess, _In_ BOOLEAN OpenAsSelf, _Out_ PHANDLE TokenHandle)
Opens a token that is tied to a thread handle.
Definition: token.c:2474
RPC_STATUS WINAPI RpcRevertToSelf(void)
Definition: rpc_binding.c:1463
RPC_STATUS WINAPI RpcImpersonateClient(RPC_BINDING_HANDLE BindingHandle)
Definition: rpc_binding.c:1056
#define TRACE(s)
Definition: solgame.cpp:4
_Must_inspect_result_ __kernel_entry NTSTATUS NTAPI NtQueryInformationToken(_In_ HANDLE TokenHandle, _In_ TOKEN_INFORMATION_CLASS TokenInformationClass, _Out_writes_bytes_to_opt_(TokenInformationLength, *ReturnLength) PVOID TokenInformation, _In_ ULONG TokenInformationLength, _Out_ PULONG ReturnLength)
Queries a specific type of information in regard of an access token based upon the information class....
Definition: tokencls.c:473
uint32_t ULONG
Definition: typedefs.h:59
#define TOKEN_QUERY
Definition: setypes.h:928
@ TokenStatistics
Definition: setypes.h:975
#define NtCurrentThread()

Referenced by NetrWkstaUserGetInfo().

◆ NetrAddAlternateComputerName()

unsigned long __stdcall NetrAddAlternateComputerName ( handle_t  RpcBindingHandle,
wchar_t ServerName,
wchar_t AlternateName,
wchar_t DomainAccount,
PJOINPR_ENCRYPTED_USER_PASSWORD  EncryptedPassword,
unsigned long  Reserved 
)

Definition at line 1194 of file rpcserver.c.

1201{
1203 return 0;
1204}
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15

Referenced by implicit_handle(), and NetAddAlternateComputerName().

◆ NetrEnumerateComputerNames()

unsigned long __stdcall NetrEnumerateComputerNames ( WKSSVC_IMPERSONATE_HANDLE  ServerName,
NET_COMPUTER_NAME_TYPE  NameType,
unsigned long  Reserved,
PNET_COMPUTER_NAME_ARRAY ComputerNames 
)

Definition at line 1242 of file rpcserver.c.

1247{
1249 return 0;
1250}

Referenced by implicit_handle(), and NetEnumerateComputerNames().

◆ NetrGetJoinableOUs()

unsigned long __stdcall NetrGetJoinableOUs ( void  )

Definition at line 1085 of file rpcserver.c.

1086{
1087 TRACE("NetrGetJoinableOUs()\n");
1088 return ERROR_NOT_SUPPORTED;
1089}
#define ERROR_NOT_SUPPORTED
Definition: compat.h:100

Referenced by implicit_handle().

◆ NetrGetJoinableOUs2()

unsigned long __stdcall NetrGetJoinableOUs2 ( handle_t  RpcBindingHandle,
wchar_t ServerName,
wchar_t DomainNameParam,
wchar_t AccountName,
PJOINPR_ENCRYPTED_USER_PASSWORD  Password,
unsigned long OUCount,
wchar_t ***  OUs 
)

Definition at line 1177 of file rpcserver.c.

1185{
1187 return 0;
1188}

Referenced by implicit_handle(), and NetGetJoinableOUs().

◆ NetrGetJoinInformation()

unsigned long __stdcall NetrGetJoinInformation ( WKSSVC_IMPERSONATE_HANDLE  ServerName,
wchar_t **  NameBuffer,
PNETSETUP_JOIN_STATUS  BufferType 
)

Definition at line 1066 of file rpcserver.c.

1070{
1071 TRACE("NetrGetJoinInformation(%p %p %p)\n",
1072 ServerName, NameBuffer, BufferType);
1073
1074 if (NameBuffer == NULL)
1076
1077 return NetpGetJoinInformation(NameBuffer,
1078 BufferType);
1079}
NET_API_STATUS NetpGetJoinInformation(LPWSTR *NameBuffer, PNETSETUP_JOIN_STATUS BufferType)
Definition: domain.c:71
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101

Referenced by implicit_handle(), and NetGetJoinInformation().

◆ NetrJoinDomain()

unsigned long __stdcall NetrJoinDomain ( void  )

Definition at line 1026 of file rpcserver.c.

1027{
1028 TRACE("NetrJoinDomain()\n");
1029 return ERROR_NOT_SUPPORTED;
1030}

Referenced by implicit_handle().

◆ NetrJoinDomain2()

unsigned long __stdcall NetrJoinDomain2 ( handle_t  RpcBindingHandle,
wchar_t ServerName,
wchar_t DomainNameParam,
wchar_t MachineAccountOU,
wchar_t AccountName,
PJOINPR_ENCRYPTED_USER_PASSWORD  Password,
unsigned long  Options 
)

Definition at line 1095 of file rpcserver.c.

1103{
1105
1106 FIXME("NetrJoinDomain2(%p %S %S %S %S %p 0x%lx)\n",
1107 RpcBindingHandle, ServerName, DomainNameParam, MachineAccountOU,
1108 AccountName, Password, Options);
1109
1110 if (DomainNameParam == NULL)
1112
1114 {
1115 FIXME("NetrJoinDomain2: NETSETUP_JOIN_DOMAIN is not supported yet!\n");
1117 }
1118 else
1119 {
1120 status = NetpJoinWorkgroup(DomainNameParam);
1121 }
1122
1123 return status;
1124}
NET_API_STATUS NetpJoinWorkgroup(_In_ LPCWSTR lpWorkgroupName)
Definition: domain.c:52
#define FIXME(fmt,...)
Definition: precomp.h:53
#define ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:102
#define NETSETUP_JOIN_DOMAIN
Definition: lmjoin.h:16
Definition: ps.c:97
@ Password
Definition: telnetd.h:65
_In_ PWDFDEVICE_INIT _In_ PWDF_REMOVE_LOCK_OPTIONS Options
Definition: wdfdevice.h:3534

Referenced by implicit_handle(), and NetJoinDomain().

◆ NetrLogonDomainNameAdd()

unsigned long __stdcall NetrLogonDomainNameAdd ( WKSSVC_IDENTIFY_HANDLE  DomainName)

Definition at line 1002 of file rpcserver.c.

1004{
1005 TRACE("NetrLogonDomainNameAdd(%s)\n",
1006 debugstr_w(DomainName));
1007 return ERROR_NOT_SUPPORTED;
1008}
#define debugstr_w
Definition: kernel32.h:32

Referenced by implicit_handle().

◆ NetrLogonDomainNameDel()

unsigned long __stdcall NetrLogonDomainNameDel ( WKSSVC_IDENTIFY_HANDLE  DomainName)

Definition at line 1014 of file rpcserver.c.

1016{
1017 TRACE("NetrLogonDomainNameDel(%s)\n",
1018 debugstr_w(DomainName));
1019 return ERROR_NOT_SUPPORTED;
1020}

Referenced by implicit_handle().

◆ NetrMessageBufferSend()

unsigned long __stdcall NetrMessageBufferSend ( void  )

Definition at line 957 of file rpcserver.c.

958{
959 TRACE("NetrMessageBufferSend()\n");
960 return ERROR_NOT_SUPPORTED;
961}

Referenced by implicit_handle().

◆ NetrRemoveAlternateComputerName()

unsigned long __stdcall NetrRemoveAlternateComputerName ( handle_t  RpcBindingHandle,
wchar_t ServerName,
wchar_t AlternateName,
wchar_t DomainAccount,
PJOINPR_ENCRYPTED_USER_PASSWORD  EncryptedPassword,
unsigned long  Reserved 
)

Definition at line 1210 of file rpcserver.c.

1217{
1219 return 0;
1220}

Referenced by implicit_handle(), and NetRemoveAlternateComputerName().

◆ NetrRenameMachineInDomain()

unsigned long __stdcall NetrRenameMachineInDomain ( void  )

Definition at line 1056 of file rpcserver.c.

1057{
1058 TRACE("NetrRenameMachineInDomain()\n");
1059 return ERROR_NOT_SUPPORTED;
1060}

Referenced by implicit_handle().

◆ NetrRenameMachineInDomain2()

unsigned long __stdcall NetrRenameMachineInDomain2 ( handle_t  RpcBindingHandle,
wchar_t ServerName,
wchar_t MachineName,
wchar_t AccountName,
PJOINPR_ENCRYPTED_USER_PASSWORD  Password,
unsigned long  Options 
)

Definition at line 1145 of file rpcserver.c.

1152{
1154 return 0;
1155}

Referenced by implicit_handle(), and NetRenameMachineInDomain().

◆ NetrSetPrimaryComputerName()

unsigned long __stdcall NetrSetPrimaryComputerName ( handle_t  RpcBindingHandle,
wchar_t ServerName,
wchar_t PrimaryName,
wchar_t DomainAccount,
PJOINPR_ENCRYPTED_USER_PASSWORD  EncryptedPassword,
unsigned long  Reserved 
)

Definition at line 1226 of file rpcserver.c.

1233{
1235 return 0;
1236}

Referenced by implicit_handle(), and NetSetPrimaryComputerName().

◆ NetrUnjoinDomain()

unsigned long __stdcall NetrUnjoinDomain ( void  )

Definition at line 1036 of file rpcserver.c.

1037{
1038 TRACE("NetrUnjoinDomain()\n");
1039 return ERROR_NOT_SUPPORTED;
1040}

Referenced by implicit_handle().

◆ NetrUnjoinDomain2()

unsigned long __stdcall NetrUnjoinDomain2 ( handle_t  RpcBindingHandle,
wchar_t ServerName,
wchar_t AccountName,
PJOINPR_ENCRYPTED_USER_PASSWORD  Password,
unsigned long  Options 
)

Definition at line 1130 of file rpcserver.c.

1136{
1138 return 0;
1139}

Referenced by implicit_handle(), and NetUnjoinDomain().

◆ NetrUseAdd()

unsigned long __stdcall NetrUseAdd ( WKSSVC_IMPERSONATE_HANDLE  ServerName,
unsigned long  Level,
LPUSE_INFO  InfoStruct,
unsigned long ErrorParameter 
)

Definition at line 901 of file rpcserver.c.

906{
908 return 0;
909}

Referenced by implicit_handle(), and NetUseAdd().

◆ NetrUseDel()

unsigned long __stdcall NetrUseDel ( WKSSVC_IMPERSONATE_HANDLE  ServerName,
wchar_t UseName,
unsigned long  ForceLevel 
)

Definition at line 929 of file rpcserver.c.

933{
935 return 0;
936}

Referenced by implicit_handle(), and NetUseDel().

◆ NetrUseEnum()

unsigned long __stdcall NetrUseEnum ( WKSSVC_IDENTIFY_HANDLE  ServerName,
LPUSE_ENUM_STRUCT  InfoStruct,
unsigned long  PreferredMaximumLength,
unsigned long TotalEntries,
unsigned long ResumeHandle 
)

Definition at line 942 of file rpcserver.c.

948{
950 return 0;
951}

Referenced by implicit_handle(), and NetUseEnum().

◆ NetrUseGetInfo()

unsigned long __stdcall NetrUseGetInfo ( WKSSVC_IMPERSONATE_HANDLE  ServerName,
wchar_t UseName,
unsigned long  Level,
LPUSE_INFO  InfoStruct 
)

Definition at line 915 of file rpcserver.c.

920{
922 return 0;
923}

Referenced by implicit_handle(), and NetUseGetInfo().

◆ NetrValidateName()

unsigned long __stdcall NetrValidateName ( void  )

Definition at line 1046 of file rpcserver.c.

1047{
1048 TRACE("NetrValidateName()\n");
1049 return ERROR_NOT_SUPPORTED;
1050}

Referenced by implicit_handle().

◆ NetrValidateName2()

unsigned long __stdcall NetrValidateName2 ( handle_t  RpcBindingHandle,
wchar_t ServerName,
wchar_t NameToValidate,
wchar_t AccountName,
PJOINPR_ENCRYPTED_USER_PASSWORD  Password,
NETSETUP_NAME_TYPE  NameType 
)

Definition at line 1161 of file rpcserver.c.

1168{
1170 return 0;
1171}

Referenced by implicit_handle(), and NetValidateName().

◆ NetrWkstaGetInfo()

unsigned long __stdcall NetrWkstaGetInfo ( WKSSVC_IDENTIFY_HANDLE  ServerName,
unsigned long  Level,
LPWKSTA_INFO WkstaInfo 
)

Definition at line 132 of file rpcserver.c.

136{
137 WCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1];
138 DWORD dwComputerNameLength;
139 LPCWSTR pszLanRoot = L"";
140 PWKSTA_INFO pWkstaInfo = NULL;
142 LSA_HANDLE PolicyHandle;
144 ULONG LoggedOnUsers;
145 NTSTATUS NtStatus;
146 DWORD dwResult = NERR_Success;
147
148 TRACE("NetrWkstaGetInfo level %lu\n", Level);
149
150 dwComputerNameLength = MAX_COMPUTERNAME_LENGTH + 1;
151 GetComputerNameW(szComputerName, &dwComputerNameLength);
152 dwComputerNameLength++; /* include NULL terminator */
153
155 NtStatus = LsaOpenPolicy(NULL,
158 &PolicyHandle);
159 if (NtStatus != STATUS_SUCCESS)
160 {
161 WARN("LsaOpenPolicy() failed (Status 0x%08lx)\n", NtStatus);
162 return LsaNtStatusToWinError(NtStatus);
163 }
164
165 NtStatus = LsaQueryInformationPolicy(PolicyHandle,
167 (PVOID*)&DomainInfo);
168
169 LsaClose(PolicyHandle);
170
171 if (NtStatus != STATUS_SUCCESS)
172 {
173 WARN("LsaQueryInformationPolicy() failed (Status 0x%08lx)\n", NtStatus);
174 return LsaNtStatusToWinError(NtStatus);
175 }
176
177 if (Level == 102)
178 {
179 MSV1_0_ENUMUSERS_REQUEST EnumRequest;
180 PMSV1_0_ENUMUSERS_RESPONSE EnumResponseBuffer = NULL;
181 DWORD EnumResponseBufferSize = 0;
183
184 /* enumerate all currently logged-on users */
185 EnumRequest.MessageType = MsV1_0EnumerateUsers;
188 &EnumRequest,
189 sizeof(EnumRequest),
190 (PVOID*)&EnumResponseBuffer,
191 &EnumResponseBufferSize,
193 if (!NT_SUCCESS(NtStatus))
194 {
195 dwResult = RtlNtStatusToDosError(NtStatus);
196 goto done;
197 }
198
199 LoggedOnUsers = EnumResponseBuffer->NumberOfLoggedOnUsers;
200
201 LsaFreeReturnBuffer(EnumResponseBuffer);
202 }
203
204 switch (Level)
205 {
206 case 100:
207 pWkstaInfo = midl_user_allocate(sizeof(WKSTA_INFO_100));
208 if (pWkstaInfo == NULL)
209 {
210 dwResult = ERROR_NOT_ENOUGH_MEMORY;
211 break;
212 }
213
215
216 pWkstaInfo->WkstaInfo100.wki100_computername = midl_user_allocate(dwComputerNameLength * sizeof(WCHAR));
217 if (pWkstaInfo->WkstaInfo100.wki100_computername != NULL)
218 wcscpy(pWkstaInfo->WkstaInfo100.wki100_computername, szComputerName);
219
220 pWkstaInfo->WkstaInfo100.wki100_langroup = midl_user_allocate((wcslen(DomainInfo->Name.Buffer) + 1) * sizeof(WCHAR));
221 if (pWkstaInfo->WkstaInfo100.wki100_langroup != NULL)
222 wcscpy(pWkstaInfo->WkstaInfo100.wki100_langroup, DomainInfo->Name.Buffer);
223
226
227 *WkstaInfo = pWkstaInfo;
228 break;
229
230 case 101:
231 pWkstaInfo = midl_user_allocate(sizeof(WKSTA_INFO_101));
232 if (pWkstaInfo == NULL)
233 {
234 dwResult = ERROR_NOT_ENOUGH_MEMORY;
235 break;
236 }
237
239
240 pWkstaInfo->WkstaInfo101.wki101_computername = midl_user_allocate(dwComputerNameLength * sizeof(WCHAR));
241 if (pWkstaInfo->WkstaInfo101.wki101_computername != NULL)
242 wcscpy(pWkstaInfo->WkstaInfo101.wki101_computername, szComputerName);
243
244 pWkstaInfo->WkstaInfo101.wki101_langroup = midl_user_allocate((wcslen(DomainInfo->Name.Buffer) + 1) * sizeof(WCHAR));
245 if (pWkstaInfo->WkstaInfo101.wki101_langroup != NULL)
246 wcscpy(pWkstaInfo->WkstaInfo101.wki101_langroup, DomainInfo->Name.Buffer);
247
250
251 pWkstaInfo->WkstaInfo101.wki101_lanroot = midl_user_allocate((wcslen(pszLanRoot) + 1) * sizeof(WCHAR));
252 if (pWkstaInfo->WkstaInfo101.wki101_lanroot != NULL)
253 wcscpy(pWkstaInfo->WkstaInfo101.wki101_lanroot, pszLanRoot);
254
255 *WkstaInfo = pWkstaInfo;
256 break;
257
258 case 102:
259 pWkstaInfo = midl_user_allocate(sizeof(WKSTA_INFO_102));
260 if (pWkstaInfo == NULL)
261 {
262 dwResult = ERROR_NOT_ENOUGH_MEMORY;
263 break;
264 }
265
267
268 pWkstaInfo->WkstaInfo102.wki102_computername = midl_user_allocate(dwComputerNameLength * sizeof(WCHAR));
269 if (pWkstaInfo->WkstaInfo102.wki102_computername != NULL)
270 wcscpy(pWkstaInfo->WkstaInfo102.wki102_computername, szComputerName);
271
272 pWkstaInfo->WkstaInfo102.wki102_langroup = midl_user_allocate((wcslen(DomainInfo->Name.Buffer) + 1) * sizeof(WCHAR));
273 if (pWkstaInfo->WkstaInfo102.wki102_langroup != NULL)
274 wcscpy(pWkstaInfo->WkstaInfo102.wki102_langroup, DomainInfo->Name.Buffer);
275
278
279 pWkstaInfo->WkstaInfo102.wki102_lanroot = midl_user_allocate((wcslen(pszLanRoot) + 1) * sizeof(WCHAR));
280 if (pWkstaInfo->WkstaInfo102.wki102_lanroot != NULL)
281 wcscpy(pWkstaInfo->WkstaInfo102.wki102_lanroot, pszLanRoot);
282
283 pWkstaInfo->WkstaInfo102.wki102_logged_on_users = LoggedOnUsers;
284
285 *WkstaInfo = pWkstaInfo;
286 break;
287
288 case 502:
289 pWkstaInfo = midl_user_allocate(sizeof(WKSTA_INFO_502));
290 if (pWkstaInfo == NULL)
291 {
292 dwResult = ERROR_NOT_ENOUGH_MEMORY;
293 break;
294 }
295
296 CopyMemory(&pWkstaInfo->WkstaInfo502, &WkstaInfo502, sizeof(WKSTA_INFO_502));
297
298 *WkstaInfo = pWkstaInfo;
299 break;
300
301 default:
302 FIXME("Level %lu unimplemented\n", Level);
303 dwResult = ERROR_INVALID_LEVEL;
304 break;
305 }
306
307done:
308 if (DomainInfo != NULL)
309 LsaFreeMemory(DomainInfo);
310
311 return dwResult;
312}
WKSTA_INFO_502 WkstaInfo502
Definition: info.c:17
HANDLE LsaHandle
Definition: wkssvc.c:41
OSVERSIONINFOW VersionInfo
Definition: wkssvc.c:40
ULONG LsaAuthenticationPackage
Definition: wkssvc.c:42
#define WARN(fmt,...)
Definition: precomp.h:61
BOOL WINAPI GetComputerNameW(LPWSTR lpBuffer, LPDWORD lpnSize)
Definition: compname.c:446
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
NTSTATUS WINAPI LsaOpenPolicy(IN PLSA_UNICODE_STRING SystemName OPTIONAL, IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes, IN ACCESS_MASK DesiredAccess, OUT PLSA_HANDLE PolicyHandle)
Definition: lsa.c:1183
ULONG WINAPI LsaNtStatusToWinError(IN NTSTATUS Status)
Definition: lsa.c:1131
NTSTATUS WINAPI LsaQueryInformationPolicy(IN LSA_HANDLE PolicyHandle, IN POLICY_INFORMATION_CLASS InformationClass, OUT PVOID *Buffer)
Definition: lsa.c:1473
NTSTATUS WINAPI LsaFreeMemory(IN PVOID Buffer)
Definition: lsa.c:701
NTSTATUS WINAPI LsaClose(IN LSA_HANDLE ObjectHandle)
Definition: lsa.c:194
unsigned long DWORD
Definition: ntddk_ex.h:95
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
VOID NTAPI ProtocolStatus(NDIS_HANDLE BindingContext, NDIS_STATUS GenerelStatus, PVOID StatusBuffer, UINT StatusBufferSize)
Called by NDIS when the underlying driver has changed state.
Definition: lan.c:461
#define PLATFORM_ID_NT
Definition: lmcons.h:60
@ PolicyPrimaryDomainInformation
Definition: ntsecapi.h:245
@ MsV1_0EnumerateUsers
Definition: ntsecapi.h:220
NTSTATUS NTAPI LsaCallAuthenticationPackage(HANDLE, ULONG, PVOID, ULONG, PVOID *, PULONG, PNTSTATUS)
#define POLICY_VIEW_LOCAL_INFORMATION
Definition: ntsecapi.h:61
NTSTATUS NTAPI LsaFreeReturnBuffer(PVOID)
#define L(x)
Definition: ntvdm.h:50
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
#define midl_user_allocate
Definition: rpc.h:40
#define STATUS_SUCCESS
Definition: shellext.h:65
MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType
Definition: ntmsv1_0.h:10
ULONG dwMinorVersion
Definition: rtltypes.h:248
ULONG dwMajorVersion
Definition: rtltypes.h:247
LSA_UNICODE_STRING Name
Definition: ntsecapi.h:570
DWORD wki100_ver_major
Definition: lmwksta.h:68
LPWSTR wki100_langroup
Definition: lmwksta.h:67
DWORD wki100_ver_minor
Definition: lmwksta.h:69
LPWSTR wki100_computername
Definition: lmwksta.h:66
DWORD wki100_platform_id
Definition: lmwksta.h:65
DWORD wki101_ver_minor
Definition: lmwksta.h:76
DWORD wki101_platform_id
Definition: lmwksta.h:72
LPWSTR wki101_lanroot
Definition: lmwksta.h:77
LPWSTR wki101_computername
Definition: lmwksta.h:73
LPWSTR wki101_langroup
Definition: lmwksta.h:74
DWORD wki101_ver_major
Definition: lmwksta.h:75
LPWSTR wki102_lanroot
Definition: lmwksta.h:85
DWORD wki102_ver_minor
Definition: lmwksta.h:84
DWORD wki102_logged_on_users
Definition: lmwksta.h:86
LPWSTR wki102_langroup
Definition: lmwksta.h:82
DWORD wki102_platform_id
Definition: lmwksta.h:80
DWORD wki102_ver_major
Definition: lmwksta.h:83
LPWSTR wki102_computername
Definition: lmwksta.h:81
WKSTA_INFO_102 WkstaInfo102
Definition: wkssvc.idl:226
WKSTA_INFO_101 WkstaInfo101
Definition: wkssvc.idl:225
WKSTA_INFO_100 WkstaInfo100
Definition: wkssvc.idl:224
WKSTA_INFO_502 WkstaInfo502
Definition: wkssvc.idl:227
#define ZeroMemory
Definition: winbase.h:1737
#define CopyMemory
Definition: winbase.h:1735
#define MAX_COMPUTERNAME_LENGTH
Definition: winbase.h:269
#define ERROR_INVALID_LEVEL
Definition: winerror.h:196
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR Level
Definition: wmitypes.h:56
__wchar_t WCHAR
Definition: xmlstorage.h:180
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

Referenced by implicit_handle(), and NetWkstaGetInfo().

◆ NetrWkstaSetInfo()

unsigned long __stdcall NetrWkstaSetInfo ( WKSSVC_IDENTIFY_HANDLE  ServerName,
unsigned long  Level,
LPWKSTA_INFO  WkstaInfo,
unsigned long ErrorParameter 
)

Definition at line 318 of file rpcserver.c.

323{
324 DWORD dwErrParam = 0;
325 DWORD dwResult = NERR_Success;
326
327 TRACE("NetrWkstaSetInfo(%lu %p %p)\n",
328 Level, WkstaInfo, ErrorParameter);
329
330 switch (Level)
331 {
332 case 502:
333 if (WkstaInfo->WkstaInfo502.wki502_keep_conn >= 1 && WkstaInfo->WkstaInfo502.wki502_keep_conn <= 65535)
334 {
336 }
337 else
338 {
339 dwErrParam = WKSTA_KEEPCONN_PARMNUM;
340 dwResult = ERROR_INVALID_PARAMETER;
341 }
342
343 if (dwResult == NERR_Success)
344 {
345 if (WkstaInfo->WkstaInfo502.wki502_max_cmds >= 50 && WkstaInfo->WkstaInfo502.wki502_max_cmds <= 65535)
346 {
348 }
349 else
350 {
351 dwErrParam = WKSTA_MAXCMDS_PARMNUM;
352 dwResult = ERROR_INVALID_PARAMETER;
353 }
354 }
355
356 if (dwResult == NERR_Success)
357 {
358 if (WkstaInfo->WkstaInfo502.wki502_sess_timeout >= 60 && WkstaInfo->WkstaInfo502.wki502_sess_timeout <= 65535)
359 {
361 }
362 else
363 {
364 dwErrParam = WKSTA_SESSTIMEOUT_PARMNUM;
365 dwResult = ERROR_INVALID_PARAMETER;
366 }
367 }
368
369 if (dwResult == NERR_Success)
370 {
371 if (WkstaInfo->WkstaInfo502.wki502_dormant_file_limit != 0)
372 {
374 }
375 else
376 {
378 dwResult = ERROR_INVALID_PARAMETER;
379 }
380 }
381 break;
382
383 case 1013:
384 if (WkstaInfo->WkstaInfo1013.wki1013_keep_conn >= 1 && WkstaInfo->WkstaInfo1013.wki1013_keep_conn <= 65535)
385 {
387 }
388 else
389 {
390 dwErrParam = WKSTA_KEEPCONN_PARMNUM;
391 dwResult = ERROR_INVALID_PARAMETER;
392 }
393 break;
394
395 case 1018:
396 if (WkstaInfo->WkstaInfo1018.wki1018_sess_timeout >= 60 && WkstaInfo->WkstaInfo1018.wki1018_sess_timeout <= 65535)
397 {
399 }
400 else
401 {
402 dwErrParam = WKSTA_SESSTIMEOUT_PARMNUM;
403 dwResult = ERROR_INVALID_PARAMETER;
404 }
405 break;
406
407 case 1046:
408 if (WkstaInfo->WkstaInfo1046.wki1046_dormant_file_limit != 0)
409 {
411 }
412 else
413 {
415 dwResult = ERROR_INVALID_PARAMETER;
416 }
417 break;
418
419 default:
420 ERR("Invalid Level %lu\n", Level);
421 dwResult = ERROR_INVALID_LEVEL;
422 break;
423 }
424
425 /* Save the workstation in the registry */
426 if (dwResult == NERR_Success)
427 {
429
430 /* FIXME: Notify the redirector */
431 }
432
433 if ((dwResult == ERROR_INVALID_PARAMETER) && (ErrorParameter != NULL))
434 *ErrorParameter = dwErrParam;
435
436 return dwResult;
437}
VOID SaveWorkstationInfo(_In_ DWORD Level)
Definition: info.c:478
#define WKSTA_KEEPCONN_PARMNUM
Definition: precomp.h:29
#define WKSTA_MAXCMDS_PARMNUM
Definition: precomp.h:30
#define WKSTA_DORMANTFILELIMIT_PARMNUM
Definition: precomp.h:32
#define WKSTA_SESSTIMEOUT_PARMNUM
Definition: precomp.h:31
#define ERR(fmt,...)
Definition: precomp.h:57
DWORD wki1013_keep_conn
Definition: lmwksta.h:176
DWORD wki1018_sess_timeout
Definition: lmwksta.h:177
DWORD wki1046_dormant_file_limit
Definition: lmwksta.h:185
DWORD wki502_dormant_file_limit
Definition: lmwksta.h:148
DWORD wki502_keep_conn
Definition: lmwksta.h:137
DWORD wki502_sess_timeout
Definition: lmwksta.h:139
DWORD wki502_max_cmds
Definition: lmwksta.h:138
WKSTA_INFO_1046 WkstaInfo1046
Definition: wkssvc.idl:230
WKSTA_INFO_1013 WkstaInfo1013
Definition: wkssvc.idl:228
WKSTA_INFO_1018 WkstaInfo1018
Definition: wkssvc.idl:229

Referenced by implicit_handle(), and NetWkstaSetInfo().

◆ NetrWkstaTransportAdd()

unsigned long __stdcall NetrWkstaTransportAdd ( WKSSVC_IDENTIFY_HANDLE  ServerName,
unsigned long  Level,
LPWKSTA_TRANSPORT_INFO_0  TransportInfo,
unsigned long ErrorParameter 
)

Definition at line 874 of file rpcserver.c.

879{
881 return 0;
882}

Referenced by implicit_handle(), and NetWkstaTransportAdd().

◆ NetrWkstaTransportDel()

unsigned long __stdcall NetrWkstaTransportDel ( WKSSVC_IDENTIFY_HANDLE  ServerName,
wchar_t TransportName,
unsigned long  ForceLevel 
)

Definition at line 888 of file rpcserver.c.

892{
894 return 0;
895}

Referenced by implicit_handle(), and NetWkstaTransportDel().

◆ NetrWkstaTransportEnum()

unsigned long __stdcall NetrWkstaTransportEnum ( WKSSVC_IDENTIFY_HANDLE  ServerName,
LPWKSTA_TRANSPORT_ENUM_STRUCT  TransportInfo,
unsigned long  PreferredMaximumLength,
unsigned long TotalEntries,
unsigned long ResumeHandle 
)

Definition at line 859 of file rpcserver.c.

865{
867 return 0;
868}

Referenced by implicit_handle().

◆ NetrWkstaUserEnum()

unsigned long __stdcall NetrWkstaUserEnum ( WKSSVC_IDENTIFY_HANDLE  ServerName,
LPWKSTA_USER_ENUM_STRUCT  UserInfo,
unsigned long  PreferredMaximumLength,
unsigned long TotalEntries,
unsigned long ResumeHandle 
)

Definition at line 443 of file rpcserver.c.

449{
450 MSV1_0_ENUMUSERS_REQUEST EnumRequest;
451 PMSV1_0_ENUMUSERS_RESPONSE EnumResponseBuffer = NULL;
452 MSV1_0_GETUSERINFO_REQUEST UserInfoRequest;
453 PMSV1_0_GETUSERINFO_RESPONSE UserInfoResponseBuffer = NULL;
454 PMSV1_0_GETUSERINFO_RESPONSE *UserInfoArray = NULL;
455 DWORD EnumResponseBufferSize = 0;
456 DWORD UserInfoResponseBufferSize = 0;
458 ULONG i, start, count;
459 PLUID pLogonId;
460 PULONG pEnumHandle;
461 DWORD dwResult = NERR_Success;
462
463 PWKSTA_USER_INFO_0 pUserInfo0 = NULL;
464 PWKSTA_USER_INFO_1 pUserInfo1 = NULL;
465
466 TRACE("NetrWkstaUserEnum(%p %p 0x%lx %p %p)\n",
467 ServerName, UserInfo, PreferredMaximumLength, TotalEntries, ResumeHandle);
468
469 if (UserInfo->Level > 1)
470 {
471 ERR("Invalid Level %lu\n", UserInfo->Level);
472 return ERROR_INVALID_LEVEL;
473 }
474
475 /* Enumerate all currently logged-on users */
476 EnumRequest.MessageType = MsV1_0EnumerateUsers;
479 &EnumRequest,
480 sizeof(EnumRequest),
481 (PVOID*)&EnumResponseBuffer,
482 &EnumResponseBufferSize,
484
485 TRACE("LsaCallAuthenticationPackage Status 0x%08lx ResponseBufferSize %lu\n", Status, EnumResponseBufferSize);
486 if (!NT_SUCCESS(Status))
487 {
488 dwResult = RtlNtStatusToDosError(Status);
489 goto done;
490 }
491
492 TRACE("LoggedOnUsers: %lu\n", EnumResponseBuffer->NumberOfLoggedOnUsers);
493 TRACE("ResponseBuffer: 0x%p\n", EnumResponseBuffer);
494 TRACE("LogonIds: 0x%p\n", EnumResponseBuffer->LogonIds);
495 TRACE("EnumHandles: 0x%p\n", EnumResponseBuffer->EnumHandles);
496 if (EnumResponseBuffer->NumberOfLoggedOnUsers > 0)
497 {
498 pLogonId = EnumResponseBuffer->LogonIds;
499 pEnumHandle = EnumResponseBuffer->EnumHandles;
500 TRACE("pLogonId: 0x%p\n", pLogonId);
501 TRACE("pEnumHandle: 0x%p\n", pEnumHandle);
502
503 UserInfoArray = RtlAllocateHeap(RtlGetProcessHeap(),
505 EnumResponseBuffer->NumberOfLoggedOnUsers * sizeof(PMSV1_0_GETUSERINFO_RESPONSE));
506 if (UserInfoArray == NULL)
507 {
508 dwResult = ERROR_NOT_ENOUGH_MEMORY;
509 goto done;
510 }
511
512 for (i = 0; i < EnumResponseBuffer->NumberOfLoggedOnUsers; i++)
513 {
514 TRACE("Logon %lu: 0x%08lx %lu\n", i, pLogonId->LowPart, *pEnumHandle);
515
516 UserInfoRequest.MessageType = MsV1_0GetUserInfo;
517 UserInfoRequest.LogonId = *pLogonId;
520 &UserInfoRequest,
521 sizeof(UserInfoRequest),
522 (PVOID*)&UserInfoResponseBuffer,
523 &UserInfoResponseBufferSize,
525 TRACE("LsaCallAuthenticationPackage:MsV1_0GetUserInfo Status 0x%08lx ResponseBufferSize %lu\n", Status, UserInfoResponseBufferSize);
526 if (!NT_SUCCESS(Status))
527 {
528 dwResult = RtlNtStatusToDosError(Status);
529 goto done;
530 }
531
532 UserInfoArray[i] = UserInfoResponseBuffer;
533
534 TRACE("UserName: %wZ\n", &UserInfoArray[i]->UserName);
535 TRACE("LogonDomain: %wZ\n", &UserInfoArray[i]->LogonDomainName);
536 TRACE("LogonServer: %wZ\n", &UserInfoArray[i]->LogonServer);
537
538 pLogonId++;
539 pEnumHandle++;
540 }
541
542 if (PreferredMaximumLength == MAX_PREFERRED_LENGTH)
543 {
544 start = 0;
545 count = EnumResponseBuffer->NumberOfLoggedOnUsers;
546 }
547 else
548 {
549 FIXME("Calculate the start index and the number of matching array entries!");
551 goto done;
552 }
553
554 switch (UserInfo->Level)
555 {
556 case 0:
557 pUserInfo0 = midl_user_allocate(count * sizeof(WKSTA_USER_INFO_0));
558 if (pUserInfo0 == NULL)
559 {
560 ERR("\n");
561 dwResult = ERROR_NOT_ENOUGH_MEMORY;
562 break;
563 }
564
565 ZeroMemory(pUserInfo0, count * sizeof(WKSTA_USER_INFO_0));
566
567 for (i = 0; i < 0 + count; i++)
568 {
569 pUserInfo0[i].wkui0_username = midl_user_allocate(UserInfoArray[start + i]->UserName.Length + sizeof(WCHAR));
570 if (pUserInfo0[i].wkui0_username == NULL)
571 {
572 ERR("\n");
573 dwResult = ERROR_NOT_ENOUGH_MEMORY;
574 break;
575 }
576
577 ZeroMemory(pUserInfo0[i].wkui0_username, UserInfoArray[start + i]->UserName.Length + sizeof(WCHAR));
578 CopyMemory(pUserInfo0[i].wkui0_username, UserInfoArray[start + i]->UserName.Buffer, UserInfoArray[start + i]->UserName.Length);
579 }
580
582 UserInfo->WkstaUserInfo.Level0.Buffer = pUserInfo0;
583 *TotalEntries = EnumResponseBuffer->NumberOfLoggedOnUsers;
584 *ResumeHandle = 0;
585 break;
586
587 case 1:
588 pUserInfo1 = midl_user_allocate(count * sizeof(WKSTA_USER_INFO_1));
589 if (pUserInfo1 == NULL)
590 {
591 ERR("\n");
592 dwResult = ERROR_NOT_ENOUGH_MEMORY;
593 break;
594 }
595
596 ZeroMemory(pUserInfo1, count * sizeof(WKSTA_USER_INFO_1));
597
598 for (i = 0; i < 0 + count; i++)
599 {
600 pUserInfo1[i].wkui1_username = midl_user_allocate(UserInfoArray[start + i]->UserName.Length + sizeof(WCHAR));
601 if (pUserInfo1[i].wkui1_username == NULL)
602 {
603 ERR("\n");
604 dwResult = ERROR_NOT_ENOUGH_MEMORY;
605 break;
606 }
607
608 ZeroMemory(pUserInfo1[i].wkui1_username, UserInfoArray[start + i]->UserName.Length + sizeof(WCHAR));
609 CopyMemory(pUserInfo1[i].wkui1_username, UserInfoArray[start + i]->UserName.Buffer, UserInfoArray[start + i]->UserName.Length);
610
611 pUserInfo1[i].wkui1_logon_domain = midl_user_allocate(UserInfoArray[start + i]->LogonDomainName.Length + sizeof(WCHAR));
612 if (pUserInfo1[i].wkui1_logon_domain == NULL)
613 {
614 ERR("\n");
615 dwResult = ERROR_NOT_ENOUGH_MEMORY;
616 break;
617 }
618
619 ZeroMemory(pUserInfo1[i].wkui1_logon_domain, UserInfoArray[start + i]->LogonDomainName.Length + sizeof(WCHAR));
620 CopyMemory(pUserInfo1[i].wkui1_logon_domain, UserInfoArray[start + i]->LogonDomainName.Buffer, UserInfoArray[start + i]->LogonDomainName.Length);
621
622 // FIXME: wkui1_oth_domains
623
624 pUserInfo1[i].wkui1_logon_server = midl_user_allocate(UserInfoArray[start + i]->LogonServer.Length + sizeof(WCHAR));
625 if (pUserInfo1[i].wkui1_logon_server == NULL)
626 {
627 ERR("\n");
628 dwResult = ERROR_NOT_ENOUGH_MEMORY;
629 break;
630 }
631
632 ZeroMemory(pUserInfo1[i].wkui1_logon_server, UserInfoArray[start + i]->LogonServer.Length + sizeof(WCHAR));
633 CopyMemory(pUserInfo1[i].wkui1_logon_server, UserInfoArray[start + i]->LogonServer.Buffer, UserInfoArray[start + i]->LogonServer.Length);
634 }
635
637 UserInfo->WkstaUserInfo.Level1.Buffer = pUserInfo1;
638 *TotalEntries = EnumResponseBuffer->NumberOfLoggedOnUsers;
639 *ResumeHandle = 0;
640 break;
641
642 break;
643 }
644 }
645 else
646 {
647 if (UserInfo->Level == 0)
648 {
649 UserInfo->WkstaUserInfo.Level0.Buffer = NULL;
650 UserInfo->WkstaUserInfo.Level0.EntriesRead = 0;
651 }
652 else
653 {
654 UserInfo->WkstaUserInfo.Level1.Buffer = NULL;
655 UserInfo->WkstaUserInfo.Level1.EntriesRead = 0;
656 }
657
658 *TotalEntries = 0;
659 dwResult = NERR_Success;
660 }
661
662done:
663 if (UserInfoArray !=NULL)
664 {
665
666 for (i = 0; i < EnumResponseBuffer->NumberOfLoggedOnUsers; i++)
667 {
668 if (UserInfoArray[i]->UserName.Buffer != NULL)
669 LsaFreeReturnBuffer(UserInfoArray[i]->UserName.Buffer);
670
671 if (UserInfoArray[i]->LogonDomainName.Buffer != NULL)
672 LsaFreeReturnBuffer(UserInfoArray[i]->LogonDomainName.Buffer);
673
674 if (UserInfoArray[i]->LogonServer.Buffer != NULL)
675 LsaFreeReturnBuffer(UserInfoArray[i]->LogonServer.Buffer);
676
677 LsaFreeReturnBuffer(UserInfoArray[i]);
678 }
679
680 RtlFreeHeap(RtlGetProcessHeap(), 0, UserInfoArray);
681 }
682
683 if (EnumResponseBuffer != NULL)
684 LsaFreeReturnBuffer(EnumResponseBuffer);
685
686 return dwResult;
687}
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:590
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:608
Status
Definition: gdiplustypes.h:25
GLuint start
Definition: gl.h:1545
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define MAX_PREFERRED_LENGTH
Definition: lmcons.h:48
@ MsV1_0GetUserInfo
Definition: ntsecapi.h:221
DWORD LowPart
MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType
Definition: ntmsv1_0.h:23
unsigned long Level
Definition: wkssvc.idl:328
union _WKSTA_USER_ENUM_STRUCT::_WKSTA_USER_ENUM_UNION WkstaUserInfo
unsigned long EntriesRead
Definition: wkssvc.idl:305
LPWKSTA_USER_INFO_0 Buffer
Definition: wkssvc.idl:306
LPWSTR wkui0_username
Definition: lmwksta.h:202
unsigned long EntriesRead
Definition: wkssvc.idl:311
LPWKSTA_USER_INFO_1 Buffer
Definition: wkssvc.idl:312
LPWSTR wkui1_username
Definition: lmwksta.h:204
LPWSTR wkui1_logon_domain
Definition: lmwksta.h:205
LPWSTR wkui1_logon_server
Definition: lmwksta.h:207
uint32_t * PULONG
Definition: typedefs.h:59
WKSTA_USER_INFO_0_CONTAINER Level0
Definition: wkssvc.idl:331
WKSTA_USER_INFO_1_CONTAINER Level1
Definition: wkssvc.idl:332

Referenced by implicit_handle(), and NetWkstaUserEnum().

◆ NetrWkstaUserGetInfo()

unsigned long __stdcall NetrWkstaUserGetInfo ( WKSSVC_IDENTIFY_HANDLE  Unused,
unsigned long  Level,
LPWKSTA_USER_INFO UserInfo 
)

Definition at line 693 of file rpcserver.c.

697{
698 MSV1_0_GETUSERINFO_REQUEST UserInfoRequest;
699 PMSV1_0_GETUSERINFO_RESPONSE UserInfoResponseBuffer = NULL;
700 DWORD UserInfoResponseBufferSize = 0;
703 PWKSTA_USER_INFO pUserInfo;
704 DWORD dwResult = NERR_Success;
705
706 TRACE("NetrWkstaUserGetInfo(%s, %d, %p)\n", debugstr_w(Unused), Level, UserInfo);
707
708 if (Unused != NULL)
710
711 if (Level > 1 && Level != 1101)
712 return ERROR_INVALID_LEVEL;
713
714 if (Level != 1101)
715 {
716 dwResult = NetpGetClientLogonId(&LogonId);
717 if (dwResult != NERR_Success)
718 {
719 ERR("NetpGetClientLogonId() failed (%u)\n", dwResult);
720 return dwResult;
721 }
722
723 TRACE("LogonId: 0x%08lx\n", LogonId.LowPart);
724
725 UserInfoRequest.MessageType = MsV1_0GetUserInfo;
726 UserInfoRequest.LogonId = LogonId;
729 &UserInfoRequest,
730 sizeof(UserInfoRequest),
731 (PVOID*)&UserInfoResponseBuffer,
732 &UserInfoResponseBufferSize,
734 TRACE("LsaCallAuthenticationPackage:MsV1_0GetUserInfo Status 0x%08lx ResponseBufferSize %lu\n", Status, UserInfoResponseBufferSize);
735 if (!NT_SUCCESS(Status))
736 {
737 ERR("\n");
739 }
740
741 TRACE("UserName: %wZ\n", &UserInfoResponseBuffer->UserName);
742 TRACE("LogonDomain: %wZ\n", &UserInfoResponseBuffer->LogonDomainName);
743 TRACE("LogonServer: %wZ\n", &UserInfoResponseBuffer->LogonServer);
744 }
745
746 switch (Level)
747 {
748 case 0:
749 pUserInfo = midl_user_allocate(sizeof(WKSTA_USER_INFO_0));
750 if (pUserInfo == NULL)
751 {
752 ERR("\n");
753 dwResult = ERROR_NOT_ENOUGH_MEMORY;
754 break;
755 }
756
757 ZeroMemory(pUserInfo, sizeof(WKSTA_USER_INFO_0));
758
759 /* User Name */
760 pUserInfo->UserInfo0.wkui0_username = midl_user_allocate(UserInfoResponseBuffer->UserName.Length + sizeof(WCHAR));
761 if (pUserInfo->UserInfo0.wkui0_username == NULL)
762 {
763 ERR("\n");
764 dwResult = ERROR_NOT_ENOUGH_MEMORY;
765 break;
766 }
767
768 ZeroMemory(pUserInfo->UserInfo0.wkui0_username, UserInfoResponseBuffer->UserName.Length + sizeof(WCHAR));
769 CopyMemory(pUserInfo->UserInfo0.wkui0_username, UserInfoResponseBuffer->UserName.Buffer, UserInfoResponseBuffer->UserName.Length);
770
771 *UserInfo = pUserInfo;
772 break;
773
774 case 1:
775 pUserInfo = midl_user_allocate(sizeof(WKSTA_USER_INFO_1));
776 if (pUserInfo == NULL)
777 {
778 ERR("\n");
779 dwResult = ERROR_NOT_ENOUGH_MEMORY;
780 break;
781 }
782
783 ZeroMemory(pUserInfo, sizeof(WKSTA_USER_INFO_1));
784
785 /* User Name */
786 pUserInfo->UserInfo1.wkui1_username = midl_user_allocate(UserInfoResponseBuffer->UserName.Length + sizeof(WCHAR));
787 if (pUserInfo->UserInfo1.wkui1_username == NULL)
788 {
789 ERR("\n");
790 dwResult = ERROR_NOT_ENOUGH_MEMORY;
791 break;
792 }
793
794 ZeroMemory(pUserInfo->UserInfo1.wkui1_username, UserInfoResponseBuffer->UserName.Length + sizeof(WCHAR));
795 CopyMemory(pUserInfo->UserInfo1.wkui1_username, UserInfoResponseBuffer->UserName.Buffer, UserInfoResponseBuffer->UserName.Length);
796
797 /* Logon Domain Name */
798 pUserInfo->UserInfo1.wkui1_logon_domain = midl_user_allocate(UserInfoResponseBuffer->LogonDomainName.Length + sizeof(WCHAR));
799 if (pUserInfo->UserInfo1.wkui1_logon_domain == NULL)
800 {
801 ERR("\n");
802 dwResult = ERROR_NOT_ENOUGH_MEMORY;
803 break;
804 }
805
806 ZeroMemory(pUserInfo->UserInfo1.wkui1_logon_domain, UserInfoResponseBuffer->LogonDomainName.Length + sizeof(WCHAR));
807 CopyMemory(pUserInfo->UserInfo1.wkui1_logon_domain, UserInfoResponseBuffer->LogonDomainName.Buffer, UserInfoResponseBuffer->LogonDomainName.Length);
808
809 /* FIXME: wkui1_oth_domains */
810
811 /* Logon Server */
812 pUserInfo->UserInfo1.wkui1_logon_server = midl_user_allocate(UserInfoResponseBuffer->LogonServer.Length + sizeof(WCHAR));
813 if (pUserInfo->UserInfo1.wkui1_logon_server == NULL)
814 {
815 ERR("\n");
816 dwResult = ERROR_NOT_ENOUGH_MEMORY;
817 break;
818 }
819
820 ZeroMemory(pUserInfo->UserInfo1.wkui1_logon_server, UserInfoResponseBuffer->LogonServer.Length + sizeof(WCHAR));
821 CopyMemory(pUserInfo->UserInfo1.wkui1_logon_server, UserInfoResponseBuffer->LogonServer.Buffer, UserInfoResponseBuffer->LogonServer.Length);
822
823 *UserInfo = pUserInfo;
824 break;
825
826 case 1101:
827 /* FIXME: wkui1101_oth_domains */
828 break;
829
830 default:
831 ERR("\n");
832 break;
833 }
834
835 if (UserInfoResponseBuffer)
836 LsaFreeReturnBuffer(UserInfoResponseBuffer);
837
838 return dwResult;
839}
static NET_API_STATUS NetpGetClientLogonId(_Out_ PLUID LogonId)
Definition: rpcserver.c:82
#define Unused(x)
Definition: atlwin.h:28
UNICODE_STRING UserName
Definition: ntmsv1_0.h:31
UNICODE_STRING LogonServer
Definition: ntmsv1_0.h:33
UNICODE_STRING LogonDomainName
Definition: ntmsv1_0.h:32
WKSTA_USER_INFO_0 UserInfo0
Definition: wkssvc.idl:194
WKSTA_USER_INFO_1 UserInfo1
Definition: wkssvc.idl:195

Referenced by implicit_handle(), and NetWkstaUserGetInfo().

◆ NetrWkstaUserSetInfo()

unsigned long __stdcall NetrWkstaUserSetInfo ( WKSSVC_IDENTIFY_HANDLE  Unused,
unsigned long  Level,
LPWKSTA_USER_INFO  UserInfo,
unsigned long ErrorParameter 
)

Definition at line 845 of file rpcserver.c.

850{
852 return 0;
853}

Referenced by implicit_handle(), and NetWkstaUserSetInfo().

◆ NetrWorkstationStatisticsGet()

unsigned long __stdcall NetrWorkstationStatisticsGet ( WKSSVC_IDENTIFY_HANDLE  ServerName,
wchar_t ServiceName,
unsigned long  Level,
unsigned long  Options,
LPSTAT_WORKSTATION_0 Buffer 
)

Definition at line 967 of file rpcserver.c.

973{
974 PSTAT_WORKSTATION_0 pStatBuffer;
975
976 TRACE("NetrWorkstationStatisticsGet(%p %p %lu 0x%lx %p)\n",
977 ServerName, ServiceName, Level, Options, Buffer);
978
979 if (Level != 0)
980 return ERROR_INVALID_LEVEL;
981
982 if (Options != 0)
984
985 pStatBuffer = midl_user_allocate(sizeof(STAT_WORKSTATION_0));
986 if (pStatBuffer == NULL)
988
989 ZeroMemory(pStatBuffer, sizeof(STAT_WORKSTATION_0));
990
991 // FIXME: Return the actual statistcs data!
992
993 *Buffer = pStatBuffer;
994
995 return NERR_Success;
996}
static WCHAR ServiceName[]
Definition: browser.c:19
Definition: bufpool.h:45

Referenced by implicit_handle(), and NetStatisticsGet().

◆ RpcThreadRoutine()

DWORD WINAPI RpcThreadRoutine ( LPVOID  lpParameter)

Definition at line 39 of file rpcserver.c.

41{
43
44 Status = RpcServerUseProtseqEpW(L"ncacn_np", 20, L"\\pipe\\wkssvc", NULL);
45 if (Status != RPC_S_OK)
46 {
47 ERR("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);
48 return 0;
49 }
50
51 Status = RpcServerRegisterIf(wkssvc_v1_0_s_ifspec, NULL, NULL);
52 if (Status != RPC_S_OK)
53 {
54 ERR("RpcServerRegisterIf() failed (Status %lx)\n", Status);
55 return 0;
56 }
57
59 if (Status != RPC_S_OK)
60 {
61 ERR("RpcServerListen() failed (Status %lx)\n", Status);
62 }
63
64 return 0;
65}
#define FALSE
Definition: types.h:117
RPC_STATUS WINAPI RpcServerListen(UINT MinimumCallThreads, UINT MaxCalls, UINT DontWait)
Definition: rpc_server.c:1520
RPC_STATUS WINAPI RpcServerRegisterIf(RPC_IF_HANDLE IfSpec, UUID *MgrTypeUuid, RPC_MGR_EPV *MgrEpv)
Definition: rpc_server.c:1116
RPC_STATUS WINAPI RpcServerUseProtseqEpW(RPC_WSTR Protseq, UINT MaxCalls, RPC_WSTR Endpoint, LPVOID SecurityDescriptor)
Definition: rpc_server.c:927
#define RPC_C_LISTEN_MAX_CALLS_DEFAULT
Definition: rpcdce.h:122
#define RPC_S_OK
Definition: rpcnterr.h:22
long RPC_STATUS
Definition: rpc.h:48

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( wkssvc  )