more tidying
parent
0efe6a43f1
commit
559d3c54e4
|
@ -190,8 +190,8 @@ char *dev_name;
|
|||
struct mkntfs_options {
|
||||
long long part_start_sect; /* -p, start sector of partition on
|
||||
parent device */
|
||||
long long nr_sectors; /* size of device in sectors */
|
||||
long long nr_clusters; /* Note: Win2k treats clusters as
|
||||
long long num_sectors; /* size of device in sectors */
|
||||
long long num_clusters; /* Note: Win2k treats clusters as
|
||||
32-bit entities! */
|
||||
long long volume_size; /* in bytes, or suffixed
|
||||
with k for kB, m or M for MB, or
|
||||
|
@ -207,7 +207,7 @@ struct mkntfs_options {
|
|||
1. */
|
||||
long long mft_zone_end; /* Determined from volume_size and
|
||||
mft_zone_multiplier, in clusters. */
|
||||
long long nr_bad_blocks; /* Number of bad clusters. */
|
||||
long long num_bad_blocks; /* Number of bad clusters. */
|
||||
long long *bad_blocks; /* Array of bad clusters. */
|
||||
char *bad_blocks_filename; /* filename, file to read list of
|
||||
bad clusters from. */
|
||||
|
@ -455,7 +455,7 @@ static void parse_options(int argc, char *argv[])
|
|||
if (*s || !u || (u >= ULONG_MAX && errno == ERANGE))
|
||||
err_exit("Invalid number of sectors: %s\n",
|
||||
argv[optind - 1]);
|
||||
opts.nr_sectors = u;
|
||||
opts.num_sectors = u;
|
||||
}
|
||||
if (optind < argc)
|
||||
usage();
|
||||
|
@ -480,15 +480,15 @@ static void append_to_bad_blocks(unsigned long long block)
|
|||
{
|
||||
long long *new_buf;
|
||||
|
||||
if (!(opts.nr_bad_blocks & 15)) {
|
||||
new_buf = realloc(opts.bad_blocks, (opts.nr_bad_blocks + 16) *
|
||||
if (!(opts.num_bad_blocks & 15)) {
|
||||
new_buf = realloc(opts.bad_blocks, (opts.num_bad_blocks + 16) *
|
||||
sizeof(long long));
|
||||
if (!new_buf)
|
||||
err_exit("Reallocating memory for bad blocks list "
|
||||
"failed: %s\n", strerror(errno));
|
||||
"failed: %s\n", strerror(errno));
|
||||
opts.bad_blocks = new_buf;
|
||||
}
|
||||
opts.bad_blocks[opts.nr_bad_blocks++] = block;
|
||||
opts.bad_blocks[opts.num_bad_blocks++] = block;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -508,8 +508,7 @@ static long long mkntfs_write(struct ntfs_device *dev,
|
|||
bytes_written = dev->d_ops->write(dev, b, count);
|
||||
if (bytes_written == -1LL) {
|
||||
retry = errno;
|
||||
ntfs_log_error("Error writing to %s: %s\n", vol->dev->d_name,
|
||||
strerror(errno));
|
||||
ntfs_log_perror("Error writing to %s", vol->dev->d_name);
|
||||
errno = retry;
|
||||
return bytes_written;
|
||||
} else if (!bytes_written) {
|
||||
|
@ -582,9 +581,8 @@ static s64 ntfs_rlwrite(struct ntfs_device *dev, const runlist *rl,
|
|||
length);
|
||||
if (bytes_written == -1LL) {
|
||||
retry = errno;
|
||||
ntfs_log_error("Error writing to %s: %s\n",
|
||||
vol->dev->d_name,
|
||||
strerror(errno));
|
||||
ntfs_log_perror("Error writing to %s",
|
||||
vol->dev->d_name);
|
||||
errno = retry;
|
||||
return bytes_written;
|
||||
}
|
||||
|
@ -952,7 +950,6 @@ static void dump_attr_record(ATTR_RECORD *a)
|
|||
"byte string in current locale.\n");
|
||||
strncpy(s, "Error converting Unicode string",
|
||||
sizeof(s));
|
||||
|
||||
}
|
||||
printf("Name = %s\n", s);
|
||||
}
|
||||
|
@ -1079,7 +1076,7 @@ static int make_room_for_attribute(MFT_RECORD *m, char *pos, const u32 size)
|
|||
* appropriate codes exist for simplicity of parsing the return value.
|
||||
*/
|
||||
if (size != ((size + 7) & ~7)) {
|
||||
ntfs_log_error("make_room_for_attribute() received non 8-byte aligned"
|
||||
ntfs_log_error("make_room_for_attribute() received non 8-byte aligned "
|
||||
"size.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -1149,7 +1146,7 @@ static runlist *allocate_scattered_clusters(s64 clusters)
|
|||
s64 prev_run_len = 0LL;
|
||||
char bit;
|
||||
|
||||
end = opts.nr_clusters;
|
||||
end = opts.num_clusters;
|
||||
/* Loop until all clusters are allocated. */
|
||||
while (clusters) {
|
||||
/* Loop in current zone until we run out of free clusters. */
|
||||
|
@ -1328,8 +1325,8 @@ static int mkntfs_attr_find(const ATTR_TYPES type, const ntfschar *name,
|
|||
return -1;
|
||||
}
|
||||
} else if (name && !ntfs_names_are_equal(name, name_len,
|
||||
(ntfschar*)((char*)a + le16_to_cpu(a->name_offset)),
|
||||
a->name_length, ic, upcase, upcase_len)) {
|
||||
(ntfschar*)((char*)a + le16_to_cpu(a->name_offset)),
|
||||
a->name_length, ic, upcase, upcase_len)) {
|
||||
int rc;
|
||||
|
||||
rc = ntfs_names_collate(name, name_len,
|
||||
|
@ -1458,7 +1455,6 @@ static int mkntfs_attr_find(const ATTR_TYPES type, const ntfschar *name,
|
|||
* The only exception to this is when @type is AT_END, in which case
|
||||
* @ctx->al_entry is set to NULL also (see above).
|
||||
*
|
||||
*
|
||||
* The following error codes are defined:
|
||||
* ENOENT Attribute not found, not an error as such.
|
||||
* EINVAL Invalid arguments.
|
||||
|
@ -1656,8 +1652,7 @@ static int insert_positioned_attr_in_mft_record(MFT_RECORD *m,
|
|||
a->compression_unit = 0;
|
||||
bw = ntfs_rlwrite(vol->dev, rl, val, val_len, &inited_size);
|
||||
if (bw != val_len)
|
||||
ntfs_log_error("Error writing non-resident attribute value."
|
||||
"\n");
|
||||
ntfs_log_error("Error writing non-resident attribute value.\n");
|
||||
err = ntfs_mapping_pairs_build(vol, (u8*)a + hdr_size +
|
||||
((name_len + 7) & ~7), mpa_size, rl, 0, NULL);
|
||||
}
|
||||
|
@ -1752,8 +1747,7 @@ static int insert_non_resident_attr_in_mft_record(MFT_RECORD *m,
|
|||
vol->cluster_size - 1) / vol->cluster_size);
|
||||
if (!rl) {
|
||||
err = -errno;
|
||||
ntfs_log_error("Failed to allocate scattered clusters: %s\n",
|
||||
strerror(-err));
|
||||
ntfs_log_perror("Failed to allocate scattered clusters");
|
||||
goto err_out;
|
||||
}
|
||||
} else {
|
||||
|
@ -1850,8 +1844,7 @@ static int insert_non_resident_attr_in_mft_record(MFT_RECORD *m,
|
|||
a->compression_unit = 0;
|
||||
bw = ntfs_rlwrite(vol->dev, rl, val, val_len, NULL);
|
||||
if (bw != val_len)
|
||||
ntfs_log_error("Error writing non-resident attribute value."
|
||||
"\n");
|
||||
ntfs_log_error("Error writing non-resident attribute value.\n");
|
||||
err = ntfs_mapping_pairs_build(vol, (u8*)a + hdr_size +
|
||||
((name_len + 7) & ~7), mpa_size, rl, 0, NULL);
|
||||
}
|
||||
|
@ -1991,7 +1984,7 @@ err_out:
|
|||
* Return 0 on success or -errno on error.
|
||||
*/
|
||||
static int add_attr_std_info(MFT_RECORD *m, const FILE_ATTR_FLAGS flags,
|
||||
u32 security_id)
|
||||
u32 security_id)
|
||||
{
|
||||
STANDARD_INFORMATION si;
|
||||
int err, sd_size;
|
||||
|
@ -2115,7 +2108,7 @@ static int add_attr_file_name(MFT_RECORD *m, const MFT_REF parent_dir,
|
|||
* return 0 on success or -errno on error
|
||||
*/
|
||||
static int add_attr_object_id(MFT_RECORD *m, OBJECT_ID_ATTR *objid_attr,
|
||||
int objid_attr_len)
|
||||
int objid_attr_len)
|
||||
{
|
||||
int err;
|
||||
|
||||
|
@ -2128,7 +2121,7 @@ static int add_attr_object_id(MFT_RECORD *m, OBJECT_ID_ATTR *objid_attr,
|
|||
else
|
||||
err = insert_resident_attr_in_mft_record(m,
|
||||
AT_OBJECT_ID, NULL, 0, 0, 0, 0,
|
||||
(u8*)objid_attr, objid_attr_len);
|
||||
(u8*)objid_attr, objid_attr_len);
|
||||
if (err < 0)
|
||||
ntfs_log_error("add_attr_volume_id failed: %s\n", strerror(-err));
|
||||
return err;
|
||||
|
@ -2305,7 +2298,7 @@ static int add_attr_index_root(MFT_RECORD *m, const char *name,
|
|||
r = malloc(val_len);
|
||||
if (!r)
|
||||
return -errno;
|
||||
r->type = indexed_attr_type == AT_FILE_NAME ? AT_FILE_NAME : 0;
|
||||
r->type = (indexed_attr_type == AT_FILE_NAME) ? AT_FILE_NAME : 0;
|
||||
if (indexed_attr_type == AT_FILE_NAME &&
|
||||
collation_rule != COLLATION_FILE_NAME) {
|
||||
free(r);
|
||||
|
@ -2324,7 +2317,7 @@ static int add_attr_index_root(MFT_RECORD *m, const char *name,
|
|||
}
|
||||
r->clusters_per_index_block = index_block_size /
|
||||
vol->cluster_size;
|
||||
} else /* if (vol->cluster_size > index_block_size) */ {
|
||||
} else { /* if (vol->cluster_size > index_block_size) */
|
||||
if (index_block_size & (index_block_size - 1)) {
|
||||
ntfs_log_error("add_attr_index_root: index block size is not "
|
||||
"a power of 2.\n");
|
||||
|
@ -2333,7 +2326,7 @@ static int add_attr_index_root(MFT_RECORD *m, const char *name,
|
|||
}
|
||||
if (index_block_size < (u32)opts.sector_size) {
|
||||
ntfs_log_error("add_attr_index_root: index block size is "
|
||||
"smaller than the sector size.\n");
|
||||
"smaller than the sector size.\n");
|
||||
free(r);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -2685,12 +2678,11 @@ static int ntfs_index_keys_compare(char *key1, char *key2,
|
|||
if (collation_rule == COLLATION_NTOFS_ULONGS) {
|
||||
/* i.e $OBJID-$O */
|
||||
while ((j < min(key1_length, key2_length)) && (i == 0)) {
|
||||
if (bswap_32(*(u32*)(key1 + j)) <
|
||||
bswap_32(*(u32*)(key1 + j))) i = -1;
|
||||
if (bswap_32(*(u32*)(key1 + j)) >
|
||||
bswap_32(*(u32*)(key1 + j))) i = +1;
|
||||
if (bswap_32(*(u32*)(key1 + j)) ==
|
||||
bswap_32(*(u32*)(key1 + j))) {
|
||||
if (bswap_32(*(u32*)(key1 + j)) < bswap_32(*(u32*)(key1 + j)))
|
||||
i = -1;
|
||||
if (bswap_32(*(u32*)(key1 + j)) > bswap_32(*(u32*)(key1 + j)))
|
||||
i = +1;
|
||||
if (bswap_32(*(u32*)(key1 + j)) == bswap_32(*(u32*)(key1 + j))) {
|
||||
i = 0;
|
||||
j += 4;
|
||||
}
|
||||
|
@ -2704,18 +2696,17 @@ static int ntfs_index_keys_compare(char *key1, char *key2,
|
|||
}
|
||||
if (collation_rule == COLLATION_NTOFS_SECURITY_HASH) {
|
||||
/* i.e. $SDH */
|
||||
if (((SDH_INDEX_KEY*)key1)->hash <
|
||||
((SDH_INDEX_KEY*)key2)->hash) i = -1;
|
||||
if (((SDH_INDEX_KEY*)key1)->hash >
|
||||
((SDH_INDEX_KEY*)key2)->hash) i = +1;
|
||||
if (((SDH_INDEX_KEY*)key1)->hash ==
|
||||
((SDH_INDEX_KEY*)key2)->hash) {
|
||||
if (((SDH_INDEX_KEY*)key1)->security_id <
|
||||
((SDH_INDEX_KEY*)key2)->security_id) i = -1;
|
||||
if (((SDH_INDEX_KEY*)key1)->security_id >
|
||||
((SDH_INDEX_KEY*)key2)->security_id) i = +1;
|
||||
if (((SDH_INDEX_KEY*)key1)->security_id ==
|
||||
((SDH_INDEX_KEY*)key2)->security_id) i = 0;
|
||||
if (((SDH_INDEX_KEY*)key1)->hash < ((SDH_INDEX_KEY*)key2)->hash)
|
||||
i = -1;
|
||||
if (((SDH_INDEX_KEY*)key1)->hash > ((SDH_INDEX_KEY*)key2)->hash)
|
||||
i = +1;
|
||||
if (((SDH_INDEX_KEY*)key1)->hash == ((SDH_INDEX_KEY*)key2)->hash) {
|
||||
if (((SDH_INDEX_KEY*)key1)->security_id < ((SDH_INDEX_KEY*)key2)->security_id)
|
||||
i = -1;
|
||||
if (((SDH_INDEX_KEY*)key1)->security_id > ((SDH_INDEX_KEY*)key2)->security_id)
|
||||
i = +1;
|
||||
if (((SDH_INDEX_KEY*)key1)->security_id == ((SDH_INDEX_KEY*)key2)->security_id)
|
||||
i = 0;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
@ -2741,7 +2732,7 @@ static int ntfs_index_keys_compare(char *key1, char *key2,
|
|||
*/
|
||||
static int insert_index_entry_in_res_dir_index(INDEX_ENTRY *idx,
|
||||
u32 idx_size, MFT_RECORD *m, ntfschar *name, u32 name_size,
|
||||
ATTR_TYPES type)
|
||||
ATTR_TYPES type)
|
||||
{
|
||||
ntfs_attr_search_ctx *ctx;
|
||||
INDEX_HEADER *idx_header;
|
||||
|
@ -2776,7 +2767,7 @@ static int insert_index_entry_in_res_dir_index(INDEX_ENTRY *idx,
|
|||
idx_entry = (INDEX_ENTRY*)((char*)idx_header +
|
||||
le16_to_cpu((idx_header)->entries_offset));
|
||||
idx_end = (INDEX_ENTRY*)((char*)idx_entry +
|
||||
le32_to_cpu(idx_header->index_length));
|
||||
le32_to_cpu(idx_header->index_length));
|
||||
/*
|
||||
* Loop until we exceed valid memory (corruption case) or until we
|
||||
* reach the last entry.
|
||||
|
@ -2798,15 +2789,15 @@ static int insert_index_entry_in_res_dir_index(INDEX_ENTRY *idx,
|
|||
/* If file names are not equal, continue search. */
|
||||
if (i)
|
||||
goto do_next;
|
||||
if (((FILE_NAME_ATTR*)&idx->key.file_name)->\
|
||||
if (((FILE_NAME_ATTR*)&idx->key.file_name)->
|
||||
file_name_type != FILE_NAME_POSIX ||
|
||||
idx_entry->key.file_name.file_name_type
|
||||
!= FILE_NAME_POSIX)
|
||||
return -EEXIST;
|
||||
|
||||
i = ntfs_file_values_compare((FILE_NAME_ATTR*)&idx->
|
||||
i = ntfs_file_values_compare((FILE_NAME_ATTR*)&idx->
|
||||
key.file_name,
|
||||
(FILE_NAME_ATTR*)&idx_entry->key.file_name, 1,
|
||||
(FILE_NAME_ATTR*)&idx_entry->key.file_name, 1,
|
||||
CASE_SENSITIVE, vol->upcase, vol->upcase_len);
|
||||
if (i == -1)
|
||||
break;
|
||||
|
@ -2825,9 +2816,8 @@ do_next:
|
|||
i = ntfs_index_keys_compare((char*)idx_entry + 0x10,
|
||||
(char*)idx + 0x10,
|
||||
idx_entry->key_length, idx->key_length, collation_rule);
|
||||
if (!i) {
|
||||
if (!i)
|
||||
return -EEXIST;
|
||||
}
|
||||
if (i == 1)
|
||||
break;
|
||||
idx_entry = (INDEX_ENTRY*)((char*)idx_entry +
|
||||
|
@ -2913,17 +2903,15 @@ static int initialize_secure(char *sds, u32 sds_size, MFT_RECORD *m)
|
|||
sii_data->offset_in_sds = sds_header->offset;
|
||||
sii_data->size_in_sds = sds_header->length;
|
||||
if ((err = insert_index_entry_in_res_dir_index(idx_entry_sdh,
|
||||
sdh_size, m,
|
||||
NTFS_INDEX_SDH, 4, AT_UNUSED)))
|
||||
sdh_size, m, NTFS_INDEX_SDH, 4, AT_UNUSED)))
|
||||
break;
|
||||
|
||||
if ((err = insert_index_entry_in_res_dir_index(idx_entry_sii,
|
||||
sii_size, m,
|
||||
NTFS_INDEX_SII, 4, AT_UNUSED)))
|
||||
sii_size, m, NTFS_INDEX_SII, 4, AT_UNUSED)))
|
||||
break;
|
||||
sds_header = (SECURITY_DESCRIPTOR_HEADER*)((char*)sds_header +
|
||||
(cpu_to_le32(sds_header->length + 0x0F) &
|
||||
~cpu_to_le32(0x0F)));
|
||||
~cpu_to_le32(0x0F)));
|
||||
if (!sds_header->length)
|
||||
break;
|
||||
}
|
||||
|
@ -2968,11 +2956,11 @@ static int initialize_quota(MFT_RECORD *m)
|
|||
idx_entry_o->key.sid.identifier_authority.low_part =
|
||||
cpu_to_le32(0x05000000);
|
||||
idx_entry_o->key.sid.sub_authority[0] =
|
||||
cpu_to_le32(SECURITY_BUILTIN_DOMAIN_RID);
|
||||
cpu_to_le32(SECURITY_BUILTIN_DOMAIN_RID);
|
||||
idx_entry_o->key.sid.sub_authority[1] =
|
||||
cpu_to_le32(DOMAIN_ALIAS_RID_ADMINS);
|
||||
idx_entry_o_data = (QUOTA_O_INDEX_DATA*)((char*)idx_entry_o
|
||||
+ idx_entry_o->data_offset);
|
||||
+ idx_entry_o->data_offset);
|
||||
idx_entry_o_data->owner_id = QUOTA_FIRST_USER_ID;
|
||||
/* 20 00 00 00 padding after here on ntfs 3.1 ?? */
|
||||
|
||||
|
@ -2983,7 +2971,7 @@ static int initialize_quota(MFT_RECORD *m)
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
/* q index entry nr. 1 */
|
||||
/* q index entry num 1 */
|
||||
idx_entry_q1->data_offset = cpu_to_le16(0x14);
|
||||
idx_entry_q1->data_length = cpu_to_le16(0x30);
|
||||
idx_entry_q1->reservedV = cpu_to_le32(0x00);
|
||||
|
@ -2993,7 +2981,7 @@ static int initialize_quota(MFT_RECORD *m)
|
|||
idx_entry_q1->reserved = cpu_to_le16(0x00);
|
||||
idx_entry_q1->key.owner_id = cpu_to_le32(0x01);
|
||||
idx_entry_q1_data = (QUOTA_CONTROL_ENTRY*)((char*)idx_entry_q1
|
||||
+ idx_entry_q1->data_offset);
|
||||
+ idx_entry_q1->data_offset);
|
||||
idx_entry_q1_data->version = cpu_to_le32(0x02);
|
||||
idx_entry_q1_data->flags = QUOTA_FLAG_DEFAULT_LIMITS;
|
||||
if (vol->minor_ver == 0)
|
||||
|
@ -3011,7 +2999,7 @@ static int initialize_quota(MFT_RECORD *m)
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
/* q index entry nr. 2 */
|
||||
/* q index entry num 2 */
|
||||
idx_entry_q2->data_offset = cpu_to_le16(0x14);
|
||||
idx_entry_q2->data_length = cpu_to_le16(0x40);
|
||||
idx_entry_q2->reservedV = cpu_to_le32(0x00);
|
||||
|
@ -3021,7 +3009,7 @@ static int initialize_quota(MFT_RECORD *m)
|
|||
idx_entry_q2->reserved = cpu_to_le16(0x00);
|
||||
idx_entry_q2->key.owner_id = QUOTA_FIRST_USER_ID;
|
||||
idx_entry_q2_data = (QUOTA_CONTROL_ENTRY*)((char*)idx_entry_q2
|
||||
+ idx_entry_q2->data_offset);
|
||||
+ idx_entry_q2->data_offset);
|
||||
idx_entry_q2_data->version = cpu_to_le32(0x02);
|
||||
idx_entry_q2_data->flags = QUOTA_FLAG_DEFAULT_LIMITS;
|
||||
idx_entry_q2_data->bytes_used = cpu_to_le64(0x00);
|
||||
|
@ -3036,7 +3024,7 @@ static int initialize_quota(MFT_RECORD *m)
|
|||
idx_entry_q2_data->sid.identifier_authority.low_part =
|
||||
cpu_to_le32(0x05000000);
|
||||
idx_entry_q2_data->sid.sub_authority[0] =
|
||||
cpu_to_le32(SECURITY_BUILTIN_DOMAIN_RID);
|
||||
cpu_to_le32(SECURITY_BUILTIN_DOMAIN_RID);
|
||||
idx_entry_q2_data->sid.sub_authority[1] =
|
||||
cpu_to_le32(DOMAIN_ALIAS_RID_ADMINS);
|
||||
|
||||
|
@ -3074,7 +3062,7 @@ static int initialize_objid(MFT_RECORD *m, GUID guid, const MFT_REF mref)
|
|||
idx_entry_o->reserved = cpu_to_le16(0x00);
|
||||
idx_entry_o->key.object_id = guid;
|
||||
idx_entry_o_data = (OBJ_ID_INDEX_DATA*)((char*)idx_entry_o
|
||||
+ idx_entry_o->data_offset);
|
||||
+ idx_entry_o->data_offset);
|
||||
idx_entry_o_data->mft_reference = mref;
|
||||
idx_entry_o_data->birth_volume_id = *zero_guid;
|
||||
idx_entry_o_data->birth_object_id = *zero_guid;
|
||||
|
@ -3118,14 +3106,13 @@ static int insert_file_link_in_dir_index(INDEX_BLOCK *idx, MFT_REF file_ref,
|
|||
* reach the last entry.
|
||||
*/
|
||||
while ((char*)ie < index_end && !(ie->flags & INDEX_ENTRY_END)) {
|
||||
/*
|
||||
#if 0
|
||||
#ifdef DEBUG
|
||||
ntfs_log_debug("file_name_attr1->file_name_length = %i\n",
|
||||
file_name->file_name_length);
|
||||
if (file_name->file_name_length) {
|
||||
char *__buf;
|
||||
__buf = calloc(1, file_name->file_name_length +
|
||||
1);
|
||||
__buf = calloc(1, file_name->file_name_length + 1);
|
||||
if (!__buf)
|
||||
err_exit("Failed to allocate internal buffer: "
|
||||
"%s\n", strerror(errno));
|
||||
|
@ -3141,8 +3128,7 @@ static int insert_file_link_in_dir_index(INDEX_BLOCK *idx, MFT_REF file_ref,
|
|||
ie->key.file_name.file_name_length);
|
||||
if (ie->key.file_name.file_name_length) {
|
||||
char *__buf;
|
||||
__buf = calloc(1,
|
||||
ie->key.file_name.file_name_length + 1);
|
||||
__buf = calloc(1, ie->key.file_name.file_name_length + 1);
|
||||
if (!__buf)
|
||||
err_exit("Failed to allocate internal buffer: "
|
||||
"%s\n", strerror(errno));
|
||||
|
@ -3155,7 +3141,7 @@ static int insert_file_link_in_dir_index(INDEX_BLOCK *idx, MFT_REF file_ref,
|
|||
free(__buf);
|
||||
}
|
||||
#endif
|
||||
*/
|
||||
#endif
|
||||
i = ntfs_file_values_compare(file_name,
|
||||
(FILE_NAME_ATTR*)&ie->key.file_name, 1,
|
||||
IGNORE_CASE, vol->upcase, vol->upcase_len);
|
||||
|
@ -3192,8 +3178,7 @@ do_next:
|
|||
#ifdef DEBUG
|
||||
/* Next entry. */
|
||||
if (!ie->length) {
|
||||
ntfs_log_debug("BUG: ie->length is zero, breaking out of "
|
||||
"loop.\n");
|
||||
ntfs_log_debug("BUG: ie->length is zero, breaking out of loop.\n");
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
@ -3312,8 +3297,8 @@ static int create_hardlink_res(MFT_RECORD *m_parent, const MFT_REF ref_parent,
|
|||
idx_entry_new->length = idx_size + 0x10;
|
||||
idx_entry_new->key_length = fn_size;
|
||||
memcpy((char*)idx_entry_new+0x10, (char*)fn, fn_size);
|
||||
i = insert_index_entry_in_res_dir_index(idx_entry_new, idx_size + 0x10
|
||||
, m_parent, NTFS_INDEX_I30, 4, AT_FILE_NAME);
|
||||
i = insert_index_entry_in_res_dir_index(idx_entry_new, idx_size + 0x10,
|
||||
m_parent, NTFS_INDEX_I30, 4, AT_FILE_NAME);
|
||||
if (i < 0) {
|
||||
ntfs_log_error("create_hardlink failed inserting index entry: %s\n",
|
||||
strerror(-i));
|
||||
|
@ -3518,22 +3503,22 @@ static void mkntfs_open_partition(void)
|
|||
ntfs_log_error("%s is not a block device.\n", vol->dev->d_name);
|
||||
if (!opts.force)
|
||||
err_exit("Refusing to make a filesystem here!\n");
|
||||
if (!opts.nr_sectors) {
|
||||
if (!opts.num_sectors) {
|
||||
if (!sbuf.st_size && !sbuf.st_blocks)
|
||||
err_exit("You must specify the number of "
|
||||
"sectors.\n");
|
||||
if (opts.sector_size) {
|
||||
if (sbuf.st_size)
|
||||
opts.nr_sectors = sbuf.st_size /
|
||||
opts.num_sectors = sbuf.st_size /
|
||||
opts.sector_size;
|
||||
else
|
||||
opts.nr_sectors = ((s64)sbuf.st_blocks
|
||||
opts.num_sectors = ((s64)sbuf.st_blocks
|
||||
<< 9) / opts.sector_size;
|
||||
} else {
|
||||
if (sbuf.st_size)
|
||||
opts.nr_sectors = sbuf.st_size / 512;
|
||||
opts.num_sectors = sbuf.st_size / 512;
|
||||
else
|
||||
opts.nr_sectors = sbuf.st_blocks;
|
||||
opts.num_sectors = sbuf.st_blocks;
|
||||
opts.sector_size = 512;
|
||||
}
|
||||
}
|
||||
|
@ -3578,9 +3563,9 @@ static void mkntfs_override_phys_params(void)
|
|||
int _sect_size = 0;
|
||||
|
||||
if (vol->dev->d_ops->ioctl(vol->dev, BLKSSZGET, &_sect_size)
|
||||
>= 0)
|
||||
>= 0) {
|
||||
opts.sector_size = _sect_size;
|
||||
else
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
ntfs_log_error("No sector size specified for %s and it could "
|
||||
|
@ -3598,16 +3583,16 @@ static void mkntfs_override_phys_params(void)
|
|||
"less than or equal 4096 bytes.\n");
|
||||
ntfs_log_debug("sector size = %i bytes\n", opts.sector_size);
|
||||
/* If user didn't specify the number of sectors, determine it now. */
|
||||
if (!opts.nr_sectors) {
|
||||
opts.nr_sectors = ntfs_device_size_get(vol->dev,
|
||||
if (!opts.num_sectors) {
|
||||
opts.num_sectors = ntfs_device_size_get(vol->dev,
|
||||
opts.sector_size);
|
||||
if (opts.nr_sectors <= 0)
|
||||
if (opts.num_sectors <= 0)
|
||||
err_exit("ntfs_device_size_get(%s) failed. Please "
|
||||
"specify it manually.\n",
|
||||
vol->dev->d_name);
|
||||
}
|
||||
ntfs_log_debug("number of sectors = %lld (0x%llx)\n", opts.nr_sectors,
|
||||
opts.nr_sectors);
|
||||
ntfs_log_debug("number of sectors = %lld (0x%llx)\n", opts.num_sectors,
|
||||
opts.num_sectors);
|
||||
/*
|
||||
* Reserve the last sector for the backup boot sector unless the
|
||||
* sector size is less than 512 bytes in which case reserve 512 bytes
|
||||
|
@ -3616,7 +3601,7 @@ static void mkntfs_override_phys_params(void)
|
|||
i = 1;
|
||||
if (opts.sector_size < 512)
|
||||
i = 512 / opts.sector_size;
|
||||
opts.nr_sectors -= i;
|
||||
opts.num_sectors -= i;
|
||||
/* If user didn't specify the partition start sector, determine it. */
|
||||
if (opts.part_start_sect < 0) {
|
||||
opts.part_start_sect = ntfs_device_partition_start_sector_get(
|
||||
|
@ -3694,7 +3679,7 @@ static void mkntfs_override_phys_params(void)
|
|||
}
|
||||
/* If user didn't specify the volume size, determine it now. */
|
||||
if (!opts.volume_size)
|
||||
opts.volume_size = opts.nr_sectors * opts.sector_size;
|
||||
opts.volume_size = opts.num_sectors * opts.sector_size;
|
||||
else if (opts.volume_size & (opts.sector_size - 1))
|
||||
err_exit("volume_size is not a multiple of sector_size.\n");
|
||||
/* Validate volume size. */
|
||||
|
@ -3758,23 +3743,23 @@ static void mkntfs_override_phys_params(void)
|
|||
"by Windows.\n");
|
||||
}
|
||||
/* If user didn't specify the number of clusters, determine it now. */
|
||||
if (!opts.nr_clusters)
|
||||
opts.nr_clusters = opts.volume_size / vol->cluster_size;
|
||||
if (!opts.num_clusters)
|
||||
opts.num_clusters = opts.volume_size / vol->cluster_size;
|
||||
/*
|
||||
* Check the cluster_size and nr_sectors for consistency with
|
||||
* sector_size and nr_sectors. And check both of these for consistency
|
||||
* Check the cluster_size and num_sectors for consistency with
|
||||
* sector_size and num_sectors. And check both of these for consistency
|
||||
* with volume_size.
|
||||
*/
|
||||
if (opts.nr_clusters != (opts.nr_sectors * opts.sector_size) /
|
||||
if (opts.num_clusters != (opts.num_sectors * opts.sector_size) /
|
||||
vol->cluster_size ||
|
||||
opts.volume_size / opts.sector_size != opts.nr_sectors ||
|
||||
opts.volume_size / vol->cluster_size != opts.nr_clusters)
|
||||
opts.volume_size / opts.sector_size != opts.num_sectors ||
|
||||
opts.volume_size / vol->cluster_size != opts.num_clusters)
|
||||
err_exit("Illegal combination of volume/cluster/sector size "
|
||||
"and/or cluster/sector number.\n");
|
||||
ntfs_log_debug("number of clusters = %llu (0x%llx)\n", opts.nr_clusters,
|
||||
opts.nr_clusters);
|
||||
"and/or cluster/sector number.\n");
|
||||
ntfs_log_debug("number of clusters = %llu (0x%llx)\n", opts.num_clusters,
|
||||
opts.num_clusters);
|
||||
/* Number of clusters must fit within 32 bits (Win2k limitation). */
|
||||
if (opts.nr_clusters >> 32) {
|
||||
if (opts.num_clusters >> 32) {
|
||||
if (vol->cluster_size >= 65536)
|
||||
err_exit("Device is too large to hold an NTFS volume "
|
||||
"(maximum size is 256TiB).\n");
|
||||
|
@ -3796,7 +3781,7 @@ static void mkntfs_initialize_bitmaps(void)
|
|||
int i, j;
|
||||
|
||||
/* Determine lcn bitmap byte size and allocate it. */
|
||||
lcn_bitmap_byte_size = (opts.nr_clusters + 7) >> 3;
|
||||
lcn_bitmap_byte_size = (opts.num_clusters + 7) >> 3;
|
||||
/* Needs to be multiple of 8 bytes. */
|
||||
lcn_bitmap_byte_size = (lcn_bitmap_byte_size + 7) & ~7;
|
||||
i = (lcn_bitmap_byte_size + vol->cluster_size - 1) &
|
||||
|
@ -3811,7 +3796,7 @@ static void mkntfs_initialize_bitmaps(void)
|
|||
* $Bitmap can overlap the end of the volume. Any bits in this region
|
||||
* must be set. This region also encompasses the backup boot sector.
|
||||
*/
|
||||
for (i = opts.nr_clusters; i < lcn_bitmap_byte_size << 3; i++)
|
||||
for (i = opts.num_clusters; i < lcn_bitmap_byte_size << 3; i++)
|
||||
ntfs_bit_set(lcn_bitmap, (u64)i, 1);
|
||||
/*
|
||||
* Determine mft_size: (16 (1.2) or 27 (3.0+) mft records)
|
||||
|
@ -3873,7 +3858,7 @@ static void mkntfs_initialize_rl_mft(void)
|
|||
}
|
||||
ntfs_log_debug("$MFT logical cluster number = 0x%llx\n", opts.mft_lcn);
|
||||
/* Determine MFT zone size. */
|
||||
opts.mft_zone_end = opts.nr_clusters;
|
||||
opts.mft_zone_end = opts.num_clusters;
|
||||
switch (opts.mft_zone_multiplier) { /* % of volume size in clusters */
|
||||
case 4:
|
||||
opts.mft_zone_end = opts.mft_zone_end >> 1; /* 50% */
|
||||
|
@ -3911,7 +3896,7 @@ static void mkntfs_initialize_rl_mft(void)
|
|||
for (i = 0; i < j; i++)
|
||||
ntfs_bit_set(lcn_bitmap, opts.mft_lcn + i, 1);
|
||||
/* Determine mftmirr_lcn (middle of volume). */
|
||||
opts.mftmirr_lcn = (opts.nr_sectors * opts.sector_size >> 1)
|
||||
opts.mftmirr_lcn = (opts.num_sectors * opts.sector_size >> 1)
|
||||
/ vol->cluster_size;
|
||||
ntfs_log_debug("$MFTMirr logical cluster number = 0x%llx\n",
|
||||
opts.mftmirr_lcn);
|
||||
|
@ -3973,7 +3958,7 @@ static void mkntfs_initialize_rl_logfile(void)
|
|||
opts.logfile_size = (opts.volume_size / 100) &
|
||||
~(vol->cluster_size - 1);
|
||||
j = opts.logfile_size / vol->cluster_size;
|
||||
while (rl_logfile[0].lcn + j >= opts.nr_clusters) {
|
||||
while (rl_logfile[0].lcn + j >= opts.num_clusters) {
|
||||
/*
|
||||
* $Logfile would overflow volume. Need to make it smaller than
|
||||
* the standard size. It's ok as we are creating a non-standard
|
||||
|
@ -4048,7 +4033,7 @@ static void mkntfs_initialize_rl_bad(void)
|
|||
* $BadClus named stream $Bad contains the whole volume as a single
|
||||
* sparse runlist entry.
|
||||
*/
|
||||
rl_bad[1].vcn = rl_bad[0].length = opts.nr_clusters;
|
||||
rl_bad[1].vcn = rl_bad[0].length = opts.num_clusters;
|
||||
rl_bad[1].lcn = -1LL;
|
||||
rl_bad[1].length = 0LL;
|
||||
|
||||
|
@ -4069,12 +4054,12 @@ static void mkntfs_fill_device_with_zeroes(void)
|
|||
int i;
|
||||
ssize_t bw;
|
||||
unsigned long long position, mid_clust;
|
||||
float progress_inc = (float)opts.nr_clusters / 100;
|
||||
float progress_inc = (float)opts.num_clusters / 100;
|
||||
|
||||
ntfs_log_quiet("Initialising device with zeroes: 0%%");
|
||||
fflush(stdout);
|
||||
mid_clust = (opts.volume_size >> 1) / vol->cluster_size;
|
||||
for (position = 0; position < (unsigned long long)opts.nr_clusters;
|
||||
for (position = 0; position < (unsigned long long)opts.num_clusters;
|
||||
position++) {
|
||||
if (!(position % (int)(progress_inc+1))) {
|
||||
ntfs_log_quiet("\b\b\b\b%3.0f%%", position /
|
||||
|
@ -4239,7 +4224,7 @@ static int create_backup_boot_sector(u8 *buff)
|
|||
size = 512;
|
||||
if (size < opts.sector_size)
|
||||
size = opts.sector_size;
|
||||
if (vol->dev->d_ops->seek(vol->dev, (opts.nr_sectors + 1) *
|
||||
if (vol->dev->d_ops->seek(vol->dev, (opts.num_sectors + 1) *
|
||||
opts.sector_size - size, SEEK_SET) == (off_t)-1)
|
||||
goto bb_err;
|
||||
if (size > 8192)
|
||||
|
@ -4331,7 +4316,7 @@ static void mkntfs_create_root_structures(void)
|
|||
|
||||
if (vol->major_ver < 3) {
|
||||
add_attr_std_info(m, file_attrs,
|
||||
cpu_to_le32(0)); /* dump_mft_record(m); */
|
||||
cpu_to_le32(0));
|
||||
} else {
|
||||
/* setting specific security_id flag and */
|
||||
/* filepermissions for ntfs 3.x */
|
||||
|
@ -4512,9 +4497,8 @@ static void mkntfs_create_root_structures(void)
|
|||
/* windows 2003 will regard the volume as corrupt (ERSO) */
|
||||
if (!err)
|
||||
err = insert_non_resident_attr_in_mft_record(m,
|
||||
AT_DATA, NULL, 0,
|
||||
0, 0,
|
||||
lcn_bitmap, lcn_bitmap_byte_size);
|
||||
AT_DATA, NULL, 0, 0, 0,
|
||||
lcn_bitmap, lcn_bitmap_byte_size);
|
||||
|
||||
|
||||
if (!err)
|
||||
|
@ -4539,7 +4523,7 @@ static void mkntfs_create_root_structures(void)
|
|||
strerror(errno));
|
||||
memcpy(buf2, boot_array, sizeof(boot_array));
|
||||
/*
|
||||
* Create the boot sector into buf2. Note, that buf2 already is zeroed
|
||||
* Create the boot sector in buf2. Note, that buf2 already is zeroed
|
||||
* in the boot sector section and that it has the NTFS OEM id/magic
|
||||
* already inserted, so no need to worry about these things.
|
||||
*/
|
||||
|
@ -4560,7 +4544,7 @@ static void mkntfs_create_root_structures(void)
|
|||
* If there are problems go back to bs->unused[0-3] and set them. See
|
||||
* ../include/layout.h for details.
|
||||
*/
|
||||
bs->number_of_sectors = cpu_to_sle64(opts.nr_sectors);
|
||||
bs->number_of_sectors = cpu_to_sle64(opts.num_sectors);
|
||||
bs->mft_lcn = cpu_to_sle64(opts.mft_lcn);
|
||||
bs->mftmirr_lcn = cpu_to_sle64(opts.mftmirr_lcn);
|
||||
if (vol->mft_record_size >= vol->cluster_size) {
|
||||
|
@ -4635,7 +4619,7 @@ static void mkntfs_create_root_structures(void)
|
|||
/* FIXME: This should be IGNORE_CASE */
|
||||
/* Create a sparse named stream of size equal to the volume size. */
|
||||
err = add_attr_data_positioned(m, "$Bad", 4, 0, 0, rl_bad, NULL,
|
||||
opts.nr_clusters * vol->cluster_size);
|
||||
opts.num_clusters * vol->cluster_size);
|
||||
if (!err) {
|
||||
err = add_attr_data(m, NULL, 0, 0, 0, NULL, 0);
|
||||
}
|
||||
|
@ -4662,9 +4646,8 @@ static void mkntfs_create_root_structures(void)
|
|||
if (!err)
|
||||
err = create_hardlink(index_block, root_ref, m,
|
||||
MK_LE_MREF(9, 9), 0LL, 0LL,
|
||||
FILE_ATTR_HIDDEN | FILE_ATTR_SYSTEM, 0
|
||||
, 0, "$Quota",
|
||||
FILE_NAME_WIN32_AND_DOS);
|
||||
FILE_ATTR_HIDDEN | FILE_ATTR_SYSTEM, 0,
|
||||
0, "$Quota", FILE_NAME_WIN32_AND_DOS);
|
||||
if (!err) {
|
||||
init_system_file_sd(FILE_Secure, &sd, &i);
|
||||
err = add_attr_sd(m, sd, i);
|
||||
|
@ -4687,14 +4670,12 @@ static void mkntfs_create_root_structures(void)
|
|||
if (vol->minor_ver == 0) {
|
||||
buf_sds_first_size = 0x1E0;
|
||||
buf_sds_size = 0x40000 + buf_sds_first_size;
|
||||
buf_sds_init = calloc(1,
|
||||
buf_sds_first_size);
|
||||
buf_sds_init = calloc(1, buf_sds_first_size);
|
||||
init_secure_30(buf_sds_init);
|
||||
} else {
|
||||
buf_sds_first_size = 0x240;
|
||||
buf_sds_size = 0x40000 + buf_sds_first_size;
|
||||
buf_sds_init = calloc(1,
|
||||
buf_sds_first_size);
|
||||
buf_sds_init = calloc(1, buf_sds_first_size);
|
||||
init_secure_31(buf_sds_init);
|
||||
}
|
||||
buf_sds = calloc(1,buf_sds_size);
|
||||
|
@ -4718,11 +4699,10 @@ static void mkntfs_create_root_structures(void)
|
|||
err = add_attr_index_root(m, "$SII", 4, 0, AT_UNUSED,
|
||||
COLLATION_NTOFS_ULONG, opts.index_block_size);
|
||||
if (!err)
|
||||
err =initialize_secure(buf_sds_init, buf_sds_first_size
|
||||
, m);
|
||||
err =initialize_secure(buf_sds_init, buf_sds_first_size, m);
|
||||
if (err < 0)
|
||||
err_exit("Couldn't create $Secure: %s\n",
|
||||
strerror(-err));
|
||||
strerror(-err));
|
||||
}
|
||||
/* dump_mft_record(m); */
|
||||
ntfs_log_verbose("Creating $UpCase (mft record 0xa)\n");
|
||||
|
@ -4779,7 +4759,7 @@ static void mkntfs_create_root_structures(void)
|
|||
COLLATION_FILE_NAME, opts.index_block_size);
|
||||
if (err < 0)
|
||||
err_exit("Couldn't create $Extend: %s\n",
|
||||
strerror(-err));
|
||||
strerror(-err));
|
||||
}
|
||||
/* NTFS 1.2 reserved system files (mft records 0xc-0xf) */
|
||||
for (i = 0xc; i < 0x10; i++) {
|
||||
|
@ -4807,8 +4787,8 @@ static void mkntfs_create_root_structures(void)
|
|||
if (!err)
|
||||
err = create_hardlink_res((MFT_RECORD*)(buf +
|
||||
11 * vol->mft_record_size), extend_ref, m,
|
||||
MK_LE_MREF(24, 24), 0LL, 0LL, extend_flags
|
||||
, 0, 0, "$Quota", FILE_NAME_WIN32_AND_DOS);
|
||||
MK_LE_MREF(24, 24), 0LL, 0LL, extend_flags,
|
||||
0, 0, "$Quota", FILE_NAME_WIN32_AND_DOS);
|
||||
/* FIXME: This should be IGNORE_CASE */
|
||||
if (!err)
|
||||
err = add_attr_index_root(m, "$O", 2, 0, AT_UNUSED,
|
||||
|
@ -4838,7 +4818,7 @@ static void mkntfs_create_root_structures(void)
|
|||
COLLATION_NTOFS_ULONGS, opts.index_block_size);
|
||||
if (!err)
|
||||
err = initialize_objid(m, volume_obj_id->object_id,
|
||||
MK_LE_MREF(FILE_Volume, FILE_Volume));
|
||||
MK_LE_MREF(FILE_Volume, FILE_Volume));
|
||||
if (err < 0)
|
||||
err_exit("Couldn't create $ObjId: %s\n", strerror(-err));
|
||||
ntfs_log_verbose("Creating $Reparse (mft record 26)\n");
|
||||
|
@ -4928,17 +4908,20 @@ int main(int argc, char **argv)
|
|||
mkntfs_fill_device_with_zeroes();
|
||||
/* Create NTFS volume structures. */
|
||||
mkntfs_create_root_structures();
|
||||
/* - Do not step onto bad blocks!!! */
|
||||
/* - If any bad blocks were specified or found, modify $BadClus, allocating the */
|
||||
/* bad clusters in $Bitmap. */
|
||||
/* - C&w bootsector backup bootsector (backup in last sector of the */
|
||||
/* partition). */
|
||||
/* - If NTFS 3.0+, c&w $Secure file and $Extend directory with the */
|
||||
/* corresponding special files in it, i.e. $ObjId, $Quota, $Reparse, and */
|
||||
/* $UsnJrnl. And others? Or not all necessary? */
|
||||
/* - RE: Populate $root with the system files (and $Extend directory if */
|
||||
/* applicable). Possibly should move this as far to the top as possible and */
|
||||
/* update during each subsequent c&w of each system file. */
|
||||
|
||||
/*
|
||||
* - Do not step onto bad blocks!!!
|
||||
* - If any bad blocks were specified or found, modify $BadClus, allocating the
|
||||
* bad clusters in $Bitmap.
|
||||
* - C&w bootsector backup bootsector (backup in last sector of the
|
||||
* partition).
|
||||
* - If NTFS 3.0+, c&w $Secure file and $Extend directory with the
|
||||
* corresponding special files in it, i.e. $ObjId, $Quota, $Reparse, and
|
||||
* $UsnJrnl. And others? Or not all necessary?
|
||||
* - RE: Populate $root with the system files (and $Extend directory if
|
||||
* applicable). Possibly should move this as far to the top as possible and
|
||||
* update during each subsequent c&w of each system file.
|
||||
*/
|
||||
ntfs_log_verbose("Syncing root directory index record.\n");
|
||||
mkntfs_sync_index_record(index_block, (MFT_RECORD*)(buf +
|
||||
5 * vol->mft_record_size), NTFS_INDEX_I30, 4);
|
||||
|
|
Loading…
Reference in New Issue