[PATCH v2 1/2] ntdll: Return a unique volume number from NtQueryInformationFile(FileIdInformation).
Gabriel Ivăncescu
gabrielopcode at gmail.com
Thu Mar 5 11:59:34 CST 2020
On 05/03/2020 19:08, Zebediah Figura wrote:
>
>
> On 3/5/20 10:18 AM, Zebediah Figura wrote:
>> On 3/4/20 9:04 PM, Zebediah Figura wrote:
>>> Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
>>> ---
>>> v2: Shift the device number by 4 bytes, since the lower 4 bytes are used by the
>>> volume serial number.
>>>
>>> dlls/ntdll/file.c | 2 +-
>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
>>> index 7dfb0a4800e..2aa5d8f979f 100644
>>> --- a/dlls/ntdll/file.c
>>> +++ b/dlls/ntdll/file.c
>>> @@ -2508,7 +2508,7 @@ NTSTATUS WINAPI NtQueryInformationFile( HANDLE hFile, PIO_STATUS_BLOCK io,
>>> else
>>> {
>>> FILE_ID_INFORMATION *info = ptr;
>>> - info->VolumeSerialNumber = 0; /* FIXME */
>>> + info->VolumeSerialNumber = (ULONGLONG)st.st_dev << 32;
>>> memset( &info->FileId, 0, sizeof(info->FileId) );
>>> *(ULONGLONG *)&info->FileId = st.st_ino;
>>> }
>>>
>>
>> Based on Alistair's comments and some further research, this probably
>> isn't a great solution.
>>
>> It turns out that NTFS drives actually have 64-bit serial numbers, but
>> that's truncated to 32 bits for most APIs. More importantly, the serial
>> number doesn't change across boots, and should be unique for different
>> removable drives—neither of which, I understand, are guarantees for st_dev.
>>
>> Actually, on further examination, I don't think either of our uses of
>> is_same_file() are necessary, so I'll try to get rid of those instead.
>>
>
> Meh, I was wrong. The MoveFile() call can go away, but the CopyFile()
> call apparently really needs to stay.
>
> I guess using the real volume serial number is the best fix here, though
> I'd welcome better ideas.
>
> (Note that we can't just compare the file name—I checked, and CopyFile()
> similarly fails for hard links.)
>
Hi Zeb,
FWIW, my patch for MoveFile that adds support to rename a file with a
different case also depends on is_same_file. Unfortunately I resent it
many times and has never been reviewed so it's not in the tree.
See: https://source.winehq.org/patches/data/177833
More information about the wine-devel
mailing list