From 568062cf9d60d52ab3a43ffcd2f7cc43d35bfbb8 Mon Sep 17 00:00:00 2001 From: "Herman S." <429230+has207@users.noreply.github.com> Date: Tue, 7 Oct 2025 10:33:17 +0900 Subject: [PATCH] [Kernel] Implement XFileAllocationInformation --- src/xenia/kernel/info/file.h | 6 ++++++ src/xenia/kernel/xboxkrnl/xboxkrnl_io_info.cc | 14 ++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/xenia/kernel/info/file.h b/src/xenia/kernel/info/file.h index 813e4bd2d..06eb791c5 100644 --- a/src/xenia/kernel/info/file.h +++ b/src/xenia/kernel/info/file.h @@ -101,6 +101,12 @@ struct X_FILE_END_OF_FILE_INFORMATION { }; static_assert_size(X_FILE_END_OF_FILE_INFORMATION, 8); +// https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_allocation_information +struct X_FILE_ALLOCATION_INFORMATION { + be allocation_size; +}; +static_assert_size(X_FILE_ALLOCATION_INFORMATION, 8); + struct X_FILE_XCTD_COMPRESSION_INFORMATION { be unknown; }; diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_io_info.cc b/src/xenia/kernel/xboxkrnl/xboxkrnl_io_info.cc index cb651489e..f3bf9eabd 100644 --- a/src/xenia/kernel/xboxkrnl/xboxkrnl_io_info.cc +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_io_info.cc @@ -158,12 +158,14 @@ uint32_t GetSetFileInfoMinimumLength(uint32_t info_class) { return sizeof(X_FILE_POSITION_INFORMATION); case XFileCompletionInformation: return sizeof(X_FILE_COMPLETION_INFORMATION); + case XFileAllocationInformation: + return sizeof(X_FILE_ALLOCATION_INFORMATION); + case XFileEndOfFileInformation: + return sizeof(X_FILE_END_OF_FILE_INFORMATION); // TODO(gibbed): structures to get the size of. case XFileModeInformation: case XFileIoPriorityInformation: return 4; - case XFileAllocationInformation: - case XFileEndOfFileInformation: case XFileMountPartitionInformation: return 8; case XFileLinkInformation: @@ -258,8 +260,12 @@ dword_result_t NtSetInformationFile_entry( break; } case XFileAllocationInformation: { - XELOGW("NtSetInformationFile ignoring alloc"); - out_length = 8; + auto info = info_ptr.as(); + result = file->SetLength(info->allocation_size); + out_length = sizeof(*info); + + // Update the files vfs::Entry information + file->entry()->update(); break; } case XFileEndOfFileInformation: {