X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=include%2Fwimlib%2Finode.h;h=777a05b5440501e66a247bc99bef57d10e9ee835;hb=1e70063e885540667e1873787e6b21f5c6704ac4;hp=8455e667b47044b2bc2d52ea3962d9b93d36a5d7;hpb=8eb500e74f1508c4722df217fb60bdf4710fbff6;p=wimlib diff --git a/include/wimlib/inode.h b/include/wimlib/inode.h index 8455e667..777a05b5 100644 --- a/include/wimlib/inode.h +++ b/include/wimlib/inode.h @@ -70,7 +70,7 @@ struct wim_inode_stream { union { u8 _stream_hash[SHA1_HASH_SIZE]; struct blob_descriptor *_stream_blob; - }; + } _packed_attribute; /* union is SHA1_HASH_SIZE bytes */ /* 'stream_resolved' determines whether 'stream_hash' or 'stream_blob' * is valid as described above. */ @@ -157,27 +157,20 @@ struct wim_inode { /* Corresponds to 'security_id' in `struct wim_dentry_on_disk': The * index of this inode's security descriptor in the WIM image's table of - * security descriptors, or -1. Note: when a WIM image is loaded, - * wimlib sets out-of-bounds indices and values less than -1 in this - * field to -1. So the extraction code need not do an upper bound check - * after checking for -1 (or equivalently < 0). */ + * security descriptors, or -1 if this inode does not have a security + * descriptor. */ s32 i_security_id; - /* Identity of a reparse point. See - * http://msdn.microsoft.com/en-us/library/windows/desktop/aa365503(v=vs.85).aspx - * for what a reparse point is. */ - u32 i_reparse_tag; - - /* Unused/unknown fields that we just read into memory so we can - * re-write them unchanged. */ - u32 i_rp_unknown_1; - u16 i_rp_unknown_2; + /* Unknown field that we only read into memory so we can re-write it + * unchanged. Probably it's actually just padding... */ + u32 i_unknown_0x54; - /* Corresponds to not_rpfixed in `struct wim_dentry_on_disk': Set to 0 - * if reparse point fixups have been done. Otherwise set to 1. Note: - * this actually may reflect the SYMBOLIC_LINK_RELATIVE flag. - */ - u16 i_not_rpfixed; + /* The following fields correspond to 'reparse_tag', 'rp_reserved', and + * 'rp_flags' in `struct wim_dentry_on_disk'. They are only meaningful + * for reparse point files. */ + u32 i_reparse_tag; + u16 i_rp_reserved; + u16 i_rp_flags; /* Inode number; corresponds to hard_link_group_id in the `struct * wim_dentry_on_disk'. */ @@ -240,21 +233,20 @@ struct wim_inode { }; /* - * Reparse tags documented at - * http://msdn.microsoft.com/en-us/library/dd541667(v=prot.10).aspx + * The available reparse tags are documented at + * http://msdn.microsoft.com/en-us/library/dd541667(v=prot.10).aspx. + * Here we only define the ones of interest to us. */ -#define WIM_IO_REPARSE_TAG_RESERVED_ZERO 0x00000000 -#define WIM_IO_REPARSE_TAG_RESERVED_ONE 0x00000001 #define WIM_IO_REPARSE_TAG_MOUNT_POINT 0xA0000003 -#define WIM_IO_REPARSE_TAG_HSM 0xC0000004 -#define WIM_IO_REPARSE_TAG_HSM2 0x80000006 -#define WIM_IO_REPARSE_TAG_DRIVER_EXTENDER 0x80000005 -#define WIM_IO_REPARSE_TAG_SIS 0x80000007 -#define WIM_IO_REPARSE_TAG_DFS 0x8000000A -#define WIM_IO_REPARSE_TAG_DFSR 0x80000012 -#define WIM_IO_REPARSE_TAG_FILTER_MANAGER 0x8000000B #define WIM_IO_REPARSE_TAG_SYMLINK 0xA000000C +#define WIM_IO_REPARSE_TAG_WOF 0x80000017 +/* Flags for the rp_flags field. Currently the only known flag is NOT_FIXED, + * which indicates that the target of the absolute symbolic link or junction was + * not changed when it was stored. */ +#define WIM_RP_FLAG_NOT_FIXED 0x0001 + +/* Windows file attribute flags */ #define FILE_ATTRIBUTE_READONLY 0x00000001 #define FILE_ATTRIBUTE_HIDDEN 0x00000002 #define FILE_ATTRIBUTE_SYSTEM 0x00000004 @@ -330,6 +322,13 @@ inode_has_children(const struct wim_inode *inode) return inode->i_children != NULL; } +/* Does the inode have a security descriptor? */ +static inline bool +inode_has_security_descriptor(const struct wim_inode *inode) +{ + return inode->i_security_id >= 0; +} + extern struct wim_inode_stream * inode_get_stream(const struct wim_inode *inode, int stream_type, const utf16lechar *stream_name);