1/* 2 * Unix SMB/CIFS implementation. 3 * RPC Pipe client / server routines 4 * 5 * Copyright (C) Gerald (Jerry) Carter 2005. 6 * Copyright (C) Guenther Deschner 2008,2009. 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 3 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; if not, see <http://www.gnu.org/licenses/>. 20 */ 21 22#include "includes.h" 23#include "../librpc/gen_ndr/srv_ntsvcs.h" 24 25#undef DBGC_CLASS 26#define DBGC_CLASS DBGC_RPC_SRV 27 28/******************************************************************** 29********************************************************************/ 30 31static char* get_device_path(TALLOC_CTX *mem_ctx, const char *device ) 32{ 33 return talloc_asprintf(mem_ctx, "ROOT\\Legacy_%s\\0000", device); 34} 35 36/******************************************************************** 37********************************************************************/ 38 39WERROR _PNP_GetVersion(pipes_struct *p, 40 struct PNP_GetVersion *r) 41{ 42 *r->out.version = 0x0400; /* no idea what this means */ 43 44 return WERR_OK; 45} 46 47/******************************************************************** 48********************************************************************/ 49 50WERROR _PNP_GetDeviceListSize(pipes_struct *p, 51 struct PNP_GetDeviceListSize *r) 52{ 53 char *devicepath; 54 55 if ((r->in.flags & CM_GETIDLIST_FILTER_SERVICE) && 56 (!r->in.devicename)) { 57 return WERR_CM_INVALID_POINTER; 58 } 59 60 if (!(devicepath = get_device_path(p->mem_ctx, r->in.devicename))) { 61 return WERR_NOMEM; 62 } 63 64 *r->out.size = strlen(devicepath) + 2; 65 66 TALLOC_FREE(devicepath); 67 68 return WERR_OK; 69} 70 71/**************************************************************** 72 _PNP_GetDeviceList 73****************************************************************/ 74 75WERROR _PNP_GetDeviceList(pipes_struct *p, 76 struct PNP_GetDeviceList *r) 77{ 78 char *devicepath; 79 uint32_t size = 0; 80 const char **multi_sz = NULL; 81 DATA_BLOB blob; 82 83 if ((r->in.flags & CM_GETIDLIST_FILTER_SERVICE) && 84 (!r->in.filter)) { 85 return WERR_CM_INVALID_POINTER; 86 } 87 88 if (!(devicepath = get_device_path(p->mem_ctx, r->in.filter))) { 89 return WERR_NOMEM; 90 } 91 92 size = strlen(devicepath) + 2; 93 94 if (*r->in.length < size) { 95 return WERR_CM_BUFFER_SMALL; 96 } 97 98 multi_sz = talloc_zero_array(p->mem_ctx, const char *, 2); 99 if (!multi_sz) { 100 return WERR_NOMEM; 101 } 102 103 multi_sz[0] = devicepath; 104 105 if (!push_reg_multi_sz(multi_sz, &blob, multi_sz)) { 106 return WERR_NOMEM; 107 } 108 109 if (*r->in.length < blob.length/2) { 110 return WERR_CM_BUFFER_SMALL; 111 } 112 113 memcpy(r->out.buffer, blob.data, blob.length); 114 115 return WERR_OK; 116} 117 118/******************************************************************** 119_PNP_GetDeviceRegProp 120********************************************************************/ 121 122WERROR _PNP_GetDeviceRegProp(pipes_struct *p, 123 struct PNP_GetDeviceRegProp *r) 124{ 125 char *ptr; 126 struct regval_ctr *values; 127 struct regval_blob *val; 128 129 switch( r->in.property ) { 130 case DEV_REGPROP_DESC: 131 132 /* just parse the service name from the device path and then 133 lookup the display name */ 134 if ( !(ptr = strrchr_m( r->in.devicepath, '\\' )) ) 135 return WERR_GENERAL_FAILURE; 136 *ptr = '\0'; 137 138 if ( !(ptr = strrchr_m( r->in.devicepath, '_' )) ) 139 return WERR_GENERAL_FAILURE; 140 ptr++; 141 142 if ( !(values = svcctl_fetch_regvalues( 143 ptr, p->server_info->ptok))) 144 return WERR_GENERAL_FAILURE; 145 146 if ( !(val = regval_ctr_getvalue( values, "DisplayName" )) ) { 147 TALLOC_FREE( values ); 148 return WERR_GENERAL_FAILURE; 149 } 150 151 if (*r->in.buffer_size < val->size) { 152 *r->out.needed = val->size; 153 *r->out.buffer_size = 0; 154 TALLOC_FREE( values ); 155 return WERR_CM_BUFFER_SMALL; 156 } 157 158 r->out.buffer = (uint8_t *)talloc_memdup(p->mem_ctx, val->data_p, val->size); 159 TALLOC_FREE(values); 160 if (!r->out.buffer) { 161 return WERR_NOMEM; 162 } 163 164 *r->out.reg_data_type = REG_SZ; /* always 1...tested using a remove device manager connection */ 165 *r->out.buffer_size = val->size; 166 *r->out.needed = val->size; 167 168 break; 169 170 default: 171 *r->out.reg_data_type = 0x00437c98; /* ??? */ 172 return WERR_CM_NO_SUCH_VALUE; 173 } 174 175 return WERR_OK; 176} 177 178/******************************************************************** 179********************************************************************/ 180 181WERROR _PNP_ValidateDeviceInstance(pipes_struct *p, 182 struct PNP_ValidateDeviceInstance *r) 183{ 184 /* whatever dude */ 185 return WERR_OK; 186} 187 188/******************************************************************** 189********************************************************************/ 190 191WERROR _PNP_GetHwProfInfo(pipes_struct *p, 192 struct PNP_GetHwProfInfo *r) 193{ 194 /* steal the incoming buffer */ 195 196 r->out.info = r->in.info; 197 198 /* Take the 5th Ammentment */ 199 200 return WERR_CM_NO_MORE_HW_PROFILES; 201} 202 203/******************************************************************** 204********************************************************************/ 205 206WERROR _PNP_HwProfFlags(pipes_struct *p, 207 struct PNP_HwProfFlags *r) 208{ 209 /* just nod your head */ 210 211 return WERR_OK; 212} 213 214/**************************************************************** 215****************************************************************/ 216 217WERROR _PNP_Disconnect(pipes_struct *p, 218 struct PNP_Disconnect *r) 219{ 220 p->rng_fault_state = true; 221 return WERR_NOT_SUPPORTED; 222} 223 224/**************************************************************** 225****************************************************************/ 226 227WERROR _PNP_Connect(pipes_struct *p, 228 struct PNP_Connect *r) 229{ 230 p->rng_fault_state = true; 231 return WERR_NOT_SUPPORTED; 232} 233 234/**************************************************************** 235****************************************************************/ 236 237WERROR _PNP_GetGlobalState(pipes_struct *p, 238 struct PNP_GetGlobalState *r) 239{ 240 p->rng_fault_state = true; 241 return WERR_NOT_SUPPORTED; 242} 243 244/**************************************************************** 245****************************************************************/ 246 247WERROR _PNP_InitDetection(pipes_struct *p, 248 struct PNP_InitDetection *r) 249{ 250 p->rng_fault_state = true; 251 return WERR_NOT_SUPPORTED; 252} 253 254/**************************************************************** 255****************************************************************/ 256 257WERROR _PNP_ReportLogOn(pipes_struct *p, 258 struct PNP_ReportLogOn *r) 259{ 260 p->rng_fault_state = true; 261 return WERR_NOT_SUPPORTED; 262} 263 264/**************************************************************** 265****************************************************************/ 266 267WERROR _PNP_GetRootDeviceInstance(pipes_struct *p, 268 struct PNP_GetRootDeviceInstance *r) 269{ 270 p->rng_fault_state = true; 271 return WERR_NOT_SUPPORTED; 272} 273 274/**************************************************************** 275****************************************************************/ 276 277WERROR _PNP_GetRelatedDeviceInstance(pipes_struct *p, 278 struct PNP_GetRelatedDeviceInstance *r) 279{ 280 p->rng_fault_state = true; 281 return WERR_NOT_SUPPORTED; 282} 283 284/**************************************************************** 285****************************************************************/ 286 287WERROR _PNP_EnumerateSubKeys(pipes_struct *p, 288 struct PNP_EnumerateSubKeys *r) 289{ 290 p->rng_fault_state = true; 291 return WERR_NOT_SUPPORTED; 292} 293 294/**************************************************************** 295****************************************************************/ 296 297WERROR _PNP_GetDepth(pipes_struct *p, 298 struct PNP_GetDepth *r) 299{ 300 p->rng_fault_state = true; 301 return WERR_NOT_SUPPORTED; 302} 303 304/**************************************************************** 305****************************************************************/ 306 307WERROR _PNP_SetDeviceRegProp(pipes_struct *p, 308 struct PNP_SetDeviceRegProp *r) 309{ 310 p->rng_fault_state = true; 311 return WERR_NOT_SUPPORTED; 312} 313 314/**************************************************************** 315****************************************************************/ 316 317WERROR _PNP_GetClassInstance(pipes_struct *p, 318 struct PNP_GetClassInstance *r) 319{ 320 p->rng_fault_state = true; 321 return WERR_NOT_SUPPORTED; 322} 323 324/**************************************************************** 325****************************************************************/ 326 327WERROR _PNP_CreateKey(pipes_struct *p, 328 struct PNP_CreateKey *r) 329{ 330 p->rng_fault_state = true; 331 return WERR_NOT_SUPPORTED; 332} 333 334/**************************************************************** 335****************************************************************/ 336 337WERROR _PNP_DeleteRegistryKey(pipes_struct *p, 338 struct PNP_DeleteRegistryKey *r) 339{ 340 p->rng_fault_state = true; 341 return WERR_NOT_SUPPORTED; 342} 343 344/**************************************************************** 345****************************************************************/ 346 347WERROR _PNP_GetClassCount(pipes_struct *p, 348 struct PNP_GetClassCount *r) 349{ 350 p->rng_fault_state = true; 351 return WERR_NOT_SUPPORTED; 352} 353 354/**************************************************************** 355****************************************************************/ 356 357WERROR _PNP_GetClassName(pipes_struct *p, 358 struct PNP_GetClassName *r) 359{ 360 p->rng_fault_state = true; 361 return WERR_NOT_SUPPORTED; 362} 363 364/**************************************************************** 365****************************************************************/ 366 367WERROR _PNP_DeleteClassKey(pipes_struct *p, 368 struct PNP_DeleteClassKey *r) 369{ 370 p->rng_fault_state = true; 371 return WERR_NOT_SUPPORTED; 372} 373 374/**************************************************************** 375****************************************************************/ 376 377WERROR _PNP_GetInterfaceDeviceAlias(pipes_struct *p, 378 struct PNP_GetInterfaceDeviceAlias *r) 379{ 380 p->rng_fault_state = true; 381 return WERR_NOT_SUPPORTED; 382} 383 384/**************************************************************** 385****************************************************************/ 386 387WERROR _PNP_GetInterfaceDeviceList(pipes_struct *p, 388 struct PNP_GetInterfaceDeviceList *r) 389{ 390 p->rng_fault_state = true; 391 return WERR_NOT_SUPPORTED; 392} 393 394/**************************************************************** 395****************************************************************/ 396 397WERROR _PNP_GetInterfaceDeviceListSize(pipes_struct *p, 398 struct PNP_GetInterfaceDeviceListSize *r) 399{ 400 p->rng_fault_state = true; 401 return WERR_NOT_SUPPORTED; 402} 403 404/**************************************************************** 405****************************************************************/ 406 407WERROR _PNP_RegisterDeviceClassAssociation(pipes_struct *p, 408 struct PNP_RegisterDeviceClassAssociation *r) 409{ 410 p->rng_fault_state = true; 411 return WERR_NOT_SUPPORTED; 412} 413 414/**************************************************************** 415****************************************************************/ 416 417WERROR _PNP_UnregisterDeviceClassAssociation(pipes_struct *p, 418 struct PNP_UnregisterDeviceClassAssociation *r) 419{ 420 p->rng_fault_state = true; 421 return WERR_NOT_SUPPORTED; 422} 423 424/**************************************************************** 425****************************************************************/ 426 427WERROR _PNP_GetClassRegProp(pipes_struct *p, 428 struct PNP_GetClassRegProp *r) 429{ 430 p->rng_fault_state = true; 431 return WERR_NOT_SUPPORTED; 432} 433 434/**************************************************************** 435****************************************************************/ 436 437WERROR _PNP_SetClassRegProp(pipes_struct *p, 438 struct PNP_SetClassRegProp *r) 439{ 440 p->rng_fault_state = true; 441 return WERR_NOT_SUPPORTED; 442} 443 444/**************************************************************** 445****************************************************************/ 446 447WERROR _PNP_CreateDevInst(pipes_struct *p, 448 struct PNP_CreateDevInst *r) 449{ 450 p->rng_fault_state = true; 451 return WERR_NOT_SUPPORTED; 452} 453 454/**************************************************************** 455****************************************************************/ 456 457WERROR _PNP_DeviceInstanceAction(pipes_struct *p, 458 struct PNP_DeviceInstanceAction *r) 459{ 460 p->rng_fault_state = true; 461 return WERR_NOT_SUPPORTED; 462} 463 464/**************************************************************** 465****************************************************************/ 466 467WERROR _PNP_GetDeviceStatus(pipes_struct *p, 468 struct PNP_GetDeviceStatus *r) 469{ 470 p->rng_fault_state = true; 471 return WERR_NOT_SUPPORTED; 472} 473 474/**************************************************************** 475****************************************************************/ 476 477WERROR _PNP_SetDeviceProblem(pipes_struct *p, 478 struct PNP_SetDeviceProblem *r) 479{ 480 p->rng_fault_state = true; 481 return WERR_NOT_SUPPORTED; 482} 483 484/**************************************************************** 485****************************************************************/ 486 487WERROR _PNP_DisableDevInst(pipes_struct *p, 488 struct PNP_DisableDevInst *r) 489{ 490 p->rng_fault_state = true; 491 return WERR_NOT_SUPPORTED; 492} 493 494/**************************************************************** 495****************************************************************/ 496 497WERROR _PNP_UninstallDevInst(pipes_struct *p, 498 struct PNP_UninstallDevInst *r) 499{ 500 p->rng_fault_state = true; 501 return WERR_NOT_SUPPORTED; 502} 503 504/**************************************************************** 505****************************************************************/ 506 507WERROR _PNP_AddID(pipes_struct *p, 508 struct PNP_AddID *r) 509{ 510 p->rng_fault_state = true; 511 return WERR_NOT_SUPPORTED; 512} 513 514/**************************************************************** 515****************************************************************/ 516 517WERROR _PNP_RegisterDriver(pipes_struct *p, 518 struct PNP_RegisterDriver *r) 519{ 520 p->rng_fault_state = true; 521 return WERR_NOT_SUPPORTED; 522} 523 524/**************************************************************** 525****************************************************************/ 526 527WERROR _PNP_QueryRemove(pipes_struct *p, 528 struct PNP_QueryRemove *r) 529{ 530 p->rng_fault_state = true; 531 return WERR_NOT_SUPPORTED; 532} 533 534/**************************************************************** 535****************************************************************/ 536 537WERROR _PNP_RequestDeviceEject(pipes_struct *p, 538 struct PNP_RequestDeviceEject *r) 539{ 540 p->rng_fault_state = true; 541 return WERR_NOT_SUPPORTED; 542} 543 544/**************************************************************** 545****************************************************************/ 546 547WERROR _PNP_IsDockStationPresent(pipes_struct *p, 548 struct PNP_IsDockStationPresent *r) 549{ 550 p->rng_fault_state = true; 551 return WERR_NOT_SUPPORTED; 552} 553 554/**************************************************************** 555****************************************************************/ 556 557WERROR _PNP_RequestEjectPC(pipes_struct *p, 558 struct PNP_RequestEjectPC *r) 559{ 560 p->rng_fault_state = true; 561 return WERR_NOT_SUPPORTED; 562} 563 564/**************************************************************** 565****************************************************************/ 566 567WERROR _PNP_AddEmptyLogConf(pipes_struct *p, 568 struct PNP_AddEmptyLogConf *r) 569{ 570 p->rng_fault_state = true; 571 return WERR_NOT_SUPPORTED; 572} 573 574/**************************************************************** 575****************************************************************/ 576 577WERROR _PNP_FreeLogConf(pipes_struct *p, 578 struct PNP_FreeLogConf *r) 579{ 580 p->rng_fault_state = true; 581 return WERR_NOT_SUPPORTED; 582} 583 584/**************************************************************** 585****************************************************************/ 586 587WERROR _PNP_GetFirstLogConf(pipes_struct *p, 588 struct PNP_GetFirstLogConf *r) 589{ 590 p->rng_fault_state = true; 591 return WERR_NOT_SUPPORTED; 592} 593 594/**************************************************************** 595****************************************************************/ 596 597WERROR _PNP_GetNextLogConf(pipes_struct *p, 598 struct PNP_GetNextLogConf *r) 599{ 600 p->rng_fault_state = true; 601 return WERR_NOT_SUPPORTED; 602} 603 604/**************************************************************** 605****************************************************************/ 606 607WERROR _PNP_GetLogConfPriority(pipes_struct *p, 608 struct PNP_GetLogConfPriority *r) 609{ 610 p->rng_fault_state = true; 611 return WERR_NOT_SUPPORTED; 612} 613 614/**************************************************************** 615****************************************************************/ 616 617WERROR _PNP_AddResDes(pipes_struct *p, 618 struct PNP_AddResDes *r) 619{ 620 p->rng_fault_state = true; 621 return WERR_NOT_SUPPORTED; 622} 623 624/**************************************************************** 625****************************************************************/ 626 627WERROR _PNP_FreeResDes(pipes_struct *p, 628 struct PNP_FreeResDes *r) 629{ 630 p->rng_fault_state = true; 631 return WERR_NOT_SUPPORTED; 632} 633 634/**************************************************************** 635****************************************************************/ 636 637WERROR _PNP_GetNextResDes(pipes_struct *p, 638 struct PNP_GetNextResDes *r) 639{ 640 p->rng_fault_state = true; 641 return WERR_NOT_SUPPORTED; 642} 643 644/**************************************************************** 645****************************************************************/ 646 647WERROR _PNP_GetResDesData(pipes_struct *p, 648 struct PNP_GetResDesData *r) 649{ 650 p->rng_fault_state = true; 651 return WERR_NOT_SUPPORTED; 652} 653 654/**************************************************************** 655****************************************************************/ 656 657WERROR _PNP_GetResDesDataSize(pipes_struct *p, 658 struct PNP_GetResDesDataSize *r) 659{ 660 p->rng_fault_state = true; 661 return WERR_NOT_SUPPORTED; 662} 663 664/**************************************************************** 665****************************************************************/ 666 667WERROR _PNP_ModifyResDes(pipes_struct *p, 668 struct PNP_ModifyResDes *r) 669{ 670 p->rng_fault_state = true; 671 return WERR_NOT_SUPPORTED; 672} 673 674/**************************************************************** 675****************************************************************/ 676 677WERROR _PNP_DetectResourceLimit(pipes_struct *p, 678 struct PNP_DetectResourceLimit *r) 679{ 680 p->rng_fault_state = true; 681 return WERR_NOT_SUPPORTED; 682} 683 684/**************************************************************** 685****************************************************************/ 686 687WERROR _PNP_QueryResConfList(pipes_struct *p, 688 struct PNP_QueryResConfList *r) 689{ 690 p->rng_fault_state = true; 691 return WERR_NOT_SUPPORTED; 692} 693 694/**************************************************************** 695****************************************************************/ 696 697WERROR _PNP_SetHwProf(pipes_struct *p, 698 struct PNP_SetHwProf *r) 699{ 700 p->rng_fault_state = true; 701 return WERR_NOT_SUPPORTED; 702} 703 704/**************************************************************** 705****************************************************************/ 706 707WERROR _PNP_QueryArbitratorFreeData(pipes_struct *p, 708 struct PNP_QueryArbitratorFreeData *r) 709{ 710 p->rng_fault_state = true; 711 return WERR_NOT_SUPPORTED; 712} 713 714/**************************************************************** 715****************************************************************/ 716 717WERROR _PNP_QueryArbitratorFreeSize(pipes_struct *p, 718 struct PNP_QueryArbitratorFreeSize *r) 719{ 720 p->rng_fault_state = true; 721 return WERR_NOT_SUPPORTED; 722} 723 724/**************************************************************** 725****************************************************************/ 726 727WERROR _PNP_RunDetection(pipes_struct *p, 728 struct PNP_RunDetection *r) 729{ 730 p->rng_fault_state = true; 731 return WERR_NOT_SUPPORTED; 732} 733 734/**************************************************************** 735****************************************************************/ 736 737WERROR _PNP_RegisterNotification(pipes_struct *p, 738 struct PNP_RegisterNotification *r) 739{ 740 p->rng_fault_state = true; 741 return WERR_NOT_SUPPORTED; 742} 743 744/**************************************************************** 745****************************************************************/ 746 747WERROR _PNP_UnregisterNotification(pipes_struct *p, 748 struct PNP_UnregisterNotification *r) 749{ 750 p->rng_fault_state = true; 751 return WERR_NOT_SUPPORTED; 752} 753 754/**************************************************************** 755****************************************************************/ 756 757WERROR _PNP_GetCustomDevProp(pipes_struct *p, 758 struct PNP_GetCustomDevProp *r) 759{ 760 p->rng_fault_state = true; 761 return WERR_NOT_SUPPORTED; 762} 763 764/**************************************************************** 765****************************************************************/ 766 767WERROR _PNP_GetVersionInternal(pipes_struct *p, 768 struct PNP_GetVersionInternal *r) 769{ 770 p->rng_fault_state = true; 771 return WERR_NOT_SUPPORTED; 772} 773 774/**************************************************************** 775****************************************************************/ 776 777WERROR _PNP_GetBlockedDriverInfo(pipes_struct *p, 778 struct PNP_GetBlockedDriverInfo *r) 779{ 780 p->rng_fault_state = true; 781 return WERR_NOT_SUPPORTED; 782} 783 784/**************************************************************** 785****************************************************************/ 786 787WERROR _PNP_GetServerSideDeviceInstallFlags(pipes_struct *p, 788 struct PNP_GetServerSideDeviceInstallFlags *r) 789{ 790 p->rng_fault_state = true; 791 return WERR_NOT_SUPPORTED; 792} 793 794