ReactOS 0.4.16-dev-1946-g52006dd
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 (_In_ WKSSVC_IDENTIFY_HANDLE ServerName, _In_ unsigned long Level, _Out_ 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
#define NtCurrentThread()
Definition: winternl.h:5364
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:2475
RPC_STATUS WINAPI RpcRevertToSelf(void)
Definition: rpc_binding.c:1445
RPC_STATUS WINAPI RpcImpersonateClient(RPC_BINDING_HANDLE BindingHandle)
Definition: rpc_binding.c:1038
#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:940
@ TokenStatistics
Definition: setypes.h:987

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 1252 of file rpcserver.c.

1259{
1261 return 0;
1262}
#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 1300 of file rpcserver.c.

1305{
1307 return 0;
1308}

Referenced by implicit_handle(), and NetEnumerateComputerNames().

◆ NetrGetJoinableOUs()

unsigned long __stdcall NetrGetJoinableOUs ( void  )

Definition at line 1143 of file rpcserver.c.

1144{
1145 TRACE("NetrGetJoinableOUs()\n");
1146 return ERROR_NOT_SUPPORTED;
1147}
#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 1235 of file rpcserver.c.

1243{
1245 return 0;
1246}

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 1124 of file rpcserver.c.

1128{
1129 TRACE("NetrGetJoinInformation(%p %p %p)\n",
1130 ServerName, NameBuffer, BufferType);
1131
1132 if (NameBuffer == NULL)
1134
1135 return NetpGetJoinInformation(NameBuffer,
1136 BufferType);
1137}
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 1084 of file rpcserver.c.

1085{
1086 TRACE("NetrJoinDomain()\n");
1087 return ERROR_NOT_SUPPORTED;
1088}

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 1153 of file rpcserver.c.

1161{
1163
1164 FIXME("NetrJoinDomain2(%p %S %S %S %S %p 0x%lx)\n",
1165 RpcBindingHandle, ServerName, DomainNameParam, MachineAccountOU,
1166 AccountName, Password, Options);
1167
1168 if (DomainNameParam == NULL)
1170
1172 {
1173 FIXME("NetrJoinDomain2: NETSETUP_JOIN_DOMAIN is not supported yet!\n");
1175 }
1176 else
1177 {
1178 status = NetpJoinWorkgroup(DomainNameParam);
1179 }
1180
1181 return status;
1182}
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:67
_In_ PWDFDEVICE_INIT _In_ PWDF_REMOVE_LOCK_OPTIONS Options
Definition: wdfdevice.h:3540

Referenced by implicit_handle(), and NetJoinDomain().

◆ NetrLogonDomainNameAdd()

unsigned long __stdcall NetrLogonDomainNameAdd ( WKSSVC_IDENTIFY_HANDLE  DomainName)

Definition at line 1060 of file rpcserver.c.

1062{
1063 TRACE("NetrLogonDomainNameAdd(%s)\n",
1064 debugstr_w(DomainName));
1065 return ERROR_NOT_SUPPORTED;
1066}
#define debugstr_w
Definition: kernel32.h:32

Referenced by implicit_handle().

◆ NetrLogonDomainNameDel()

unsigned long __stdcall NetrLogonDomainNameDel ( WKSSVC_IDENTIFY_HANDLE  DomainName)

Definition at line 1072 of file rpcserver.c.

1074{
1075 TRACE("NetrLogonDomainNameDel(%s)\n",
1076 debugstr_w(DomainName));
1077 return ERROR_NOT_SUPPORTED;
1078}

Referenced by implicit_handle().

◆ NetrMessageBufferSend()

unsigned long __stdcall NetrMessageBufferSend ( void  )

Definition at line 998 of file rpcserver.c.

999{
1000 TRACE("NetrMessageBufferSend()\n");
1001 return ERROR_NOT_SUPPORTED;
1002}

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 1268 of file rpcserver.c.

1275{
1277 return 0;
1278}

Referenced by implicit_handle(), and NetRemoveAlternateComputerName().

◆ NetrRenameMachineInDomain()

unsigned long __stdcall NetrRenameMachineInDomain ( void  )

Definition at line 1114 of file rpcserver.c.

1115{
1116 TRACE("NetrRenameMachineInDomain()\n");
1117 return ERROR_NOT_SUPPORTED;
1118}

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 1203 of file rpcserver.c.

1210{
1212 return 0;
1213}

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 1284 of file rpcserver.c.

1291{
1293 return 0;
1294}

Referenced by implicit_handle(), and NetSetPrimaryComputerName().

◆ NetrUnjoinDomain()

unsigned long __stdcall NetrUnjoinDomain ( void  )

Definition at line 1094 of file rpcserver.c.

1095{
1096 TRACE("NetrUnjoinDomain()\n");
1097 return ERROR_NOT_SUPPORTED;
1098}

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 1188 of file rpcserver.c.

1194{
1196 return 0;
1197}

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 942 of file rpcserver.c.

947{
949 return 0;
950}

Referenced by implicit_handle(), and NetUseAdd().

◆ NetrUseDel()

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

Definition at line 970 of file rpcserver.c.

974{
976 return 0;
977}

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 983 of file rpcserver.c.

989{
991 return 0;
992}

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 956 of file rpcserver.c.

961{
963 return 0;
964}

Referenced by implicit_handle(), and NetUseGetInfo().

◆ NetrValidateName()

unsigned long __stdcall NetrValidateName ( void  )

Definition at line 1104 of file rpcserver.c.

1105{
1106 TRACE("NetrValidateName()\n");
1107 return ERROR_NOT_SUPPORTED;
1108}

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 1219 of file rpcserver.c.

1226{
1228 return 0;
1229}

Referenced by implicit_handle(), and NetValidateName().

◆ NetrWkstaGetInfo()

unsigned long __stdcall NetrWkstaGetInfo ( _In_ WKSSVC_IDENTIFY_HANDLE  ServerName,
_In_ unsigned long  Level,
_Out_ 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_100 pWkstaInfo100 = NULL;
141 PWKSTA_INFO_101 pWkstaInfo101 = NULL;
142 PWKSTA_INFO_102 pWkstaInfo102 = NULL;
143 PWKSTA_INFO_502 pWkstaInfo502 = NULL;
145 LSA_HANDLE PolicyHandle;
147 ULONG LoggedOnUsers;
148 NTSTATUS NtStatus;
149 DWORD dwResult = NERR_Success;
150
151 TRACE("NetrWkstaGetInfo level %lu\n", Level);
152
153 dwComputerNameLength = MAX_COMPUTERNAME_LENGTH + 1;
154 GetComputerNameW(szComputerName, &dwComputerNameLength);
155 dwComputerNameLength++; /* include NULL terminator */
156
158 NtStatus = LsaOpenPolicy(NULL,
161 &PolicyHandle);
162 if (NtStatus != STATUS_SUCCESS)
163 {
164 WARN("LsaOpenPolicy() failed (Status 0x%08lx)\n", NtStatus);
165 return LsaNtStatusToWinError(NtStatus);
166 }
167
168 NtStatus = LsaQueryInformationPolicy(PolicyHandle,
170 (PVOID*)&DomainInfo);
171
172 LsaClose(PolicyHandle);
173
174 if (NtStatus != STATUS_SUCCESS)
175 {
176 WARN("LsaQueryInformationPolicy() failed (Status 0x%08lx)\n", NtStatus);
177 return LsaNtStatusToWinError(NtStatus);
178 }
179
180 if (Level == 102)
181 {
182 MSV1_0_ENUMUSERS_REQUEST EnumRequest;
183 PMSV1_0_ENUMUSERS_RESPONSE EnumResponseBuffer = NULL;
184 DWORD EnumResponseBufferSize = 0;
186
187 /* enumerate all currently logged-on users */
188 EnumRequest.MessageType = MsV1_0EnumerateUsers;
191 &EnumRequest,
192 sizeof(EnumRequest),
193 (PVOID*)&EnumResponseBuffer,
194 &EnumResponseBufferSize,
196 if (!NT_SUCCESS(NtStatus))
197 {
198 dwResult = RtlNtStatusToDosError(NtStatus);
199 goto done;
200 }
201
202 LoggedOnUsers = EnumResponseBuffer->NumberOfLoggedOnUsers;
203
204 LsaFreeReturnBuffer(EnumResponseBuffer);
205 }
206
207 switch (Level)
208 {
209 case 100:
210 pWkstaInfo100 = midl_user_allocate(sizeof(WKSTA_INFO_100));
211 if (pWkstaInfo100 == NULL)
212 {
213 dwResult = ERROR_NOT_ENOUGH_MEMORY;
214 break;
215 }
216
217 pWkstaInfo100->wki100_platform_id = PLATFORM_ID_NT;
218
219 pWkstaInfo100->wki100_computername = midl_user_allocate(dwComputerNameLength * sizeof(WCHAR));
220 if (pWkstaInfo100->wki100_computername != NULL)
221 wcscpy(pWkstaInfo100->wki100_computername, szComputerName);
222
223 pWkstaInfo100->wki100_langroup = midl_user_allocate((wcslen(DomainInfo->Name.Buffer) + 1) * sizeof(WCHAR));
224 if (pWkstaInfo100->wki100_langroup != NULL)
225 wcscpy(pWkstaInfo100->wki100_langroup, DomainInfo->Name.Buffer);
226
229
230 WkstaInfo->WkstaInfo100 = pWkstaInfo100;
231 break;
232
233 case 101:
234 pWkstaInfo101 = midl_user_allocate(sizeof(WKSTA_INFO_101));
235 if (pWkstaInfo101 == NULL)
236 {
237 dwResult = ERROR_NOT_ENOUGH_MEMORY;
238 break;
239 }
240
241 pWkstaInfo101->wki101_platform_id = PLATFORM_ID_NT;
242
243 pWkstaInfo101->wki101_computername = midl_user_allocate(dwComputerNameLength * sizeof(WCHAR));
244 if (pWkstaInfo101->wki101_computername != NULL)
245 wcscpy(pWkstaInfo101->wki101_computername, szComputerName);
246
247 pWkstaInfo101->wki101_langroup = midl_user_allocate((wcslen(DomainInfo->Name.Buffer) + 1) * sizeof(WCHAR));
248 if (pWkstaInfo101->wki101_langroup != NULL)
249 wcscpy(pWkstaInfo101->wki101_langroup, DomainInfo->Name.Buffer);
250
253
254 pWkstaInfo101->wki101_lanroot = midl_user_allocate((wcslen(pszLanRoot) + 1) * sizeof(WCHAR));
255 if (pWkstaInfo101->wki101_lanroot != NULL)
256 wcscpy(pWkstaInfo101->wki101_lanroot, pszLanRoot);
257
258 WkstaInfo->WkstaInfo101 = pWkstaInfo101;
259 break;
260
261 case 102:
262 pWkstaInfo102 = midl_user_allocate(sizeof(WKSTA_INFO_102));
263 if (pWkstaInfo102 == NULL)
264 {
265 dwResult = ERROR_NOT_ENOUGH_MEMORY;
266 break;
267 }
268
269 pWkstaInfo102->wki102_platform_id = PLATFORM_ID_NT;
270
271 pWkstaInfo102->wki102_computername = midl_user_allocate(dwComputerNameLength * sizeof(WCHAR));
272 if (pWkstaInfo102->wki102_computername != NULL)
273 wcscpy(pWkstaInfo102->wki102_computername, szComputerName);
274
275 pWkstaInfo102->wki102_langroup = midl_user_allocate((wcslen(DomainInfo->Name.Buffer) + 1) * sizeof(WCHAR));
276 if (pWkstaInfo102->wki102_langroup != NULL)
277 wcscpy(pWkstaInfo102->wki102_langroup, DomainInfo->Name.Buffer);
278
281
282 pWkstaInfo102->wki102_lanroot = midl_user_allocate((wcslen(pszLanRoot) + 1) * sizeof(WCHAR));
283 if (pWkstaInfo102->wki102_lanroot != NULL)
284 wcscpy(pWkstaInfo102->wki102_lanroot, pszLanRoot);
285
286 pWkstaInfo102->wki102_logged_on_users = LoggedOnUsers;
287
288 WkstaInfo->WkstaInfo102 = pWkstaInfo102;
289 break;
290
291 case 502:
292 pWkstaInfo502 = midl_user_allocate(sizeof(WKSTA_INFO_502));
293 if (pWkstaInfo502 == NULL)
294 {
295 dwResult = ERROR_NOT_ENOUGH_MEMORY;
296 break;
297 }
298
299 CopyMemory(pWkstaInfo502, &WkstaInfo502, sizeof(WKSTA_INFO_502));
300
301 WkstaInfo->WkstaInfo502 = pWkstaInfo502;
302 break;
303
304 default:
305 FIXME("Level %lu unimplemented\n", Level);
306 dwResult = ERROR_INVALID_LEVEL;
307 break;
308 }
309
310done:
311 if (DomainInfo != NULL)
312 LsaFreeMemory(DomainInfo);
313
314 return dwResult;
315}
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
wcscpy
#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
#define L(x)
Definition: resources.c:13
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
#define ZeroMemory
Definition: minwinbase.h:31
#define CopyMemory
Definition: minwinbase.h:29
@ 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 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
#define MAX_COMPUTERNAME_LENGTH
Definition: winbase.h:267
#define ERROR_INVALID_LEVEL
Definition: winerror.h:318
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR Level
Definition: wmitypes.h:56
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
__wchar_t WCHAR
Definition: xmlstorage.h:180

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 321 of file rpcserver.c.

326{
327 DWORD dwErrParam = 0;
328 DWORD dwResult = NERR_Success;
329
330 TRACE("NetrWkstaSetInfo(%lu %p %p)\n",
331 Level, WkstaInfo, ErrorParameter);
332
333 switch (Level)
334 {
335 case 502:
336 if (WkstaInfo->WkstaInfo502->wki502_keep_conn >= 1 && WkstaInfo->WkstaInfo502->wki502_keep_conn <= 65535)
337 {
339 }
340 else
341 {
342 dwErrParam = WKSTA_KEEPCONN_PARMNUM;
343 dwResult = ERROR_INVALID_PARAMETER;
344 }
345
346 if (dwResult == NERR_Success)
347 {
348 if (WkstaInfo->WkstaInfo502->wki502_max_cmds >= 50 && WkstaInfo->WkstaInfo502->wki502_max_cmds <= 65535)
349 {
351 }
352 else
353 {
354 dwErrParam = WKSTA_MAXCMDS_PARMNUM;
355 dwResult = ERROR_INVALID_PARAMETER;
356 }
357 }
358
359 if (dwResult == NERR_Success)
360 {
361 if (WkstaInfo->WkstaInfo502->wki502_sess_timeout >= 60 && WkstaInfo->WkstaInfo502->wki502_sess_timeout <= 65535)
362 {
364 }
365 else
366 {
367 dwErrParam = WKSTA_SESSTIMEOUT_PARMNUM;
368 dwResult = ERROR_INVALID_PARAMETER;
369 }
370 }
371
372 if (dwResult == NERR_Success)
373 {
374 if (WkstaInfo->WkstaInfo502->wki502_dormant_file_limit != 0)
375 {
377 }
378 else
379 {
381 dwResult = ERROR_INVALID_PARAMETER;
382 }
383 }
384 break;
385
386 case 1013:
387 if (WkstaInfo->WkstaInfo1013->wki1013_keep_conn >= 1 && WkstaInfo->WkstaInfo1013->wki1013_keep_conn <= 65535)
388 {
390 }
391 else
392 {
393 dwErrParam = WKSTA_KEEPCONN_PARMNUM;
394 dwResult = ERROR_INVALID_PARAMETER;
395 }
396 break;
397
398 case 1018:
399 if (WkstaInfo->WkstaInfo1018->wki1018_sess_timeout >= 60 && WkstaInfo->WkstaInfo1018->wki1018_sess_timeout <= 65535)
400 {
402 }
403 else
404 {
405 dwErrParam = WKSTA_SESSTIMEOUT_PARMNUM;
406 dwResult = ERROR_INVALID_PARAMETER;
407 }
408 break;
409
410 case 1046:
411 if (WkstaInfo->WkstaInfo1046->wki1046_dormant_file_limit != 0)
412 {
414 }
415 else
416 {
418 dwResult = ERROR_INVALID_PARAMETER;
419 }
420 break;
421
422 default:
423 ERR("Invalid Level %lu\n", Level);
424 dwResult = ERROR_INVALID_LEVEL;
425 break;
426 }
427
428 /* Save the workstation in the registry */
429 if (dwResult == NERR_Success)
430 {
432
433 /* FIXME: Notify the redirector */
434 }
435
436 if ((dwResult == ERROR_INVALID_PARAMETER) && (ErrorParameter != NULL))
437 *ErrorParameter = dwErrParam;
438
439 return dwResult;
440}
VOID SaveWorkstationInfo(_In_ DWORD Level)
Definition: info.c:478
#define WKSTA_KEEPCONN_PARMNUM
Definition: precomp.h:30
#define WKSTA_MAXCMDS_PARMNUM
Definition: precomp.h:31
#define WKSTA_DORMANTFILELIMIT_PARMNUM
Definition: precomp.h:33
#define WKSTA_SESSTIMEOUT_PARMNUM
Definition: precomp.h:32
#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
LPWKSTA_INFO_1046 WkstaInfo1046
Definition: wkssvc.idl:209
LPWKSTA_INFO_502 WkstaInfo502
Definition: wkssvc.idl:206
LPWKSTA_INFO_1013 WkstaInfo1013
Definition: wkssvc.idl:207
LPWKSTA_INFO_1018 WkstaInfo1018
Definition: wkssvc.idl:208

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 915 of file rpcserver.c.

920{
922 return 0;
923}

Referenced by implicit_handle(), and NetWkstaTransportAdd().

◆ NetrWkstaTransportDel()

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

Definition at line 929 of file rpcserver.c.

933{
935 return 0;
936}

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 900 of file rpcserver.c.

906{
908 return 0;
909}

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 446 of file rpcserver.c.

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

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 696 of file rpcserver.c.

700{
701 MSV1_0_GETUSERINFO_REQUEST UserInfoRequest;
702 PMSV1_0_GETUSERINFO_RESPONSE UserInfoResponseBuffer = NULL;
703 DWORD UserInfoResponseBufferSize = 0;
706 PWKSTA_USER_INFO_0 pUserInfo0 = NULL;
707 PWKSTA_USER_INFO_1 pUserInfo1 = NULL;
708 PWKSTA_USER_INFO_1101 pUserInfo1101 = NULL;
709 DWORD dwResult = NERR_Success;
710
711 TRACE("NetrWkstaUserGetInfo(%s, %d, %p)\n", debugstr_w(Unused), Level, UserInfo);
712
713 if (Unused != NULL)
715
716 if (Level > 1 && Level != 1101)
717 return ERROR_INVALID_LEVEL;
718
719 if (Level != 1101)
720 {
721 dwResult = NetpGetClientLogonId(&LogonId);
722 if (dwResult != NERR_Success)
723 {
724 ERR("NetpGetClientLogonId() failed (%u)\n", dwResult);
725 return dwResult;
726 }
727
728 TRACE("LogonId: 0x%08lx\n", LogonId.LowPart);
729
730 UserInfoRequest.MessageType = MsV1_0GetUserInfo;
731 UserInfoRequest.LogonId = LogonId;
734 &UserInfoRequest,
735 sizeof(UserInfoRequest),
736 (PVOID*)&UserInfoResponseBuffer,
737 &UserInfoResponseBufferSize,
739 TRACE("LsaCallAuthenticationPackage:MsV1_0GetUserInfo Status 0x%08lx ResponseBufferSize %lu\n", Status, UserInfoResponseBufferSize);
740 if (!NT_SUCCESS(Status))
741 {
742 ERR("\n");
744 }
745
746 TRACE("UserName: %wZ\n", &UserInfoResponseBuffer->UserName);
747 TRACE("LogonDomain: %wZ\n", &UserInfoResponseBuffer->LogonDomainName);
748 TRACE("LogonServer: %wZ\n", &UserInfoResponseBuffer->LogonServer);
749 }
750
751 switch (Level)
752 {
753 case 0:
754 pUserInfo0 = midl_user_allocate(sizeof(WKSTA_USER_INFO_0));
755 if (pUserInfo0 == NULL)
756 {
757 ERR("\n");
758 dwResult = ERROR_NOT_ENOUGH_MEMORY;
759 break;
760 }
761
762 ZeroMemory(pUserInfo0, sizeof(WKSTA_USER_INFO_0));
763
764 /* User Name */
765 pUserInfo0->wkui0_username =
766 midl_user_allocate(UserInfoResponseBuffer->UserName.Length + sizeof(WCHAR));
767 if (pUserInfo0->wkui0_username == NULL)
768 {
769 ERR("\n");
770 midl_user_free(pUserInfo0);
771 dwResult = ERROR_NOT_ENOUGH_MEMORY;
772 break;
773 }
774
775 ZeroMemory(pUserInfo0->wkui0_username,
776 UserInfoResponseBuffer->UserName.Length + sizeof(WCHAR));
777 CopyMemory(pUserInfo0->wkui0_username,
778 UserInfoResponseBuffer->UserName.Buffer,
779 UserInfoResponseBuffer->UserName.Length);
780
781 UserInfo->UserInfo0 = pUserInfo0;
782 break;
783
784 case 1:
785 pUserInfo1 = midl_user_allocate(sizeof(WKSTA_USER_INFO_1));
786 if (pUserInfo1 == NULL)
787 {
788 ERR("\n");
789 dwResult = ERROR_NOT_ENOUGH_MEMORY;
790 break;
791 }
792
793 ZeroMemory(pUserInfo1, sizeof(WKSTA_USER_INFO_1));
794
795 /* User Name */
796 pUserInfo1->wkui1_username =
797 midl_user_allocate(UserInfoResponseBuffer->UserName.Length + sizeof(WCHAR));
798 if (pUserInfo1->wkui1_username == NULL)
799 {
800 ERR("\n");
801 midl_user_free(pUserInfo1);
802 dwResult = ERROR_NOT_ENOUGH_MEMORY;
803 break;
804 }
805
806 ZeroMemory(pUserInfo1->wkui1_username,
807 UserInfoResponseBuffer->UserName.Length + sizeof(WCHAR));
808 CopyMemory(pUserInfo1->wkui1_username,
809 UserInfoResponseBuffer->UserName.Buffer,
810 UserInfoResponseBuffer->UserName.Length);
811
812 /* Logon Domain Name */
813 pUserInfo1->wkui1_logon_domain =
814 midl_user_allocate(UserInfoResponseBuffer->LogonDomainName.Length + sizeof(WCHAR));
815 if (pUserInfo1->wkui1_logon_domain == NULL)
816 {
817 ERR("\n");
818 midl_user_free(pUserInfo1->wkui1_username);
819 midl_user_free(pUserInfo1);
820 dwResult = ERROR_NOT_ENOUGH_MEMORY;
821 break;
822 }
823
824 ZeroMemory(pUserInfo1->wkui1_logon_domain,
825 UserInfoResponseBuffer->LogonDomainName.Length + sizeof(WCHAR));
826 CopyMemory(pUserInfo1->wkui1_logon_domain,
827 UserInfoResponseBuffer->LogonDomainName.Buffer,
828 UserInfoResponseBuffer->LogonDomainName.Length);
829
830 /* FIXME: wkui1_oth_domains */
831
832 /* Logon Server */
833 pUserInfo1->wkui1_logon_server =
834 midl_user_allocate(UserInfoResponseBuffer->LogonServer.Length + sizeof(WCHAR));
835 if (pUserInfo1->wkui1_logon_server == NULL)
836 {
837 ERR("\n");
838 midl_user_free(pUserInfo1->wkui1_username);
840 midl_user_free(pUserInfo1);
841 dwResult = ERROR_NOT_ENOUGH_MEMORY;
842 break;
843 }
844
845 ZeroMemory(pUserInfo1->wkui1_logon_server,
846 UserInfoResponseBuffer->LogonServer.Length + sizeof(WCHAR));
847 CopyMemory(pUserInfo1->wkui1_logon_server,
848 UserInfoResponseBuffer->LogonServer.Buffer,
849 UserInfoResponseBuffer->LogonServer.Length);
850
851 UserInfo->UserInfo1 = pUserInfo1;
852 break;
853
854 case 1101:
855 pUserInfo1101 = midl_user_allocate(sizeof(WKSTA_USER_INFO_1101));
856 if (pUserInfo1101 == NULL)
857 {
858 ERR("Failed to allocate WKSTA_USER_INFO_1101\n");
859 dwResult = ERROR_NOT_ENOUGH_MEMORY;
860 break;
861 }
862
863 ZeroMemory(pUserInfo1101, sizeof(WKSTA_USER_INFO_1101));
864
865 /* FIXME: wkui1101_oth_domains */
866
867 UserInfo->UserInfo1101 = pUserInfo1101;
868 break;
869
870 default:
871 ERR("\n");
872 dwResult = ERROR_INVALID_LEVEL;
873 break;
874 }
875
876 if (UserInfoResponseBuffer)
877 LsaFreeReturnBuffer(UserInfoResponseBuffer);
878
879 return dwResult;
880}
static NET_API_STATUS NetpGetClientLogonId(_Out_ PLUID LogonId)
Definition: rpcserver.c:82
#define Unused(x)
Definition: atlwin.h:28
#define midl_user_free
Definition: rpc.h:41
UNICODE_STRING UserName
Definition: ntmsv1_0.h:31
UNICODE_STRING LogonServer
Definition: ntmsv1_0.h:33
UNICODE_STRING LogonDomainName
Definition: ntmsv1_0.h:32
LPWKSTA_USER_INFO_1101 UserInfo1101
Definition: wkssvc.idl:188
LPWKSTA_USER_INFO_0 UserInfo0
Definition: wkssvc.idl:186
LPWKSTA_USER_INFO_1 UserInfo1
Definition: wkssvc.idl:187

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 886 of file rpcserver.c.

891{
893 return 0;
894}

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 1008 of file rpcserver.c.

1014{
1015 SYSTEM_TIMEOFDAY_INFORMATION TimeOfDayInfo;
1016 PSTAT_WORKSTATION_0 pStatBuffer = NULL;
1018
1019 TRACE("NetrWorkstationStatisticsGet(%p %p %lu 0x%lx %p)\n",
1020 ServerName, ServiceName, Level, Options, Buffer);
1021
1022 if (Level != 0)
1023 return ERROR_INVALID_LEVEL;
1024
1025 if (Options != 0)
1027
1028 pStatBuffer = midl_user_allocate(sizeof(STAT_WORKSTATION_0));
1029 if (pStatBuffer == NULL)
1031
1032 ZeroMemory(pStatBuffer, sizeof(STAT_WORKSTATION_0));
1033
1034 /* Query the boot time */
1036 &TimeOfDayInfo,
1037 sizeof(TimeOfDayInfo),
1038 NULL);
1039 if (NT_SUCCESS(Status))
1040 {
1041 ULONG Seconds = 0;
1042 if (RtlTimeToSecondsSince1970(&TimeOfDayInfo.BootTime, &Seconds))
1043 {
1044 pStatBuffer->StatisticsStartTime.u.HighPart = 0;
1045 pStatBuffer->StatisticsStartTime.u.LowPart = Seconds;
1046 }
1047 }
1048
1049 // FIXME: Return the actual statistcs data!
1050
1051 *Buffer = pStatBuffer;
1052
1053 return NERR_Success;
1054}
static WCHAR ServiceName[]
Definition: browser.c:20
Definition: bufpool.h:45
@ SystemTimeOfDayInformation
Definition: ntddk_ex.h:14
BOOLEAN NTAPI RtlTimeToSecondsSince1970(PLARGE_INTEGER Time, PULONG ElapsedSeconds)
NTSYSAPI NTSTATUS NTAPI NtQuerySystemInformation(IN SYSTEM_INFORMATION_CLASS SystemInfoClass, OUT PVOID SystemInfoBuffer, IN ULONG SystemInfoBufferSize, OUT PULONG BytesReturned OPTIONAL)
LARGE_INTEGER StatisticsStartTime
Definition: lmstats.h:64
struct _LARGE_INTEGER::@2479 u

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  )