From 7f6bfa6cc0ce75fc2c3ca707f9940f514ff3f14c Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sat, 8 Feb 2025 20:41:03 +0100 Subject: [PATCH] Support fetching tag information --- src/common/platform/file_management.hpp | 7 +++++++ src/windows-emulator/syscalls.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/common/platform/file_management.hpp b/src/common/platform/file_management.hpp index 3e0e90d3..95050c6a 100644 --- a/src/common/platform/file_management.hpp +++ b/src/common/platform/file_management.hpp @@ -59,6 +59,7 @@ #define FILE_CREATE_TREE_CONNECTION 0x00000080 #define FILE_ATTRIBUTE_NORMAL 0x00000080 +#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 #define PS_ATTRIBUTE_NUMBER_MASK 0x0000ffff #define PS_ATTRIBUTE_THREAD 0x00010000 // may be used with thread creation @@ -291,6 +292,12 @@ typedef struct _FILE_POSITION_INFORMATION LARGE_INTEGER CurrentByteOffset; } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION; +typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION +{ + ULONG FileAttributes; + ULONG ReparseTag; +} FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION; + typedef struct _FILE_STANDARD_INFORMATION { LARGE_INTEGER AllocationSize; diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index 722ba92a..82567f8f 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -1841,6 +1841,30 @@ namespace return ret(STATUS_SUCCESS); } + if (info_class == FileAttributeTagInformation) + { + if (!f->handle) + { + return ret(STATUS_NOT_SUPPORTED); + } + + block.Information = sizeof(FILE_ATTRIBUTE_TAG_INFORMATION); + + if (length < block.Information) + { + return ret(STATUS_BUFFER_OVERFLOW); + } + + const emulator_object info{c.emu, file_information}; + FILE_ATTRIBUTE_TAG_INFORMATION i{}; + + i.FileAttributes = f->is_directory() ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL; + + info.write(i); + + return ret(STATUS_SUCCESS); + } + c.win_emu.log.error("Unsupported query file info class: %X\n", info_class); c.emu.stop();