ReactOS 0.4.16-dev-1946-g52006dd
rpcserver.c
Go to the documentation of this file.
1/*
2 * ReactOS Services
3 * Copyright (C) 2015 ReactOS Team
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19/*
20 * COPYRIGHT: See COPYING in the top level directory
21 * PROJECT: ReactOS Services
22 * FILE: base/services/wkssvc/rpcserver.c
23 * PURPOSE: Workstation service
24 * PROGRAMMER: Eric Kohl
25 */
26
27/* INCLUDES *****************************************************************/
28
29#include "precomp.h"
30
31#include "lmerr.h"
32
34
35/* FUNCTIONS *****************************************************************/
36
40 LPVOID lpParameter)
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}
66
67
69{
71}
72
73
75{
77}
78
79
80static
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);
118
119done:
120 if (ThreadToken != NULL)
121 NtClose(ThreadToken);
122
124
125 return ApiStatus;
126}
127
128
129/* Function 0 */
130unsigned long
133 _In_ WKSSVC_IDENTIFY_HANDLE ServerName,
134 _In_ unsigned long Level,
135 _Out_ LPWKSTA_INFO WkstaInfo)
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}
316
317
318/* Function 1 */
319unsigned long
322 WKSSVC_IDENTIFY_HANDLE ServerName,
323 unsigned long Level,
324 LPWKSTA_INFO WkstaInfo,
325 unsigned long *ErrorParameter)
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}
441
442
443/* Function 2 */
444unsigned long
447 WKSSVC_IDENTIFY_HANDLE ServerName,
449 unsigned long PreferredMaximumLength,
450 unsigned long *TotalEntries,
451 unsigned long *ResumeHandle)
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}
691
692
693/* Function 3 */
694unsigned long
698 unsigned long Level,
699 LPWKSTA_USER_INFO UserInfo)
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}
881
882
883/* Function 4 */
884unsigned long
888 unsigned long Level,
889 LPWKSTA_USER_INFO UserInfo,
890 unsigned long *ErrorParameter)
891{
893 return 0;
894}
895
896
897/* Function 5 */
898unsigned long
901 WKSSVC_IDENTIFY_HANDLE ServerName,
902 LPWKSTA_TRANSPORT_ENUM_STRUCT TransportInfo,
903 unsigned long PreferredMaximumLength,
904 unsigned long* TotalEntries,
905 unsigned long *ResumeHandle)
906{
908 return 0;
909}
910
911
912/* Function 6 */
913unsigned long
916 WKSSVC_IDENTIFY_HANDLE ServerName,
917 unsigned long Level,
918 LPWKSTA_TRANSPORT_INFO_0 TransportInfo,
919 unsigned long *ErrorParameter)
920{
922 return 0;
923}
924
925
926/* Function 7 */
927unsigned long
930 WKSSVC_IDENTIFY_HANDLE ServerName,
931 wchar_t *TransportName,
932 unsigned long ForceLevel)
933{
935 return 0;
936}
937
938
939/* Function 8 */
940unsigned long
943 WKSSVC_IMPERSONATE_HANDLE ServerName,
944 unsigned long Level,
945 LPUSE_INFO InfoStruct,
946 unsigned long *ErrorParameter)
947{
949 return 0;
950}
951
952
953/* Function 9 */
954unsigned long
957 WKSSVC_IMPERSONATE_HANDLE ServerName,
958 wchar_t *UseName,
959 unsigned long Level,
960 LPUSE_INFO InfoStruct)
961{
963 return 0;
964}
965
966
967/* Function 10 */
968unsigned long
971 WKSSVC_IMPERSONATE_HANDLE ServerName,
972 wchar_t *UseName,
973 unsigned long ForceLevel)
974{
976 return 0;
977}
978
979
980/* Function 11 */
981unsigned long
984 WKSSVC_IDENTIFY_HANDLE ServerName,
985 LPUSE_ENUM_STRUCT InfoStruct,
986 unsigned long PreferredMaximumLength,
987 unsigned long *TotalEntries,
988 unsigned long *ResumeHandle)
989{
991 return 0;
992}
993
994
995/* Function 12 - Not used on wire */
996unsigned long
999{
1000 TRACE("NetrMessageBufferSend()\n");
1001 return ERROR_NOT_SUPPORTED;
1002}
1003
1004
1005/* Function 13 */
1006unsigned long
1009 WKSSVC_IDENTIFY_HANDLE ServerName,
1010 wchar_t *ServiceName,
1011 unsigned long Level,
1012 unsigned long Options,
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}
1055
1056
1057/* Function 14 - Not used on wire */
1058unsigned long
1061 WKSSVC_IDENTIFY_HANDLE DomainName)
1062{
1063 TRACE("NetrLogonDomainNameAdd(%s)\n",
1064 debugstr_w(DomainName));
1065 return ERROR_NOT_SUPPORTED;
1066}
1067
1068
1069/* Function 15 - Not used on wire */
1070unsigned long
1073 WKSSVC_IDENTIFY_HANDLE DomainName)
1074{
1075 TRACE("NetrLogonDomainNameDel(%s)\n",
1076 debugstr_w(DomainName));
1077 return ERROR_NOT_SUPPORTED;
1078}
1079
1080
1081/* Function 16 - Not used on wire */
1082unsigned long
1085{
1086 TRACE("NetrJoinDomain()\n");
1087 return ERROR_NOT_SUPPORTED;
1088}
1089
1090
1091/* Function 17 - Not used on wire */
1092unsigned long
1095{
1096 TRACE("NetrUnjoinDomain()\n");
1097 return ERROR_NOT_SUPPORTED;
1098}
1099
1100
1101/* Function 18 - Not used on wire */
1102unsigned long
1105{
1106 TRACE("NetrValidateName()\n");
1107 return ERROR_NOT_SUPPORTED;
1108}
1109
1110
1111/* Function 19 - Not used on wire */
1112unsigned long
1115{
1116 TRACE("NetrRenameMachineInDomain()\n");
1117 return ERROR_NOT_SUPPORTED;
1118}
1119
1120
1121/* Function 20 */
1122unsigned long
1125 WKSSVC_IMPERSONATE_HANDLE ServerName,
1126 wchar_t **NameBuffer,
1127 PNETSETUP_JOIN_STATUS BufferType)
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}
1138
1139
1140/* Function 21 - Not used on wire */
1141unsigned long
1144{
1145 TRACE("NetrGetJoinableOUs()\n");
1146 return ERROR_NOT_SUPPORTED;
1147}
1148
1149
1150/* Function 22 */
1151unsigned long
1154 handle_t RpcBindingHandle,
1155 wchar_t *ServerName,
1156 wchar_t *DomainNameParam,
1157 wchar_t *MachineAccountOU,
1158 wchar_t *AccountName,
1160 unsigned long Options)
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}
1183
1184
1185/* Function 23 */
1186unsigned long
1189 handle_t RpcBindingHandle,
1190 wchar_t *ServerName,
1191 wchar_t *AccountName,
1193 unsigned long Options)
1194{
1196 return 0;
1197}
1198
1199
1200/* Function 24 */
1201unsigned long
1204 handle_t RpcBindingHandle,
1205 wchar_t *ServerName,
1206 wchar_t *MachineName,
1207 wchar_t *AccountName,
1209 unsigned long Options)
1210{
1212 return 0;
1213}
1214
1215
1216/* Function 25 */
1217unsigned long
1220 handle_t RpcBindingHandle,
1221 wchar_t *ServerName,
1222 wchar_t *NameToValidate,
1223 wchar_t *AccountName,
1226{
1228 return 0;
1229}
1230
1231
1232/* Function 26 */
1233unsigned long
1236 handle_t RpcBindingHandle,
1237 wchar_t *ServerName,
1238 wchar_t *DomainNameParam,
1239 wchar_t *AccountName,
1241 unsigned long* OUCount,
1242 wchar_t ***OUs)
1243{
1245 return 0;
1246}
1247
1248
1249/* Function 27 */
1250unsigned long
1253 handle_t RpcBindingHandle,
1254 wchar_t *ServerName,
1255 wchar_t *AlternateName,
1256 wchar_t *DomainAccount,
1257 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword,
1258 unsigned long Reserved)
1259{
1261 return 0;
1262}
1263
1264
1265/* Function 28 */
1266unsigned long
1269 handle_t RpcBindingHandle,
1270 wchar_t *ServerName,
1271 wchar_t *AlternateName,
1272 wchar_t *DomainAccount,
1273 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword,
1274 unsigned long Reserved)
1275{
1277 return 0;
1278}
1279
1280
1281/* Function 29 */
1282unsigned long
1285 handle_t RpcBindingHandle,
1286 wchar_t *ServerName,
1287 wchar_t *PrimaryName,
1288 wchar_t *DomainAccount,
1289 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword,
1290 unsigned long Reserved)
1291{
1293 return 0;
1294}
1295
1296
1297/* Function 30 */
1298unsigned long
1301 WKSSVC_IMPERSONATE_HANDLE ServerName,
1303 unsigned long Reserved,
1304 PNET_COMPUTER_NAME_ARRAY *ComputerNames)
1305{
1307 return 0;
1308}
1309
1310/* EOF */
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 NameType
Definition: acpixf.h:658
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
LONG NTSTATUS
Definition: precomp.h:26
static WCHAR ServiceName[]
Definition: browser.c:20
DWORD WINAPI RpcThreadRoutine(LPVOID lpParameter)
Definition: rpcserver.c:20
NET_API_STATUS NetpGetJoinInformation(LPWSTR *NameBuffer, PNETSETUP_JOIN_STATUS BufferType)
Definition: domain.c:71
NET_API_STATUS NetpJoinWorkgroup(_In_ LPCWSTR lpWorkgroupName)
Definition: domain.c:52
VOID SaveWorkstationInfo(_In_ DWORD Level)
Definition: info.c:478
WKSTA_INFO_502 WkstaInfo502
Definition: info.c:17
#define WKSTA_KEEPCONN_PARMNUM
Definition: precomp.h:30
HANDLE LsaHandle
Definition: wkssvc.c:41
OSVERSIONINFOW VersionInfo
Definition: wkssvc.c:40
#define WKSTA_MAXCMDS_PARMNUM
Definition: precomp.h:31
ULONG LsaAuthenticationPackage
Definition: wkssvc.c:42
#define WKSTA_DORMANTFILELIMIT_PARMNUM
Definition: precomp.h:33
#define WKSTA_SESSTIMEOUT_PARMNUM
Definition: precomp.h:32
unsigned long __stdcall NetrUseDel(WKSSVC_IMPERSONATE_HANDLE ServerName, wchar_t *UseName, unsigned long ForceLevel)
Definition: rpcserver.c:970
unsigned long __stdcall NetrUseAdd(WKSSVC_IMPERSONATE_HANDLE ServerName, unsigned long Level, LPUSE_INFO InfoStruct, unsigned long *ErrorParameter)
Definition: rpcserver.c:942
unsigned long __stdcall NetrWkstaGetInfo(_In_ WKSSVC_IDENTIFY_HANDLE ServerName, _In_ unsigned long Level, _Out_ LPWKSTA_INFO WkstaInfo)
Definition: rpcserver.c:132
unsigned long __stdcall NetrWkstaTransportAdd(WKSSVC_IDENTIFY_HANDLE ServerName, unsigned long Level, LPWKSTA_TRANSPORT_INFO_0 TransportInfo, unsigned long *ErrorParameter)
Definition: rpcserver.c:915
unsigned long __stdcall NetrGetJoinInformation(WKSSVC_IMPERSONATE_HANDLE ServerName, wchar_t **NameBuffer, PNETSETUP_JOIN_STATUS BufferType)
Definition: rpcserver.c:1124
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: rpcserver.c:1268
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: rpcserver.c:1203
unsigned long __stdcall NetrWkstaTransportEnum(WKSSVC_IDENTIFY_HANDLE ServerName, LPWKSTA_TRANSPORT_ENUM_STRUCT TransportInfo, unsigned long PreferredMaximumLength, unsigned long *TotalEntries, unsigned long *ResumeHandle)
Definition: rpcserver.c:900
unsigned long __stdcall NetrJoinDomain(void)
Definition: rpcserver.c:1084
unsigned long __stdcall NetrMessageBufferSend(void)
Definition: rpcserver.c:998
unsigned long __stdcall NetrWkstaUserEnum(WKSSVC_IDENTIFY_HANDLE ServerName, LPWKSTA_USER_ENUM_STRUCT UserInfo, unsigned long PreferredMaximumLength, unsigned long *TotalEntries, unsigned long *ResumeHandle)
Definition: rpcserver.c:446
unsigned long __stdcall NetrGetJoinableOUs(void)
Definition: rpcserver.c:1143
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: rpcserver.c:1235
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: rpcserver.c:1219
static NET_API_STATUS NetpGetClientLogonId(_Out_ PLUID LogonId)
Definition: rpcserver.c:82
unsigned long __stdcall NetrWkstaSetInfo(WKSSVC_IDENTIFY_HANDLE ServerName, unsigned long Level, LPWKSTA_INFO WkstaInfo, unsigned long *ErrorParameter)
Definition: rpcserver.c:321
unsigned long __stdcall NetrEnumerateComputerNames(WKSSVC_IMPERSONATE_HANDLE ServerName, NET_COMPUTER_NAME_TYPE NameType, unsigned long Reserved, PNET_COMPUTER_NAME_ARRAY *ComputerNames)
Definition: rpcserver.c:1300
unsigned long __stdcall NetrWorkstationStatisticsGet(WKSSVC_IDENTIFY_HANDLE ServerName, wchar_t *ServiceName, unsigned long Level, unsigned long Options, LPSTAT_WORKSTATION_0 *Buffer)
Definition: rpcserver.c:1008
unsigned long __stdcall NetrWkstaTransportDel(WKSSVC_IDENTIFY_HANDLE ServerName, wchar_t *TransportName, unsigned long ForceLevel)
Definition: rpcserver.c:929
unsigned long __stdcall NetrValidateName(void)
Definition: rpcserver.c:1104
unsigned long __stdcall NetrLogonDomainNameDel(WKSSVC_IDENTIFY_HANDLE DomainName)
Definition: rpcserver.c:1072
unsigned long __stdcall NetrLogonDomainNameAdd(WKSSVC_IDENTIFY_HANDLE DomainName)
Definition: rpcserver.c:1060
unsigned long __stdcall NetrRenameMachineInDomain(void)
Definition: rpcserver.c:1114
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: rpcserver.c:1284
unsigned long __stdcall NetrWkstaUserSetInfo(WKSSVC_IDENTIFY_HANDLE Unused, unsigned long Level, LPWKSTA_USER_INFO UserInfo, unsigned long *ErrorParameter)
Definition: rpcserver.c:886
unsigned long __stdcall NetrUnjoinDomain(void)
Definition: rpcserver.c:1094
unsigned long __stdcall NetrUnjoinDomain2(handle_t RpcBindingHandle, wchar_t *ServerName, wchar_t *AccountName, PJOINPR_ENCRYPTED_USER_PASSWORD Password, unsigned long Options)
Definition: rpcserver.c:1188
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: rpcserver.c:1252
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: rpcserver.c:1153
unsigned long __stdcall NetrUseEnum(WKSSVC_IDENTIFY_HANDLE ServerName, LPUSE_ENUM_STRUCT InfoStruct, unsigned long PreferredMaximumLength, unsigned long *TotalEntries, unsigned long *ResumeHandle)
Definition: rpcserver.c:983
unsigned long __stdcall NetrUseGetInfo(WKSSVC_IMPERSONATE_HANDLE ServerName, wchar_t *UseName, unsigned long Level, LPUSE_INFO InfoStruct)
Definition: rpcserver.c:956
unsigned long __stdcall NetrWkstaUserGetInfo(WKSSVC_IDENTIFY_HANDLE Unused, unsigned long Level, LPWKSTA_USER_INFO UserInfo)
Definition: rpcserver.c:696
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
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
Definition: bufpool.h:45
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
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
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 GetProcessHeap()
Definition: compat.h:736
#define ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:102
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define HeapAlloc
Definition: compat.h:733
#define ERROR_NOT_SUPPORTED
Definition: compat.h:100
#define HeapFree(x, y, z)
Definition: compat.h:735
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
#define L(x)
Definition: resources.c:13
unsigned long DWORD
Definition: ntddk_ex.h:95
@ SystemTimeOfDayInformation
Definition: ntddk_ex.h:14
Status
Definition: gdiplustypes.h:25
GLuint start
Definition: gl.h:1545
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLenum GLsizei len
Definition: glext.h:6722
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
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
BOOLEAN NTAPI RtlTimeToSecondsSince1970(PLARGE_INTEGER Time, PULONG ElapsedSeconds)
#define NtCurrentThread()
Definition: winternl.h:5364
NTSYSAPI ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)
NTSYSAPI void WINAPI RtlCopyLuid(PLUID, const LUID *)
#define debugstr_w
Definition: kernel32.h:32
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 Unused(x)
Definition: atlwin.h:28
#define PLATFORM_ID_NT
Definition: lmcons.h:60
#define MAX_PREFERRED_LENGTH
Definition: lmcons.h:48
#define NERR_Success
Definition: lmerr.h:5
enum _NETSETUP_JOIN_STATUS * PNETSETUP_JOIN_STATUS
#define NETSETUP_JOIN_DOMAIN
Definition: lmjoin.h:16
#define ZeroMemory
Definition: minwinbase.h:31
#define CopyMemory
Definition: minwinbase.h:29
static PVOID ptr
Definition: dispmode.c:27
DWORD NET_API_STATUS
Definition: ms-dtyp.idl:91
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
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
@ PolicyPrimaryDomainInformation
Definition: ntsecapi.h:245
@ MsV1_0EnumerateUsers
Definition: ntsecapi.h:220
@ MsV1_0GetUserInfo
Definition: ntsecapi.h:221
NTSTATUS NTAPI LsaCallAuthenticationPackage(HANDLE, ULONG, PVOID, ULONG, PVOID *, PULONG, PNTSTATUS)
#define POLICY_VIEW_LOCAL_INFORMATION
Definition: ntsecapi.h:61
NTSTATUS NTAPI LsaFreeReturnBuffer(PVOID)
RPC_STATUS WINAPI RpcRevertToSelf(void)
Definition: rpc_binding.c:1445
RPC_STATUS WINAPI RpcImpersonateClient(RPC_BINDING_HANDLE BindingHandle)
Definition: rpc_binding.c:1038
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
#define midl_user_free
Definition: rpc.h:41
#define __RPC_FAR
Definition: rpc.h:52
long RPC_STATUS
Definition: rpc.h:48
#define __RPC_USER
Definition: rpc.h:61
#define midl_user_allocate
Definition: rpc.h:40
_In_ DWORD _Out_ PDWORD _In_opt_ PCSTR MachineName
Definition: setupapi.h:1294
#define STATUS_SUCCESS
Definition: shellext.h:65
#define TRACE(s)
Definition: solgame.cpp:4
NTSYSAPI NTSTATUS NTAPI NtQuerySystemInformation(IN SYSTEM_INFORMATION_CLASS SystemInfoClass, OUT PVOID SystemInfoBuffer, IN ULONG SystemInfoBufferSize, OUT PULONG BytesReturned OPTIONAL)
DWORD LowPart
MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType
Definition: ntmsv1_0.h:10
MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType
Definition: ntmsv1_0.h:23
UNICODE_STRING UserName
Definition: ntmsv1_0.h:31
UNICODE_STRING LogonServer
Definition: ntmsv1_0.h:33
UNICODE_STRING LogonDomainName
Definition: ntmsv1_0.h:32
ULONG dwMinorVersion
Definition: rtltypes.h:248
ULONG dwMajorVersion
Definition: rtltypes.h:247
LSA_UNICODE_STRING Name
Definition: ntsecapi.h:570
LARGE_INTEGER StatisticsStartTime
Definition: lmstats.h:64
LUID AuthenticationId
Definition: setypes.h:1099
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 wki1013_keep_conn
Definition: lmwksta.h:176
DWORD wki1018_sess_timeout
Definition: lmwksta.h:177
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
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
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
Definition: ps.c:97
@ Password
Definition: telnetd.h:67
_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 * PULONG
Definition: typedefs.h:59
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define __stdcall
Definition: typedefs.h:25
uint32_t ULONG
Definition: typedefs.h:59
struct _LARGE_INTEGER::@2479 u
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
WKSTA_USER_INFO_0_CONTAINER Level0
Definition: wkssvc.idl:310
WKSTA_USER_INFO_1_CONTAINER Level1
Definition: wkssvc.idl:311
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
_In_ PWDFDEVICE_INIT _In_ PWDF_REMOVE_LOCK_OPTIONS Options
Definition: wdfdevice.h:3540
#define MAX_COMPUTERNAME_LENGTH
Definition: winbase.h:267
_Reserved_ PVOID Reserved
Definition: winddi.h:3974
#define WINAPI
Definition: msvc.h:6
#define ERROR_INVALID_LEVEL
Definition: winerror.h:318
enum _NET_COMPUTER_NAME_TYPE NET_COMPUTER_NAME_TYPE
enum _NETSETUP_NAME_TYPE NETSETUP_NAME_TYPE
wchar_t * WKSSVC_IMPERSONATE_HANDLE
Definition: wkssvc.idl:8
wchar_t * WKSSVC_IDENTIFY_HANDLE
Definition: wkssvc.idl:7
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR Level
Definition: wmitypes.h:56
#define TOKEN_QUERY
Definition: setypes.h:940
@ TokenStatistics
Definition: setypes.h:987
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
__wchar_t WCHAR
Definition: xmlstorage.h:180