On 31.12.2016 16:50, Jonathan Doron wrote:
Signed-off-by: Jonathan Doron <jond(a)wizery.com> --- dlls/ntdll/file.c | 19 ++++++++++++++++++- include/winternl.h | 9 +++++++++ 2 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c index 6eddd19..fbadfbd 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c @@ -2379,7 +2379,7 @@ NTSTATUS WINAPI NtQueryInformationFile( HANDLE hFile, PIO_STATUS_BLOCK io, 0, /* FileRenameInformationBypassAccessCheck */ 0, /* FileLinkInformationBypassAccessCheck */ 0, /* FileVolumeNameInformation */ - 0, /* FileIdInformation */ + sizeof(FILE_ID_INFORMATION), /* FileIdInformation */ 0, /* FileIdExtdDirectoryInformation */ 0, /* FileReplaceCompletionInformation */ 0, /* FileHardLinkFullIdInformation */ @@ -2621,6 +2621,23 @@ NTSTATUS WINAPI NtQueryInformationFile( HANDLE hFile, PIO_STATUS_BLOCK io, } } break; + case FileIdInformation: + { + struct statfs volstats; + FILE_ID_INFORMATION *info = ptr; + if ((fstat(fd, &st) == -1) || (fstatfs(fd, &volstats) == -1)) + { + io->u.Status = FILE_GetNtStatus(); + } + else + { + memset(info, 0, sizeof(*info)); + ((PLARGE_INTEGER)&info->VolumeSerialNumber)->LowPart = (ULONG)volstats.f_fsid.__val[0]; + ((PLARGE_INTEGER)&info->VolumeSerialNumber)->HighPart = (ULONG)volstats.f_fsid.__val[1]; + ((PLARGE_INTEGER)&info->FileId)->QuadPart = st.st_ino; + } + } + break; default: FIXME("Unsupported class (%d)\n", class); io->u.Status = STATUS_NOT_IMPLEMENTED; diff --git a/include/winternl.h b/include/winternl.h index 891b6a7..2f2ea86 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -571,6 +571,15 @@ typedef struct _FILE_INTERNAL_INFORMATION { LARGE_INTEGER IndexNumber; } FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
+typedef struct _FILE_ID_128 { + UCHAR Identifier[16]; +} FILE_ID_128, *PFILE_ID_128; Windows SDK has it in winnt.h, using BYTE instead of UCHAR.
+ +typedef struct _FILE_ID_INFORMATION { + ULONGLONG VolumeSerialNumber; + FILE_ID_128 FileId; +} FILE_ID_INFORMATION, *PFILE_ID_INFORMATION; + This one should go to winbase.h, as FILE_ID_INFO. typedef struct _FILE_EA_INFORMATION { ULONG EaSize; } FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;