Module: wine Branch: master Commit: 7fe0b56e15a278dbd3a9def388321a2771785576 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7fe0b56e15a278dbd3a9def388...
Author: Michael Müller michael@fds-team.de Date: Wed Jun 10 07:56:32 2015 +0200
kernel32: Forward SetFileInformationByHandle FileDispositionInfo class to ntdll.
---
dlls/kernel32/file.c | 13 ++++++++++++- dlls/kernel32/tests/file.c | 16 ++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/dlls/kernel32/file.c b/dlls/kernel32/file.c index 9cdcd8d..bcb21c9 100644 --- a/dlls/kernel32/file.c +++ b/dlls/kernel32/file.c @@ -1046,6 +1046,9 @@ BOOL WINAPI SetEndOfFile( HANDLE hFile ) */ BOOL WINAPI SetFileInformationByHandle( HANDLE file, FILE_INFO_BY_HANDLE_CLASS class, VOID *info, DWORD size ) { + NTSTATUS status; + IO_STATUS_BLOCK io; + TRACE( "%p %u %p %u\n", file, class, info, size );
switch (class) @@ -1053,7 +1056,6 @@ BOOL WINAPI SetFileInformationByHandle( HANDLE file, FILE_INFO_BY_HANDLE_CLASS c case FileBasicInfo: case FileNameInfo: case FileRenameInfo: - case FileDispositionInfo: case FileAllocationInfo: case FileEndOfFileInfo: case FileStreamInfo: @@ -1071,6 +1073,10 @@ BOOL WINAPI SetFileInformationByHandle( HANDLE file, FILE_INFO_BY_HANDLE_CLASS c SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); return FALSE;
+ case FileDispositionInfo: + status = NtSetInformationFile( file, &io, info, size, FileDispositionInformation ); + break; + case FileStandardInfo: case FileCompressionInfo: case FileAttributeTagInfo: @@ -1080,6 +1086,11 @@ BOOL WINAPI SetFileInformationByHandle( HANDLE file, FILE_INFO_BY_HANDLE_CLASS c return FALSE; }
+ if (status != STATUS_SUCCESS) + { + SetLastError( RtlNtStatusToDosError( status ) ); + return FALSE; + } return TRUE; }
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c index fb4cd9b..53d225c 100644 --- a/dlls/kernel32/tests/file.c +++ b/dlls/kernel32/tests/file.c @@ -38,6 +38,10 @@ #include "winnls.h" #include "fileapi.h"
+#ifdef WINE_NO_UNICODE_MACROS +#undef DeleteFile /* needed for FILE_DISPOSITION_INFO */ +#endif + static HANDLE (WINAPI *pFindFirstFileExA)(LPCSTR,FINDEX_INFO_LEVELS,LPVOID,FINDEX_SEARCH_OPS,LPVOID,DWORD); static BOOL (WINAPI *pReplaceFileA)(LPCSTR, LPCSTR, LPCSTR, DWORD, LPVOID, LPVOID); static BOOL (WINAPI *pReplaceFileW)(LPCWSTR, LPCWSTR, LPCWSTR, DWORD, LPVOID, LPVOID); @@ -4589,6 +4593,7 @@ static void test_SetFileInformationByHandle(void) FILE_REMOTE_PROTOCOL_INFO protinfo = { 0 }; FILE_STANDARD_INFO stdinfo = { }; FILE_COMPRESSION_INFO compressinfo; + FILE_DISPOSITION_INFO dispinfo; char tempFileName[MAX_PATH]; char tempPath[MAX_PATH]; HANDLE file; @@ -4632,6 +4637,17 @@ static void test_SetFileInformationByHandle(void) ret = pSetFileInformationByHandle(file, FileRemoteProtocolInfo, &protinfo, sizeof(protinfo)); ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "got %d, error %d\n", ret, GetLastError());
+ /* test FileDispositionInfo, additional details already covered by ntdll tests */ + SetLastError(0xdeadbeef); + ret = pSetFileInformationByHandle(file, FileDispositionInfo, &dispinfo, 0); +todo_wine + ok(!ret && GetLastError() == ERROR_BAD_LENGTH, "got %d, error %d\n", ret, GetLastError()); + + dispinfo.DeleteFile = TRUE; + ret = pSetFileInformationByHandle(file, FileDispositionInfo, &dispinfo, sizeof(dispinfo)); +todo_wine + ok(ret, "setting FileDispositionInfo failed, error %d\n", GetLastError()); + CloseHandle(file); }