Nikolay Sivov : kernel32: Fail properly for unsupported classes in GetFileInformationByHandleEx.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Jun 8 07:49:55 CDT 2015
Module: wine
Branch: master
Commit: b17e4376d571347ebdbbe1ddd3e612614d3fc1e8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b17e4376d571347ebdbbe1ddd3e612614d3fc1e8
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Sun Jun 7 00:56:14 2015 +0300
kernel32: Fail properly for unsupported classes in GetFileInformationByHandleEx.
---
dlls/kernel32/file.c | 10 +++++-----
dlls/kernel32/tests/file.c | 29 ++++++++++++++++++++++++++++-
include/winbase.h | 30 ++++++++++++++++++++++++++++++
3 files changed, 63 insertions(+), 6 deletions(-)
diff --git a/dlls/kernel32/file.c b/dlls/kernel32/file.c
index a680ab2..0b208a5 100644
--- a/dlls/kernel32/file.c
+++ b/dlls/kernel32/file.c
@@ -897,14 +897,9 @@ BOOL WINAPI GetFileInformationByHandleEx( HANDLE handle, FILE_INFO_BY_HANDLE_CLA
switch (class)
{
- case FileRenameInfo:
- case FileDispositionInfo:
- case FileAllocationInfo:
- case FileEndOfFileInfo:
case FileStreamInfo:
case FileCompressionInfo:
case FileAttributeTagInfo:
- case FileIoPriorityHintInfo:
case FileRemoteProtocolInfo:
case FileFullDirectoryInfo:
case FileFullDirectoryRestartInfo:
@@ -936,6 +931,11 @@ BOOL WINAPI GetFileInformationByHandleEx( HANDLE handle, FILE_INFO_BY_HANDLE_CLA
(class == FileIdBothDirectoryRestartInfo) );
break;
+ case FileRenameInfo:
+ case FileDispositionInfo:
+ case FileAllocationInfo:
+ case FileIoPriorityHintInfo:
+ case FileEndOfFileInfo:
default:
SetLastError( ERROR_INVALID_PARAMETER );
return FALSE;
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index bd85e01..9480bd4 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -3830,6 +3830,12 @@ static void test_GetFileInformationByHandleEx(void)
FILE_STANDARD_INFO *standardInfo;
FILE_NAME_INFO *nameInfo;
LARGE_INTEGER prevWrite;
+ FILE_IO_PRIORITY_HINT_INFO priohintinfo;
+ FILE_ALLOCATION_INFO allocinfo;
+ FILE_DISPOSITION_INFO dispinfo;
+ FILE_END_OF_FILE_INFO eofinfo;
+ FILE_RENAME_INFO renameinfo;
+
struct {
FILE_INFO_BY_HANDLE_CLASS handleClass;
void *ptr;
@@ -3952,8 +3958,29 @@ static void test_GetFileInformationByHandleEx(void)
for (i = 0; i < nameInfo->FileNameLength/2; i++)
ok(strPtr[i] == nameInfo->FileName[i], "Incorrect filename char %d: %c vs %c\n",
i, strPtr[i], nameInfo->FileName[i]);
- CloseHandle(file);
+ /* invalid classes */
+ SetLastError(0xdeadbeef);
+ ret = pGetFileInformationByHandleEx(file, FileEndOfFileInfo, &eofinfo, sizeof(eofinfo));
+ ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "got %d, error %d\n", ret, GetLastError());
+
+ SetLastError(0xdeadbeef);
+ ret = pGetFileInformationByHandleEx(file, FileIoPriorityHintInfo, &priohintinfo, sizeof(priohintinfo));
+ ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "got %d, error %d\n", ret, GetLastError());
+
+ SetLastError(0xdeadbeef);
+ ret = pGetFileInformationByHandleEx(file, FileAllocationInfo, &allocinfo, sizeof(allocinfo));
+ ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "got %d, error %d\n", ret, GetLastError());
+
+ SetLastError(0xdeadbeef);
+ ret = pGetFileInformationByHandleEx(file, FileDispositionInfo, &dispinfo, sizeof(dispinfo));
+ ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "got %d, error %d\n", ret, GetLastError());
+
+ SetLastError(0xdeadbeef);
+ ret = pGetFileInformationByHandleEx(file, FileRenameInfo, &renameinfo, sizeof(renameinfo));
+ ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "got %d, error %d\n", ret, GetLastError());
+
+ CloseHandle(file);
DeleteFileA(tempFileName);
}
diff --git a/include/winbase.h b/include/winbase.h
index 3601051..4795d87 100644
--- a/include/winbase.h
+++ b/include/winbase.h
@@ -844,6 +844,36 @@ typedef struct _FILE_NAME_INFO {
WCHAR FileName[1];
} FILE_NAME_INFO, *PFILE_NAME_INFO;
+typedef enum _PRIORITY_HINT {
+ IoPriorityHintVeryLow,
+ IoPriorityHintLow,
+ IoPriorityHintNormal,
+ MaximumIoPriorityHintType
+} PRIORITY_HINT;
+
+typedef struct _FILE_IO_PRIORITY_HINT_INFO {
+ PRIORITY_HINT PriorityHint;
+} FILE_IO_PRIORITY_HINT_INFO;
+
+typedef struct _FILE_ALLOCATION_INFO {
+ LARGE_INTEGER AllocationSize;
+} FILE_ALLOCATION_INFO, *PFILE_ALLOCATION_INFO;
+
+typedef struct _FILE_DISPOSITION_INFO {
+ BOOLEAN DeleteFile;
+} FILE_DISPOSITION_INFO, *PFILE_DISPOSITION_INFO;
+
+typedef struct _FILE_END_OF_FILE_INFO {
+ LARGE_INTEGER EndOfFile;
+} FILE_END_OF_FILE_INFO, *PFILE_END_OF_FILE_INFO;
+
+typedef struct _FILE_RENAME_INFO {
+ BOOLEAN ReplaceIfExists;
+ HANDLE RootDirectory;
+ DWORD FileNameLength;
+ WCHAR FileName[1];
+} FILE_RENAME_INFO, *PFILE_RENAME_INFO;
+
#define PIPE_ACCESS_INBOUND 1
#define PIPE_ACCESS_OUTBOUND 2
#define PIPE_ACCESS_DUPLEX 3
More information about the wine-cvs
mailing list