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 33 WINE_DEFAULT_DEBUG_CHANNEL(wkssvc); 34 35 /* FUNCTIONS *****************************************************************/ 36 37 DWORD 38 WINAPI 39 RpcThreadRoutine( 40 LPVOID lpParameter) 41 { 42 RPC_STATUS Status; 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 58 Status = RpcServerListen(1, RPC_C_LISTEN_MAX_CALLS_DEFAULT, FALSE); 59 if (Status != RPC_S_OK) 60 { 61 ERR("RpcServerListen() failed (Status %lx)\n", Status); 62 } 63 64 return 0; 65 } 66 67 68 void __RPC_FAR * __RPC_USER midl_user_allocate(SIZE_T len) 69 { 70 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len); 71 } 72 73 74 void __RPC_USER midl_user_free(void __RPC_FAR * ptr) 75 { 76 HeapFree(GetProcessHeap(), 0, ptr); 77 } 78 79 80 /* Function 0 */ 81 unsigned long 82 __stdcall 83 NetrWkstaGetInfo( 84 WKSSVC_IDENTIFY_HANDLE ServerName, 85 unsigned long Level, 86 LPWKSTA_INFO *WkstaInfo) 87 { 88 WCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1]; 89 DWORD dwComputerNameLength; 90 LPCWSTR pszLanRoot = L""; 91 PWKSTA_INFO pWkstaInfo = NULL; 92 LSA_OBJECT_ATTRIBUTES ObjectAttributes; 93 LSA_HANDLE PolicyHandle; 94 PPOLICY_PRIMARY_DOMAIN_INFO DomainInfo = NULL; 95 NTSTATUS NtStatus; 96 DWORD dwResult = NERR_Success; 97 98 TRACE("NetrWkstaGetInfo level %lu\n", Level); 99 100 dwComputerNameLength = MAX_COMPUTERNAME_LENGTH + 1; 101 GetComputerNameW(szComputerName, &dwComputerNameLength); 102 dwComputerNameLength++; /* include NULL terminator */ 103 104 ZeroMemory(&ObjectAttributes, sizeof(ObjectAttributes)); 105 NtStatus = LsaOpenPolicy(NULL, 106 &ObjectAttributes, 107 POLICY_VIEW_LOCAL_INFORMATION, 108 &PolicyHandle); 109 if (NtStatus != STATUS_SUCCESS) 110 { 111 WARN("LsaOpenPolicy() failed (Status 0x%08lx)\n", NtStatus); 112 return LsaNtStatusToWinError(NtStatus); 113 } 114 115 NtStatus = LsaQueryInformationPolicy(PolicyHandle, 116 PolicyPrimaryDomainInformation, 117 (PVOID*)&DomainInfo); 118 119 LsaClose(PolicyHandle); 120 121 if (NtStatus != STATUS_SUCCESS) 122 { 123 WARN("LsaQueryInformationPolicy() failed (Status 0x%08lx)\n", NtStatus); 124 return LsaNtStatusToWinError(NtStatus); 125 } 126 127 switch (Level) 128 { 129 case 100: 130 pWkstaInfo = midl_user_allocate(sizeof(WKSTA_INFO_100)); 131 if (pWkstaInfo == NULL) 132 { 133 dwResult = ERROR_NOT_ENOUGH_MEMORY; 134 break; 135 } 136 137 pWkstaInfo->WkstaInfo100.wki100_platform_id = PLATFORM_ID_NT; 138 139 pWkstaInfo->WkstaInfo100.wki100_computername = midl_user_allocate(dwComputerNameLength * sizeof(WCHAR)); 140 if (pWkstaInfo->WkstaInfo100.wki100_computername != NULL) 141 wcscpy(pWkstaInfo->WkstaInfo100.wki100_computername, szComputerName); 142 143 pWkstaInfo->WkstaInfo100.wki100_langroup = midl_user_allocate((wcslen(DomainInfo->Name.Buffer) + 1) * sizeof(WCHAR)); 144 if (pWkstaInfo->WkstaInfo100.wki100_langroup != NULL) 145 wcscpy(pWkstaInfo->WkstaInfo100.wki100_langroup, DomainInfo->Name.Buffer); 146 147 pWkstaInfo->WkstaInfo100.wki100_ver_major = VersionInfo.dwMajorVersion; 148 pWkstaInfo->WkstaInfo100.wki100_ver_minor = VersionInfo.dwMinorVersion; 149 150 *WkstaInfo = pWkstaInfo; 151 break; 152 153 case 101: 154 pWkstaInfo = midl_user_allocate(sizeof(WKSTA_INFO_101)); 155 if (pWkstaInfo == NULL) 156 { 157 dwResult = ERROR_NOT_ENOUGH_MEMORY; 158 break; 159 } 160 161 pWkstaInfo->WkstaInfo101.wki101_platform_id = PLATFORM_ID_NT; 162 163 pWkstaInfo->WkstaInfo101.wki101_computername = midl_user_allocate(dwComputerNameLength * sizeof(WCHAR)); 164 if (pWkstaInfo->WkstaInfo101.wki101_computername != NULL) 165 wcscpy(pWkstaInfo->WkstaInfo101.wki101_computername, szComputerName); 166 167 pWkstaInfo->WkstaInfo101.wki101_langroup = midl_user_allocate((wcslen(DomainInfo->Name.Buffer) + 1) * sizeof(WCHAR)); 168 if (pWkstaInfo->WkstaInfo101.wki101_langroup != NULL) 169 wcscpy(pWkstaInfo->WkstaInfo101.wki101_langroup, DomainInfo->Name.Buffer); 170 171 pWkstaInfo->WkstaInfo101.wki101_ver_major = VersionInfo.dwMajorVersion; 172 pWkstaInfo->WkstaInfo101.wki101_ver_minor = VersionInfo.dwMinorVersion; 173 174 pWkstaInfo->WkstaInfo101.wki101_lanroot = midl_user_allocate((wcslen(pszLanRoot) + 1) * sizeof(WCHAR)); 175 if (pWkstaInfo->WkstaInfo101.wki101_lanroot != NULL) 176 wcscpy(pWkstaInfo->WkstaInfo101.wki101_lanroot, pszLanRoot); 177 178 *WkstaInfo = pWkstaInfo; 179 break; 180 181 case 102: 182 pWkstaInfo = midl_user_allocate(sizeof(WKSTA_INFO_102)); 183 if (pWkstaInfo == NULL) 184 { 185 dwResult = ERROR_NOT_ENOUGH_MEMORY; 186 break; 187 } 188 189 pWkstaInfo->WkstaInfo102.wki102_platform_id = PLATFORM_ID_NT; 190 191 pWkstaInfo->WkstaInfo102.wki102_computername = midl_user_allocate(dwComputerNameLength * sizeof(WCHAR)); 192 if (pWkstaInfo->WkstaInfo102.wki102_computername != NULL) 193 wcscpy(pWkstaInfo->WkstaInfo102.wki102_computername, szComputerName); 194 195 pWkstaInfo->WkstaInfo102.wki102_langroup = midl_user_allocate((wcslen(DomainInfo->Name.Buffer) + 1) * sizeof(WCHAR)); 196 if (pWkstaInfo->WkstaInfo102.wki102_langroup != NULL) 197 wcscpy(pWkstaInfo->WkstaInfo102.wki102_langroup, DomainInfo->Name.Buffer); 198 199 pWkstaInfo->WkstaInfo102.wki102_ver_major = VersionInfo.dwMajorVersion; 200 pWkstaInfo->WkstaInfo102.wki102_ver_minor = VersionInfo.dwMinorVersion; 201 202 pWkstaInfo->WkstaInfo102.wki102_lanroot = midl_user_allocate((wcslen(pszLanRoot) + 1) * sizeof(WCHAR)); 203 if (pWkstaInfo->WkstaInfo102.wki102_lanroot != NULL) 204 wcscpy(pWkstaInfo->WkstaInfo102.wki102_lanroot, pszLanRoot); 205 206 pWkstaInfo->WkstaInfo102.wki102_logged_on_users = 1; /* FIXME */ 207 208 *WkstaInfo = pWkstaInfo; 209 break; 210 211 case 502: 212 pWkstaInfo = midl_user_allocate(sizeof(WKSTA_INFO_502)); 213 if (pWkstaInfo == NULL) 214 { 215 dwResult = ERROR_NOT_ENOUGH_MEMORY; 216 break; 217 } 218 219 CopyMemory(&pWkstaInfo->WkstaInfo502, &WkstaInfo502, sizeof(WKSTA_INFO_502)); 220 221 *WkstaInfo = pWkstaInfo; 222 break; 223 224 default: 225 FIXME("Level %lu unimplemented\n", Level); 226 dwResult = ERROR_INVALID_LEVEL; 227 break; 228 } 229 230 if (DomainInfo != NULL) 231 LsaFreeMemory(DomainInfo); 232 233 return dwResult; 234 } 235 236 237 /* Function 1 */ 238 unsigned long 239 __stdcall 240 NetrWkstaSetInfo( 241 WKSSVC_IDENTIFY_HANDLE ServerName, 242 unsigned long Level, 243 LPWKSTA_INFO WkstaInfo, 244 unsigned long *ErrorParameter) 245 { 246 DWORD dwResult = NERR_Success; 247 248 TRACE("NetrWkstaSetInfo(%lu %p %p)\n", 249 Level, WkstaInfo, ErrorParameter); 250 251 switch (Level) 252 { 253 case 502: 254 if (WkstaInfo->WkstaInfo502.wki502_keep_conn >= 1 && WkstaInfo->WkstaInfo502.wki502_keep_conn <= 65535) 255 { 256 WkstaInfo502.wki502_keep_conn = WkstaInfo->WkstaInfo502.wki502_keep_conn; 257 258 if (WkstaInfo->WkstaInfo502.wki502_max_cmds >= 50 && WkstaInfo->WkstaInfo502.wki502_max_cmds <= 65535) 259 { 260 WkstaInfo502.wki502_max_cmds = WkstaInfo->WkstaInfo502.wki502_max_cmds; 261 262 if (WkstaInfo->WkstaInfo502.wki502_sess_timeout >= 60 && WkstaInfo->WkstaInfo502.wki502_sess_timeout <= 65535) 263 { 264 WkstaInfo502.wki502_sess_timeout = WkstaInfo->WkstaInfo502.wki502_sess_timeout; 265 266 if (WkstaInfo->WkstaInfo502.wki502_dormant_file_limit != 0) 267 { 268 WkstaInfo502.wki502_dormant_file_limit = WkstaInfo->WkstaInfo502.wki502_dormant_file_limit; 269 } 270 else 271 { 272 if (ErrorParameter) 273 *ErrorParameter = WKSTA_DORMANTFILELIMIT_PARMNUM; 274 dwResult = ERROR_INVALID_PARAMETER; 275 } 276 } 277 else 278 { 279 if (ErrorParameter) 280 *ErrorParameter = WKSTA_SESSTIMEOUT_PARMNUM; 281 dwResult = ERROR_INVALID_PARAMETER; 282 } 283 } 284 else 285 { 286 if (ErrorParameter) 287 *ErrorParameter = WKSTA_MAXCMDS_PARMNUM; 288 dwResult = ERROR_INVALID_PARAMETER; 289 } 290 } 291 else 292 { 293 if (ErrorParameter) 294 *ErrorParameter = WKSTA_KEEPCONN_PARMNUM; 295 dwResult = ERROR_INVALID_PARAMETER; 296 } 297 break; 298 299 case 1013: 300 if (WkstaInfo->WkstaInfo1013.wki1013_keep_conn >= 1 && WkstaInfo->WkstaInfo1013.wki1013_keep_conn <= 65535) 301 { 302 WkstaInfo502.wki502_keep_conn = WkstaInfo->WkstaInfo1013.wki1013_keep_conn; 303 } 304 else 305 { 306 if (ErrorParameter) 307 *ErrorParameter = WKSTA_KEEPCONN_PARMNUM; 308 dwResult = ERROR_INVALID_PARAMETER; 309 } 310 break; 311 312 case 1018: 313 if (WkstaInfo->WkstaInfo1018.wki1018_sess_timeout >= 60 && WkstaInfo->WkstaInfo1018.wki1018_sess_timeout <= 65535) 314 { 315 WkstaInfo502.wki502_sess_timeout = WkstaInfo->WkstaInfo1018.wki1018_sess_timeout; 316 } 317 else 318 { 319 if (ErrorParameter) 320 *ErrorParameter = WKSTA_SESSTIMEOUT_PARMNUM; 321 dwResult = ERROR_INVALID_PARAMETER; 322 } 323 break; 324 325 case 1046: 326 if (WkstaInfo->WkstaInfo1046.wki1046_dormant_file_limit != 0) 327 { 328 WkstaInfo502.wki502_dormant_file_limit = WkstaInfo->WkstaInfo1046.wki1046_dormant_file_limit; 329 } 330 else 331 { 332 if (ErrorParameter) 333 *ErrorParameter = WKSTA_DORMANTFILELIMIT_PARMNUM; 334 dwResult = ERROR_INVALID_PARAMETER; 335 } 336 break; 337 338 default: 339 FIXME("Level %lu unimplemented\n", Level); 340 dwResult = ERROR_INVALID_LEVEL; 341 break; 342 } 343 344 /* Save the workstation in the registry */ 345 if (dwResult == NERR_Success) 346 SaveWorkstationInfo(Level); 347 348 /* FIXME: Notify the redirector */ 349 350 return dwResult; 351 } 352 353 354 /* Function 2 */ 355 unsigned long 356 __stdcall 357 NetrWkstaUserEnum( 358 WKSSVC_IDENTIFY_HANDLE ServerName, 359 LPWKSTA_USER_ENUM_STRUCT UserInfo, 360 unsigned long PreferredMaximumLength, 361 unsigned long *TotalEntries, 362 unsigned long *ResumeHandle) 363 { 364 ERR("NetrWkstaUserEnum(%p %p 0x%lx %p %p)\n", 365 ServerName, UserInfo, PreferredMaximumLength, TotalEntries, ResumeHandle); 366 367 368 UNIMPLEMENTED; 369 return 0; 370 } 371 372 373 /* Function 3 */ 374 unsigned long 375 __stdcall 376 NetrWkstaUserGetInfo( 377 WKSSVC_IDENTIFY_HANDLE Unused, 378 unsigned long Level, 379 LPWKSTA_USER_INFO UserInfo) 380 { 381 FIXME("(%s, %d, %p)\n", debugstr_w(Unused), Level, UserInfo); 382 383 UNIMPLEMENTED; 384 return 0; 385 } 386 387 388 /* Function 4 */ 389 unsigned long 390 __stdcall 391 NetrWkstaUserSetInfo ( 392 WKSSVC_IDENTIFY_HANDLE Unused, 393 unsigned long Level, 394 LPWKSTA_USER_INFO UserInfo, 395 unsigned long *ErrorParameter) 396 { 397 UNIMPLEMENTED; 398 return 0; 399 } 400 401 402 /* Function 5 */ 403 unsigned long 404 __stdcall 405 NetrWkstaTransportEnum( 406 WKSSVC_IDENTIFY_HANDLE ServerName, 407 LPWKSTA_TRANSPORT_ENUM_STRUCT TransportInfo, 408 unsigned long PreferredMaximumLength, 409 unsigned long* TotalEntries, 410 unsigned long *ResumeHandle) 411 { 412 UNIMPLEMENTED; 413 return 0; 414 } 415 416 417 /* Function 6 */ 418 unsigned long 419 __stdcall 420 NetrWkstaTransportAdd( 421 WKSSVC_IDENTIFY_HANDLE ServerName, 422 unsigned long Level, 423 LPWKSTA_TRANSPORT_INFO_0 TransportInfo, 424 unsigned long *ErrorParameter) 425 { 426 UNIMPLEMENTED; 427 return 0; 428 } 429 430 431 /* Function 7 */ 432 unsigned long 433 __stdcall 434 NetrWkstaTransportDel( 435 WKSSVC_IDENTIFY_HANDLE ServerName, 436 wchar_t *TransportName, 437 unsigned long ForceLevel) 438 { 439 UNIMPLEMENTED; 440 return 0; 441 } 442 443 444 /* Function 8 */ 445 unsigned long 446 __stdcall 447 NetrUseAdd( 448 WKSSVC_IMPERSONATE_HANDLE ServerName, 449 unsigned long Level, 450 LPUSE_INFO InfoStruct, 451 unsigned long *ErrorParameter) 452 { 453 UNIMPLEMENTED; 454 return 0; 455 } 456 457 458 /* Function 9 */ 459 unsigned long 460 __stdcall 461 NetrUseGetInfo( 462 WKSSVC_IMPERSONATE_HANDLE ServerName, 463 wchar_t *UseName, 464 unsigned long Level, 465 LPUSE_INFO InfoStruct) 466 { 467 UNIMPLEMENTED; 468 return 0; 469 } 470 471 472 /* Function 10 */ 473 unsigned long 474 __stdcall 475 NetrUseDel( 476 WKSSVC_IMPERSONATE_HANDLE ServerName, 477 wchar_t *UseName, 478 unsigned long ForceLevel) 479 { 480 UNIMPLEMENTED; 481 return 0; 482 } 483 484 485 /* Function 11 */ 486 unsigned long 487 __stdcall 488 NetrUseEnum( 489 WKSSVC_IDENTIFY_HANDLE ServerName, 490 LPUSE_ENUM_STRUCT InfoStruct, 491 unsigned long PreferredMaximumLength, 492 unsigned long *TotalEntries, 493 unsigned long *ResumeHandle) 494 { 495 UNIMPLEMENTED; 496 return 0; 497 } 498 499 500 /* Function 12 - Not used on wire */ 501 unsigned long 502 __stdcall 503 NetrMessageBufferSend(void) 504 { 505 TRACE("NetrMessageBufferSend()\n"); 506 return ERROR_NOT_SUPPORTED; 507 } 508 509 510 /* Function 13 */ 511 unsigned long 512 __stdcall 513 NetrWorkstationStatisticsGet( 514 WKSSVC_IDENTIFY_HANDLE ServerName, 515 wchar_t *ServiceName, 516 unsigned long Level, 517 unsigned long Options, 518 LPSTAT_WORKSTATION_0 *Buffer) 519 { 520 PSTAT_WORKSTATION_0 pStatBuffer; 521 522 TRACE("NetrWorkstationStatisticsGet(%p %p %lu 0x%lx %p)\n", 523 ServerName, ServiceName, Level, Options, Buffer); 524 525 if (Level != 0) 526 return ERROR_INVALID_LEVEL; 527 528 if (Options != 0) 529 return ERROR_INVALID_PARAMETER; 530 531 pStatBuffer = midl_user_allocate(sizeof(STAT_WORKSTATION_0)); 532 if (pStatBuffer == NULL) 533 return ERROR_NOT_ENOUGH_MEMORY; 534 535 ZeroMemory(pStatBuffer, sizeof(STAT_WORKSTATION_0)); 536 537 // FIXME: Return the actual statistcs data! 538 539 *Buffer = pStatBuffer; 540 541 return NERR_Success; 542 } 543 544 545 /* Function 14 - Not used on wire */ 546 unsigned long 547 __stdcall 548 NetrLogonDomainNameAdd( 549 WKSSVC_IDENTIFY_HANDLE DomainName) 550 { 551 TRACE("NetrLogonDomainNameAdd(%s)\n", 552 debugstr_w(DomainName)); 553 return ERROR_NOT_SUPPORTED; 554 } 555 556 557 /* Function 15 - Not used on wire */ 558 unsigned long 559 __stdcall 560 NetrLogonDomainNameDel( 561 WKSSVC_IDENTIFY_HANDLE DomainName) 562 { 563 TRACE("NetrLogonDomainNameDel(%s)\n", 564 debugstr_w(DomainName)); 565 return ERROR_NOT_SUPPORTED; 566 } 567 568 569 /* Function 16 - Not used on wire */ 570 unsigned long 571 __stdcall 572 NetrJoinDomain(void) 573 { 574 TRACE("NetrJoinDomain()\n"); 575 return ERROR_NOT_SUPPORTED; 576 } 577 578 579 /* Function 17 - Not used on wire */ 580 unsigned long 581 __stdcall 582 NetrUnjoinDomain(void) 583 { 584 TRACE("NetrUnjoinDomain()\n"); 585 return ERROR_NOT_SUPPORTED; 586 } 587 588 589 /* Function 18 - Not used on wire */ 590 unsigned long 591 __stdcall 592 NetrValidateName(void) 593 { 594 TRACE("NetrValidateName()\n"); 595 return ERROR_NOT_SUPPORTED; 596 } 597 598 599 /* Function 19 - Not used on wire */ 600 unsigned long 601 __stdcall 602 NetrRenameMachineInDomain(void) 603 { 604 TRACE("NetrRenameMachineInDomain()\n"); 605 return ERROR_NOT_SUPPORTED; 606 } 607 608 609 /* Function 20 */ 610 unsigned long 611 __stdcall 612 NetrGetJoinInformation( 613 WKSSVC_IMPERSONATE_HANDLE ServerName, 614 wchar_t **NameBuffer, 615 PNETSETUP_JOIN_STATUS BufferType) 616 { 617 TRACE("NetrGetJoinInformation(%p %p %p)\n", 618 ServerName, NameBuffer, BufferType); 619 620 if (NameBuffer == NULL) 621 return ERROR_INVALID_PARAMETER; 622 623 return NetpGetJoinInformation(NameBuffer, 624 BufferType); 625 } 626 627 628 /* Function 21 - Not used on wire */ 629 unsigned long 630 __stdcall 631 NetrGetJoinableOUs(void) 632 { 633 TRACE("NetrGetJoinableOUs()\n"); 634 return ERROR_NOT_SUPPORTED; 635 } 636 637 638 /* Function 22 */ 639 unsigned long 640 __stdcall 641 NetrJoinDomain2( 642 handle_t RpcBindingHandle, 643 wchar_t *ServerName, 644 wchar_t *DomainNameParam, 645 wchar_t *MachineAccountOU, 646 wchar_t *AccountName, 647 PJOINPR_ENCRYPTED_USER_PASSWORD Password, 648 unsigned long Options) 649 { 650 NET_API_STATUS status; 651 652 FIXME("NetrJoinDomain2(%p %S %S %S %S %p 0x%lx)\n", 653 RpcBindingHandle, ServerName, DomainNameParam, MachineAccountOU, 654 AccountName, Password, Options); 655 656 if (DomainNameParam == NULL) 657 return ERROR_INVALID_PARAMETER; 658 659 if (Options & NETSETUP_JOIN_DOMAIN) 660 { 661 FIXME("NetrJoinDomain2: NETSETUP_JOIN_DOMAIN is not supported yet!\n"); 662 status = ERROR_CALL_NOT_IMPLEMENTED; 663 } 664 else 665 { 666 status = NetpJoinWorkgroup(DomainNameParam); 667 } 668 669 return status; 670 } 671 672 673 /* Function 23 */ 674 unsigned long 675 __stdcall 676 NetrUnjoinDomain2( 677 handle_t RpcBindingHandle, 678 wchar_t *ServerName, 679 wchar_t *AccountName, 680 PJOINPR_ENCRYPTED_USER_PASSWORD Password, 681 unsigned long Options) 682 { 683 UNIMPLEMENTED; 684 return 0; 685 } 686 687 688 /* Function 24 */ 689 unsigned long 690 __stdcall 691 NetrRenameMachineInDomain2( 692 handle_t RpcBindingHandle, 693 wchar_t *ServerName, 694 wchar_t *MachineName, 695 wchar_t *AccountName, 696 PJOINPR_ENCRYPTED_USER_PASSWORD Password, 697 unsigned long Options) 698 { 699 UNIMPLEMENTED; 700 return 0; 701 } 702 703 704 /* Function 25 */ 705 unsigned long 706 __stdcall 707 NetrValidateName2( 708 handle_t RpcBindingHandle, 709 wchar_t *ServerName, 710 wchar_t *NameToValidate, 711 wchar_t *AccountName, 712 PJOINPR_ENCRYPTED_USER_PASSWORD Password, 713 NETSETUP_NAME_TYPE NameType) 714 { 715 UNIMPLEMENTED; 716 return 0; 717 } 718 719 720 /* Function 26 */ 721 unsigned long 722 __stdcall 723 NetrGetJoinableOUs2( 724 handle_t RpcBindingHandle, 725 wchar_t *ServerName, 726 wchar_t *DomainNameParam, 727 wchar_t *AccountName, 728 PJOINPR_ENCRYPTED_USER_PASSWORD Password, 729 unsigned long* OUCount, 730 wchar_t ***OUs) 731 { 732 UNIMPLEMENTED; 733 return 0; 734 } 735 736 737 /* Function 27 */ 738 unsigned long 739 __stdcall 740 NetrAddAlternateComputerName( 741 handle_t RpcBindingHandle, 742 wchar_t *ServerName, 743 wchar_t *AlternateName, 744 wchar_t *DomainAccount, 745 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword, 746 unsigned long Reserved) 747 { 748 UNIMPLEMENTED; 749 return 0; 750 } 751 752 753 /* Function 28 */ 754 unsigned long 755 __stdcall 756 NetrRemoveAlternateComputerName( 757 handle_t RpcBindingHandle, 758 wchar_t *ServerName, 759 wchar_t *AlternateName, 760 wchar_t *DomainAccount, 761 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword, 762 unsigned long Reserved) 763 { 764 UNIMPLEMENTED; 765 return 0; 766 } 767 768 769 /* Function 29 */ 770 unsigned long 771 __stdcall 772 NetrSetPrimaryComputerName( 773 handle_t RpcBindingHandle, 774 wchar_t *ServerName, 775 wchar_t *PrimaryName, 776 wchar_t *DomainAccount, 777 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword, 778 unsigned long Reserved) 779 { 780 UNIMPLEMENTED; 781 return 0; 782 } 783 784 785 /* Function 30 */ 786 unsigned long 787 __stdcall 788 NetrEnumerateComputerNames( 789 WKSSVC_IMPERSONATE_HANDLE ServerName, 790 NET_COMPUTER_NAME_TYPE NameType, 791 unsigned long Reserved, 792 PNET_COMPUTER_NAME_ARRAY *ComputerNames) 793 { 794 UNIMPLEMENTED; 795 return 0; 796 } 797 798 /* EOF */ 799