diff --git a/reactos/dll/win32/kernel32_vista/CMakeLists.txt b/reactos/dll/win32/kernel32_vista/CMakeLists.txt index 65cf8145611..57333ff5c15 100644 --- a/reactos/dll/win32/kernel32_vista/CMakeLists.txt +++ b/reactos/dll/win32/kernel32_vista/CMakeLists.txt @@ -7,6 +7,7 @@ spec2def(kernel32_vista.dll kernel32_vista.spec ADD_IMPORTLIB) list(APPEND SOURCE DllMain.c + GetFileInformationByHandleEx.c GetTickCount64.c InitOnceExecuteOnce.c ${CMAKE_CURRENT_BINARY_DIR}/kernel32_vista.def) diff --git a/reactos/dll/win32/kernel32_vista/GetFileInformationByHandleEx.c b/reactos/dll/win32/kernel32_vista/GetFileInformationByHandleEx.c new file mode 100644 index 00000000000..e515d30952e --- /dev/null +++ b/reactos/dll/win32/kernel32_vista/GetFileInformationByHandleEx.c @@ -0,0 +1,70 @@ + +#include "k32_vista.h" + +#include +#include + +/* Taken from Wine kernel32/file.c */ + +/*********************************************************************** +* 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 FileStreamInfo: + case FileCompressionInfo: + case FileAttributeTagInfo: + 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 FileBasicInfo: + status = NtQueryInformationFile( handle, &io, info, size, FileBasicInformation ); + break; + + case FileStandardInfo: + status = NtQueryInformationFile( handle, &io, info, size, FileStandardInformation ); + break; + + case FileNameInfo: + status = NtQueryInformationFile( handle, &io, info, size, FileNameInformation ); + break; + + case FileIdBothDirectoryRestartInfo: + case FileIdBothDirectoryInfo: + status = NtQueryDirectoryFile( handle, NULL, NULL, NULL, &io, info, size, + FileIdBothDirectoryInformation, FALSE, NULL, + (class == FileIdBothDirectoryRestartInfo) ); + break; + + case FileRenameInfo: + case FileDispositionInfo: + case FileAllocationInfo: + case FileIoPriorityHintInfo: + case FileEndOfFileInfo: + default: + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; + } + + if (status != STATUS_SUCCESS) + { + SetLastError( RtlNtStatusToDosError( status ) ); + return FALSE; + } + return TRUE; +} diff --git a/reactos/dll/win32/kernel32_vista/kernel32_vista.spec b/reactos/dll/win32/kernel32_vista/kernel32_vista.spec index 4594116eb22..c046b0e5a2c 100644 --- a/reactos/dll/win32/kernel32_vista/kernel32_vista.spec +++ b/reactos/dll/win32/kernel32_vista/kernel32_vista.spec @@ -1,3 +1,4 @@ -@ stdcall -ret64 GetTickCount64() @ stdcall InitOnceExecuteOnce(ptr ptr ptr ptr) +@ stdcall GetFileInformationByHandleEx(long long ptr long) +@ stdcall -ret64 GetTickCount64()