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