+ /*
+ * Usually this is the SHA-1 message digest of the file's "contents"
+ * (the unnamed data stream).
+ *
+ * If the file has FILE_ATTRIBUTE_REPARSE_POINT set, then this is
+ * instead usually the SHA-1 message digest of the uncompressed reparse
+ * point data.
+ *
+ * However, there are some special rules that need to be applied to
+ * interpret this field correctly when extra stream entries are present.
+ * See the code for details.
+ */
+ u8 default_hash[SHA1_HASH_SIZE];
+
+ /* Unknown field (maybe accidental padding) */
+ le32 unknown_0x54;
+
+ /*
+ * The following 8-byte union contains either information about the
+ * reparse point (for files with FILE_ATTRIBUTE_REPARSE_POINT set), or
+ * the "hard link group ID" (for other files).
+ *
+ * The reparse point information contains ReparseTag and ReparseReserved
+ * from the header of the reparse point buffer. It also contains a flag
+ * that indicates whether a reparse point fixup (for the target of an
+ * absolute symbolic link or junction) was done or not.
+ *
+ * The "hard link group ID" is like an inode number; all dentries for
+ * the same inode share the same value. See inode_fixup.c for more
+ * information.
+ *
+ * Note that this union creates the limitation that reparse point files
+ * cannot have multiple names (hard links).
+ */
+ union {
+ struct {
+ le32 reparse_tag;
+ le16 rp_reserved;
+ le16 rp_flags;
+ } _packed_attribute reparse;
+ struct {
+ le64 hard_link_group_id;
+ } _packed_attribute nonreparse;
+ };
+
+ /* Number of extra stream entries that directly follow this dentry
+ * on-disk. */
+ le16 num_extra_streams;
+
+ /* If nonzero, this is the length, in bytes, of this dentry's UTF-16LE
+ * encoded short name (8.3 DOS-compatible name), excluding the null
+ * terminator. If zero, then the long name of this dentry does not have
+ * a corresponding short name (but this does not exclude the possibility
+ * that another dentry for the same file has a short name). */
+ le16 short_name_nbytes;
+
+ /* If nonzero, this is the length, in bytes, of this dentry's UTF-16LE
+ * encoded "long" name, excluding the null terminator. If zero, then
+ * this file has no long name. The root dentry should not have a long
+ * name, but all other dentries in the image should have long names. */
+ le16 name_nbytes;
+
+ /* Beginning of optional, variable-length fields */
+
+ /* If name_nbytes != 0, the next field will be the UTF-16LE encoded long
+ * name. This will be null-terminated, so the size of this field will
+ * really be name_nbytes + 2. */
+ /*utf16lechar name[];*/
+
+ /* If short_name_nbytes != 0, the next field will be the UTF-16LE
+ * encoded short name. This will be null-terminated, so the size of
+ * this field will really be short_name_nbytes + 2. */
+ /*utf16lechar short_name[];*/
+
+ /* If there is still space in the dentry (according to the 'length'
+ * field) after 8-byte alignment, then the remaining space will be a
+ * variable-length list of tagged metadata items. See tagged_items.c
+ * for more information. */
+ /* u8 tagged_items[] _aligned_attribute(8); */
+
+} _packed_attribute;
+ /* If num_extra_streams != 0, then there are that many extra stream
+ * entries following the dentry, starting on the next 8-byte aligned
+ * boundary. They are not counted in the 'length' field of the dentry.
+ */
+
+/* On-disk format of an extra stream entry. This represents an extra NTFS-style
+ * "stream" associated with the file, such as a named data stream. */
+struct wim_extra_stream_entry_on_disk {