1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-01 05:47:28 +03:00

Add definitions of the various NT Registry on-disk structures ...

(This used to be commit a4f9b9effc9491bdc4d0fe4bea3d25d7436e6a71)
This commit is contained in:
Richard Sharpe 2002-12-08 15:32:02 +00:00
parent 0670d6b156
commit 1d44520de8

View File

@ -401,6 +401,11 @@ typedef struct key_sec_desc_s {
/* Make, delete keys */
int nt_delete_reg_key(REG_KEY *key)
{
return 1;
}
/*
* Create/delete key lists and add delete keys to/from a list, count the keys
@ -466,6 +471,124 @@ typedef struct regf_struct_s {
SK_MAP **sk_map;
} REGF;
/*
* Structures for dealing with the on-disk format of the registry
*/
typedef unsigned int DWORD;
typedef unsigned short WORD;
#define REG_REGF_ID 0x66676572
typedef struct regf_block {
DWORD REGF_ID; /* regf */
DWORD uk1;
DWORD uk2;
DWORD tim1, tim2;
DWORD uk3; /* 1 */
DWORD uk4; /* 3 */
DWORD uk5; /* 0 */
DWORD uk6; /* 1 */
DWORD first_key; /* offset */
unsigned int dblk_size;
DWORD uk7[116]; /* 1 */
DWORD chksum;
} REGF_HDR;
typedef struct hbin_sub_struct {
DWORD dblocksize;
char data[1];
} HBIN_SUB_HDR;
#define REG_HBIN_ID 0x6E696268
typedef struct hbin_struct {
DWORD HBIN_ID; /* hbin */
DWORD next_off;
DWORD prev_off;
DWORD uk1;
DWORD uk2;
DWORD uk3;
DWORD uk4;
DWORD blk_size;
HBIN_SUB_HDR hbin_sub_hdr;
} HBIN_HDR;
#define REG_NK_ID 0x6B6E
typedef struct nk_struct {
WORD NK_ID;
WORD type;
DWORD t1, t2;
DWORD uk1;
DWORD own_off;
DWORD subk_num;
DWORD uk2;
DWORD lf_off;
DWORD uk3;
DWORD val_cnt;
DWORD val_off;
DWORD sk_off;
DWORD clsnam_off;
DWORD unk4[4];
DWORD unk5;
WORD nam_len;
WORD clsnam_len;
char key_nam[1]; /* Actual length determined by nam_len */
} NK_HDR;
#define REG_SK_ID 0x6B73
typedef struct sk_struct {
WORD SK_ID;
WORD uk1;
DWORD prev_off;
DWORD next_off;
DWORD ref_cnt;
DWORD rec_size;
char sec_desc[1];
} SK_HDR;
#define OFF(f) ((f) + 0x1000 + 4)
#define LOCN(f) (base + OFF(f))
typedef struct hash_struct {
DWORD nk_off;
char hash[4];
} HASH_REC;
#define REG_LF_ID 0x666C
typedef struct lf_struct {
WORD LF_ID;
WORD key_count;
struct hash_struct hr[1]; /* Array of hash records, depending on key_count */
} LF_HDR;
typedef DWORD VL_TYPE[1]; /* Value list is an array of vk rec offsets */
#define REG_VK_ID 0x6B76
typedef struct vk_struct {
WORD VK_ID;
WORD nam_len;
DWORD dat_len; /* If top-bit set, offset contains the data */
DWORD dat_off;
DWORD dat_type;
WORD flag; /* =1, has name, else no name (=Default). */
WORD unk1;
char dat_name[1]; /* Name starts here ... */
} VK_HDR;
#define REG_TYPE_REGSZ 1
#define REG_TYPE_EXPANDSZ 2
#define REG_TYPE_BIN 3
#define REG_TYPE_DWORD 4
#define REG_TYPE_MULTISZ 7
#define OFF(f) ((f) + 0x1000 + 4)
#define LOCN(f) (base + OFF(f))
int nt_set_regf_input_file(REGF *regf, char *filename)
{
return ((regf->regfile_name = strdup(filename)) != NULL);
@ -501,7 +624,7 @@ int nt_free_regf(REGF *regf)
regf->base = NULL;
close(regf->fd); /* Ignore the error :-) */
nt_free_reg_tree(regf->root); /* Free the tree */
nt_delete_reg_key(regf->root); /* Free the tree */
free(regf->sk_map);
regf->sk_count = regf->sk_map_size = 0;
@ -544,13 +667,68 @@ int nt_get_regf_hdr(REGF *regf)
* header
*/
ASSERT(regf->base != NULL);
assert(regf->base != NULL);
return 1;
}
int nt_get_hbin_hdr(REGF *regf, int hbin_offs)
{
return 1;
}
int nt_load_registry(REGF *regf)
{
int rc;
/* Get the header */
if ((rc = nt_get_regf_hdr(regf)) < 0) {
return rc;
}
/* Now what? */
return 1;
}
/*
* Main code from here on ...
*/
void usage(void)
{
fprintf(stderr, "Usage: editreg <registryfile>\n");
fprintf(stderr, "Version: 0.1\n\n");
}
int main(int argc, char *argv[])
{
REGF *regf;
if (argc < 2) {
usage();
exit(1);
}
if ((regf = nt_create_regf()) == NULL) {
fprintf(stderr, "Could not create registry object: %s\n", strerror(errno));
exit(2);
}
if (!nt_set_regf_input_file(regf, argv[1])) {
fprintf(stderr, "Could not set name of registry file: %s, %s\n",
argv[1], strerror(errno));
exit(3);
}
/* Now, open it, and bring it into memory :-) */
if (nt_load_registry(regf) < 0) {
fprintf(stderr, "Could not load registry: %s\n", argv[1]);
exit(4);
}
}