routines to add/remove a name and add/remove a vcn

(Logical change 1.426)
edge.strict_endians
flatcap.org!ntfs 2004-06-18 17:51:59 +00:00
parent 5bc3824d85
commit acef9d58b3
1 changed files with 126 additions and 75 deletions

View File

@ -1555,8 +1555,9 @@ static void ntfs_ie_dump (INDEX_ENTRY *ie)
if (!ie)
return;
utils_dump_mem ((u8*)ie, 0, ie->length, 1);
printf ("________________________________________________");
printf ("\n");
utils_dump_mem ((u8*)ie, 0, ie->length, 1);
printf ("MFT Ref: 0x%llx\n", ie->indexed_file);
printf ("length: %d\n", ie->length);
@ -1577,8 +1578,7 @@ static void ntfs_ie_dump (INDEX_ENTRY *ie)
printf ("alloc size: %lld\n", ie->key.file_name.allocated_size);
printf ("data size: %lld\n", ie->key.file_name.data_size);
printf ("file flags: 0x%04x\n", ie->key.file_name.file_attributes);
printf ("reserved: 0x%04x\n", ie->key.file_name.reserved);
printf ("name len: %d\n", ie->key.file_name.file_name_length);
printf ("reserved: 0x%04x\n", ie->key.file_name.reserved); printf ("name len: %d\n", ie->key.file_name.file_name_length);
if (ie->key.file_name.file_name_length > 0) {
int i, r;
printf ("name type: %d\n", ie->key.file_name.file_name_type);
@ -1642,41 +1642,43 @@ static INDEX_ENTRY * ntfs_ie_copy (INDEX_ENTRY *ie)
}
/**
* ntfs_ie_reset_flags
* ntfs_ie_set_child
*/
static INDEX_ENTRY * ntfs_ie_reset_flags (INDEX_ENTRY *ie, INDEX_ENTRY_FLAGS flags)
static INDEX_ENTRY * ntfs_ie_set_child (INDEX_ENTRY *ie, VCN vcn)
{
VCN vcn;
if (!ie)
return 0;
if ((flags & INDEX_ENTRY_NODE) && (!(ie->flags & INDEX_ENTRY_NODE))) {
ie->length -= 8;
ie->flags &= ~INDEX_ENTRY_NODE;
ie = realloc (ie, ie->length);
}
if ((!(flags & INDEX_ENTRY_END)) && (ie->flags & INDEX_ENTRY_END)) {
ie->length -= ATTR_SIZE (ie->key_length);
vcn = *((VCN*) ((u8*) ie + ie->length - 8));
if (ie->flags & INDEX_ENTRY_NODE) {
*((VCN*) ((u8*) ie + ie->length - 8)) = vcn;
ie->flags |= INDEX_ENTRY_END;
return ie;
}
return ie;
ie->length += 8;
ie = realloc (ie, ie->length);
if (!ie)
return NULL;
ie->flags |= INDEX_ENTRY_NODE;
*((VCN*) ((u8*) ie + ie->length - 8)) = vcn;
return 0;
}
/**
* ntfs_ie_set_child
* ntfs_ie_remove_child
*/
static int ntfs_ie_set_child (INDEX_ENTRY *ie, VCN vcn)
static INDEX_ENTRY * ntfs_ie_remove_child (INDEX_ENTRY *ie)
{
if (!ie)
return 0;
vcn = 0;
return 0;
return NULL;
if (!(ie->flags & INDEX_ENTRY_NODE))
return ie;
ie->length -= 8;
ie->flags &= ~INDEX_ENTRY_NODE;
ie = realloc (ie, ie->length);
return NULL;
}
/**
@ -1723,9 +1725,9 @@ static INDEX_ENTRY * ntfs_ie_set_name (INDEX_ENTRY *ie, ntfschar *name, int name
klen = ATTR_SIZE (ie->key_length);
need = ATTR_SIZE (sizeof (FILE_NAME_ATTR) + (namelen * sizeof (ntfschar)));
printf ("ilen = %d\n", ie->length);
printf ("klen = %d\n", klen);
printf ("need = %d\n", need);
//printf ("ilen = %d\n", ie->length);
//printf ("klen = %d\n", klen);
//printf ("need = %d\n", need);
if (ie->flags & INDEX_ENTRY_NODE)
vcn = *((VCN*) ((u8*) ie + ie->length - 8));
@ -1748,6 +1750,102 @@ static INDEX_ENTRY * ntfs_ie_set_name (INDEX_ENTRY *ie, ntfschar *name, int name
return ie;
}
/**
* ntfs_ie_remove_name
*/
static INDEX_ENTRY * ntfs_ie_remove_name (INDEX_ENTRY *ie)
{
VCN vcn;
if (!ie)
return NULL;
if (ie->key_length == 0)
return ie;
if (ie->flags & INDEX_ENTRY_NODE)
vcn = *((VCN*) ((u8*) ie + ie->length - 8));
ie->length -= ATTR_SIZE (ie->key_length);
ie->key_length = 0;
ie->flags |= INDEX_ENTRY_END;
ie = realloc (ie, ie->length);
if (!ie)
return NULL;
if (ie->flags & INDEX_ENTRY_NODE)
*((VCN*) ((u8*) ie + ie->length - 8)) = vcn;
return ie;
}
/**
* ntfs_ie_test
*/
static int ntfs_ie_test (void)
{
INDEX_ENTRY *ie1 = NULL;
INDEX_ENTRY *ie2 = NULL;
int namelen = 0;
ntfschar *name = NULL;
printf ("\n\n\n\n\n\n----------------------------------------------------------------------------------\n\n");
if (1) {
ie1 = ntfs_ie_create();
//ntfs_ie_dump (ie1);
}
if (0) {
ie2 = ntfs_ie_copy (ie1);
ntfs_ie_dump (ie2);
}
if (1) {
namelen = ntfs_mbstoucs("richard", &name, 0);
ie1 = ntfs_ie_set_name (ie1, name, namelen, FILE_NAME_WIN32);
free (name);
name = NULL;
ntfs_ie_dump (ie1);
}
if (1) {
namelen = ntfs_mbstoucs("richard2", &name, 0);
ie1 = ntfs_ie_set_name (ie1, name, namelen, FILE_NAME_WIN32);
free (name);
name = NULL;
ntfs_ie_dump (ie1);
}
if (1) {
ie1 = ntfs_ie_remove_name (ie1);
ntfs_ie_dump (ie1);
}
if (1) {
ntfs_ie_set_child (ie1, 1234);
ntfs_ie_dump (ie1);
}
if (1) {
ntfs_ie_remove_child (ie1);
ntfs_ie_dump (ie1);
}
ie1->indexed_file = 1234;
ie1->key.file_name.parent_directory = 5;
ie1->key.file_name.creation_time = utc2ntfs (time(NULL));
ie1->key.file_name.last_data_change_time = utc2ntfs (time(NULL));
ie1->key.file_name.last_mft_change_time = utc2ntfs (time(NULL));
ie1->key.file_name.last_access_time = utc2ntfs (time(NULL));
ie1->key.file_name.allocated_size = 4096;
ie1->key.file_name.data_size = 3973;
//ntfs_ie_dump (ie1);
free (name);
free (ie1);
free (ie2);
return 0;
}
/**
* ntfs_index_dump_alloc
@ -1889,54 +1987,7 @@ int main (int argc, char *argv[])
if (0) result = ntfs_index_dump (inode);
if (0) result = ntfsrm (vol, opts.file);
if (1) {
INDEX_ENTRY *ie1 = NULL;
INDEX_ENTRY *ie2 = NULL;
int namelen = 0;
ntfschar *name = NULL;
if (1) {
ie1 = ntfs_ie_create();
ntfs_ie_dump (ie1);
}
if (0) {
ie2 = ntfs_ie_copy (ie1);
ntfs_ie_dump (ie2);
}
if (0) {
ie1 = ntfs_ie_reset_flags (ie1, INDEX_ENTRY_END);
ntfs_ie_dump (ie1);
}
if (0) {
ntfs_ie_set_child (ie1, 1234);
ntfs_ie_dump (ie1);
}
namelen = ntfs_mbstoucs("richard", &name, 0);
if (1) ie1 = ntfs_ie_set_name (ie1, name, namelen, FILE_NAME_WIN32);
free (name);
name = NULL;
namelen = ntfs_mbstoucs("richard2", &name, 0);
if (1) ie1 = ntfs_ie_set_name (ie1, name, namelen, FILE_NAME_WIN32);
ie1->indexed_file = 1234;
ie1->key.file_name.parent_directory = 5;
ie1->key.file_name.creation_time = utc2ntfs (time(NULL));
ie1->key.file_name.last_data_change_time = utc2ntfs (time(NULL));
ie1->key.file_name.last_mft_change_time = utc2ntfs (time(NULL));
ie1->key.file_name.last_access_time = utc2ntfs (time(NULL));
ie1->key.file_name.allocated_size = 4096;
ie1->key.file_name.data_size = 3973;
ntfs_ie_dump (ie1);
free (name);
free (ie1);
free (ie2);
}
if (0) result = ntfs_ie_test();
done:
ntfs_inode_close (inode);