|
|
#include <errno.h> | #include <errno.h> |
#include <string.h> | #include <string.h> |
#include <unistd.h> | #include <unistd.h> |
|
#include <inttypes.h> |
| |
#include "ntreg.h" | #include "ntreg.h" |
| |
|
|
#define D_OFFS(o) ( (void *)&(key->o)-(void *)hdesc->buffer-vofs ) | #define D_OFFS(o) ( (void *)&(key->o)-(void *)hdesc->buffer-vofs ) |
| |
key = (struct nk_key *)(hdesc->buffer + vofs); | key = (struct nk_key *)(hdesc->buffer + vofs); |
printf("%04x type = 0x%02x %s\n", D_OFFS(type) , key->type, |
printf("%04x type = 0x%02x %s\n", D_OFFS(type) ,key->type, |
(key->type == KEY_ROOT ? "ROOT_KEY" : "") ); | (key->type == KEY_ROOT ? "ROOT_KEY" : "") ); |
printf("%04x timestamp skipped\n", D_OFFS(timestamp) ); | printf("%04x timestamp skipped\n", D_OFFS(timestamp) ); |
printf("%04x parent key offset = 0x%0lx\n", D_OFFS(ofs_parent) ,key->ofs_parent); | printf("%04x parent key offset = 0x%0lx\n", D_OFFS(ofs_parent) ,key->ofs_parent); |
printf("%04x number of subkeys = %ld\n", D_OFFS(no_subkeys),key->no_subkeys); |
printf("%04x number of subkeys = %d\n", D_OFFS(no_subkeys),key->no_subkeys); |
printf("%04x lf-record offset = 0x%0lx\n",D_OFFS(ofs_lf),key->ofs_lf); | printf("%04x lf-record offset = 0x%0lx\n",D_OFFS(ofs_lf),key->ofs_lf); |
printf("%04x number of values = %ld\n", D_OFFS(no_values),key->no_values); |
printf("%04x number of values = %d\n", D_OFFS(no_values),key->no_values); |
printf("%04x val-list offset = 0x%0lx\n",D_OFFS(ofs_vallist),key->ofs_vallist); | printf("%04x val-list offset = 0x%0lx\n",D_OFFS(ofs_vallist),key->ofs_vallist); |
printf("%04x sk-record offset = 0x%0lx\n",D_OFFS(ofs_sk),key->ofs_sk); | printf("%04x sk-record offset = 0x%0lx\n",D_OFFS(ofs_sk),key->ofs_sk); |
printf("%04x classname offset = 0x%0lx\n",D_OFFS(ofs_classnam),key->ofs_classnam); | printf("%04x classname offset = 0x%0lx\n",D_OFFS(ofs_classnam),key->ofs_classnam); |
|
|
key = (struct vk_key *)(hdesc->buffer + vofs); | key = (struct vk_key *)(hdesc->buffer + vofs); |
printf("%04x name length = %d (0x%0x)\n", D_OFFS(len_name), | printf("%04x name length = %d (0x%0x)\n", D_OFFS(len_name), |
key->len_name, key->len_name ); | key->len_name, key->len_name ); |
printf("%04x length of data = %ld (0x%0lx)\n", D_OFFS(len_data), |
printf("%04x length of data = %d (0x%0lx)\n", D_OFFS(len_data), |
key->len_data, key->len_data ); | key->len_data, key->len_data ); |
printf("%04x data offset = 0x%0lx\n",D_OFFS(ofs_data),key->ofs_data); | printf("%04x data offset = 0x%0lx\n",D_OFFS(ofs_data),key->ofs_data); |
printf("%04x value type = 0x%0lx %s\n", D_OFFS(val_type), key->val_type, | printf("%04x value type = 0x%0lx %s\n", D_OFFS(val_type), key->val_type, |
|
|
printf("%04x *unused?* = %d\n" , D_OFFS(dummy1), key->dummy1 ); | printf("%04x *unused?* = %d\n" , D_OFFS(dummy1), key->dummy1 ); |
printf("%04x Offset to prev sk = 0x%0lx\n", D_OFFS(ofs_prevsk), key->ofs_prevsk); | printf("%04x Offset to prev sk = 0x%0lx\n", D_OFFS(ofs_prevsk), key->ofs_prevsk); |
printf("%04x Offset to next sk = 0x%0lx\n", D_OFFS(ofs_nextsk), key->ofs_nextsk); | printf("%04x Offset to next sk = 0x%0lx\n", D_OFFS(ofs_nextsk), key->ofs_nextsk); |
printf("%04x Usage counter = %ld (0x%0lx)\n", D_OFFS(no_usage), |
printf("%04x Usage counter = %d (0x%0lx)\n", D_OFFS(no_usage), |
key->no_usage,key->no_usage); | key->no_usage,key->no_usage); |
printf("%04x Security data len = %ld (0x%0lx)\n", D_OFFS(len_sk), |
printf("%04x Security data len = %d (0x%0lx)\n", D_OFFS(len_sk), |
key->len_sk,key->len_sk); | key->len_sk,key->len_sk); |
| |
printf("== End of key info.\n"); | printf("== End of key info.\n"); |
|
|
{ | { |
struct vk_key *vkkey; | struct vk_key *vkkey; |
int i,vkofs; | int i,vkofs; |
long *vlistkey; |
int32_t *vlistkey; |
| |
vlistkey = (long *)(hdesc->buffer + vlistofs); |
vlistkey = (int32_t *)(hdesc->buffer + vlistofs); |
| |
for (i = 0; i < numval; i++) { | for (i = 0; i < numval; i++) { |
vkofs = vlistkey[i] + 0x1004; | vkofs = vlistkey[i] + 0x1004; |
|
|
struct li_key *likey; | struct li_key *likey; |
struct ri_key *rikey; | struct ri_key *rikey; |
| |
long *vlistkey; |
int32_t *vlistkey; |
int newnkofs, plen, i, lfofs, vlistofs, adjust, r, ricnt, subs; | int newnkofs, plen, i, lfofs, vlistofs, adjust, r, ricnt, subs; |
char *buf; | char *buf; |
char part[ABSPATHLEN+1]; | char part[ABSPATHLEN+1]; |
|
|
if (!path[plen] && type == 1 && key->no_values) { | if (!path[plen] && type == 1 && key->no_values) { |
/* printf("VK namematch for <%s>\n",part); */ | /* printf("VK namematch for <%s>\n",part); */ |
vlistofs = key->ofs_vallist + 0x1004; | vlistofs = key->ofs_vallist + 0x1004; |
vlistkey = (long *)(buf + vlistofs); |
vlistkey = (int32_t *)(buf + vlistofs); |
i = vlist_find(hdesc, vlistofs, key->no_values, part); | i = vlist_find(hdesc, vlistofs, key->no_values, part); |
if (i != -1) { | if (i != -1) { |
return(vlistkey[i] + 0x1000); | return(vlistkey[i] + 0x1000); |
|
|
| |
} | } |
| |
printf("Node has %ld subkeys and %ld values",key->no_subkeys,key->no_values); |
printf("Node has %d subkeys and %d values",key->no_subkeys,key->no_values); |
if (key->len_classnam) printf(", and class-data of %d bytes",key->len_classnam); | if (key->len_classnam) printf(", and class-data of %d bytes",key->len_classnam); |
printf("\n"); | printf("\n"); |
| |
|
|
void del_allvalues(struct hive *hdesc, int nkofs) | void del_allvalues(struct hive *hdesc, int nkofs) |
{ | { |
int vlistofs, o, vkofs; | int vlistofs, o, vkofs; |
long *vlistkey; |
int32_t *vlistkey; |
struct nk_key *nk; | struct nk_key *nk; |
| |
nk = (struct nk_key *)(hdesc->buffer + nkofs); | nk = (struct nk_key *)(hdesc->buffer + nkofs); |
|
|
} | } |
| |
vlistofs = nk->ofs_vallist + 0x1004; | vlistofs = nk->ofs_vallist + 0x1004; |
vlistkey = (long *)(hdesc->buffer + vlistofs); |
vlistkey = (int32_t *)(hdesc->buffer + vlistofs); |
| |
/* Loop through index and delete all vk's */ | /* Loop through index and delete all vk's */ |
for (o = 0; o < nk->no_values; o++) { | for (o = 0; o < nk->no_values; o++) { |
|
|
int del_value(struct hive *hdesc, int nkofs, char *name) | int del_value(struct hive *hdesc, int nkofs, char *name) |
{ | { |
int vlistofs, slot, o, n, vkofs, newlistofs; | int vlistofs, slot, o, n, vkofs, newlistofs; |
long *vlistkey, *tmplist, *newlistkey; |
int32_t *vlistkey, *tmplist, *newlistkey; |
struct nk_key *nk; | struct nk_key *nk; |
char *blank=""; | char *blank=""; |
| |
|
|
} | } |
| |
vlistofs = nk->ofs_vallist + 0x1004; | vlistofs = nk->ofs_vallist + 0x1004; |
vlistkey = (long *)(hdesc->buffer + vlistofs); |
vlistkey = (int32_t *)(hdesc->buffer + vlistofs); |
| |
slot = vlist_find(hdesc, vlistofs, nk->no_values, name); | slot = vlist_find(hdesc, vlistofs, nk->no_values, name); |
| |
|
|
del_vk(hdesc, vkofs); | del_vk(hdesc, vkofs); |
| |
/* Copy out old index list */ | /* Copy out old index list */ |
CREATE(tmplist,long,nk->no_values); |
CREATE(tmplist,int32_t,nk->no_values); |
memcpy(tmplist, vlistkey, nk->no_values * sizeof(long)); |
memcpy(tmplist, vlistkey, nk->no_values * sizeof(int32_t)); |
| |
free_block(hdesc,vlistofs-4); /* Get rid of old list */ | free_block(hdesc,vlistofs-4); /* Get rid of old list */ |
| |
nk->no_values--; | nk->no_values--; |
| |
if (nk->no_values) { | if (nk->no_values) { |
newlistofs = alloc_block(hdesc, vlistofs, nk->no_values * sizeof(long)); |
newlistofs = alloc_block(hdesc, vlistofs, nk->no_values * sizeof(int32_t)); |
if (!newlistofs) { | if (!newlistofs) { |
printf("del_value: FATAL: Was not able to alloc new index list\n"); | printf("del_value: FATAL: Was not able to alloc new index list\n"); |
abort(); | abort(); |
} | } |
/* Now copy over, omitting deleted entry */ | /* Now copy over, omitting deleted entry */ |
newlistkey = (long *)(hdesc->buffer + newlistofs + 4); |
newlistkey = (int32_t *)(hdesc->buffer + newlistofs + 4); |
for (n = 0, o = 0; o < nk->no_values+1; o++, n++) { | for (n = 0, o = 0; o < nk->no_values+1; o++, n++) { |
if (o == slot) o++; | if (o == slot) o++; |
newlistkey[n] = tmplist[o]; | newlistkey[n] = tmplist[o]; |
|
|
struct lf_key *newlf = NULL, *oldlf; | struct lf_key *newlf = NULL, *oldlf; |
struct li_key *newli = NULL, *oldli; | struct li_key *newli = NULL, *oldli; |
struct nk_key *key, *newnk, *onk; | struct nk_key *key, *newnk, *onk; |
long hash; |
int32_t hash; |
| |
key = (struct nk_key *)(hdesc->buffer + nkofs); | key = (struct nk_key *)(hdesc->buffer + nkofs); |
| |
|
|
} | } |
| |
#if 0 | #if 0 |
printf("Node has %ld subkeys and %ld values\n",key->no_subkeys,key->no_values); |
printf("Node has %d subkeys and %d values\n",key->no_subkeys,key->no_values); |
#endif | #endif |
if (key->no_subkeys) { | if (key->no_subkeys) { |
while ((ex_next_n(hdesc, nkofs, &count, &countri, &ex) > 0)) { | while ((ex_next_n(hdesc, nkofs, &count, &countri, &ex) > 0)) { |
|
|
| |
| |
/* Get and copy keys CLASS-data (if any) to buffer | /* Get and copy keys CLASS-data (if any) to buffer |
* Returns a buffer with the data (first long is size). see ntreg.h |
* Returns a buffer with the data (first int32_t is size). see ntreg.h |
* NOTE: caller must deallocate buffer! a simple free(keyval) will suffice. | * NOTE: caller must deallocate buffer! a simple free(keyval) will suffice. |
*/ | */ |
struct keyval *get_class(struct hive *hdesc, | struct keyval *get_class(struct hive *hdesc, |
|
|
struct hive *hdesc; | struct hive *hdesc; |
int fmode,r,vofs; | int fmode,r,vofs; |
struct stat sbuf; | struct stat sbuf; |
unsigned long pofs; |
uint32_t pofs; |
/* off_t l; */ | /* off_t l; */ |
char *c; | char *c; |
struct hbin_page *p; | struct hbin_page *p; |