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 TRACE("NetrWkstaGetInfo level %lu\n", Level); 89 90 return 0; 91 } 92 93 94 /* Function 1 */ 95 unsigned long 96 __stdcall 97 NetrWkstaSetInfo( 98 WKSSVC_IDENTIFY_HANDLE ServerName, 99 unsigned long Level, 100 LPWKSTA_INFO WkstaInfo, 101 unsigned long *ErrorParameter) 102 { 103 UNIMPLEMENTED; 104 return 0; 105 } 106 107 108 /* Function 2 */ 109 unsigned long 110 __stdcall 111 NetrWkstaUserEnum( 112 WKSSVC_IDENTIFY_HANDLE ServerName, 113 LPWKSTA_USER_ENUM_STRUCT UserInfo, 114 unsigned long PreferredMaximumLength, 115 unsigned long *TotalEntries, 116 unsigned long *ResumeHandle) 117 { 118 UNIMPLEMENTED; 119 return 0; 120 } 121 122 123 /* Function 3 */ 124 unsigned long 125 __stdcall 126 NetrWkstaUserGetInfo( 127 WKSSVC_IDENTIFY_HANDLE Unused, 128 unsigned long Level, 129 LPWKSTA_USER_INFO UserInfo) 130 { 131 FIXME("(%s, %d, %p)\n", debugstr_w(Unused), Level, UserInfo); 132 133 UNIMPLEMENTED; 134 return 0; 135 } 136 137 138 /* Function 4 */ 139 unsigned long 140 __stdcall 141 NetrWkstaUserSetInfo ( 142 WKSSVC_IDENTIFY_HANDLE Unused, 143 unsigned long Level, 144 LPWKSTA_USER_INFO UserInfo, 145 unsigned long *ErrorParameter) 146 { 147 UNIMPLEMENTED; 148 return 0; 149 } 150 151 152 /* Function 5 */ 153 unsigned long 154 __stdcall 155 NetrWkstaTransportEnum( 156 WKSSVC_IDENTIFY_HANDLE ServerName, 157 LPWKSTA_TRANSPORT_ENUM_STRUCT TransportInfo, 158 unsigned long PreferredMaximumLength, 159 unsigned long* TotalEntries, 160 unsigned long *ResumeHandle) 161 { 162 UNIMPLEMENTED; 163 return 0; 164 } 165 166 167 /* Function 6 */ 168 unsigned long 169 __stdcall 170 NetrWkstaTransportAdd( 171 WKSSVC_IDENTIFY_HANDLE ServerName, 172 unsigned long Level, 173 LPWKSTA_TRANSPORT_INFO_0 TransportInfo, 174 unsigned long *ErrorParameter) 175 { 176 UNIMPLEMENTED; 177 return 0; 178 } 179 180 181 /* Function 7 */ 182 unsigned long 183 __stdcall 184 NetrWkstaTransportDel( 185 WKSSVC_IDENTIFY_HANDLE ServerName, 186 wchar_t *TransportName, 187 unsigned long ForceLevel) 188 { 189 UNIMPLEMENTED; 190 return 0; 191 } 192 193 194 /* Function 8 */ 195 unsigned long 196 __stdcall 197 NetrUseAdd( 198 WKSSVC_IMPERSONATE_HANDLE ServerName, 199 unsigned long Level, 200 LPUSE_INFO InfoStruct, 201 unsigned long *ErrorParameter) 202 { 203 UNIMPLEMENTED; 204 return 0; 205 } 206 207 208 /* Function 9 */ 209 unsigned long 210 __stdcall 211 NetrUseGetInfo( 212 WKSSVC_IMPERSONATE_HANDLE ServerName, 213 wchar_t *UseName, 214 unsigned long Level, 215 LPUSE_INFO InfoStruct) 216 { 217 UNIMPLEMENTED; 218 return 0; 219 } 220 221 222 /* Function 10 */ 223 unsigned long 224 __stdcall 225 NetrUseDel( 226 WKSSVC_IMPERSONATE_HANDLE ServerName, 227 wchar_t *UseName, 228 unsigned long ForceLevel) 229 { 230 UNIMPLEMENTED; 231 return 0; 232 } 233 234 235 /* Function 11 */ 236 unsigned long 237 __stdcall 238 NetrUseEnum( 239 WKSSVC_IDENTIFY_HANDLE ServerName, 240 LPUSE_ENUM_STRUCT InfoStruct, 241 unsigned long PreferredMaximumLength, 242 unsigned long *TotalEntries, 243 unsigned long *ResumeHandle) 244 { 245 UNIMPLEMENTED; 246 return 0; 247 } 248 249 250 /* Function 12 - Not used on wire */ 251 unsigned long 252 __stdcall 253 NetrMessageBufferSend(void) 254 { 255 TRACE("NetrMessageBufferSend()\n"); 256 return ERROR_NOT_SUPPORTED; 257 } 258 259 260 /* Function 13 */ 261 unsigned long 262 __stdcall 263 NetrWorkstationStatisticsGet( 264 WKSSVC_IDENTIFY_HANDLE ServerName, 265 wchar_t *ServiceName, 266 unsigned long Level, 267 unsigned long Options, 268 LPSTAT_WORKSTATION_0 *Buffer) 269 { 270 PSTAT_WORKSTATION_0 pStatBuffer; 271 272 TRACE("NetrWorkstationStatisticsGet(%p %p %lu 0x%lx %p)\n", 273 ServerName, ServiceName, Level, Options, Buffer); 274 275 if (Level != 0) 276 return ERROR_INVALID_LEVEL; 277 278 if (Options != 0) 279 return ERROR_INVALID_PARAMETER; 280 281 pStatBuffer = midl_user_allocate(sizeof(STAT_WORKSTATION_0)); 282 if (pStatBuffer == NULL) 283 return ERROR_NOT_ENOUGH_MEMORY; 284 285 ZeroMemory(pStatBuffer, sizeof(STAT_WORKSTATION_0)); 286 287 // FIXME: Return the actual statistcs data! 288 289 *Buffer = pStatBuffer; 290 291 return NERR_Success; 292 } 293 294 295 /* Function 14 - Not used on wire */ 296 unsigned long 297 __stdcall 298 NetrLogonDomainNameAdd( 299 WKSSVC_IDENTIFY_HANDLE DomainName) 300 { 301 TRACE("NetrLogonDomainNameAdd(%s)\n", 302 debugstr_w(DomainName)); 303 return ERROR_NOT_SUPPORTED; 304 } 305 306 307 /* Function 15 - Not used on wire */ 308 unsigned long 309 __stdcall 310 NetrLogonDomainNameDel( 311 WKSSVC_IDENTIFY_HANDLE DomainName) 312 { 313 TRACE("NetrLogonDomainNameDel(%s)\n", 314 debugstr_w(DomainName)); 315 return ERROR_NOT_SUPPORTED; 316 } 317 318 319 /* Function 16 - Not used on wire */ 320 unsigned long 321 __stdcall 322 NetrJoinDomain(void) 323 { 324 TRACE("NetrJoinDomain()\n"); 325 return ERROR_NOT_SUPPORTED; 326 } 327 328 329 /* Function 17 - Not used on wire */ 330 unsigned long 331 __stdcall 332 NetrUnjoinDomain(void) 333 { 334 TRACE("NetrUnjoinDomain()\n"); 335 return ERROR_NOT_SUPPORTED; 336 } 337 338 339 /* Function 18 - Not used on wire */ 340 unsigned long 341 __stdcall 342 NetrValidateName(void) 343 { 344 TRACE("NetrValidateName()\n"); 345 return ERROR_NOT_SUPPORTED; 346 } 347 348 349 /* Function 19 - Not used on wire */ 350 unsigned long 351 __stdcall 352 NetrRenameMachineInDomain(void) 353 { 354 TRACE("NetrRenameMachineInDomain()\n"); 355 return ERROR_NOT_SUPPORTED; 356 } 357 358 359 /* Function 20 */ 360 unsigned long 361 __stdcall 362 NetrGetJoinInformation( 363 WKSSVC_IMPERSONATE_HANDLE ServerName, 364 wchar_t **NameBuffer, 365 PNETSETUP_JOIN_STATUS BufferType) 366 { 367 TRACE("NetrGetJoinInformation(%p %p %p)\n", 368 ServerName, NameBuffer, BufferType); 369 370 if (NameBuffer == NULL) 371 return ERROR_INVALID_PARAMETER; 372 373 return NetpGetJoinInformation(NameBuffer, 374 BufferType); 375 } 376 377 378 /* Function 21 - Not used on wire */ 379 unsigned long 380 __stdcall 381 NetrGetJoinableOUs(void) 382 { 383 TRACE("NetrGetJoinableOUs()\n"); 384 return ERROR_NOT_SUPPORTED; 385 } 386 387 388 /* Function 22 */ 389 unsigned long 390 __stdcall 391 NetrJoinDomain2( 392 handle_t RpcBindingHandle, 393 wchar_t *ServerName, 394 wchar_t *DomainNameParam, 395 wchar_t *MachineAccountOU, 396 wchar_t *AccountName, 397 PJOINPR_ENCRYPTED_USER_PASSWORD Password, 398 unsigned long Options) 399 { 400 NET_API_STATUS status; 401 402 FIXME("NetrJoinDomain2(%p %S %S %S %S %p 0x%lx)\n", 403 RpcBindingHandle, ServerName, DomainNameParam, MachineAccountOU, 404 AccountName, Password, Options); 405 406 if (DomainNameParam == NULL) 407 return ERROR_INVALID_PARAMETER; 408 409 if (Options & NETSETUP_JOIN_DOMAIN) 410 { 411 FIXME("NetrJoinDomain2: NETSETUP_JOIN_DOMAIN is not supported yet!\n"); 412 status = ERROR_CALL_NOT_IMPLEMENTED; 413 } 414 else 415 { 416 status = NetpJoinWorkgroup(DomainNameParam); 417 } 418 419 return status; 420 } 421 422 423 /* Function 23 */ 424 unsigned long 425 __stdcall 426 NetrUnjoinDomain2( 427 handle_t RpcBindingHandle, 428 wchar_t *ServerName, 429 wchar_t *AccountName, 430 PJOINPR_ENCRYPTED_USER_PASSWORD Password, 431 unsigned long Options) 432 { 433 UNIMPLEMENTED; 434 return 0; 435 } 436 437 438 /* Function 24 */ 439 unsigned long 440 __stdcall 441 NetrRenameMachineInDomain2( 442 handle_t RpcBindingHandle, 443 wchar_t *ServerName, 444 wchar_t *MachineName, 445 wchar_t *AccountName, 446 PJOINPR_ENCRYPTED_USER_PASSWORD Password, 447 unsigned long Options) 448 { 449 UNIMPLEMENTED; 450 return 0; 451 } 452 453 454 /* Function 25 */ 455 unsigned long 456 __stdcall 457 NetrValidateName2( 458 handle_t RpcBindingHandle, 459 wchar_t *ServerName, 460 wchar_t *NameToValidate, 461 wchar_t *AccountName, 462 PJOINPR_ENCRYPTED_USER_PASSWORD Password, 463 NETSETUP_NAME_TYPE NameType) 464 { 465 UNIMPLEMENTED; 466 return 0; 467 } 468 469 470 /* Function 26 */ 471 unsigned long 472 __stdcall 473 NetrGetJoinableOUs2( 474 handle_t RpcBindingHandle, 475 wchar_t *ServerName, 476 wchar_t *DomainNameParam, 477 wchar_t *AccountName, 478 PJOINPR_ENCRYPTED_USER_PASSWORD Password, 479 unsigned long* OUCount, 480 wchar_t ***OUs) 481 { 482 UNIMPLEMENTED; 483 return 0; 484 } 485 486 487 /* Function 27 */ 488 unsigned long 489 __stdcall 490 NetrAddAlternateComputerName( 491 handle_t RpcBindingHandle, 492 wchar_t *ServerName, 493 wchar_t *AlternateName, 494 wchar_t *DomainAccount, 495 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword, 496 unsigned long Reserved) 497 { 498 UNIMPLEMENTED; 499 return 0; 500 } 501 502 503 /* Function 28 */ 504 unsigned long 505 __stdcall 506 NetrRemoveAlternateComputerName( 507 handle_t RpcBindingHandle, 508 wchar_t *ServerName, 509 wchar_t *AlternateName, 510 wchar_t *DomainAccount, 511 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword, 512 unsigned long Reserved) 513 { 514 UNIMPLEMENTED; 515 return 0; 516 } 517 518 519 /* Function 29 */ 520 unsigned long 521 __stdcall 522 NetrSetPrimaryComputerName( 523 handle_t RpcBindingHandle, 524 wchar_t *ServerName, 525 wchar_t *PrimaryName, 526 wchar_t *DomainAccount, 527 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword, 528 unsigned long Reserved) 529 { 530 UNIMPLEMENTED; 531 return 0; 532 } 533 534 535 /* Function 30 */ 536 unsigned long 537 __stdcall 538 NetrEnumerateComputerNames( 539 WKSSVC_IMPERSONATE_HANDLE ServerName, 540 NET_COMPUTER_NAME_TYPE NameType, 541 unsigned long Reserved, 542 PNET_COMPUTER_NAME_ARRAY *ComputerNames) 543 { 544 UNIMPLEMENTED; 545 return 0; 546 } 547 548 /* EOF */ 549