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