* along with wimlib; if not, see http://www.gnu.org/licenses/.
*/
+#ifdef __WIN32__
+
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
d = dentry;
do {
len += d->d_extraction_name_nchars + 1;
- d = d->parent;
+ d = d->d_parent;
} while (!dentry_is_root(d) && will_extract_dentry(d));
return --len; /* No leading slash */
ctx->pathbuf.Length = len * sizeof(wchar_t);
p = ctx->pathbuf.Buffer + len;
for (d = dentry;
- !dentry_is_root(d->parent) && will_extract_dentry(d->parent);
- d = d->parent)
+ !dentry_is_root(d->d_parent) && will_extract_dentry(d->d_parent);
+ d = d->d_parent)
{
p -= d->d_extraction_name_nchars;
wmemcpy(p, d->d_extraction_name, d->d_extraction_name_nchars);
/* 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;
&info, ctx->common.progctx);
FREE(dentry->_full_path);
dentry->_full_path = NULL;
- return ret;
+ if (ret)
+ return ret;
+ /* Go on and open the file for normal extraction. */
} else {
FREE(dentry->_full_path);
dentry->_full_path = NULL;
/* Too many open handles? */
if (ctx->num_open_handles == MAX_OPEN_HANDLES) {
- ERROR("Too many open handles!");
+ ERROR("Can't extract data: too many open files!");
return WIMLIB_ERR_UNSUPPORTED;
}
/* 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;
}
.extract = win32_extract,
.context_size = sizeof(struct win32_apply_ctx),
};
+
+#endif /* __WIN32__ */