Give a better name to MFT_RECORD_IS_8 and rename FILE_ATTR_DUP_* to match this meaning.
parent
3c2c988f96
commit
0d651e54d3
|
@ -247,15 +247,22 @@ typedef enum {
|
|||
*
|
||||
* These are the so far known MFT_RECORD_* flags (16-bit) which contain
|
||||
* information about the mft record in which they are present.
|
||||
* _4 and _8 are needed by $Extend sub-files (don't know what to
|
||||
* call them yet...)
|
||||
*
|
||||
* MFT_RECORD_IS_4 exists on all $Extend sub-files.
|
||||
* It seems that it marks it is a metadata file with MFT record >24, however,
|
||||
* it is unknown if it is limited to metadata files only.
|
||||
*
|
||||
* MFT_RECORD_IS_VIEW_INDEX exists on every metafile with a non directory
|
||||
* index, that means an INDEX_ROOT and an INDEX_ALLOCATION with a name other
|
||||
* than "$I30". It is unknown if it is limited to metadata files only.
|
||||
*/
|
||||
typedef enum {
|
||||
MFT_RECORD_IN_USE = const_cpu_to_le16(0x0001),
|
||||
MFT_RECORD_IS_DIRECTORY = const_cpu_to_le16(0x0002),
|
||||
MFT_RECORD_IS_4 = const_cpu_to_le16(0x0004),
|
||||
MFT_RECORD_IS_8 = const_cpu_to_le16(0x0008),
|
||||
MFT_REC_SPACE_FILLER = 0xffff /* Just to make flags 16-bit. */
|
||||
MFT_RECORD_IN_USE = const_cpu_to_le16(0x0001),
|
||||
MFT_RECORD_IS_DIRECTORY = const_cpu_to_le16(0x0002),
|
||||
MFT_RECORD_IS_4 = const_cpu_to_le16(0x0004),
|
||||
MFT_RECORD_IS_VIEW_INDEX = const_cpu_to_le16(0x0008),
|
||||
MFT_REC_SPACE_FILLER = 0xffff, /* Just to make flags
|
||||
16-bit. */
|
||||
} __attribute__((__packed__)) MFT_RECORD_FLAGS;
|
||||
|
||||
/*
|
||||
|
@ -857,19 +864,30 @@ typedef enum {
|
|||
and preserves the rest. This mask is used to to obtain all flags that
|
||||
are valid for setting. */
|
||||
|
||||
/*
|
||||
* FILE_ATTR_DUP_FILE_NAME_INDEX_PRESENT is only present in the
|
||||
* FILE_NAME attribute (in the field file_attributes).
|
||||
/**
|
||||
* FILE_ATTR_I30_INDEX_PRESENT - Is it a directory?
|
||||
*
|
||||
* This is a copy of the MFT_RECORD_IS_DIRECTORY bit from the mft
|
||||
* record, telling us whether this is a directory or not, i.e. whether
|
||||
* it has an index root attribute named "$I30" or not.
|
||||
*
|
||||
* This flag is only present in the FILE_NAME attribute (in the
|
||||
* file_attributes field).
|
||||
*/
|
||||
FILE_ATTR_DUP_FILE_NAME_INDEX_PRESENT = const_cpu_to_le32(0x10000000),
|
||||
/* This is a copy of the corresponding bit from the mft record, telling
|
||||
us whether this is a directory or not, i.e. whether it has an
|
||||
index root attribute or not. */
|
||||
FILE_ATTR_DUP_VIEW_INDEX_PRESENT = const_cpu_to_le32(0x20000000),
|
||||
/* This is a copy of the corresponding bit from the mft record, telling
|
||||
us whether this file has a view index present (eg. object id index,
|
||||
quota index, one of the security indexes or the encrypting file
|
||||
system related indexes). */
|
||||
FILE_ATTR_I30_INDEX_PRESENT = const_cpu_to_le32(0x10000000),
|
||||
|
||||
/**
|
||||
* FILE_ATTR_VIEW_INDEX_PRESENT - Does have a non-directory index?
|
||||
*
|
||||
* This is a copy of the MFT_RECORD_IS_VIEW_INDEX bit from the mft
|
||||
* record, telling us whether this file has a view index present (eg.
|
||||
* object id index, quota index, one of the security indexes and the
|
||||
* reparse points index).
|
||||
*
|
||||
* This flag is only present in the $STANDARD_INFORMATION and
|
||||
* $FILE_NAME attributes.
|
||||
*/
|
||||
FILE_ATTR_VIEW_INDEX_PRESENT = const_cpu_to_le32(0x20000000),
|
||||
} __attribute__((__packed__)) FILE_ATTR_FLAGS;
|
||||
|
||||
/*
|
||||
|
|
|
@ -643,8 +643,7 @@ static inline int ntfs_filldir(ntfs_inode *dir_ni, s64 *pos, u8 ivcn_bits,
|
|||
/* Skip root directory self reference entry. */
|
||||
if (MREF_LE(ie->indexed_file) == FILE_root)
|
||||
return 0;
|
||||
if (ie->key.file_name.file_attributes &
|
||||
FILE_ATTR_DUP_FILE_NAME_INDEX_PRESENT)
|
||||
if (ie->key.file_name.file_attributes & FILE_ATTR_I30_INDEX_PRESENT)
|
||||
dt_type = NTFS_DT_DIR;
|
||||
else
|
||||
dt_type = NTFS_DT_REG;
|
||||
|
@ -1254,7 +1253,7 @@ static ntfs_inode *__ntfs_create(ntfs_inode *dir_ni,
|
|||
fn->file_name_length = name_len;
|
||||
fn->file_name_type = FILE_NAME_POSIX;
|
||||
if (S_ISDIR(type))
|
||||
fn->file_attributes = FILE_ATTR_DUP_FILE_NAME_INDEX_PRESENT;
|
||||
fn->file_attributes = FILE_ATTR_I30_INDEX_PRESENT;
|
||||
if (!S_ISREG(type) && !S_ISDIR(type))
|
||||
fn->file_attributes = FILE_ATTR_SYSTEM;
|
||||
fn->creation_time = utc2ntfs(ni->creation_time);
|
||||
|
@ -1576,7 +1575,7 @@ int ntfs_link(ntfs_inode *ni, ntfs_inode *dir_ni, ntfschar *name, u8 name_len)
|
|||
fn->file_name_type = FILE_NAME_POSIX;
|
||||
fn->file_attributes = ni->flags;
|
||||
if (ni->mrec->flags & MFT_RECORD_IS_DIRECTORY)
|
||||
fn->file_attributes |= FILE_ATTR_DUP_FILE_NAME_INDEX_PRESENT;
|
||||
fn->file_attributes |= FILE_ATTR_I30_INDEX_PRESENT;
|
||||
fn->allocated_size = cpu_to_sle64(ni->allocated_size);
|
||||
fn->data_size = cpu_to_sle64(ni->data_size);
|
||||
fn->creation_time = utc2ntfs(ni->creation_time);
|
||||
|
|
|
@ -4358,7 +4358,7 @@ static void mkntfs_create_root_structures(void)
|
|||
add_attr_std_info(m, file_attrs,
|
||||
cpu_to_le32(0x0100));
|
||||
} else if (i == 9) {
|
||||
file_attrs |= FILE_ATTR_DUP_VIEW_INDEX_PRESENT;
|
||||
file_attrs |= FILE_ATTR_VIEW_INDEX_PRESENT;
|
||||
add_attr_std_info(m, file_attrs,
|
||||
cpu_to_le32(0x0101));
|
||||
} else if (i == 11) {
|
||||
|
@ -4366,7 +4366,7 @@ static void mkntfs_create_root_structures(void)
|
|||
cpu_to_le32(0x0101));
|
||||
} else if (i == 24 || i == 25 || i == 26) {
|
||||
file_attrs |= FILE_ATTR_ARCHIVE;
|
||||
file_attrs |= FILE_ATTR_DUP_VIEW_INDEX_PRESENT;
|
||||
file_attrs |= FILE_ATTR_VIEW_INDEX_PRESENT;
|
||||
add_attr_std_info(m, file_attrs,
|
||||
cpu_to_le32(0x0101));
|
||||
} else {
|
||||
|
@ -4384,8 +4384,8 @@ static void mkntfs_create_root_structures(void)
|
|||
m->link_count = cpu_to_le16(le16_to_cpu(m->link_count) + 1);
|
||||
err = add_attr_file_name(m, root_ref, 0LL, 0LL,
|
||||
FILE_ATTR_HIDDEN | FILE_ATTR_SYSTEM |
|
||||
FILE_ATTR_DUP_FILE_NAME_INDEX_PRESENT, 0, 0,
|
||||
".", FILE_NAME_WIN32_AND_DOS);
|
||||
FILE_ATTR_I30_INDEX_PRESENT, 0, 0, ".",
|
||||
FILE_NAME_WIN32_AND_DOS);
|
||||
if (!err) {
|
||||
if (g_vol->major_ver == 1) {
|
||||
init_system_file_sd(FILE_root, &sd, &i);
|
||||
|
@ -4690,14 +4690,13 @@ static void mkntfs_create_root_structures(void)
|
|||
} else {
|
||||
ntfs_log_verbose("Creating $Secure (mft record 9)\n");
|
||||
m = (MFT_RECORD*)(g_buf + 9 * g_vol->mft_record_size);
|
||||
m->flags |= MFT_RECORD_IS_8;
|
||||
m->flags |= MFT_RECORD_IS_VIEW_INDEX;
|
||||
if (!err)
|
||||
err = create_hardlink(g_index_block, root_ref, m,
|
||||
MK_LE_MREF(9, 9), 0LL, 0LL,
|
||||
FILE_ATTR_HIDDEN | FILE_ATTR_SYSTEM |
|
||||
FILE_ATTR_DUP_VIEW_INDEX_PRESENT
|
||||
, 0, 0, "$Secure",
|
||||
FILE_NAME_WIN32_AND_DOS);
|
||||
FILE_ATTR_VIEW_INDEX_PRESENT, 0, 0,
|
||||
"$Secure", FILE_NAME_WIN32_AND_DOS);
|
||||
if (!err) {
|
||||
if (g_vol->minor_ver == 0) {
|
||||
g_buf_sds_first_size = 0x1E0;
|
||||
|
@ -4782,9 +4781,8 @@ static void mkntfs_create_root_structures(void)
|
|||
err = create_hardlink(g_index_block, root_ref, m,
|
||||
MK_LE_MREF(11, 11), 0LL, 0LL,
|
||||
FILE_ATTR_HIDDEN | FILE_ATTR_SYSTEM |
|
||||
FILE_ATTR_DUP_FILE_NAME_INDEX_PRESENT,
|
||||
0, 0, "$Extend",
|
||||
FILE_NAME_WIN32_AND_DOS);
|
||||
FILE_ATTR_I30_INDEX_PRESENT, 0, 0,
|
||||
"$Extend", FILE_NAME_WIN32_AND_DOS);
|
||||
/* FIXME: This should be IGNORE_CASE */
|
||||
if (!err)
|
||||
err = add_attr_index_root(m, "$I30", 4, 0, AT_FILE_NAME,
|
||||
|
@ -4811,11 +4809,11 @@ static void mkntfs_create_root_structures(void)
|
|||
/* starting vith file 24 (ignoring file 16-23) */
|
||||
if (g_vol->major_ver >= 3) {
|
||||
extend_flags = FILE_ATTR_HIDDEN | FILE_ATTR_SYSTEM |
|
||||
FILE_ATTR_ARCHIVE | FILE_ATTR_DUP_VIEW_INDEX_PRESENT;
|
||||
FILE_ATTR_ARCHIVE | FILE_ATTR_VIEW_INDEX_PRESENT;
|
||||
ntfs_log_verbose("Creating $Quota (mft record 24)\n");
|
||||
m = (MFT_RECORD*)(g_buf + 24 * g_vol->mft_record_size);
|
||||
m->flags |= MFT_RECORD_IS_4;
|
||||
m->flags |= MFT_RECORD_IS_8;
|
||||
m->flags |= MFT_RECORD_IS_VIEW_INDEX;
|
||||
if (!err)
|
||||
err = create_hardlink_res((MFT_RECORD*)(g_buf +
|
||||
11 * g_vol->mft_record_size), extend_ref, m,
|
||||
|
@ -4836,7 +4834,7 @@ static void mkntfs_create_root_structures(void)
|
|||
ntfs_log_verbose("Creating $ObjId (mft record 25)\n");
|
||||
m = (MFT_RECORD*)(g_buf + 25 * g_vol->mft_record_size);
|
||||
m->flags |= MFT_RECORD_IS_4;
|
||||
m->flags |= MFT_RECORD_IS_8;
|
||||
m->flags |= MFT_RECORD_IS_VIEW_INDEX;
|
||||
if (!err)
|
||||
err = create_hardlink_res((MFT_RECORD*)(g_buf +
|
||||
11 * g_vol->mft_record_size), extend_ref,
|
||||
|
@ -4853,7 +4851,7 @@ static void mkntfs_create_root_structures(void)
|
|||
ntfs_log_verbose("Creating $Reparse (mft record 26)\n");
|
||||
m = (MFT_RECORD*)(g_buf + 26 * g_vol->mft_record_size);
|
||||
m->flags |= MFT_RECORD_IS_4;
|
||||
m->flags |= MFT_RECORD_IS_8;
|
||||
m->flags |= MFT_RECORD_IS_VIEW_INDEX;
|
||||
if (!err)
|
||||
err = create_hardlink_res((MFT_RECORD*)(g_buf +
|
||||
11 * g_vol->mft_record_size),
|
||||
|
|
|
@ -484,15 +484,17 @@ static void ntfs_dump_flags(ATTR_TYPES type, u32 flags)
|
|||
printf(" ENCRYPTED");
|
||||
flags &= ~FILE_ATTR_ENCRYPTED;
|
||||
}
|
||||
/* We know that FILE_ATTR_I30_INDEX_PRESENT only exists on $FILE_NAME,
|
||||
and in case we are wrong, let it appear as UNKNOWN */
|
||||
if (type == AT_FILE_NAME) {
|
||||
if (flags & FILE_ATTR_DUP_FILE_NAME_INDEX_PRESENT) {
|
||||
printf(" FILE_NAME_INDEX");
|
||||
flags &= ~FILE_ATTR_DUP_FILE_NAME_INDEX_PRESENT;
|
||||
if (flags & FILE_ATTR_I30_INDEX_PRESENT) {
|
||||
printf(" I30_INDEX");
|
||||
flags &= ~FILE_ATTR_I30_INDEX_PRESENT;
|
||||
}
|
||||
}
|
||||
if (flags & FILE_ATTR_DUP_VIEW_INDEX_PRESENT) {
|
||||
if (flags & FILE_ATTR_VIEW_INDEX_PRESENT) {
|
||||
printf(" VIEW_INDEX");
|
||||
flags &= ~FILE_ATTR_DUP_VIEW_INDEX_PRESENT;
|
||||
flags &= ~FILE_ATTR_VIEW_INDEX_PRESENT;
|
||||
}
|
||||
if (flags)
|
||||
printf(" UNKNOWN: 0x%x", (unsigned int)le32_to_cpu(flags));
|
||||
|
|
|
@ -381,7 +381,7 @@ static BOOL utils_pathname_to_inode2(ntfs_volume *vol, struct ntfs_dir *parent,
|
|||
ntfs_log_debug("dt = %p, data_len = %d, parent = %p\n", dt, dt->data_len, dt->parent);
|
||||
|
||||
//printf("dt's flags = 0x%08x\n", dt->children[dt_num]->key.file_name.file_attributes);
|
||||
if (dt->children[dt_num]->key.file_name.file_attributes == FILE_ATTR_DUP_FILE_NAME_INDEX_PRESENT) {
|
||||
if (dt->children[dt_num]->key.file_name.file_attributes == FILE_ATTR_I30_INDEX_PRESENT) {
|
||||
//printf("DIR\n");
|
||||
child = ntfs_dir_create(dir->vol, dt->children[dt_num]->indexed_file);
|
||||
//printf("child = %p (%lld)\n", child, MREF(dt->children[dt_num]->indexed_file));
|
||||
|
|
Loading…
Reference in New Issue