1/* 2 Unix SMB/CIFS implementation. 3 SMB parameters and setup 4 Copyright (C) Andrew Tridgell 1992-1997. 5 Copyright (C) Luke Kenneth Casson Leighton 1996-1997. 6 Copyright (C) Paul Ashton 1997. 7 Copyright (C) Gerald Carter 2002. 8 9 This program is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 2 of the License, or 12 (at your option) any later version. 13 14 This program is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with this program; if not, write to the Free Software 21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 22*/ 23 24#ifndef _RPC_REG_H /* _RPC_REG_H */ 25#define _RPC_REG_H 26 27 28/* winreg pipe defines 29 NOT IMPLEMENTED !! 30#define _REG_UNK_01 0x01 31#define _REG_UNK_03 0x03 32#define REG_CREATE_KEY 0x06 33#define REG_DELETE_KEY 0x07 34#define REG_DELETE_VALUE 0x08 35#define REG_FLUSH_KEY 0x0b 36#define REG_GET_KEY_SEC 0x0c 37#define _REG_UNK_0D 0x0d 38#define _REG_UNK_0E 0x0e 39#define _REG_UNK_12 0x12 40#define _REG_UNK_13 0x13 41#define REG_SET_KEY_SEC 0x15 42#define REG_CREATE_VALUE 0x16 43#define _REG_UNK_17 0x17 44*/ 45 46/* Implemented */ 47#define REG_OPEN_HKCR 0x00 48#define REG_OPEN_HKLM 0x02 49#define REG_OPEN_HKU 0x04 50#define REG_CLOSE 0x05 51#define REG_ENUM_KEY 0x09 52#define REG_ENUM_VALUE 0x0a 53#define REG_OPEN_ENTRY 0x0f 54#define REG_QUERY_KEY 0x10 55#define REG_INFO 0x11 56#define REG_SHUTDOWN 0x18 57#define REG_ABORT_SHUTDOWN 0x19 58#define REG_SAVE_KEY 0x14 /* no idea what the real name is */ 59#define REG_UNKNOWN_1A 0x1a 60 61 62#define HKEY_CLASSES_ROOT 0x80000000 63#define HKEY_CURRENT_USER 0x80000001 64#define HKEY_LOCAL_MACHINE 0x80000002 65#define HKEY_USERS 0x80000003 66 67#define KEY_HKLM "HKLM" 68#define KEY_HKU "HKU" 69#define KEY_HKCR "HKCR" 70#define KEY_PRINTING "HKLM\\SYSTEM\\CurrentControlSet\\Control\\Print" 71#define KEY_TREE_ROOT "" 72 73/* Registry data types */ 74 75#define REG_NONE 0 76#define REG_SZ 1 77#define REG_EXPAND_SZ 2 78#define REG_BINARY 3 79#define REG_DWORD 4 80#define REG_DWORD_LE 4 /* DWORD, little endian */ 81#define REG_DWORD_BE 5 /* DWORD, big endian */ 82#define REG_LINK 6 83#define REG_MULTI_SZ 7 84#define REG_RESOURCE_LIST 8 85#define REG_FULL_RESOURCE_DESCRIPTOR 9 86#define REG_RESOURCE_REQUIREMENTS_LIST 10 87 88/* structure to contain registry values */ 89 90typedef struct { 91 fstring valuename; 92 uint16 type; 93 uint32 size; /* in bytes */ 94 uint8 *data_p; 95} REGISTRY_VALUE; 96 97/* container for regostry values */ 98 99typedef struct { 100 TALLOC_CTX *ctx; 101 uint32 num_values; 102 REGISTRY_VALUE **values; 103} REGVAL_CTR; 104 105/* container for registry subkey names */ 106 107typedef struct { 108 TALLOC_CTX *ctx; 109 uint32 num_subkeys; 110 char **subkeys; 111} REGSUBKEY_CTR; 112 113 114/* 115 * container for function pointers to enumeration routines 116 * for vitural registry view 117 */ 118 119typedef struct { 120 /* functions for enumerating subkeys and values */ 121 int (*subkey_fn)( char *key, REGSUBKEY_CTR *subkeys); 122 int (*value_fn) ( char *key, REGVAL_CTR *val ); 123 BOOL (*store_subkeys_fn)( char *key, REGSUBKEY_CTR *subkeys ); 124 BOOL (*store_values_fn)( char *key, REGVAL_CTR *val ); 125} REGISTRY_OPS; 126 127typedef struct { 128 const char *keyname; /* full path to name of key */ 129 REGISTRY_OPS *ops; /* registry function hooks */ 130} REGISTRY_HOOK; 131 132 133 134/* structure to store the registry handles */ 135 136typedef struct _RegistryKey { 137 138 struct _RegistryKey *prev, *next; 139 140 POLICY_HND hnd; 141 pstring name; /* full name of registry key */ 142 REGISTRY_HOOK *hook; 143 144} REGISTRY_KEY; 145 146 147/* REG_Q_OPEN_HKCR */ 148typedef struct q_reg_open_hkcr_info 149{ 150 uint32 ptr; 151 uint16 unknown_0; /* 0x5428 - 16 bit unknown */ 152 uint16 unknown_1; /* random. changes */ 153 uint32 level; /* 0x0000 0002 - 32 bit unknown */ 154 155} REG_Q_OPEN_HKCR ; 156 157/* REG_R_OPEN_HKCR */ 158typedef struct r_reg_open_hkcr_info 159{ 160 POLICY_HND pol; /* policy handle */ 161 WERROR status; /* return status */ 162 163} REG_R_OPEN_HKCR; 164 165 166/* REG_Q_OPEN_HKLM */ 167typedef struct q_reg_open_hklm_info 168{ 169 uint32 ptr; 170 uint16 unknown_0; /* 0xE084 - 16 bit unknown */ 171 uint16 unknown_1; /* random. changes */ 172 uint32 access_mask; 173 174} 175REG_Q_OPEN_HKLM; 176 177/* REG_R_OPEN_HKLM */ 178typedef struct r_reg_open_hklm_info 179{ 180 POLICY_HND pol; /* policy handle */ 181 WERROR status; /* return status */ 182 183} 184REG_R_OPEN_HKLM; 185 186 187/* REG_Q_OPEN_HKU */ 188typedef struct q_reg_open_hku_info 189{ 190 uint32 ptr; 191 uint16 unknown_0; 192 uint16 unknown_1; 193 uint32 access_mask; 194 195} REG_Q_OPEN_HKU; 196 197/* REG_R_OPEN_HKU */ 198typedef struct r_reg_open_hku_info 199{ 200 POLICY_HND pol; /* policy handle */ 201 WERROR status; /* return status */ 202 203} REG_R_OPEN_HKU; 204 205 206/* REG_Q_FLUSH_KEY */ 207typedef struct q_reg_open_flush_key_info 208{ 209 POLICY_HND pol; /* policy handle */ 210 211} REG_Q_FLUSH_KEY; 212 213/* REG_R_FLUSH_KEY */ 214typedef struct r_reg_open_flush_key_info 215{ 216 WERROR status; /* return status */ 217 218} REG_R_FLUSH_KEY; 219 220 221/* REG_Q_SET_KEY_SEC */ 222typedef struct q_reg_set_key_sec_info 223{ 224 POLICY_HND pol; /* policy handle */ 225 226 uint32 sec_info; /* xxxx_SECURITY_INFORMATION */ 227 228 uint32 ptr; /* pointer */ 229 BUFHDR hdr_sec; /* header for security data */ 230 SEC_DESC_BUF *data; /* security data */ 231 232} REG_Q_SET_KEY_SEC; 233 234/* REG_R_SET_KEY_SEC */ 235typedef struct r_reg_set_key_sec_info 236{ 237 WERROR status; 238 239} REG_R_SET_KEY_SEC; 240 241 242/* REG_Q_GET_KEY_SEC */ 243typedef struct q_reg_get_key_sec_info 244{ 245 POLICY_HND pol; /* policy handle */ 246 247 uint32 sec_info; /* xxxx_SECURITY_INFORMATION */ 248 249 uint32 ptr; /* pointer */ 250 BUFHDR hdr_sec; /* header for security data */ 251 SEC_DESC_BUF *data; /* security data */ 252 253} REG_Q_GET_KEY_SEC; 254 255/* REG_R_GET_KEY_SEC */ 256typedef struct r_reg_get_key_sec_info 257{ 258 uint32 sec_info; /* xxxx_SECURITY_INFORMATION */ 259 260 uint32 ptr; /* pointer */ 261 BUFHDR hdr_sec; /* header for security data */ 262 SEC_DESC_BUF *data; /* security data */ 263 264 WERROR status; 265 266} REG_R_GET_KEY_SEC; 267 268/* REG_Q_CREATE_VALUE */ 269typedef struct q_reg_create_value_info 270{ 271 POLICY_HND pol; /* policy handle */ 272 273 UNIHDR hdr_name; /* name of value */ 274 UNISTR2 uni_name; 275 276 uint32 type; /* 1 = UNISTR, 3 = BYTES, 4 = DWORD, 7 = MULTI_UNISTR */ 277 278 BUFFER3 *buf_value; /* value, in byte buffer */ 279 280} REG_Q_CREATE_VALUE; 281 282/* REG_R_CREATE_VALUE */ 283typedef struct r_reg_create_value_info 284{ 285 WERROR status; /* return status */ 286 287} REG_R_CREATE_VALUE; 288 289/* REG_Q_ENUM_VALUE */ 290typedef struct q_reg_query_value_info 291{ 292 POLICY_HND pol; /* policy handle */ 293 294 uint32 val_index; /* index */ 295 296 UNIHDR hdr_name; /* name of value */ 297 UNISTR2 uni_name; 298 299 uint32 ptr_type; /* pointer */ 300 uint32 type; /* 1 = UNISTR, 3 = BYTES, 4 = DWORD, 7 = MULTI_UNISTR */ 301 302 uint32 ptr_value; /* pointer */ 303 BUFFER2 buf_value; /* value, in byte buffer */ 304 305 uint32 ptr1; /* pointer */ 306 uint32 len_value1; /* */ 307 308 uint32 ptr2; /* pointer */ 309 uint32 len_value2; /* */ 310 311 312} REG_Q_ENUM_VALUE; 313 314/* REG_R_ENUM_VALUE */ 315typedef struct r_reg_enum_value_info 316{ 317 UNIHDR hdr_name; /* name of value */ 318 UNISTR2 uni_name; 319 320 uint32 ptr_type; /* pointer */ 321 uint32 type; /* 1 = UNISTR, 3 = BYTES, 4 = DWORD, 7 = MULTI_UNISTR */ 322 323 uint32 ptr_value; /* pointer */ 324 BUFFER2 buf_value; /* value, in byte buffer */ 325 326 uint32 ptr1; /* pointer */ 327 uint32 len_value1; /* */ 328 329 uint32 ptr2; /* pointer */ 330 uint32 len_value2; /* */ 331 332 WERROR status; /* return status */ 333 334} REG_R_ENUM_VALUE; 335 336/* REG_Q_CREATE_KEY */ 337typedef struct q_reg_create_key_info 338{ 339 POLICY_HND pnt_pol; /* parent key policy handle */ 340 341 UNIHDR hdr_name; 342 UNISTR2 uni_name; 343 344 UNIHDR hdr_class; 345 UNISTR2 uni_class; 346 347 uint32 reserved; /* 0x0000 0000 */ 348 SEC_ACCESS sam_access; /* access rights flags, see rpc_secdes.h */ 349 350 uint32 ptr1; 351 uint32 sec_info; /* xxxx_SECURITY_INFORMATION */ 352 353 uint32 ptr2; /* pointer */ 354 BUFHDR hdr_sec; /* header for security data */ 355 uint32 ptr3; /* pointer */ 356 SEC_DESC_BUF *data; 357 358 uint32 unknown_2; /* 0x0000 0000 */ 359 360} REG_Q_CREATE_KEY; 361 362/* REG_R_CREATE_KEY */ 363typedef struct r_reg_create_key_info 364{ 365 POLICY_HND key_pol; /* policy handle */ 366 uint32 unknown; /* 0x0000 0000 */ 367 368 WERROR status; /* return status */ 369 370} REG_R_CREATE_KEY; 371 372/* REG_Q_DELETE_KEY */ 373typedef struct q_reg_delete_key_info 374{ 375 POLICY_HND pnt_pol; /* parent key policy handle */ 376 377 UNIHDR hdr_name; 378 UNISTR2 uni_name; 379} REG_Q_DELETE_KEY; 380 381/* REG_R_DELETE_KEY */ 382typedef struct r_reg_delete_key_info 383{ 384 POLICY_HND key_pol; /* policy handle */ 385 386 WERROR status; /* return status */ 387 388} REG_R_DELETE_KEY; 389 390/* REG_Q_DELETE_VALUE */ 391typedef struct q_reg_delete_val_info 392{ 393 POLICY_HND pnt_pol; /* parent key policy handle */ 394 395 UNIHDR hdr_name; 396 UNISTR2 uni_name; 397 398} REG_Q_DELETE_VALUE; 399 400/* REG_R_DELETE_VALUE */ 401typedef struct r_reg_delete_val_info 402{ 403 POLICY_HND key_pol; /* policy handle */ 404 405 WERROR status; /* return status */ 406 407} REG_R_DELETE_VALUE; 408 409/* REG_Q_QUERY_KEY */ 410typedef struct q_reg_query_info 411{ 412 POLICY_HND pol; /* policy handle */ 413 UNIHDR hdr_class; 414 UNISTR2 uni_class; 415 416} REG_Q_QUERY_KEY; 417 418/* REG_R_QUERY_KEY */ 419typedef struct r_reg_query_key_info 420{ 421 UNIHDR hdr_class; 422 UNISTR2 uni_class; 423 424 uint32 num_subkeys; 425 uint32 max_subkeylen; 426 uint32 reserved; /* 0x0000 0000 - according to MSDN (max_subkeysize?) */ 427 uint32 num_values; 428 uint32 max_valnamelen; 429 uint32 max_valbufsize; 430 uint32 sec_desc; /* 0x0000 0078 */ 431 NTTIME mod_time; /* modified time */ 432 433 WERROR status; /* return status */ 434 435} REG_R_QUERY_KEY; 436 437 438/* REG_Q_UNKNOWN_1A */ 439typedef struct q_reg_unk_1a_info 440{ 441 POLICY_HND pol; /* policy handle */ 442 443} REG_Q_UNKNOWN_1A; 444 445/* REG_R_UNKNOWN_1A */ 446typedef struct r_reg_unk_1a_info 447{ 448 uint32 unknown; /* 0x0500 0000 */ 449 WERROR status; /* return status */ 450 451} REG_R_UNKNOWN_1A; 452 453 454/* REG_Q_UNKNOWN_1A */ 455typedef struct q_reg_unknown_14 456{ 457 POLICY_HND pol; /* policy handle */ 458 459 UNIHDR hdr_file; /* unicode product type header */ 460 UNISTR2 uni_file; /* local filename to save key as from regedt32.exe */ 461 /* e.g. "c:\temp\test.dat" */ 462 463 uint32 unknown; /* 0x0000 0000 */ 464 465} REG_Q_SAVE_KEY; 466 467 468/* REG_R_UNKNOWN_1A */ 469typedef struct r_reg_unknown_14 470{ 471 WERROR status; /* return status */ 472 473} REG_R_SAVE_KEY; 474 475 476 477/* REG_Q_CLOSE */ 478typedef struct reg_q_close_info 479{ 480 POLICY_HND pol; /* policy handle */ 481 482} REG_Q_CLOSE; 483 484/* REG_R_CLOSE */ 485typedef struct reg_r_close_info 486{ 487 POLICY_HND pol; /* policy handle. should be all zeros. */ 488 489 WERROR status; /* return code */ 490 491} REG_R_CLOSE; 492 493 494/* REG_Q_ENUM_KEY */ 495typedef struct q_reg_enum_value_info 496{ 497 POLICY_HND pol; /* policy handle */ 498 499 uint32 key_index; 500 501 uint16 key_name_len; /* 0x0000 */ 502 uint16 unknown_1; /* 0x0414 */ 503 504 uint32 ptr1; /* pointer */ 505 uint32 unknown_2; /* 0x0000 020A */ 506 uint8 pad1[8]; /* padding - zeros */ 507 508 uint32 ptr2; /* pointer */ 509 uint8 pad2[8]; /* padding - zeros */ 510 511 uint32 ptr3; /* pointer */ 512 NTTIME time; /* current time? */ 513 514} REG_Q_ENUM_KEY; 515 516/* REG_R_ENUM_KEY */ 517typedef struct r_reg_enum_key_info 518{ 519 uint16 key_name_len; /* number of bytes in key name */ 520 uint16 unknown_1; /* 0x0414 - matches with query unknown_1 */ 521 522 uint32 ptr1; /* pointer */ 523 uint32 unknown_2; /* 0x0000 020A */ 524 uint32 unknown_3; /* 0x0000 0000 */ 525 526 UNISTR3 key_name; 527 528 uint32 ptr2; /* pointer */ 529 uint8 pad2[8]; /* padding - zeros */ 530 531 uint32 ptr3; /* pointer */ 532 NTTIME time; /* current time? */ 533 534 WERROR status; /* return status */ 535 536} REG_R_ENUM_KEY; 537 538 539/* REG_Q_INFO */ 540typedef struct q_reg_info_info 541{ 542 POLICY_HND pol; /* policy handle */ 543 544 UNIHDR hdr_type; /* unicode product type header */ 545 UNISTR2 uni_type; /* unicode product type - "ProductType" */ 546 547 uint32 ptr_reserved; /* pointer */ 548 549 uint32 ptr_buf; /* the next three fields follow if ptr_buf != 0 */ 550 uint32 ptr_bufsize; 551 uint32 bufsize; 552 uint32 buf_unk; 553 554 uint32 unk1; 555 uint32 ptr_buflen; 556 uint32 buflen; 557 558 uint32 ptr_buflen2; 559 uint32 buflen2; 560 561} REG_Q_INFO; 562 563/* REG_R_INFO */ 564typedef struct r_reg_info_info 565{ 566 uint32 ptr_type; /* key type pointer */ 567 uint32 type; /* key datatype */ 568 569 uint32 ptr_uni_val; /* key value pointer */ 570 BUFFER2 uni_val; /* key value */ 571 572 uint32 ptr_max_len; 573 uint32 buf_max_len; 574 575 uint32 ptr_len; 576 uint32 buf_len; 577 578 WERROR status; /* return status */ 579 580} REG_R_INFO; 581 582 583/* REG_Q_OPEN_ENTRY */ 584typedef struct q_reg_open_entry_info 585{ 586 POLICY_HND pol; /* policy handle */ 587 588 UNIHDR hdr_name; /* unicode registry string header */ 589 UNISTR2 uni_name; /* unicode registry string name */ 590 591 uint32 unknown_0; /* 32 bit unknown - 0x0000 0000 */ 592 uint32 access_desired; 593 594} REG_Q_OPEN_ENTRY; 595 596 597 598/* REG_R_OPEN_ENTRY */ 599typedef struct r_reg_open_entry_info 600{ 601 POLICY_HND pol; /* policy handle */ 602 WERROR status; /* return status */ 603 604} REG_R_OPEN_ENTRY; 605 606/* REG_Q_SHUTDOWN */ 607typedef struct q_reg_shutdown_info 608{ 609 uint32 ptr_0; 610 uint32 ptr_1; 611 uint32 ptr_2; 612 UNIHDR hdr_msg; /* shutdown message */ 613 UNISTR2 uni_msg; /* seconds */ 614 uint32 timeout; /* seconds */ 615 uint8 force; /* boolean: force shutdown */ 616 uint8 reboot; /* boolean: reboot on shutdown */ 617 618} REG_Q_SHUTDOWN; 619 620/* REG_R_SHUTDOWN */ 621typedef struct r_reg_shutdown_info 622{ 623 WERROR status; /* return status */ 624 625} REG_R_SHUTDOWN; 626 627/* REG_Q_ABORT_SHUTDOWN */ 628typedef struct q_reg_abort_shutdown_info 629{ 630 uint32 ptr_server; 631 uint16 server; 632 633} REG_Q_ABORT_SHUTDOWN; 634 635/* REG_R_ABORT_SHUTDOWN */ 636typedef struct r_reg_abort_shutdown_info 637{ 638 WERROR status; /* return status */ 639 640} REG_R_ABORT_SHUTDOWN; 641 642 643#endif /* _RPC_REG_H */ 644 645