From 2c82277b5e7ac7e43edefe60aaf6dfeaa36d620b Mon Sep 17 00:00:00 2001 From: Igor Pissolati Date: Thu, 23 Oct 2025 11:19:17 -0300 Subject: [PATCH] Add FileIdInformation file info class --- src/common/platform/file_management.hpp | 18 ++++++++++---- src/windows-emulator/syscalls/file.cpp | 32 +++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/common/platform/file_management.hpp b/src/common/platform/file_management.hpp index 5c6d091e..0d8745e1 100644 --- a/src/common/platform/file_management.hpp +++ b/src/common/platform/file_management.hpp @@ -333,6 +333,19 @@ typedef struct _FILE_IS_REMOTE_DEVICE_INFORMATION BOOLEAN IsRemote; } FILE_IS_REMOTE_DEVICE_INFORMATION, *PFILE_IS_REMOTE_DEVICE_INFORMATION; +#ifndef OS_WINDOWS +typedef struct _FILE_ID_128 +{ + BYTE Identifier[16]; +} FILE_ID_128, *PFILE_ID_128; +#endif + +typedef struct _FILE_ID_INFORMATION +{ + ULONGLONG VolumeSerialNumber; + FILE_ID_128 FileId; +} FILE_ID_INFORMATION, *PFILE_ID_INFORMATION; + typedef struct _FILE_STANDARD_INFORMATION { LARGE_INTEGER AllocationSize; @@ -426,11 +439,6 @@ typedef struct _FILE_RENAME_INFORMATION } FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION; #ifndef OS_WINDOWS -typedef struct _FILE_ID_128 -{ - BYTE Identifier[16]; -} FILE_ID_128, *PFILE_ID_128; - typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE; typedef struct _SECURITY_QUALITY_OF_SERVICE { diff --git a/src/windows-emulator/syscalls/file.cpp b/src/windows-emulator/syscalls/file.cpp index 62fd7ff7..7c9a0199 100644 --- a/src/windows-emulator/syscalls/file.cpp +++ b/src/windows-emulator/syscalls/file.cpp @@ -571,6 +571,38 @@ namespace syscalls return ret(STATUS_SUCCESS); } + if (info_class == FileIdInformation) + { + if (!f->handle) + { + return ret(STATUS_NOT_SUPPORTED); + } + + block.Information = sizeof(FILE_ID_INFORMATION); + + if (length < block.Information) + { + return ret(STATUS_BUFFER_OVERFLOW); + } + + struct _stat64 file_stat{}; + if (fstat64(f->handle, &file_stat) != 0) + { + return ret(STATUS_INVALID_HANDLE); + } + + const emulator_object info{c.emu, file_information}; + FILE_ID_INFORMATION i{}; + + i.VolumeSerialNumber = file_stat.st_dev; + memset(&i.FileId, 0, sizeof(i.FileId)); + memcpy(&i.FileId.Identifier[0], &file_stat.st_ino, sizeof(file_stat.st_ino)); + + info.write(i); + + return ret(STATUS_SUCCESS); + } + if (info_class == FileAllInformation) { return ret(STATUS_NOT_SUPPORTED);