1 
2 #include "k32_vista.h"
3 
4 #include <ndk/rtlfuncs.h>
5 #include <ndk/iofuncs.h>
6 
7 #define NDEBUG
8 #include <debug.h>
9 
10 #undef FIXME
11 #define FIXME DPRINT1
12 
13 /* Taken from Wine kernel32/file.c */
14 
15 /***********************************************************************
16  *	GetFileInformationByHandleEx   (kernelbase.@)
17  */
18 BOOL WINAPI DECLSPEC_HOTPATCH GetFileInformationByHandleEx(HANDLE handle, FILE_INFO_BY_HANDLE_CLASS class,
19     LPVOID info, DWORD size)
20 {
21     NTSTATUS status;
22     IO_STATUS_BLOCK io;
23 
24     switch (class)
25     {
26     case FileRemoteProtocolInfo:
27     case FileStorageInfo:
28     case FileDispositionInfoEx:
29     case FileRenameInfoEx:
30     case FileCaseSensitiveInfo:
31     case FileNormalizedNameInfo:
32         FIXME("%p, %u, %p, %lu\n", handle, class, info, size);
33         SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
34         return FALSE;
35 
36     case FileStreamInfo:
37         status = NtQueryInformationFile(handle, &io, info, size, FileStreamInformation);
38         break;
39 
40     case FileCompressionInfo:
41         status = NtQueryInformationFile(handle, &io, info, size, FileCompressionInformation);
42         break;
43 
44     case FileAlignmentInfo:
45         status = NtQueryInformationFile(handle, &io, info, size, FileAlignmentInformation);
46         break;
47 
48     case FileAttributeTagInfo:
49         status = NtQueryInformationFile(handle, &io, info, size, FileAttributeTagInformation);
50         break;
51 
52     case FileBasicInfo:
53         status = NtQueryInformationFile(handle, &io, info, size, FileBasicInformation);
54         break;
55 
56     case FileStandardInfo:
57         status = NtQueryInformationFile(handle, &io, info, size, FileStandardInformation);
58         break;
59 
60     case FileNameInfo:
61         status = NtQueryInformationFile(handle, &io, info, size, FileNameInformation);
62         break;
63 
64     case FileIdInfo:
65         status = NtQueryInformationFile(handle, &io, info, size, FileIdInformation);
66         break;
67 
68     case FileIdBothDirectoryRestartInfo:
69     case FileIdBothDirectoryInfo:
70         status = NtQueryDirectoryFile(handle, NULL, NULL, NULL, &io, info, size,
71             FileIdBothDirectoryInformation, FALSE, NULL,
72             (class == FileIdBothDirectoryRestartInfo));
73         break;
74 
75     case FileFullDirectoryInfo:
76     case FileFullDirectoryRestartInfo:
77         status = NtQueryDirectoryFile(handle, NULL, NULL, NULL, &io, info, size,
78             FileFullDirectoryInformation, FALSE, NULL,
79             (class == FileFullDirectoryRestartInfo));
80         break;
81 
82     case FileIdExtdDirectoryInfo:
83     case FileIdExtdDirectoryRestartInfo:
84         status = NtQueryDirectoryFile(handle, NULL, NULL, NULL, &io, info, size,
85             FileIdExtdDirectoryInformation, FALSE, NULL,
86             (class == FileIdExtdDirectoryRestartInfo));
87         break;
88 
89     case FileRenameInfo:
90     case FileDispositionInfo:
91     case FileAllocationInfo:
92     case FileIoPriorityHintInfo:
93     case FileEndOfFileInfo:
94     default:
95         SetLastError(ERROR_INVALID_PARAMETER);
96         return FALSE;
97     }
98 
99 #ifdef __REACTOS__
100     if (!NT_SUCCESS(status))
101     {
102         SetLastError(RtlNtStatusToDosError(status));
103         return FALSE;
104     }
105 
106     return TRUE;
107 #else
108     return set_ntstatus(status);
109 #endif
110 }
111