Module: wine Branch: master Commit: 1b0d8428dfc13b0fa5ea7d576dfef7aaf8a8c927 URL: https://gitlab.winehq.org/wine/wine/-/commit/1b0d8428dfc13b0fa5ea7d576dfef7a...
Author: Jinoh Kang jinoh.kang.kr@gmail.com Date: Tue Feb 20 00:47:19 2024 +0900
kernelbase: Replace FileAllInformation with FileStatInformation in GetFileInformationByHandle().
It also fixes the game Unity of Command II (same bug).
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46070
---
dlls/kernelbase/file.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-)
diff --git a/dlls/kernelbase/file.c b/dlls/kernelbase/file.c index 67a7a34249a..2b59db43041 100644 --- a/dlls/kernelbase/file.c +++ b/dlls/kernelbase/file.c @@ -3043,27 +3043,26 @@ BOOL WINAPI DECLSPEC_HOTPATCH FlushFileBuffers( HANDLE file ) BOOL WINAPI DECLSPEC_HOTPATCH GetFileInformationByHandle( HANDLE file, BY_HANDLE_FILE_INFORMATION *info ) { FILE_FS_VOLUME_INFORMATION volume_info; - FILE_ALL_INFORMATION all_info; + FILE_STAT_INFORMATION stat_info; IO_STATUS_BLOCK io; NTSTATUS status;
- status = NtQueryInformationFile( file, &io, &all_info, sizeof(all_info), FileAllInformation ); - if (status == STATUS_BUFFER_OVERFLOW) status = STATUS_SUCCESS; + status = NtQueryInformationFile( file, &io, &stat_info, sizeof(stat_info), FileStatInformation ); if (!set_ntstatus( status )) return FALSE;
- info->dwFileAttributes = all_info.BasicInformation.FileAttributes; - info->ftCreationTime.dwHighDateTime = all_info.BasicInformation.CreationTime.u.HighPart; - info->ftCreationTime.dwLowDateTime = all_info.BasicInformation.CreationTime.u.LowPart; - info->ftLastAccessTime.dwHighDateTime = all_info.BasicInformation.LastAccessTime.u.HighPart; - info->ftLastAccessTime.dwLowDateTime = all_info.BasicInformation.LastAccessTime.u.LowPart; - info->ftLastWriteTime.dwHighDateTime = all_info.BasicInformation.LastWriteTime.u.HighPart; - info->ftLastWriteTime.dwLowDateTime = all_info.BasicInformation.LastWriteTime.u.LowPart; + info->dwFileAttributes = stat_info.FileAttributes; + info->ftCreationTime.dwHighDateTime = stat_info.CreationTime.u.HighPart; + info->ftCreationTime.dwLowDateTime = stat_info.CreationTime.u.LowPart; + info->ftLastAccessTime.dwHighDateTime = stat_info.LastAccessTime.u.HighPart; + info->ftLastAccessTime.dwLowDateTime = stat_info.LastAccessTime.u.LowPart; + info->ftLastWriteTime.dwHighDateTime = stat_info.LastWriteTime.u.HighPart; + info->ftLastWriteTime.dwLowDateTime = stat_info.LastWriteTime.u.LowPart; info->dwVolumeSerialNumber = 0; - info->nFileSizeHigh = all_info.StandardInformation.EndOfFile.u.HighPart; - info->nFileSizeLow = all_info.StandardInformation.EndOfFile.u.LowPart; - info->nNumberOfLinks = all_info.StandardInformation.NumberOfLinks; - info->nFileIndexHigh = all_info.InternalInformation.IndexNumber.u.HighPart; - info->nFileIndexLow = all_info.InternalInformation.IndexNumber.u.LowPart; + info->nFileSizeHigh = stat_info.EndOfFile.u.HighPart; + info->nFileSizeLow = stat_info.EndOfFile.u.LowPart; + info->nNumberOfLinks = stat_info.NumberOfLinks; + info->nFileIndexHigh = stat_info.FileId.u.HighPart; + info->nFileIndexLow = stat_info.FileId.u.LowPart;
status = NtQueryVolumeInformationFile( file, &io, &volume_info, sizeof(volume_info), FileFsVolumeInformation ); if (status == STATUS_SUCCESS || status == STATUS_BUFFER_OVERFLOW)