diff options
Diffstat (limited to 'source4/include/registry.h')
-rw-r--r-- | source4/include/registry.h | 118 |
1 files changed, 113 insertions, 5 deletions
diff --git a/source4/include/registry.h b/source4/include/registry.h index 162bb5e283..3aea70ecc1 100644 --- a/source4/include/registry.h +++ b/source4/include/registry.h @@ -43,11 +43,6 @@ #define REG_FULL_RESOURCE_DESCRIPTOR 9 #define REG_RESOURCE_REQUIREMENTS_LIST 10 -typedef struct reg_handle_s REG_HANDLE; -typedef struct reg_key_s REG_KEY; -typedef struct reg_val_s REG_VAL; -typedef struct reg_ops_s REG_OPS; - #if 0 /* FIXME */ typedef struct ace_struct_s { @@ -57,4 +52,117 @@ typedef struct ace_struct_s { } ACE; #endif +/* + * The general idea here is that every backend provides a 'hive'. Combining + * various hives gives you a complete registry like windows has + */ + +#define REGISTRY_INTERFACE_VERSION 1 + +/* structure to store the registry handles */ +struct registry_key { + char *name; /* Name of the key */ + char *path; /* Full path to the key */ + char *class_name; /* Name of key class */ + NTTIME last_mod; /* Time last modified */ + SEC_DESC *security; + struct registry_hive *hive; + void *backend_data; + int ref; +}; + +struct registry_value { + char *name; + int data_type; + int data_len; + void *data_blk; /* Might want a separate block */ + struct registry_hive *hive; + struct registry_key *parent; + void *backend_data; + int ref; +}; + +/* FIXME */ +typedef void (*key_notification_function) (void); +typedef void (*value_notification_function) (void); + +/* + * Container for function pointers to enumeration routines + * for virtual registry view + * + * Backends can provide : + * - just one hive (example: nt4, w95) + * - several hives (example: rpc) + * + */ + +struct registry_operations { + const char *name; + + /* If one file, connection, etc may have more then one hive */ + WERROR (*list_available_hives) (TALLOC_CTX *, const char *location, const char *credentials, char ***hives); + + /* Implement this one */ + WERROR (*open_hive) (TALLOC_CTX *, struct registry_hive *, struct registry_key **); + + /* Or this one */ + WERROR (*open_key) (TALLOC_CTX *, struct registry_hive *, const char *name, struct registry_key **); + + /* Either implement these */ + WERROR (*num_subkeys) (struct registry_key *, int *count); + WERROR (*num_values) (struct registry_key *, int *count); + WERROR (*get_subkey_by_index) (TALLOC_CTX *, struct registry_key *, int idx, struct registry_key **); + + /* Can not contain more then one level */ + WERROR (*get_subkey_by_name) (TALLOC_CTX *, struct registry_key *, const char *name, struct registry_key **); + WERROR (*get_value_by_index) (TALLOC_CTX *, struct registry_key *, int idx, struct registry_value **); + + /* Can not contain more then one level */ + WERROR (*get_value_by_name) (TALLOC_CTX *, struct registry_key *, const char *name, struct registry_value **); + + /* Security control */ + WERROR (*key_get_sec_desc) (TALLOC_CTX *, struct registry_key *, SEC_DESC **); + WERROR (*key_set_sec_desc) (struct registry_key *, SEC_DESC *); + + /* Notification */ + WERROR (*request_key_change_notify) (struct registry_key *, key_notification_function); + WERROR (*request_value_change_notify) (struct registry_value *, value_notification_function); + + /* Key management */ + WERROR (*add_key)(TALLOC_CTX *, struct registry_key *, const char *name, uint32_t access_mask, SEC_DESC *, struct registry_key **); + WERROR (*del_key)(struct registry_key *); + + /* Value management */ + WERROR (*set_value)(struct registry_key *, const char *name, int type, void *data, int len); + WERROR (*del_value)(struct registry_value *); +}; + +struct registry_hive { + const struct registry_operations *functions; + char *name; /* usually something like HKEY_CURRENT_USER, etc */ + char *location; + char *credentials; + char *backend_hivename; + void *backend_data; + struct registry_key *root; + struct registry_context *reg_ctx; +}; + +/* Handle to a full registry + * contains zero or more hives */ +struct registry_context { + TALLOC_CTX *mem_ctx; + int num_hives; + struct registry_hive **hives; +}; + +struct reg_init_function_entry { + /* Function to create a member of the pdb_methods list */ + const struct registry_operations *functions; + struct reg_init_function_entry *prev, *next; +}; + +/* Used internally */ +#define SMB_REG_ASSERT(a) { if(!(a)) { DEBUG(0,("%s failed! (%s:%d)", #a, __FILE__, __LINE__)); }} + #endif /* _REGISTRY_H */ |