]> wimlib.net Git - wimlib/blobdiff - include/wimlib/blob_table.h
Add experimental support for Windows VSS
[wimlib] / include / wimlib / blob_table.h
index 1adec4ed6db602aa617b2ba91eb6b2cd1496f03e..4e70e5749f4b21f594ec26f034c414e8b11a5202 100644 (file)
@@ -12,7 +12,7 @@ enum blob_location {
        /* The blob's data does not exist.  This is a temporary state only.  */
        BLOB_NONEXISTENT = 0,
 
-       /* The blob's data is located in a WIM resource identified by the
+       /* The blob's data is available in the WIM resource identified by the
         * `struct wim_resource_descriptor' pointed to by @rdesc.
         * @offset_in_res identifies the offset at which this particular blob
         * begins in the uncompressed data of the resource.  */
@@ -35,23 +35,16 @@ enum blob_location {
 
 #ifdef WITH_NTFS_3G
        /* The blob's data is available as the contents of an NTFS attribute
-        * accessible through libntfs-3g.  The attribute is identified by
-        * volume, path to an inode, attribute name, and attribute type.
-        * @ntfs_loc points to a structure containing this information.  */
+        * accessible through libntfs-3g.  @ntfs_loc points to a structure which
+        * identifies the attribute.  */
        BLOB_IN_NTFS_VOLUME,
 #endif
 
 #ifdef __WIN32__
-       /* Windows only: the blob's data is available as the contents of the
-        * data stream named by @file_on_disk.  @file_on_disk is an NT namespace
-        * path that may be longer than the Win32-level MAX_PATH.  Furthermore,
-        * the stream may require "backup semantics" to access.  */
-       BLOB_IN_WINNT_FILE_ON_DISK,
-
-       /* Windows only: the blob's data is available as the raw encrypted data
-        * of the external file named by @file_on_disk.  @file_on_disk is a
-        * Win32 namespace path.  */
-       BLOB_WIN32_ENCRYPTED,
+       /* Windows only: the blob's data is available in the file (or named data
+        * stream) specified by @windows_file.  The data might be only properly
+        * accessible through the Windows API.  */
+       BLOB_IN_WINDOWS_FILE,
 #endif
 };
 
@@ -75,7 +68,20 @@ struct blob_descriptor {
        /* List node for a hash bucket of the blob table  */
        struct hlist_node hash_list;
 
-       /* Uncompressed size of this blob  */
+       /*
+        * Uncompressed size of this blob.
+        *
+        * In most cases we are now enforcing that this is nonzero; i.e. an
+        * empty stream will have "no blob" rather than "an empty blob".  The
+        * exceptions are:
+        *
+        *      - blob descriptors with 'blob_location == BLOB_NONEXISTENT',
+        *        e.g. placeholder entries for new metadata resources or for
+        *        blobs required for pipable WIM extraction.  In these cases the
+        *        size is not meaningful information anyway.
+        *      - blob descriptors with 'blob_location == BLOB_IN_STAGING_FILE'
+        *        can vary their size over time, including to 0.
+        */
        u64 size;
 
        union {
@@ -96,7 +102,7 @@ struct blob_descriptor {
                        struct wim_inode *back_inode;
                        u32 back_stream_id;
                };
-       };
+       } _packed_attribute; /* union is SHA1_HASH_SIZE bytes */
 
        /* Number of times this blob is referenced by file streams in WIM
         * images.  See blob_decrement_refcnt() for information about the
@@ -122,7 +128,7 @@ struct blob_descriptor {
 
 #ifdef WITH_FUSE
        /* Number of open file descriptors to this blob during a FUSE mount of
-        * the containing image.  */
+        * a WIM image.  */
        u16 num_opened_fds;
 #endif
 
@@ -140,13 +146,6 @@ struct blob_descriptor {
        u16 unique_size : 1;
        u16 will_be_in_output_wim : 1;
 
-       /* Set to 1 if this blob represents a metadata resource that has been
-        * changed.  In such cases, the hash cannot be used to verify the data
-        * if the metadata resource is read again.  (This could be avoided if we
-        * used separate fields for input/output checksum, but most blobs
-        * wouldn't need this.)  */
-       u16 dont_check_metadata_hash : 1;
-
        u16 may_send_done_with_file : 1;
 
        /* Only used by wimlib_export_image() */
@@ -170,10 +169,12 @@ struct blob_descriptor {
                        union {
 
                                /* BLOB_IN_FILE_ON_DISK
-                                * BLOB_IN_WINNT_FILE_ON_DISK
-                                * BLOB_WIN32_ENCRYPTED  */
+                                * BLOB_IN_WINDOWS_FILE  */
                                struct {
-                                       tchar *file_on_disk;
+                                       union {
+                                               tchar *file_on_disk;
+                                               struct windows_file *windows_file;
+                                       };
                                        struct wim_inode *file_inode;
                                };
 
@@ -298,6 +299,9 @@ extern void
 blob_decrement_num_opened_fds(struct blob_descriptor *blob);
 #endif
 
+extern void
+blob_release_location(struct blob_descriptor *blob);
+
 extern void
 free_blob_descriptor(struct blob_descriptor *blob);
 
@@ -326,8 +330,7 @@ blob_to_wimlib_resource_entry(const struct blob_descriptor *blob,
                              struct wimlib_resource_entry *wentry);
 
 extern int
-sort_blob_list(struct list_head *blob_list,
-              size_t list_head_offset,
+sort_blob_list(struct list_head *blob_list, size_t list_head_offset,
               int (*compar)(const void *, const void*));
 
 extern int
@@ -338,7 +341,7 @@ extern int
 cmp_blobs_by_sequential_order(const void *p1, const void *p2);
 
 static inline const struct blob_extraction_target *
-blob_extraction_targets(struct blob_descriptor *blob)
+blob_extraction_targets(const struct blob_descriptor *blob)
 {
        if (blob->out_refcnt <= ARRAY_LEN(blob->inline_blob_extraction_targets))
                return blob->inline_blob_extraction_targets;
@@ -361,18 +364,6 @@ blob_set_is_located_in_wim_resource(struct blob_descriptor *blob,
        blob->offset_in_res = offset_in_res;
 }
 
-/*
- * Declare that the specified blob is located in the specified non-solid WIM
- * resource.  In this case, the blob data is the entire uncompressed resource.
- */
-static inline void
-blob_set_is_located_in_nonsolid_wim_resource(struct blob_descriptor *blob,
-                                            struct wim_resource_descriptor *rdesc)
-{
-       blob_set_is_located_in_wim_resource(blob, rdesc, 0);
-       blob->size = rdesc->uncompressed_size;
-}
-
 static inline void
 blob_unset_is_located_in_wim_resource(struct blob_descriptor *blob)
 {
@@ -389,6 +380,31 @@ blob_set_is_located_in_attached_buffer(struct blob_descriptor *blob,
        blob->size = size;
 }
 
+static inline bool
+blob_is_in_file(const struct blob_descriptor *blob)
+{
+       return blob->blob_location == BLOB_IN_FILE_ON_DISK
+#ifdef __WIN32__
+           || blob->blob_location == BLOB_IN_WINDOWS_FILE
+#endif
+          ;
+}
+
+#ifdef __WIN32__
+extern const wchar_t *
+get_windows_file_path(const struct windows_file *file);
+#endif
+
+static inline const tchar *
+blob_file_path(const struct blob_descriptor *blob)
+{
+#ifdef __WIN32__
+       if (blob->blob_location == BLOB_IN_WINDOWS_FILE)
+               return get_windows_file_path(blob->windows_file);
+#endif
+       return blob->file_on_disk;
+}
+
 extern struct blob_descriptor *
 new_blob_from_data_buffer(const void *buffer, size_t size,
                          struct blob_table *blob_table);
@@ -399,8 +415,7 @@ after_blob_hashed(struct blob_descriptor *blob,
                  struct blob_table *blob_table);
 
 extern int
-hash_unhashed_blob(struct blob_descriptor *blob,
-                  struct blob_table *blob_table,
+hash_unhashed_blob(struct blob_descriptor *blob, struct blob_table *blob_table,
                   struct blob_descriptor **blob_ret);
 
 extern struct blob_descriptor **