wim_timestamp_to_str(inode->i_last_write_time, buf, sizeof(buf));
tprintf(T("Last Write Time = %"TS"\n"), buf);
- tprintf(T("Reparse Tag = 0x%"PRIx32"\n"), inode->i_reparse_tag);
+ if (inode->i_attributes & FILE_ATTRIBUTE_REPARSE_POINT) {
+ tprintf(T("Reparse Tag = 0x%"PRIx32"\n"), inode->i_reparse_tag);
+ tprintf(T("Reparse Point Flags = 0x%"PRIx16"\n"),
+ inode->i_not_rpfixed);
+ tprintf(T("Reparse Point Unknown 2 = 0x%"PRIx32"\n"),
+ inode->i_rp_unknown_2);
+ }
+ tprintf(T("Reparse Point Unknown 1 = 0x%"PRIx32"\n"),
+ inode->i_rp_unknown_1);
tprintf(T("Hard Link Group = 0x%"PRIx64"\n"), inode->i_ino);
tprintf(T("Hard Link Group Size = %"PRIu32"\n"), inode->i_nlink);
tprintf(T("Number of Alternate Data Streams = %hu\n"), inode->i_num_ads);
inode->i_security_id = -1;
inode->i_nlink = 1;
inode->i_next_stream_id = 1;
+ inode->i_not_rpfixed = 1;
#ifdef WITH_FUSE
if (pthread_mutex_init(&inode->i_mutex, NULL) != 0) {
ERROR_WITH_ERRNO("Error initializing mutex");
* @parent: The dentry that will be the parent of @dentry.
* @dentry: The dentry to link.
*/
-bool
+struct wim_dentry *
dentry_add_child(struct wim_dentry * restrict parent,
struct wim_dentry * restrict child)
{
else if (result > 0)
new = &((*new)->rb_right);
else
- return false;
+ return this;
}
child->parent = parent;
rb_link_node(&child->rb_node, rb_parent, new);
rb_insert_color(&child->rb_node, root);
- return true;
+ return NULL;
}
/* Unlink a WIM dentry from the directory entry tree. */
#ifdef __WIN32__
if (wcschr(L"<>:\"/\\|?*", (wchar_t)*p))
#else
- if (*p == '/') {
+ if (*p == '/')
#endif
+ {
if (name) {
WARNING("File, directory, or stream name \"%"WS"\"\n"
" contains forbidden characters; "
* reparse points, then put the fields in the same place and didn't
* document it. */
if (inode->i_attributes & FILE_ATTRIBUTE_REPARSE_POINT) {
- p += 4;
+ p = get_u32(p, &inode->i_rp_unknown_1);
p = get_u32(p, &inode->i_reparse_tag);
- p += 4;
+ p = get_u16(p, &inode->i_rp_unknown_2);
+ p = get_u16(p, &inode->i_not_rpfixed);
} else {
- p += 4;
- /* i_reparse_tag is irrelevant; just leave it at 0. */
+ p = get_u32(p, &inode->i_rp_unknown_1);
p = get_u64(p, &inode->i_ino);
}
hash = inode_stream_hash(inode, 0);
p = put_bytes(p, SHA1_HASH_SIZE, hash);
if (inode->i_attributes & FILE_ATTRIBUTE_REPARSE_POINT) {
- p = put_zeroes(p, 4);
+ p = put_u32(p, 0);
p = put_u32(p, inode->i_reparse_tag);
- p = put_zeroes(p, 4);
+ p = put_u16(p, 0);
+ p = put_u16(p, inode->i_not_rpfixed);
} else {
u64 link_group_id;
p = put_u32(p, 0);