]> wimlib.net Git - wimlib/blobdiff - src/resource.c
Add experimental support for Windows VSS
[wimlib] / src / resource.c
index 72d051931787506726989f09505b269d58b22f12..c3e6927c147d50a25dd4e4c0d0f694737e652edc 100644 (file)
@@ -57,8 +57,8 @@
  *   "chunk table" provides the offset, in bytes relative to the end of the
  *   chunk table, of the start of each compressed chunk, except for the first
  *   chunk which is omitted as it always has an offset of 0.  Chunk table
- *   entries are 32-bit for resources <= 4 GiB uncompressed and 64-bit for
- *   resources > 4 GiB uncompressed.
+ *   entries are 32-bit for resources < 4 GiB uncompressed and 64-bit for
+ *   resources >= 4 GiB uncompressed.
  *
  * - Solid resource format (distinguished by the use of WIM_RESHDR_FLAG_SOLID
  *   instead of WIM_RESHDR_FLAG_COMPRESSED): similar to the original format, but
@@ -234,35 +234,34 @@ read_compressed_wim_resource(const struct wim_resource_descriptor * const rdesc,
                 * to initialize the chunk_offsets array.  */
 
                u64 first_chunk_entry_to_read;
-               u64 last_chunk_entry_to_read;
+               u64 num_chunk_entries_to_read;
 
                if (alt_chunk_table) {
                        /* The alternate chunk table contains chunk sizes, not
                         * offsets, so we always must read all preceding entries
                         * in order to determine offsets.  */
                        first_chunk_entry_to_read = 0;
-                       last_chunk_entry_to_read = last_needed_chunk;
+                       num_chunk_entries_to_read = last_needed_chunk + 1;
                } else {
-                       /* Here we must account for the fact that the first
-                        * chunk has no explicit chunk table entry.  */
 
-                       if (read_start_chunk == 0)
+                       num_chunk_entries_to_read = last_needed_chunk - read_start_chunk + 1;
+
+                       /* The first chunk has no explicit chunk table entry.  */
+                       if (read_start_chunk == 0) {
+                               num_chunk_entries_to_read--;
                                first_chunk_entry_to_read = 0;
-                       else
+                       } else {
                                first_chunk_entry_to_read = read_start_chunk - 1;
+                       }
 
-                       if (last_needed_chunk == 0)
-                               last_chunk_entry_to_read = 0;
-                       else
-                               last_chunk_entry_to_read = last_needed_chunk - 1;
-
+                       /* Unless we're reading the final chunk of the resource,
+                        * we need the offset of the chunk following the last
+                        * needed chunk so that the compressed size of the last
+                        * needed chunk can be computed.  */
                        if (last_needed_chunk < num_chunks - 1)
-                               last_chunk_entry_to_read++;
+                               num_chunk_entries_to_read++;
                }
 
-               const u64 num_chunk_entries_to_read =
-                       last_chunk_entry_to_read - first_chunk_entry_to_read + 1;
-
                const u64 chunk_offsets_alloc_size =
                        max(num_chunk_entries_to_read,
                            num_needed_chunk_offsets) * sizeof(chunk_offsets[0]);
@@ -740,8 +739,7 @@ read_blob_prefix(const struct blob_descriptor *blob, u64 size,
                [BLOB_IN_NTFS_VOLUME] = read_ntfs_attribute_prefix,
        #endif
        #ifdef __WIN32__
-               [BLOB_IN_WINNT_FILE_ON_DISK] = read_winnt_stream_prefix,
-               [BLOB_WIN32_ENCRYPTED] = read_win32_encrypted_file_prefix,
+               [BLOB_IN_WINDOWS_FILE] = read_windows_file_prefix,
        #endif
        };
        wimlib_assert(blob->blob_location < ARRAY_LEN(handlers)
@@ -960,7 +958,7 @@ report_sha1_mismatch_error(const struct blob_descriptor *blob,
                      "        Path: \"%"TS"\"\n"
                      "        Expected SHA-1: %"TS"\n"
                      "        Actual SHA-1: %"TS"\n",
-                     blob->file_on_disk, expected_hashstr, actual_hashstr);
+                     blob_file_path(blob), expected_hashstr, actual_hashstr);
                return WIMLIB_ERR_CONCURRENT_MODIFICATION_DETECTED;
        } else if (blob->blob_location == BLOB_IN_WIM) {
                const struct wim_resource_descriptor *rdesc = blob->rdesc;