00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef _REGFIO_H
00029 #define _REGFIO_H
00030
00031
00032
00033 #define REGF_BLOCKSIZE 0x1000
00034 #define REGF_ALLOC_BLOCK 0x1000
00035
00036
00037
00038 #define REGF_HDR_SIZE 4
00039 #define HBIN_HDR_SIZE 4
00040 #define HBIN_HEADER_REC_SIZE 0x24
00041 #define REC_HDR_SIZE 2
00042
00043 #define REGF_OFFSET_NONE 0xffffffff
00044
00045
00046
00047 #define VK_FLAG_NAME_PRESENT 0x0001
00048 #define VK_DATA_IN_OFFSET 0x80000000
00049
00050
00051
00052 #define NK_TYPE_LINKKEY 0x0010
00053 #define NK_TYPE_NORMALKEY 0x0020
00054 #define NK_TYPE_ROOTKEY 0x002c
00055
00056 #define HBIN_STORE_REF(x, y) { x->hbin = y; y->ref_count++ };
00057 #define HBIN_REMOVE_REF(x, y) { x->hbin = NULL; y->ref_count-- };
00058
00059
00060
00061 struct regf_hbin;
00062 typedef struct regf_hbin {
00063 struct regf_hbin *prev, *next;
00064 uint32 file_off;
00065 uint32 free_off;
00066 uint32 free_size;
00067 int ref_count;
00068
00069 char header[HBIN_HDR_SIZE];
00070 uint32 first_hbin_off;
00071 uint32 block_size;
00072
00073 prs_struct ps;
00074
00075 BOOL dirty;
00076 } REGF_HBIN;
00077
00078
00079
00080 typedef struct {
00081 uint32 nk_off;
00082 uint8 keycheck[sizeof(uint32)];
00083 char *fullname;
00084 } REGF_HASH_REC;
00085
00086 typedef struct {
00087 REGF_HBIN *hbin;
00088 uint32 hbin_off;
00089 uint32 rec_size;
00090
00091 char header[REC_HDR_SIZE];
00092 uint16 num_keys;
00093 REGF_HASH_REC *hashes;
00094 } REGF_LF_REC;
00095
00096
00097
00098 typedef struct {
00099 REGF_HBIN *hbin;
00100 uint32 hbin_off;
00101 uint32 rec_size;
00102 uint32 rec_off;
00103
00104 char header[REC_HDR_SIZE];
00105 char *valuename;
00106 uint32 data_size;
00107 uint32 data_off;
00108 uint8 *data;
00109 uint32 type;
00110 uint16 flag;
00111 } REGF_VK_REC;
00112
00113
00114
00115 struct _regf_sk_rec;
00116
00117 typedef struct _regf_sk_rec {
00118 struct _regf_sk_rec *next, *prev;
00119 REGF_HBIN *hbin;
00120 uint32 hbin_off;
00121 uint32 rec_size;
00122
00123 uint32 sk_off;
00124
00125
00126 char header[REC_HDR_SIZE];
00127 uint32 prev_sk_off;
00128 uint32 next_sk_off;
00129 uint32 ref_count;
00130 uint32 size;
00131 SEC_DESC *sec_desc;
00132 } REGF_SK_REC;
00133
00134
00135
00136 typedef struct {
00137 REGF_HBIN *hbin;
00138 uint32 hbin_off;
00139 uint32 subkey_index;
00140 uint32 rec_size;
00141
00142
00143
00144 char header[REC_HDR_SIZE];
00145 uint16 key_type;
00146 NTTIME mtime;
00147 uint32 parent_off;
00148 uint32 classname_off;
00149 char *classname;
00150 char *keyname;
00151
00152
00153
00154 uint32 max_bytes_subkeyname;
00155 uint32 max_bytes_subkeyclassname;
00156 uint32 max_bytes_valuename;
00157 uint32 max_bytes_value;
00158
00159
00160
00161 uint32 unk_index;
00162
00163
00164
00165 uint32 num_subkeys;
00166 uint32 subkeys_off;
00167 uint32 num_values;
00168 uint32 values_off;
00169 uint32 sk_off;
00170
00171
00172
00173 REGF_LF_REC subkeys;
00174 REGF_VK_REC *values;
00175 REGF_SK_REC *sec_desc;
00176
00177 } REGF_NK_REC;
00178
00179
00180
00181 typedef struct {
00182
00183
00184 int fd;
00185 int open_flags;
00186 TALLOC_CTX *mem_ctx;
00187 REGF_HBIN *block_list;
00188
00189
00190
00191 char header[REGF_HDR_SIZE];
00192 uint32 data_offset;
00193 uint32 last_block;
00194 uint32 checksum;
00195 NTTIME mtime;
00196
00197 REGF_SK_REC *sec_desc_list;
00198
00199
00200
00201 uint32 unknown1;
00202 uint32 unknown2;
00203 uint32 unknown3;
00204 uint32 unknown4;
00205 uint32 unknown5;
00206 uint32 unknown6;
00207
00208 } REGF_FILE;
00209
00210
00211
00212 REGF_FILE* regfio_open( const char *filename, int flags, int mode );
00213 int regfio_close( REGF_FILE *r );
00214
00215 REGF_NK_REC* regfio_rootkey( REGF_FILE *file );
00216 REGF_NK_REC* regfio_fetch_subkey( REGF_FILE *file, REGF_NK_REC *nk );
00217 REGF_NK_REC* regfio_write_key ( REGF_FILE *file, const char *name,
00218 REGVAL_CTR *values, REGSUBKEY_CTR *subkeys,
00219 SEC_DESC *sec_desc, REGF_NK_REC *parent );
00220
00221
00222 #endif
00223