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,
+#ifdef _WIN32
+ /* 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
};
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
/* 1 iff the SHA-1 message digest of this blob is unknown. */
u16 unhashed : 1;
+ /* 1 iff this blob has failed its checksum. */
+ u16 corrupted : 1;
+
/* Temporary fields used when writing blobs; set as documented for
* prepare_blob_list_for_write(). */
u16 unique_size : 1;
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;
- #ifdef __WIN32__
- u64 sort_key;
- #endif
};
/* BLOB_IN_ATTACHED_BUFFER */
/* Links blobs being exported. */
struct list_head export_blob_list;
-
- /* Links original list of blobs in the read-write mounted image. */
- struct list_head orig_blob_list;
};
};
-extern struct blob_table *
-new_blob_table(size_t capacity) _malloc_attribute;
+struct blob_table *
+new_blob_table(size_t capacity);
-extern void
+void
free_blob_table(struct blob_table *table);
-extern int
+int
read_blob_table(WIMStruct *wim);
-extern int
+int
write_blob_table_from_blob_list(struct list_head *blob_list,
struct filedes *out_fd,
u16 part_number,
struct wim_reshdr *out_reshdr,
int write_resource_flags);
-extern struct blob_descriptor *
-new_blob_descriptor(void) _malloc_attribute;
+struct blob_descriptor *
+new_blob_descriptor(void);
-extern struct blob_descriptor *
-clone_blob_descriptor(const struct blob_descriptor *blob) _malloc_attribute;
+struct blob_descriptor *
+clone_blob_descriptor(const struct blob_descriptor *blob);
-extern void
+void
blob_decrement_refcnt(struct blob_descriptor *blob, struct blob_table *table);
-extern void
+void
blob_subtract_refcnt(struct blob_descriptor *blob, struct blob_table *table,
u32 count);
#ifdef WITH_FUSE
-extern void
+void
blob_decrement_num_opened_fds(struct blob_descriptor *blob);
#endif
-extern void
+void
blob_release_location(struct blob_descriptor *blob);
-extern void
+void
free_blob_descriptor(struct blob_descriptor *blob);
-extern void
+void
blob_table_insert(struct blob_table *table, struct blob_descriptor *blob);
-extern void
+void
blob_table_unlink(struct blob_table *table, struct blob_descriptor *blob);
-extern struct blob_descriptor *
+struct blob_descriptor *
lookup_blob(const struct blob_table *table, const u8 *hash);
-extern int
+int
for_blob_in_table(struct blob_table *table,
int (*visitor)(struct blob_descriptor *, void *), void *arg);
-extern int
+int
for_blob_in_table_sorted_by_sequential_order(struct blob_table *table,
int (*visitor)(struct blob_descriptor *, void *),
void *arg);
struct wimlib_resource_entry;
-extern void
+void
blob_to_wimlib_resource_entry(const struct blob_descriptor *blob,
struct wimlib_resource_entry *wentry);
-extern int
+int
sort_blob_list(struct list_head *blob_list, size_t list_head_offset,
int (*compar)(const void *, const void*));
-extern int
+int
sort_blob_list_by_sequential_order(struct list_head *blob_list,
size_t list_head_offset);
-extern int
+int
cmp_blobs_by_sequential_order(const void *p1, const void *p2);
static inline const struct blob_extraction_target *
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_WINNT_FILE_ON_DISK
- || blob->blob_location == BLOB_WIN32_ENCRYPTED
+#ifdef _WIN32
+ || blob->blob_location == BLOB_IN_WINDOWS_FILE
#endif
;
}
-extern struct blob_descriptor *
+#ifdef _WIN32
+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;
+}
+
+struct blob_descriptor *
new_blob_from_data_buffer(const void *buffer, size_t size,
struct blob_table *blob_table);
-extern struct blob_descriptor *
+struct blob_descriptor *
after_blob_hashed(struct blob_descriptor *blob,
struct blob_descriptor **back_ptr,
- struct blob_table *blob_table);
+ struct blob_table *blob_table, struct wim_inode *inode);
-extern int
+int
hash_unhashed_blob(struct blob_descriptor *blob, struct blob_table *blob_table,
struct blob_descriptor **blob_ret);
-extern struct blob_descriptor **
+struct blob_descriptor **
retrieve_pointer_to_unhashed_blob(struct blob_descriptor *blob);
static inline void