/* Open handle to the target directory (possibly creating it). */
- status = (*func_RtlDosPathNameToNtPathName_U_WithStatus)(ctx->common.target,
- &ctx->target_ntpath,
- NULL, NULL);
+ if (func_RtlDosPathNameToNtPathName_U_WithStatus) {
+ status = (*func_RtlDosPathNameToNtPathName_U_WithStatus)(ctx->common.target,
+ &ctx->target_ntpath,
+ NULL, NULL);
+ } else {
+ if ((*func_RtlDosPathNameToNtPathName_U)(ctx->common.target,
+ &ctx->target_ntpath,
+ NULL, NULL))
+ status = STATUS_SUCCESS;
+ else
+ status = STATUS_NO_MEMORY;
+ }
if (!NT_SUCCESS(status)) {
if (status == STATUS_NO_MEMORY) {
return WIMLIB_ERR_NOMEM;
return 0;
}
-/* Gets the number of bytes to allocate for the specified inode. */
-static void
-inode_get_allocation_size(const struct wim_inode *inode,
- LARGE_INTEGER *allocation_size_ret)
-{
- const struct wim_lookup_table_entry *unnamed_stream;
-
- /* We just count the unnamed data stream. */
-
- unnamed_stream = inode_unnamed_lte_resolved(inode);
- if (unnamed_stream)
- allocation_size_ret->QuadPart = unnamed_stream->size;
- else
- allocation_size_ret->QuadPart = 0;
-}
-
/*
* Creates the nondirectory file named by @dentry.
*
struct win32_apply_ctx *ctx)
{
const struct wim_inode *inode;
- LARGE_INTEGER allocation_size;
ULONG attrib;
NTSTATUS status;
bool retried = false;
inode = dentry->d_inode;
- /* To increase performance, we will pre-allocate space for the file
- * data. */
- inode_get_allocation_size(inode, &allocation_size);
-
/* If the file already exists and has FILE_ATTRIBUTE_SYSTEM and/or
* FILE_ATTRIBUTE_HIDDEN, these must be specified in order to supersede
* the file.
build_extraction_path(dentry, ctx);
retry:
status = do_create_file(h_ret, GENERIC_READ | GENERIC_WRITE | DELETE,
- &allocation_size, attrib, FILE_SUPERSEDE,
+ NULL, attrib, FILE_SUPERSEDE,
FILE_NON_DIRECTORY_FILE, ctx);
if (NT_SUCCESS(status)) {
int ret;
{
const struct wim_inode *inode = dentry->d_inode;
size_t stream_name_nchars = 0;
- LARGE_INTEGER allocation_size;
+ FILE_ALLOCATION_INFORMATION alloc_info;
HANDLE h;
NTSTATUS status;
}
/* Open a new handle */
- allocation_size.QuadPart = stream->size;
status = do_create_file(&h,
FILE_WRITE_DATA | SYNCHRONIZE,
- &allocation_size, 0, FILE_OPEN_IF,
+ NULL, 0, FILE_OPEN_IF,
FILE_SEQUENTIAL_ONLY |
FILE_SYNCHRONOUS_IO_NONALERT,
ctx);
}
ctx->open_handles[ctx->num_open_handles++] = h;
+
+ /* Allocate space for the data. */
+ alloc_info.AllocationSize.QuadPart = stream->size;
+ (*func_NtSetInformationFile)(h, &ctx->iosb,
+ &alloc_info, sizeof(alloc_info),
+ FileAllocationInformation);
return 0;
}