ntdll: Implement FSCTL_GET_OBJECT_ID to retrieve a file id.

It can be used instead of FileIdInformation to avoid depending on
mountmgr.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
master
Alexandre Julliard 2020-06-21 16:25:59 +02:00
parent 6ff0bb786c
commit 251335cdf3
2 changed files with 38 additions and 0 deletions

View File

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

View File

@ -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];