create an index alloc (needs work)
parent
49a4f377f3
commit
db1e9afb1f
|
@ -43,7 +43,7 @@ GEN_PRINTF (Eprintf, stderr, NULL, FALSE)
|
|||
GEN_PRINTF (Vprintf, stdout, &opts.verbose, TRUE)
|
||||
GEN_PRINTF (Qprintf, stdout, &opts.quiet, FALSE)
|
||||
|
||||
//#define RM_WRITE 1
|
||||
#define RM_WRITE 1
|
||||
|
||||
/**
|
||||
* version - Print version information about the program
|
||||
|
@ -426,6 +426,46 @@ static int ntfs_inode_close2 (ntfs_inode *ni)
|
|||
return ntfs_inode_close (ni);
|
||||
}
|
||||
|
||||
/**
|
||||
* utils_index_init
|
||||
*/
|
||||
static int utils_index_init (ntfs_volume *vol, u8 *buffer, int size)
|
||||
{
|
||||
INDEX_ALLOCATION *alloc;
|
||||
INDEX_ENTRY_HEADER *header;
|
||||
|
||||
if (!vol)
|
||||
return 1;
|
||||
if (!buffer)
|
||||
return 1;
|
||||
if (size < 512)
|
||||
return 1;
|
||||
|
||||
memset (buffer, 0, size);
|
||||
|
||||
alloc = (INDEX_ALLOCATION*) buffer;
|
||||
|
||||
alloc->magic = magic_INDX;
|
||||
alloc->usa_ofs = 0x28;
|
||||
alloc->usa_count = (size >> vol->sector_size_bits) + 1;
|
||||
alloc->lsn = 0;
|
||||
alloc->index_block_vcn = 0;
|
||||
|
||||
alloc->index.entries_offset = 0x40;
|
||||
alloc->index.index_length = 0x10;
|
||||
alloc->index.allocated_size = size - 0x18;
|
||||
alloc->index.flags = 0;
|
||||
|
||||
header = (INDEX_ENTRY_HEADER*) (buffer + 0x40);
|
||||
|
||||
header->indexed_file = 0;
|
||||
header->length = 0x10;
|
||||
header->key_length = 0;
|
||||
header->flags = INDEX_ENTRY_END;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* ntfs_bmp_rollback
|
||||
|
@ -778,6 +818,26 @@ static s64 ntfs_bmp_find_last_set (struct ntfs_bmp *bmp)
|
|||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* ntfs_bmp_find_space
|
||||
*/
|
||||
static int ntfs_bmp_find_space (struct ntfs_bmp *bmp, LCN start, long size)
|
||||
{
|
||||
if (!bmp)
|
||||
return 0;
|
||||
|
||||
start = 0;
|
||||
size = 0;
|
||||
|
||||
/*
|
||||
bmp find space - uncached bmp's
|
||||
$Bitmap/$DATA free space on volume
|
||||
dir/$BITMAP free index record
|
||||
$MFT/$BITMAP free record in mft
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* ntfs_ie_get_vcn
|
||||
|
@ -1252,9 +1312,9 @@ static BOOL ntfs_dt_alloc_children2 (struct ntfs_dt *dt, int count)
|
|||
if (!dt->children || !dt->sub_nodes || !dt->inodes)
|
||||
return FALSE; // dt->child_count = -1 ?
|
||||
|
||||
memset ((u8*)dt->children + old, 0, (new - old) * sizeof (*dt->children));
|
||||
memset ((u8*)dt->sub_nodes + old, 0, (new - old) * sizeof (*dt->sub_nodes));
|
||||
memset ((u8*)dt->inodes + old, 0, (new - old) * sizeof (*dt->inodes));
|
||||
memset ((u8*)dt->children + old, 0, (new - old) * sizeof (*dt->children));
|
||||
memset ((u8*)dt->sub_nodes + old, 0, (new - old) * sizeof (*dt->sub_nodes));
|
||||
memset ((u8*)dt->inodes + old, 0, (new - old) * sizeof (*dt->inodes));
|
||||
|
||||
return (dt->children && dt->sub_nodes && dt->inodes);
|
||||
}
|
||||
|
@ -1411,8 +1471,14 @@ static struct ntfs_dt * ntfs_dt_alloc (struct ntfs_dir *dir, struct ntfs_dt *par
|
|||
dt->data_len = dt->dir->index_size;
|
||||
//printf ("parent size = %d\n", dt->data_len);
|
||||
dt->data = malloc (dt->data_len);
|
||||
//printf ("%lld\n", ntfs_attr_mst_pread (dir->ialloc, vcn*512, 1, dt->data_len, dt->data));
|
||||
ntfs_attr_mst_pread (dir->ialloc, vcn*512, 1, dt->data_len, dt->data);
|
||||
|
||||
if (vcn >= 0) {
|
||||
//printf ("%lld\n", ntfs_attr_mst_pread (dir->ialloc, vcn*512, 1, dt->data_len, dt->data));
|
||||
ntfs_attr_mst_pread (dir->ialloc, vcn*512, 1, dt->data_len, dt->data);
|
||||
} else {
|
||||
utils_index_init (dir->vol, dt->data, dt->data_len);
|
||||
}
|
||||
|
||||
//utils_dump_mem (dt->data, 0, dt->data_len, DM_DEFAULTS);
|
||||
//printf ("\n");
|
||||
|
||||
|
@ -2104,7 +2170,6 @@ static int utils_free_non_residents2 (ntfs_inode *inode, struct ntfs_bmp *bmp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* utils_mftrec_mark_free6
|
||||
*/
|
||||
|
@ -2122,19 +2187,10 @@ static int utils_mftrec_set_inuse6 (ntfs_inode *inode, struct ntfs_bmp *bmp, BOO
|
|||
|
||||
// XXX extent inodes?
|
||||
|
||||
if (inuse) {
|
||||
if ((rec->flags & MFT_RECORD_IN_USE) == 1) {
|
||||
Eprintf ("MFT record is already in use.\n");
|
||||
return -1;
|
||||
}
|
||||
if (inuse)
|
||||
rec->flags |= MFT_RECORD_IN_USE;
|
||||
} else {
|
||||
if ((rec->flags & MFT_RECORD_IN_USE) == 0) {
|
||||
Eprintf ("MFT record isn't in use.\n");
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
rec->flags &= ~MFT_RECORD_IN_USE;
|
||||
}
|
||||
|
||||
// XXX inc sequence number
|
||||
|
||||
|
@ -2227,6 +2283,11 @@ static ATTR_RECORD * ntfs_mft_add_attr (ntfs_inode *inode, ATTR_TYPES type, u8 *
|
|||
if (!mrec)
|
||||
return NULL;
|
||||
|
||||
if ((mrec->bytes_in_use + attr_size + 0x18) > mrec->bytes_allocated) {
|
||||
printf ("attribute is too big to fit in the record\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ptr = (u8*) inode->mrec + mrec->attrs_offset;
|
||||
while (1) {
|
||||
attr = (ATTR_RECORD*) ptr;
|
||||
|
@ -2379,6 +2440,91 @@ static int ntfs_mft_free_space (struct ntfs_dir *dir)
|
|||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* ntfs_mft_add_index
|
||||
*/
|
||||
static int ntfs_mft_add_index (struct ntfs_dir *dir)
|
||||
{
|
||||
ntfs_volume *vol;
|
||||
u8 *buffer = NULL;
|
||||
ATTR_RECORD *attr = NULL;
|
||||
struct ntfs_dt *dt = NULL;
|
||||
INDEX_ENTRY *ie = NULL;
|
||||
|
||||
if (!dir)
|
||||
return 1;
|
||||
if (dir->bitmap && dir->ialloc)
|
||||
return 0;
|
||||
if (dir->bitmap || dir->ialloc)
|
||||
return 1;
|
||||
if (dir->index_size < 512)
|
||||
return 1;
|
||||
|
||||
vol = dir->vol;
|
||||
printf ("add two attrs to " YELLOW); ntfs_name_print (dir->name, dir->name_len); printf (END "\n");
|
||||
printf ("index size = %d\n", dir->index_size);
|
||||
|
||||
buffer = malloc (dir->index_size);
|
||||
if (!buffer)
|
||||
return 1;
|
||||
|
||||
dt = ntfs_dt_alloc (dir, dir->index, -1);
|
||||
if (!dt)
|
||||
return 1;
|
||||
|
||||
dt->vcn = 0; // New alloc record
|
||||
|
||||
ie = ntfs_ie_copy (dir->index->children[dir->index->child_count-1]);
|
||||
ie = ntfs_ie_set_vcn (ie, dt->vcn);
|
||||
|
||||
// can't replace ie yet, there may not be room
|
||||
free (ie);
|
||||
|
||||
//ntfs_dt_transfer (dir->index, dt, 0, 7);
|
||||
|
||||
printf ("root has %d children\n", dir->index->child_count);
|
||||
printf ("node has %d children\n", dt->child_count);
|
||||
|
||||
ntfs_dt_free (dt);
|
||||
//utils_index_init (vol, buffer, dir->index_size);
|
||||
|
||||
// create a new dt
|
||||
// attach dt to dir
|
||||
// move entries into alloc
|
||||
// shrink root
|
||||
|
||||
// transfer keys to new node
|
||||
// hook up root & alloc dts
|
||||
|
||||
// need disk allocation before here
|
||||
|
||||
// Index Allocation
|
||||
memset (buffer, 0, 128);
|
||||
attr = ntfs_mft_add_attr (dir->inode, AT_INDEX_ALLOCATION, buffer, 0x48);
|
||||
|
||||
// Bitmap
|
||||
memset (buffer, 0, 8);
|
||||
buffer[0] = 0x01;
|
||||
//printf ("inode = %p\n", dir->inode);
|
||||
attr = ntfs_mft_add_attr (dir->inode, AT_BITMAP, buffer, 8);
|
||||
|
||||
// attach alloc and bitmap to dir
|
||||
// need to create ntfs_attr's for them
|
||||
|
||||
// one indx record
|
||||
// 8 bits of bitmap
|
||||
|
||||
if (0) ntfs_bmp_find_space (NULL, 0, 0);
|
||||
|
||||
//printf ("m1 = %lld\n", vol->mft_zone_start);
|
||||
//printf ("m2 = %lld\n", vol->mft_zone_end);
|
||||
//printf ("m3 = %lld\n", vol->mft_zone_pos);
|
||||
//printf ("z1 = %lld\n", vol->data1_zone_pos);
|
||||
//printf ("z2 = %lld\n", vol->data2_zone_pos);
|
||||
|
||||
free (buffer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ntfs_dt_root_replace
|
||||
|
@ -2789,7 +2935,7 @@ static int ntfs_dt_root_add (struct ntfs_dt *add, INDEX_ENTRY *add_ie)
|
|||
|
||||
printf ("need %d, have %d\n", need, space);
|
||||
if (need > space) {
|
||||
printf ("no room");
|
||||
printf ("no room\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -2802,7 +2948,7 @@ static int ntfs_dt_root_add (struct ntfs_dt *add, INDEX_ENTRY *add_ie)
|
|||
|
||||
for (i = 0; i < add->child_count; i++)
|
||||
add->children[i] = (INDEX_ENTRY*) ((long)add->children[i] + (long)new_data - (long)add->data); // rebase the children
|
||||
|
||||
|
||||
add->data = new_data;
|
||||
new_data = NULL;
|
||||
|
||||
|
@ -3106,8 +3252,8 @@ static int ntfs_dt_add2 (INDEX_ENTRY *ie, struct ntfs_dt *suc, int suc_num, stru
|
|||
int median;
|
||||
struct ntfs_dt *new = NULL;
|
||||
struct ntfs_dt *chl;
|
||||
INDEX_ENTRY *med_ie;
|
||||
FILE_NAME_ATTR *file;
|
||||
INDEX_ENTRY *med_ie = NULL;
|
||||
//FILE_NAME_ATTR *file;
|
||||
VCN vcn = 0;
|
||||
//int i;
|
||||
|
||||
|
@ -3165,6 +3311,7 @@ ascend:
|
|||
ded = ded->sub_nodes[0];
|
||||
printf ("\treusing vcn %lld\n", new->vcn);
|
||||
} else {
|
||||
ntfs_mft_add_index (suc->dir);
|
||||
/*
|
||||
* ALLOC
|
||||
* any unused records?
|
||||
|
@ -3190,7 +3337,7 @@ ascend:
|
|||
*/
|
||||
}
|
||||
|
||||
printf ("\tnode has %d children\n", suc->child_count);
|
||||
//printf ("\tnode has %d children\n", suc->child_count);
|
||||
|
||||
// initialise new node
|
||||
ntfs_dt_initialise (new, vcn);
|
||||
|
@ -3198,7 +3345,10 @@ ascend:
|
|||
// find median key
|
||||
median = (suc->child_count+1) / 2;
|
||||
med_ie = ntfs_ie_copy (suc->children[median]);
|
||||
file = &med_ie->key.file_name; printf ("\tmed name: "); ntfs_name_print (file->file_name, file->file_name_length); printf ("\n");
|
||||
//file = &med_ie->key.file_name; printf ("\tmed name: "); ntfs_name_print (file->file_name, file->file_name_length); printf ("\n");
|
||||
|
||||
free (med_ie);
|
||||
med_ie = NULL;
|
||||
|
||||
//printf ("suc key count = %d\n", suc->child_count);
|
||||
//printf ("new key count = %d\n", new->child_count);
|
||||
|
@ -3545,11 +3695,12 @@ static struct ntfs_dir * ntfs_dir_alloc (ntfs_volume *vol, MFT_REF mft_num)
|
|||
// This may not exist
|
||||
dir->bitmap = ntfs_bmp_alloc (inode, AT_BITMAP, I30, 4);
|
||||
|
||||
if (dir->ialloc) {
|
||||
if (dir->iroot) {
|
||||
rec = find_first_attribute (AT_INDEX_ROOT, inode->mrec);
|
||||
ir = (INDEX_ROOT*) ((u8*)rec + rec->value_offset);
|
||||
dir->index_size = ir->index_block_size;
|
||||
} else {
|
||||
// XXX !iroot?
|
||||
dir->index_size = 0;
|
||||
}
|
||||
|
||||
|
@ -4481,9 +4632,11 @@ static int ntfs_file_add2 (ntfs_volume *vol, char *filename)
|
|||
s64 now = 0;
|
||||
struct ntfs_dir *dir;
|
||||
struct ntfs_dt *dt;
|
||||
int dt_index = 0;
|
||||
//int dt_index = 0;
|
||||
int data_len = 0;
|
||||
ATTR_RECORD *attr;
|
||||
struct ntfs_dt *suc = NULL;
|
||||
int suc_num = 0;
|
||||
|
||||
new_num = utils_mft_find_free_entry (vol);
|
||||
if (new_num == (MFT_REF) -1)
|
||||
|
@ -4531,6 +4684,7 @@ static int ntfs_file_add2 (ntfs_volume *vol, char *filename)
|
|||
ino->mrec->link_count = 1;
|
||||
ino->mrec->base_mft_record = 0;
|
||||
ino->mrec->next_attr_instance = 0;
|
||||
ino->mrec->flags = MFT_RECORD_IN_USE;
|
||||
|
||||
utils_mftrec_set_inuse6 (ino, vol->private_bmp1, TRUE);
|
||||
|
||||
|
@ -4594,9 +4748,17 @@ static int ntfs_file_add2 (ntfs_volume *vol, char *filename)
|
|||
dir = dt->dir->children[0];
|
||||
dt = dir->index;
|
||||
|
||||
suc = ntfs_dt_find3 (dt, uname, uname_len, &suc_num);
|
||||
|
||||
ntfs_dt_add2 (ie, suc, suc_num, NULL);
|
||||
|
||||
/*
|
||||
dt_index = ntfs_dt_root_add (dt, ie);
|
||||
dt->inodes[dt_index] = ino;
|
||||
ino->ref_count++;
|
||||
if (dt_index >= 0) {
|
||||
dt->inodes[dt_index] = ino;
|
||||
ino->ref_count++;
|
||||
}
|
||||
*/
|
||||
|
||||
close:
|
||||
free (buffer);
|
||||
|
|
Loading…
Reference in New Issue