Add FileIdInformation file info class

This commit is contained in:
Igor Pissolati
2025-10-23 11:19:17 -03:00
parent 83aa3b663a
commit 2c82277b5e
2 changed files with 45 additions and 5 deletions

View File

@@ -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
{

View File

@@ -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<FILE_ID_INFORMATION> 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);