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;