In mounted WIM images, the disk usage provided for each file (st_blocks)
is now the compressed size rather than the uncompressed size.
- The performance of NTFS-3g capture mode has been slightly improved.
+ The performance of the NTFS-3g and Windows capture modes has been
+ slightly improved.
Version 1.8.0:
Improved the LZX compressor. It is now 15-20% faster than before and
v = (int)blob1->blob_location - (int)blob2->blob_location;
- /* Different resource locations? */
+ /* Different locations? */
if (v)
return v;
#ifdef __WIN32__
case BLOB_IN_WINNT_FILE_ON_DISK:
case BLOB_WIN32_ENCRYPTED:
+ /* Windows: compare by starting LCN (logical cluster number) */
+ v = cmp_u64(blob1->sort_key, blob2->sort_key);
+ if (v)
+ return v;
#endif
/* Compare files by path: just a heuristic that will place files
* in the same directory next to each other. */
return ret;
}
+static u64
+get_sort_key(HANDLE h)
+{
+ STARTING_VCN_INPUT_BUFFER in = { .StartingVcn.QuadPart = 0 };
+ RETRIEVAL_POINTERS_BUFFER out;
+ DWORD bytesReturned;
+
+ if (!DeviceIoControl(h, FSCTL_GET_RETRIEVAL_POINTERS,
+ &in, sizeof(in),
+ &out, sizeof(out),
+ &bytesReturned, NULL))
+ return 0;
+
+ if (out.ExtentCount < 1)
+ return 0;
+
+ return out.Extents[0].Lcn.QuadPart;
+}
+
+static void
+set_sort_key(struct wim_inode *inode, u64 sort_key)
+{
+ for (unsigned i = 0; i < inode->i_num_streams; i++) {
+ struct wim_inode_stream *strm = &inode->i_streams[i];
+ struct blob_descriptor *blob = stream_blob_resolved(strm);
+ if (blob && (blob->blob_location == BLOB_IN_WINNT_FILE_ON_DISK ||
+ blob->blob_location == BLOB_WIN32_ENCRYPTED))
+ blob->sort_key = sort_key;
+ }
+}
+
static int
winnt_build_dentry_tree_recursive(struct wim_dentry **root_ret,
HANDLE cur_dir,
NTSTATUS status;
FILE_ALL_INFORMATION file_info;
ACCESS_MASK requestedPerms;
+ u64 sort_key;
ret = try_exclude(full_path, full_path_nchars, params);
if (ret < 0) /* Excluded? */
}
}
+ sort_key = get_sort_key(h);
+
if (unlikely(inode->i_attributes & FILE_ATTRIBUTE_ENCRYPTED)) {
/* Load information about the raw encrypted data. This is
* needed for any directory or non-directory that has
goto out;
}
+ set_sort_key(inode, sort_key);
+
if (inode_is_directory(inode)) {
/* Directory: recurse to children. */