From f4b07ee8eceb1d85b2bfd521462d010db00bee29 Mon Sep 17 00:00:00 2001 From: Greg Smith Date: Mon, 19 Nov 2018 07:13:50 +1100 Subject: [PATCH] kernel32: Ignore FileIoPriorityHintInfo in SetFileInformationByHandle(). Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46130 Signed-off-by: Greg Smith Signed-off-by: Alexandre Julliard --- dlls/kernel32/file.c | 5 +++-- dlls/kernel32/tests/file.c | 23 +++++++++++++++++++++++ dlls/ntdll/file.c | 12 ++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/dlls/kernel32/file.c b/dlls/kernel32/file.c index eeccf67e15e..3214d724cbb 100644 --- a/dlls/kernel32/file.c +++ b/dlls/kernel32/file.c @@ -1103,7 +1103,6 @@ BOOL WINAPI SetFileInformationByHandle( HANDLE file, FILE_INFO_BY_HANDLE_CLASS c case FileStreamInfo: case FileIdBothDirectoryInfo: case FileIdBothDirectoryRestartInfo: - case FileIoPriorityHintInfo: case FileFullDirectoryInfo: case FileFullDirectoryRestartInfo: case FileStorageInfo: @@ -1118,7 +1117,9 @@ BOOL WINAPI SetFileInformationByHandle( HANDLE file, FILE_INFO_BY_HANDLE_CLASS c case FileDispositionInfo: status = NtSetInformationFile( file, &io, info, size, FileDispositionInformation ); break; - + case FileIoPriorityHintInfo: + status = NtSetInformationFile( file, &io, info, size, FileIoPriorityHintInformation ); + break; case FileStandardInfo: case FileCompressionInfo: case FileAttributeTagInfo: diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c index 168bdd5e7b4..d1b76bb7111 100644 --- a/dlls/kernel32/tests/file.c +++ b/dlls/kernel32/tests/file.c @@ -4914,6 +4914,7 @@ static void test_SetFileInformationByHandle(void) FILE_STANDARD_INFO stdinfo = { {{0}},{{0}},0,FALSE,FALSE }; FILE_COMPRESSION_INFO compressinfo; FILE_DISPOSITION_INFO dispinfo; + DECLSPEC_ALIGN(8) FILE_IO_PRIORITY_HINT_INFO hintinfo; char tempFileName[MAX_PATH]; char tempPath[MAX_PATH]; HANDLE file; @@ -4950,6 +4951,28 @@ static void test_SetFileInformationByHandle(void) ret = pSetFileInformationByHandle(file, FileAttributeTagInfo, &fileattrinfo, sizeof(fileattrinfo)); ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "got %d, error %d\n", ret, GetLastError()); + SetLastError(0xdeadbeef); + hintinfo.PriorityHint = MaximumIoPriorityHintType; + ret = pSetFileInformationByHandle(file, FileIoPriorityHintInfo, &hintinfo, sizeof(hintinfo)); + ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "got %d, error %d\n", ret, GetLastError()); + + hintinfo.PriorityHint = IoPriorityHintNormal; + ret = pSetFileInformationByHandle(file, FileIoPriorityHintInfo, &hintinfo, sizeof(hintinfo)); + ok(ret, "setting FileIoPriorityHintInfo got %d, error %d\n", ret, GetLastError()); + + hintinfo.PriorityHint = IoPriorityHintVeryLow; + ret = pSetFileInformationByHandle(file, FileIoPriorityHintInfo, &hintinfo, sizeof(hintinfo)); + ok(ret, "setting FileIoPriorityHintInfo got %d, error %d\n", ret, GetLastError()); + + SetLastError(0xdeadbeef); + ret = pSetFileInformationByHandle(file, FileIoPriorityHintInfo, &hintinfo, sizeof(hintinfo) - 1); + ok(!ret && GetLastError() == ERROR_BAD_LENGTH, "got %d, error %d\n", ret, GetLastError()); + + SetLastError(0xdeadbeef); + hintinfo.PriorityHint = IoPriorityHintVeryLow - 1; + ret = pSetFileInformationByHandle(file, FileIoPriorityHintInfo, &hintinfo, sizeof(hintinfo)); + ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "got %d, error %d\n", ret, GetLastError()); + memset(&protinfo, 0, sizeof(protinfo)); protinfo.StructureVersion = 1; protinfo.StructureSize = sizeof(protinfo); diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c index 7c8b8edc1e8..a43fe71108d 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c @@ -2671,6 +2671,18 @@ NTSTATUS WINAPI NtSetInformationFile(HANDLE handle, PIO_STATUS_BLOCK io, io->u.Status = STATUS_INFO_LENGTH_MISMATCH; break; + case FileIoPriorityHintInformation: + if (len >= sizeof(FILE_IO_PRIORITY_HINT_INFO)) + { + FILE_IO_PRIORITY_HINT_INFO *info = ptr; + if (info->PriorityHint < MaximumIoPriorityHintType) + TRACE( "ignoring FileIoPriorityHintInformation %u\n", info->PriorityHint ); + else + io->u.Status = STATUS_INVALID_PARAMETER; + } + else io->u.Status = STATUS_INFO_LENGTH_MISMATCH; + break; + case FileAllInformation: io->u.Status = STATUS_INVALID_INFO_CLASS; break;