14e72da08STimo Kreuzer
24e72da08STimo Kreuzer #include "k32_vista.h"
34e72da08STimo Kreuzer
44e72da08STimo Kreuzer #include <ndk/rtlfuncs.h>
54e72da08STimo Kreuzer #include <ndk/iofuncs.h>
64e72da08STimo Kreuzer
7*455f3307STimo Kreuzer #define NDEBUG
8*455f3307STimo Kreuzer #include <debug.h>
9*455f3307STimo Kreuzer
10*455f3307STimo Kreuzer #undef FIXME
11*455f3307STimo Kreuzer #define FIXME DPRINT1
12*455f3307STimo Kreuzer
134e72da08STimo Kreuzer /* Taken from Wine kernel32/file.c */
144e72da08STimo Kreuzer
154e72da08STimo Kreuzer /***********************************************************************
16*455f3307STimo Kreuzer * GetFileInformationByHandleEx (kernelbase.@)
174e72da08STimo Kreuzer */
GetFileInformationByHandleEx(HANDLE handle,FILE_INFO_BY_HANDLE_CLASS class,LPVOID info,DWORD size)18*455f3307STimo Kreuzer BOOL WINAPI DECLSPEC_HOTPATCH GetFileInformationByHandleEx(HANDLE handle, FILE_INFO_BY_HANDLE_CLASS class,
194e72da08STimo Kreuzer LPVOID info, DWORD size)
204e72da08STimo Kreuzer {
214e72da08STimo Kreuzer NTSTATUS status;
224e72da08STimo Kreuzer IO_STATUS_BLOCK io;
234e72da08STimo Kreuzer
244e72da08STimo Kreuzer switch (class)
254e72da08STimo Kreuzer {
264e72da08STimo Kreuzer case FileRemoteProtocolInfo:
274e72da08STimo Kreuzer case FileStorageInfo:
28*455f3307STimo Kreuzer case FileDispositionInfoEx:
29*455f3307STimo Kreuzer case FileRenameInfoEx:
30*455f3307STimo Kreuzer case FileCaseSensitiveInfo:
31*455f3307STimo Kreuzer case FileNormalizedNameInfo:
32*455f3307STimo Kreuzer FIXME("%p, %u, %p, %lu\n", handle, class, info, size);
334e72da08STimo Kreuzer SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
344e72da08STimo Kreuzer return FALSE;
354e72da08STimo Kreuzer
36*455f3307STimo Kreuzer case FileStreamInfo:
37*455f3307STimo Kreuzer status = NtQueryInformationFile(handle, &io, info, size, FileStreamInformation);
38*455f3307STimo Kreuzer break;
39*455f3307STimo Kreuzer
40*455f3307STimo Kreuzer case FileCompressionInfo:
41*455f3307STimo Kreuzer status = NtQueryInformationFile(handle, &io, info, size, FileCompressionInformation);
42*455f3307STimo Kreuzer break;
43*455f3307STimo Kreuzer
44*455f3307STimo Kreuzer case FileAlignmentInfo:
45*455f3307STimo Kreuzer status = NtQueryInformationFile(handle, &io, info, size, FileAlignmentInformation);
46*455f3307STimo Kreuzer break;
47*455f3307STimo Kreuzer
48*455f3307STimo Kreuzer case FileAttributeTagInfo:
49*455f3307STimo Kreuzer status = NtQueryInformationFile(handle, &io, info, size, FileAttributeTagInformation);
50*455f3307STimo Kreuzer break;
51*455f3307STimo Kreuzer
524e72da08STimo Kreuzer case FileBasicInfo:
534e72da08STimo Kreuzer status = NtQueryInformationFile(handle, &io, info, size, FileBasicInformation);
544e72da08STimo Kreuzer break;
554e72da08STimo Kreuzer
564e72da08STimo Kreuzer case FileStandardInfo:
574e72da08STimo Kreuzer status = NtQueryInformationFile(handle, &io, info, size, FileStandardInformation);
584e72da08STimo Kreuzer break;
594e72da08STimo Kreuzer
604e72da08STimo Kreuzer case FileNameInfo:
614e72da08STimo Kreuzer status = NtQueryInformationFile(handle, &io, info, size, FileNameInformation);
624e72da08STimo Kreuzer break;
634e72da08STimo Kreuzer
64*455f3307STimo Kreuzer case FileIdInfo:
65*455f3307STimo Kreuzer status = NtQueryInformationFile(handle, &io, info, size, FileIdInformation);
66*455f3307STimo Kreuzer break;
67*455f3307STimo Kreuzer
684e72da08STimo Kreuzer case FileIdBothDirectoryRestartInfo:
694e72da08STimo Kreuzer case FileIdBothDirectoryInfo:
704e72da08STimo Kreuzer status = NtQueryDirectoryFile(handle, NULL, NULL, NULL, &io, info, size,
714e72da08STimo Kreuzer FileIdBothDirectoryInformation, FALSE, NULL,
724e72da08STimo Kreuzer (class == FileIdBothDirectoryRestartInfo));
734e72da08STimo Kreuzer break;
744e72da08STimo Kreuzer
75*455f3307STimo Kreuzer case FileFullDirectoryInfo:
76*455f3307STimo Kreuzer case FileFullDirectoryRestartInfo:
77*455f3307STimo Kreuzer status = NtQueryDirectoryFile(handle, NULL, NULL, NULL, &io, info, size,
78*455f3307STimo Kreuzer FileFullDirectoryInformation, FALSE, NULL,
79*455f3307STimo Kreuzer (class == FileFullDirectoryRestartInfo));
80*455f3307STimo Kreuzer break;
81*455f3307STimo Kreuzer
82*455f3307STimo Kreuzer case FileIdExtdDirectoryInfo:
83*455f3307STimo Kreuzer case FileIdExtdDirectoryRestartInfo:
84*455f3307STimo Kreuzer status = NtQueryDirectoryFile(handle, NULL, NULL, NULL, &io, info, size,
85*455f3307STimo Kreuzer FileIdExtdDirectoryInformation, FALSE, NULL,
86*455f3307STimo Kreuzer (class == FileIdExtdDirectoryRestartInfo));
87*455f3307STimo Kreuzer break;
88*455f3307STimo Kreuzer
894e72da08STimo Kreuzer case FileRenameInfo:
904e72da08STimo Kreuzer case FileDispositionInfo:
914e72da08STimo Kreuzer case FileAllocationInfo:
924e72da08STimo Kreuzer case FileIoPriorityHintInfo:
934e72da08STimo Kreuzer case FileEndOfFileInfo:
944e72da08STimo Kreuzer default:
954e72da08STimo Kreuzer SetLastError(ERROR_INVALID_PARAMETER);
964e72da08STimo Kreuzer return FALSE;
974e72da08STimo Kreuzer }
984e72da08STimo Kreuzer
99*455f3307STimo Kreuzer #ifdef __REACTOS__
100*455f3307STimo Kreuzer if (!NT_SUCCESS(status))
1014e72da08STimo Kreuzer {
1024e72da08STimo Kreuzer SetLastError(RtlNtStatusToDosError(status));
1034e72da08STimo Kreuzer return FALSE;
1044e72da08STimo Kreuzer }
105*455f3307STimo Kreuzer
1064e72da08STimo Kreuzer return TRUE;
107*455f3307STimo Kreuzer #else
108*455f3307STimo Kreuzer return set_ntstatus(status);
109*455f3307STimo Kreuzer #endif
1104e72da08STimo Kreuzer }
111