=?UTF-8?Q?Vincas=20Mili=C5=ABnas=20?=: kernel32: Added implementation of FileIdBothDirectoryInfo for GetFileInformationByHandleEx .
Alexandre Julliard
julliard at winehq.org
Fri Oct 12 11:37:44 CDT 2012
Module: wine
Branch: master
Commit: 6314cf0295ae64705aeeb24ba162c2136c6ea436
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6314cf0295ae64705aeeb24ba162c2136c6ea436
Author: Vincas Miliūnas <vincas.miliunas at 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 );
More information about the wine-cvs
mailing list