diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c index ca6899b50f5..bf1354f46e8 100644 --- a/dlls/ntdll/unix/file.c +++ b/dlls/ntdll/unix/file.c @@ -5666,6 +5666,29 @@ NTSTATUS WINAPI NtFsControlFile( HANDLE handle, HANDLE event, PIO_APC_ROUTINE ap } break; } + + case FSCTL_GET_OBJECT_ID: + { + FILE_OBJECTID_BUFFER *info = out_buffer; + int fd, needs_close; + struct stat st; + + io->Information = 0; + if (out_size >= sizeof(*info)) + { + status = server_get_unix_fd( handle, 0, &fd, &needs_close, NULL, NULL ); + if (status) break; + fstat( fd, &st ); + if (needs_close) close( fd ); + memset( info, 0, sizeof(*info) ); + memcpy( info->ObjectId, &st.st_dev, sizeof(st.st_dev) ); + memcpy( info->ObjectId + 8, &st.st_ino, sizeof(st.st_ino) ); + io->Information = sizeof(*info); + } + else status = STATUS_BUFFER_TOO_SMALL; + break; + } + case FSCTL_SET_SPARSE: TRACE("FSCTL_SET_SPARSE: Ignoring request\n"); io->Information = 0; diff --git a/include/winternl.h b/include/winternl.h index 0957561063a..3ff15f28c15 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -744,6 +744,21 @@ typedef struct _FILE_PIPE_LOCAL_INFORMATION { #define FILE_PIPE_CONNECTED_STATE 0x00000003 #define FILE_PIPE_CLOSING_STATE 0x00000004 +typedef struct _FILE_OBJECTID_BUFFER +{ + BYTE ObjectId[16]; + union + { + struct + { + BYTE BirthVolumeId[16]; + BYTE BirthObjectId[16]; + BYTE DomainId[16]; + } DUMMYSTRUCTNAME; + BYTE ExtendedInfo[48]; + } DUMMYUNIONNAME; +} FILE_OBJECTID_BUFFER, *PFILE_OBJECTID_BUFFER; + typedef struct _FILE_OBJECTID_INFORMATION { LONGLONG FileReference; UCHAR ObjectId[16];