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()\n"); 368 369 *NameBuffer = NULL; 370 *BufferType = NetSetupUnjoined; 371 372 return NERR_Success; 373 } 374 375 376 /* Function 21 - Not used on wire */ 377 unsigned long 378 __stdcall 379 NetrGetJoinableOUs(void) 380 { 381 TRACE("NetrGetJoinableOUs()\n"); 382 return ERROR_NOT_SUPPORTED; 383 } 384 385 386 /* Function 22 */ 387 unsigned long 388 __stdcall 389 NetrJoinDomain2( 390 handle_t RpcBindingHandle, 391 wchar_t *ServerName, 392 wchar_t *DomainNameParam, 393 wchar_t *MachineAccountOU, 394 wchar_t *AccountName, 395 PJOINPR_ENCRYPTED_USER_PASSWORD Password, 396 unsigned long Options) 397 { 398 UNIMPLEMENTED; 399 return 0; 400 } 401 402 403 /* Function 23 */ 404 unsigned long 405 __stdcall 406 NetrUnjoinDomain2( 407 handle_t RpcBindingHandle, 408 wchar_t *ServerName, 409 wchar_t *AccountName, 410 PJOINPR_ENCRYPTED_USER_PASSWORD Password, 411 unsigned long Options) 412 { 413 UNIMPLEMENTED; 414 return 0; 415 } 416 417 418 /* Function 24 */ 419 unsigned long 420 __stdcall 421 NetrRenameMachineInDomain2( 422 handle_t RpcBindingHandle, 423 wchar_t *ServerName, 424 wchar_t *MachineName, 425 wchar_t *AccountName, 426 PJOINPR_ENCRYPTED_USER_PASSWORD Password, 427 unsigned long Options) 428 { 429 UNIMPLEMENTED; 430 return 0; 431 } 432 433 434 /* Function 25 */ 435 unsigned long 436 __stdcall 437 NetrValidateName2( 438 handle_t RpcBindingHandle, 439 wchar_t *ServerName, 440 wchar_t *NameToValidate, 441 wchar_t *AccountName, 442 PJOINPR_ENCRYPTED_USER_PASSWORD Password, 443 NETSETUP_NAME_TYPE NameType) 444 { 445 UNIMPLEMENTED; 446 return 0; 447 } 448 449 450 /* Function 26 */ 451 unsigned long 452 __stdcall 453 NetrGetJoinableOUs2( 454 handle_t RpcBindingHandle, 455 wchar_t *ServerName, 456 wchar_t *DomainNameParam, 457 wchar_t *AccountName, 458 PJOINPR_ENCRYPTED_USER_PASSWORD Password, 459 unsigned long* OUCount, 460 wchar_t ***OUs) 461 { 462 UNIMPLEMENTED; 463 return 0; 464 } 465 466 467 /* Function 27 */ 468 unsigned long 469 __stdcall 470 NetrAddAlternateComputerName( 471 handle_t RpcBindingHandle, 472 wchar_t *ServerName, 473 wchar_t *AlternateName, 474 wchar_t *DomainAccount, 475 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword, 476 unsigned long Reserved) 477 { 478 UNIMPLEMENTED; 479 return 0; 480 } 481 482 483 /* Function 28 */ 484 unsigned long 485 __stdcall 486 NetrRemoveAlternateComputerName( 487 handle_t RpcBindingHandle, 488 wchar_t *ServerName, 489 wchar_t *AlternateName, 490 wchar_t *DomainAccount, 491 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword, 492 unsigned long Reserved) 493 { 494 UNIMPLEMENTED; 495 return 0; 496 } 497 498 499 /* Function 29 */ 500 unsigned long 501 __stdcall 502 NetrSetPrimaryComputerName( 503 handle_t RpcBindingHandle, 504 wchar_t *ServerName, 505 wchar_t *PrimaryName, 506 wchar_t *DomainAccount, 507 PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword, 508 unsigned long Reserved) 509 { 510 UNIMPLEMENTED; 511 return 0; 512 } 513 514 515 /* Function 30 */ 516 unsigned long 517 __stdcall 518 NetrEnumerateComputerNames( 519 WKSSVC_IMPERSONATE_HANDLE ServerName, 520 NET_COMPUTER_NAME_TYPE NameType, 521 unsigned long Reserved, 522 PNET_COMPUTER_NAME_ARRAY *ComputerNames) 523 { 524 UNIMPLEMENTED; 525 return 0; 526 } 527 528 /* EOF */ 529