make mft modifications in memory

(Logical change 1.443)
edge.strict_endians
flatcap.org!ntfs 2004-06-27 01:05:48 +00:00
parent 6b1670837c
commit a1805f9212
1 changed files with 57 additions and 11 deletions

View File

@ -202,7 +202,7 @@ static INDEX_ENTRY * ntfs_ie_set_name (INDEX_ENTRY *ie, ntfschar *name, int name
/**
* struct ntfs_bmp
* a cache for either dir/$BITMAP, $MFT/$BITMAP or $MFT/$Bitmap
* a cache for either dir/$BITMAP, $MFT/$BITMAP or $Bitmap/$DATA
*/
struct ntfs_bmp {
ntfs_attr *attr;
@ -509,9 +509,16 @@ static int ntfs_bmp_set_range (struct ntfs_bmp *bmp, VCN vcn, u64 length, int va
memset (buffer+start, 0x00, finish-start);
buffer[finish] &= ~fin_part;
}
utils_dump_mem (buffer, 0, 16, DM_DEFAULTS);
//utils_dump_mem (buffer, 0, 16, DM_DEFAULTS);
}
printf ("Modified: inode %lld, ", bmp->attr->ni->mft_no);
switch (bmp->attr->type) {
case AT_BITMAP: printf ("$BITMAP"); break;
case AT_DATA: printf ("$DATA"); break;
}
printf (" vcn %lld-%lld\n", vcn>>12, (vcn+length)>>12);
return 1;
}
@ -1344,6 +1351,40 @@ static int utils_mftrec_mark_free2 (ntfs_volume *vol, MFT_REF mref)
return 0;
}
/**
* utils_mftrec_mark_free3
*/
static int utils_mftrec_mark_free3 (struct ntfs_bmp *bmp, MFT_REF mref)
{
return ntfs_bmp_set_range (bmp, (VCN) MREF (mref), 1, 0);
}
/**
* utils_mftrec_mark_free4
*/
static int utils_mftrec_mark_free4 (ntfs_inode *inode)
{
MFT_RECORD *rec;
if (!inode)
return -1;
rec = (MFT_RECORD*) inode->mrec;
if ((rec->flags & MFT_RECORD_IN_USE) == 0) {
Eprintf ("MFT record isn't in use (2).\n");
return -1;
}
rec->flags &= ~MFT_RECORD_IN_USE;
//printf ("\n");
//utils_dump_mem (buffer, 0, 1024, DM_DEFAULTS);
printf ("Modified: inode %lld MFT_RECORD header\n", inode->mft_no);
return 0;
}
/**
* utils_free_non_residents
*/
@ -2650,7 +2691,7 @@ static BOOL ntfs_dt_alloc_replace (struct ntfs_dt *del, int del_num, INDEX_ENTRY
//utils_dump_mem (del->data, 0, del->data_len, DM_DEFAULTS);
printf ("Modified: inode %lld, INDEX_ALLOCATION vcn %lld-%lld\n", del->dir->inode->mft_no, del->vcn, del->vcn + 4);
printf ("Modified: inode %lld, $INDEX_ALLOCATION vcn %lld-%lld\n", del->dir->inode->mft_no, del->vcn, del->vcn + 4);
return TRUE;
}
@ -2877,7 +2918,7 @@ static BOOL ntfs_dt_alloc_remove (struct ntfs_dt *del, int del_num)
printf ("\n");
#endif
printf ("Modified: inode %lld, INDEX_ALLOCATION vcn %lld-%lld\n", del->dir->inode->mft_no, del->vcn, del->vcn + 4);
printf ("Modified: inode %lld, $INDEX_ALLOCATION vcn %lld-%lld\n", del->dir->inode->mft_no, del->vcn, del->vcn + 4);
return TRUE;
}
@ -3018,7 +3059,7 @@ static int ntfs_dt_alloc_add (struct ntfs_dt *add, INDEX_ENTRY *add_ie)
//utils_dump_mem (add->data, 0, add->data_len, DM_DEFAULTS);
//printf ("\n");
printf ("Modified: inode %lld, INDEX_ALLOCATION vcn %lld-%lld\n", add->dir->inode->mft_no, add->vcn, add->vcn + 4);
printf ("Modified: inode %lld, $INDEX_ALLOCATION vcn %lld-%lld\n", add->dir->inode->mft_no, add->vcn, add->vcn + 4);
return 0;
}
@ -3227,10 +3268,11 @@ done:
/**
* ntfs_test_bmp
*/
static int ntfs_test_bmp (ntfs_volume *vol, ntfs_inode *inode, int s, int f)
static int ntfs_test_bmp (ntfs_volume *vol, ntfs_inode *inode)
{
ntfs_inode *volbmp;
struct ntfs_bmp *bmp;
struct ntfs_bmp *bmp2;
//u8 *buffer;
//int i;
@ -3242,9 +3284,14 @@ static int ntfs_test_bmp (ntfs_volume *vol, ntfs_inode *inode, int s, int f)
if (!bmp)
return 1;
if (0) utils_free_non_residents2 (inode, bmp);
bmp2 = ntfs_bmp_alloc (vol->mft_ni, AT_BITMAP, NULL, 0);
if (!bmp2)
return 1;
ntfs_bmp_set_range (bmp, s, f, 1);
if (0) ntfs_bmp_set_range (bmp, 0, 9, 1);
if (0) utils_free_non_residents2 (inode, bmp);
if (0) utils_mftrec_mark_free3 (bmp2, inode->mft_no);
if (0) utils_mftrec_mark_free4 (inode);
ntfs_bmp_free (bmp);
return 0;
@ -3272,8 +3319,7 @@ int main (int argc, char *argv[])
utils_set_locale();
#if 0
printf ("sizeof (bmp_page) = %d\n", sizeof (struct bmp_page));
printf ("sizeof (mft_bitmap) = %d\n", sizeof (struct mft_bitmap));
printf ("sizeof (ntfs_bmp) = %d\n", sizeof (struct ntfs_bmp));
printf ("sizeof (ntfs_dt) = %d\n", sizeof (struct ntfs_dt));
printf ("sizeof (ntfs_dir) = %d\n", sizeof (struct ntfs_dir));
printf ("\n");
@ -3299,7 +3345,7 @@ int main (int argc, char *argv[])
if (0) result = ntfs_ie_test();
if (0) result = ntfs_file_add (vol, opts.file);
if (0) result = ntfs_file_remove (vol, opts.file);
if (0) result = ntfs_test_bmp (vol, inode, s, f-s+1);
if (0) result = ntfs_test_bmp (vol, inode);
done:
ntfs_inode_close (inode);