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) Jeremy Cooper 2004. 8 Copyright (C) Gerald Carter 2002-2005. 9 10 This program is free software; you can redistribute it and/or modify 11 it under the terms of the GNU General Public License as published by 12 the Free Software Foundation; either version 2 of the License, or 13 (at your option) any later version. 14 15 This program is distributed in the hope that it will be useful, 16 but WITHOUT ANY WARRANTY; without even the implied warranty of 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 GNU General Public License for more details. 19 20 You should have received a copy of the GNU General Public License 21 along with this program; if not, write to the Free Software 22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 23*/ 24 25#ifndef _RPC_REG_H /* _RPC_REG_H */ 26#define _RPC_REG_H 27 28/* RPC opnum */ 29 30#define REG_OPEN_HKCR 0x00 31#define REG_OPEN_HKLM 0x02 32#define REG_OPEN_HKPD 0x03 33#define REG_OPEN_HKU 0x04 34#define REG_CLOSE 0x05 35#define REG_CREATE_KEY_EX 0x06 36#define REG_DELETE_KEY 0x07 37#define REG_DELETE_VALUE 0x08 38#define REG_ENUM_KEY 0x09 39#define REG_ENUM_VALUE 0x0a 40#define REG_FLUSH_KEY 0x0b 41#define REG_GET_KEY_SEC 0x0c 42#define REG_OPEN_ENTRY 0x0f 43#define REG_QUERY_KEY 0x10 44#define REG_QUERY_VALUE 0x11 45#define REG_RESTORE_KEY 0x13 46#define REG_SAVE_KEY 0x14 47#define REG_SET_KEY_SEC 0x15 48#define REG_SET_VALUE 0x16 49#define REG_SHUTDOWN 0x18 50#define REG_ABORT_SHUTDOWN 0x19 51#define REG_OPEN_HKPT 0x20 52#define REG_GETVERSION 0x1a 53#define REG_SHUTDOWN_EX 0x1e 54 55 56#define HKEY_CLASSES_ROOT 0x80000000 57#define HKEY_CURRENT_USER 0x80000001 58#define HKEY_LOCAL_MACHINE 0x80000002 59#define HKEY_USERS 0x80000003 60#define HKEY_PERFORMANCE_DATA 0x80000004 61 62#define KEY_HKLM "HKLM" 63#define KEY_HKU "HKU" 64#define KEY_HKCR "HKCR" 65#define KEY_HKPD "HKPD" 66#define KEY_HKPT "HKPT" 67#define KEY_SERVICES "HKLM\\SYSTEM\\CurrentControlSet\\Services" 68#define KEY_PRINTING "HKLM\\SYSTEM\\CurrentControlSet\\Control\\Print" 69#define KEY_PRINTING_2K "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers" 70#define KEY_PRINTING_PORTS "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Ports" 71#define KEY_EVENTLOG "HKLM\\SYSTEM\\CurrentControlSet\\Services\\Eventlog" 72#define KEY_SHARES "HKLM\\SYSTEM\\CurrentControlSet\\Services\\LanmanServer\\Shares" 73#define KEY_TREE_ROOT "" 74 75/* Registry data types */ 76 77#define REG_NONE 0 78#define REG_SZ 1 79#define REG_EXPAND_SZ 2 80#define REG_BINARY 3 81#define REG_DWORD 4 82#define REG_DWORD_LE 4 /* DWORD, little endian */ 83#define REG_DWORD_BE 5 /* DWORD, big endian */ 84#define REG_LINK 6 85#define REG_MULTI_SZ 7 86#define REG_RESOURCE_LIST 8 87#define REG_FULL_RESOURCE_DESCRIPTOR 9 88#define REG_RESOURCE_REQUIREMENTS_LIST 10 89 90/* 91 * Registry key types 92 * Most keys are going to be GENERIC -- may need a better name? 93 * HKPD and HKPT are used by reg_perfcount.c 94 * they are special keys that contain performance data 95 */ 96#define REG_KEY_GENERIC 0 97#define REG_KEY_HKPD 1 98#define REG_KEY_HKPT 2 99 100/* 101 * container for function pointers to enumeration routines 102 * for virtual registry view 103 */ 104 105typedef struct { 106 /* functions for enumerating subkeys and values */ 107 int (*fetch_subkeys)( const char *key, REGSUBKEY_CTR *subkeys); 108 int (*fetch_values) ( const char *key, REGVAL_CTR *val ); 109 BOOL (*store_subkeys)( const char *key, REGSUBKEY_CTR *subkeys ); 110 BOOL (*store_values)( const char *key, REGVAL_CTR *val ); 111 BOOL (*reg_access_check)( const char *keyname, uint32 requested, uint32 *granted, NT_USER_TOKEN *token ); 112} REGISTRY_OPS; 113 114typedef struct { 115 const char *keyname; /* full path to name of key */ 116 REGISTRY_OPS *ops; /* registry function hooks */ 117} REGISTRY_HOOK; 118 119 120/* structure to store the registry handles */ 121 122typedef struct _RegistryKey { 123 uint32 type; 124 char *name; /* full name of registry key */ 125 uint32 access_granted; 126 REGISTRY_HOOK *hook; 127} REGISTRY_KEY; 128 129/* 130 * RPC REGISTRY STRUCTURES 131 */ 132 133/***********************************************/ 134 135typedef struct { 136 uint16 *server; 137 uint32 access; 138} REG_Q_OPEN_HIVE; 139 140typedef struct { 141 POLICY_HND pol; 142 WERROR status; 143} REG_R_OPEN_HIVE; 144 145 146/***********************************************/ 147 148typedef struct { 149 POLICY_HND pol; 150} REG_Q_FLUSH_KEY; 151 152typedef struct { 153 WERROR status; 154} REG_R_FLUSH_KEY; 155 156 157/***********************************************/ 158 159typedef struct { 160 POLICY_HND handle; 161 uint32 sec_info; 162 uint32 ptr; 163 BUFHDR hdr_sec; 164 SEC_DESC_BUF *data; 165} REG_Q_SET_KEY_SEC; 166 167typedef struct { 168 WERROR status; 169} REG_R_SET_KEY_SEC; 170 171 172/***********************************************/ 173 174typedef struct { 175 POLICY_HND handle; 176 uint32 sec_info; 177 uint32 ptr; 178 BUFHDR hdr_sec; 179 SEC_DESC_BUF *data; 180} REG_Q_GET_KEY_SEC; 181 182typedef struct { 183 uint32 sec_info; 184 uint32 ptr; 185 BUFHDR hdr_sec; 186 SEC_DESC_BUF *data; 187 WERROR status; 188} REG_R_GET_KEY_SEC; 189 190/***********************************************/ 191 192typedef struct { 193 POLICY_HND handle; 194 UNISTR4 name; 195 uint32 type; 196 RPC_DATA_BLOB value; 197 uint32 size; 198} REG_Q_SET_VALUE; 199 200typedef struct { 201 WERROR status; 202} REG_R_SET_VALUE; 203 204/***********************************************/ 205 206typedef struct { 207 POLICY_HND pol; 208 uint32 val_index; 209 UNISTR4 name; 210 uint32 *type; 211 REGVAL_BUFFER *value; /* value, in byte buffer */ 212 uint32 *buffer_len; 213 uint32 *name_len; 214} REG_Q_ENUM_VALUE; 215 216typedef struct { 217 UNISTR4 name; 218 uint32 *type; 219 REGVAL_BUFFER *value; 220 uint32 *buffer_len1; 221 uint32 *buffer_len2; 222 WERROR status; 223} REG_R_ENUM_VALUE; 224 225/***********************************************/ 226 227typedef struct { 228 POLICY_HND handle; 229 UNISTR4 name; 230 UNISTR4 key_class; 231 uint32 options; 232 uint32 access; 233 234 /* FIXME! collapse all this into one structure */ 235 uint32 *sec_info; 236 uint32 ptr2; 237 BUFHDR hdr_sec; 238 uint32 ptr3; 239 SEC_DESC_BUF *data; 240 241 uint32 *disposition; 242} REG_Q_CREATE_KEY_EX; 243 244typedef struct { 245 POLICY_HND handle; 246 uint32 disposition; 247 WERROR status; 248} REG_R_CREATE_KEY_EX; 249 250/***********************************************/ 251 252typedef struct { 253 POLICY_HND handle; 254 UNISTR4 name; 255} REG_Q_DELETE_KEY; 256 257typedef struct { 258 WERROR status; 259} REG_R_DELETE_KEY; 260 261/***********************************************/ 262 263typedef struct { 264 POLICY_HND handle; 265 UNISTR4 name; 266} REG_Q_DELETE_VALUE; 267 268typedef struct { 269 WERROR status; 270} REG_R_DELETE_VALUE; 271 272/***********************************************/ 273 274typedef struct { 275 POLICY_HND pol; 276 UNISTR4 key_class; 277} REG_Q_QUERY_KEY; 278 279typedef struct { 280 UNISTR4 key_class; 281 uint32 num_subkeys; 282 uint32 max_subkeylen; 283 uint32 reserved; /* 0x0000 0000 - according to MSDN (max_subkeysize?) */ 284 uint32 num_values; 285 uint32 max_valnamelen; 286 uint32 max_valbufsize; 287 uint32 sec_desc; /* 0x0000 0078 */ 288 NTTIME mod_time; /* modified time */ 289 WERROR status; 290} REG_R_QUERY_KEY; 291 292 293/***********************************************/ 294 295typedef struct { 296 POLICY_HND pol; 297} REG_Q_GETVERSION; 298 299typedef struct { 300 uint32 win_version; 301 WERROR status; 302} REG_R_GETVERSION; 303 304 305/***********************************************/ 306 307typedef struct { 308 POLICY_HND pol; 309 UNISTR4 filename; 310 uint32 flags; 311} REG_Q_RESTORE_KEY; 312 313typedef struct { 314 WERROR status; /* return status */ 315} REG_R_RESTORE_KEY; 316 317 318/***********************************************/ 319 320 321/* I have no idea if this is correct since I 322 have not seen the full structure on the wire 323 as of yet */ 324 325typedef struct { 326 uint32 max_len; 327 uint32 len; 328 SEC_DESC *secdesc; 329} REG_SEC_DESC_BUF; 330 331typedef struct { 332 uint32 size; /* size in bytes of security descriptor */ 333 REG_SEC_DESC_BUF secdesc; 334 uint8 inherit; /* see MSDN for a description */ 335} SECURITY_ATTRIBUTE; 336 337typedef struct { 338 POLICY_HND pol; 339 UNISTR4 filename; 340 SECURITY_ATTRIBUTE *sec_attr; 341} REG_Q_SAVE_KEY; 342 343typedef struct { 344 WERROR status; /* return status */ 345} REG_R_SAVE_KEY; 346 347 348/***********************************************/ 349 350typedef struct { 351 POLICY_HND pol; /* policy handle */ 352} REG_Q_CLOSE; 353 354typedef struct { 355 POLICY_HND pol; 356 WERROR status; 357} REG_R_CLOSE; 358 359 360/***********************************************/ 361 362typedef struct { 363 POLICY_HND pol; 364 uint32 key_index; 365 uint16 key_name_len; 366 uint16 unknown_1; /* 0x0414 */ 367 uint32 ptr1; 368 uint32 unknown_2; /* 0x0000 020A */ 369 uint8 pad1[8]; 370 uint32 ptr2; 371 uint8 pad2[8]; 372 uint32 ptr3; 373 NTTIME time; 374} REG_Q_ENUM_KEY; 375 376typedef struct { 377 UNISTR4 keyname; 378 UNISTR4 *classname; 379 NTTIME *time; 380 WERROR status; /* return status */ 381} REG_R_ENUM_KEY; 382 383 384/***********************************************/ 385 386typedef struct { 387 POLICY_HND pol; /* policy handle */ 388 UNISTR4 name; 389 390 uint32 ptr_reserved; /* pointer */ 391 392 uint32 ptr_buf; /* the next three fields follow if ptr_buf != 0 */ 393 uint32 ptr_bufsize; 394 uint32 bufsize; 395 uint32 buf_unk; 396 397 uint32 unk1; 398 uint32 ptr_buflen; 399 uint32 buflen; 400 401 uint32 ptr_buflen2; 402 uint32 buflen2; 403 404} REG_Q_QUERY_VALUE; 405 406typedef struct { 407 uint32 *type; 408 REGVAL_BUFFER *value; /* key value */ 409 uint32 *buf_max_len; 410 uint32 *buf_len; 411 WERROR status; /* return status */ 412} REG_R_QUERY_VALUE; 413 414 415/***********************************************/ 416 417typedef struct { 418 POLICY_HND pol; 419 UNISTR4 name; 420 uint32 unknown_0; /* 32 bit unknown - 0x0000 0000 */ 421 uint32 access; 422} REG_Q_OPEN_ENTRY; 423 424typedef struct { 425 POLICY_HND handle; 426 WERROR status; 427} REG_R_OPEN_ENTRY; 428 429/***********************************************/ 430 431typedef struct { 432 uint16 *server; 433 UNISTR4 *message; 434 uint32 timeout; /* in seconds */ 435 uint8 force; /* boolean: force shutdown */ 436 uint8 reboot; /* boolean: reboot on shutdown */ 437} REG_Q_SHUTDOWN; 438 439typedef struct { 440 WERROR status; /* return status */ 441} REG_R_SHUTDOWN; 442 443/***********************************************/ 444 445typedef struct { 446 uint16 *server; 447 UNISTR4 *message; 448 uint32 timeout; /* in seconds */ 449 uint8 force; /* boolean: force shutdown */ 450 uint8 reboot; /* boolean: reboot on shutdown */ 451 uint32 reason; /* reason - must be defined code */ 452} REG_Q_SHUTDOWN_EX; 453 454typedef struct { 455 WERROR status; 456} REG_R_SHUTDOWN_EX; 457 458/***********************************************/ 459 460typedef struct { 461 uint16 *server; 462} REG_Q_ABORT_SHUTDOWN; 463 464typedef struct { 465 WERROR status; 466} REG_R_ABORT_SHUTDOWN; 467 468 469#endif /* _RPC_REG_H */ 470 471