Module: wine Branch: master Commit: 6314cf0295ae64705aeeb24ba162c2136c6ea436 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6314cf0295ae64705aeeb24ba1...
Author: Vincas Miliūnas vincas.miliunas@gmail.com Date: Wed Oct 10 19:37:57 2012 +0300
kernel32: Added implementation of FileIdBothDirectoryInfo for GetFileInformationByHandleEx.
---
dlls/kernel32/file.c | 53 +++++++++++++++++++++++++++++++++++++++++++ dlls/kernel32/kernel32.spec | 1 + dlls/kernel32/tests/file.c | 5 ---- dlls/ntdll/directory.c | 1 + 4 files changed, 55 insertions(+), 5 deletions(-)
diff --git a/dlls/kernel32/file.c b/dlls/kernel32/file.c index 717ae9b..cac1e98 100644 --- a/dlls/kernel32/file.c +++ b/dlls/kernel32/file.c @@ -864,6 +864,59 @@ BOOL WINAPI GetFileInformationByHandle( HANDLE hFile, BY_HANDLE_FILE_INFORMATION
/*********************************************************************** +* GetFileInformationByHandleEx (KERNEL32.@) +*/ +BOOL WINAPI GetFileInformationByHandleEx( HANDLE handle, FILE_INFO_BY_HANDLE_CLASS class, + LPVOID info, DWORD size ) +{ + NTSTATUS status; + IO_STATUS_BLOCK io; + + switch (class) + { + case FileBasicInfo: + case FileStandardInfo: + case FileNameInfo: + case FileRenameInfo: + case FileDispositionInfo: + case FileAllocationInfo: + case FileEndOfFileInfo: + case FileStreamInfo: + case FileCompressionInfo: + case FileAttributeTagInfo: + case FileIoPriorityHintInfo: + case FileRemoteProtocolInfo: + case FileFullDirectoryInfo: + case FileFullDirectoryRestartInfo: + case FileStorageInfo: + case FileAlignmentInfo: + case FileIdInfo: + case FileIdExtdDirectoryInfo: + case FileIdExtdDirectoryRestartInfo: + FIXME( "%p, %u, %p, %u\n", handle, class, info, size ); + SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); + return FALSE; + + case FileIdBothDirectoryRestartInfo: + case FileIdBothDirectoryInfo: + status = NtQueryDirectoryFile( handle, NULL, NULL, NULL, &io, info, size, + FileIdBothDirectoryInformation, FALSE, NULL, + (class == FileIdBothDirectoryRestartInfo) ); + if (status != STATUS_SUCCESS) + { + SetLastError( RtlNtStatusToDosError( status ) ); + return FALSE; + } + return TRUE; + + default: + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; + } +} + + +/*********************************************************************** * GetFileSize (KERNEL32.@) * * Retrieve the size of a file. diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index f9f8685..57f7aff 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -533,6 +533,7 @@ @ stdcall GetFileAttributesExW(wstr long ptr) @ stdcall GetFileAttributesW(wstr) @ stdcall GetFileInformationByHandle(long ptr) +@ stdcall GetFileInformationByHandleEx(long long ptr long) @ stdcall GetFileSize(long ptr) @ stdcall GetFileSizeEx(long ptr) @ stdcall GetFileTime(long ptr ptr ptr) diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c index 71ad774..41fca60 100644 --- a/dlls/kernel32/tests/file.c +++ b/dlls/kernel32/tests/file.c @@ -3303,7 +3303,6 @@ static void test_GetFileInformationByHandleEx(void) { SetLastError(0xdeadbeef); ret = pGetFileInformationByHandleEx(directory, checks[i].handleClass, checks[i].ptr, checks[i].size); - todo_wine ok(!ret && GetLastError() == checks[i].errorCode, "GetFileInformationByHandleEx: expected error %u, " "got %u.\n", checks[i].errorCode, GetLastError()); } @@ -3314,18 +3313,14 @@ static void test_GetFileInformationByHandleEx(void) ret = pGetFileInformationByHandleEx(directory, FileIdBothDirectoryInfo, buffer, sizeof(buffer)); if (!ret && GetLastError() == ERROR_NO_MORE_FILES) break; - todo_wine ok(ret, "GetFileInformationByHandleEx: failed to query for FileIdBothDirectoryInfo, got error %u.\n", GetLastError()); if (!ret) break; bothDirInfo = (FILE_ID_BOTH_DIR_INFO *)buffer; while (TRUE) { - todo_wine ok(bothDirInfo->FileAttributes != 0xffffffff, "GetFileInformationByHandleEx: returned invalid file attributes.\n"); - todo_wine ok(bothDirInfo->FileId.u.LowPart != 0xffffffff, "GetFileInformationByHandleEx: returned invalid file id.\n"); - todo_wine ok(bothDirInfo->FileNameLength != 0xffffffff, "GetFileInformationByHandleEx: returned invalid file name length.\n"); if (!bothDirInfo->NextEntryOffset) break; diff --git a/dlls/ntdll/directory.c b/dlls/ntdll/directory.c index 28b0ab3..cd2ee90 100644 --- a/dlls/ntdll/directory.c +++ b/dlls/ntdll/directory.c @@ -2042,6 +2042,7 @@ NTSTATUS WINAPI NtQueryDirectoryFile( HANDLE handle, HANDLE event, case FileIdBothDirectoryInformation: case FileIdFullDirectoryInformation: if (length < dir_info_size( info_class, 1 )) return io->u.Status = STATUS_INFO_LENGTH_MISMATCH; + if (!buffer) return io->u.Status = STATUS_ACCESS_VIOLATION; break; default: FIXME( "Unsupported file info class %d\n", info_class );