[2/3] ntdll: Implement FileIdInformation class support in NtQueryInformationFile.

Jonathan Doron jond at wizery.com
Sat Dec 31 07:50:56 CST 2016


Signed-off-by: Jonathan Doron <jond at 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;
+
+typedef struct _FILE_ID_INFORMATION {
+    ULONGLONG VolumeSerialNumber;
+    FILE_ID_128 FileId;
+} FILE_ID_INFORMATION, *PFILE_ID_INFORMATION;
+
 typedef struct _FILE_EA_INFORMATION {
     ULONG EaSize;
 } FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;
-- 
2.9.3




More information about the wine-patches mailing list