1 /*
2  * PROJECT:         ReactOS kernel-mode tests
3  * LICENSE:         LGPLv2+ - See COPYING.LIB in the top level directory
4  * PURPOSE:         Kernel-Mode Test Suite NPFS file information test
5  * PROGRAMMER:      Pierre Schweitzer <pierre@reactos.org>
6  */
7 
8 #include <kmt_test.h>
9 #include "npfs.h"
10 
11 #define MAX_INSTANCES   1
12 #define IN_QUOTA        4096
13 #define OUT_QUOTA       4096
14 #define PIPE_NAME       L"\\KmtestNpfsFileInfoTestPipe"
15 
16 static
17 VOID
18 TestFileInfo(
19     IN HANDLE ServerHandle)
20 {
21     NTSTATUS Status;
22     IO_STATUS_BLOCK IoStatusBlock;
23 
24     struct {
25         FILE_ALL_INFORMATION;
26         WCHAR PartialName[50];
27     } FileAllInfo;
28 
29     RtlFillMemory(&FileAllInfo, sizeof(FileAllInfo), 0xFF);
30     Status = ZwQueryInformationFile(ServerHandle,
31                                     &IoStatusBlock,
32                                     &FileAllInfo,
33                                     sizeof(FileAllInfo),
34                                     FileAllInformation);
35     ok_eq_hex(Status, STATUS_SUCCESS);
36     ok_eq_hex(IoStatusBlock.Status, STATUS_SUCCESS);
37     ok_eq_longlong(FileAllInfo.BasicInformation.CreationTime.QuadPart, 0);
38     ok_eq_longlong(FileAllInfo.BasicInformation.LastAccessTime.QuadPart, 0);
39     ok_eq_longlong(FileAllInfo.BasicInformation.LastWriteTime.QuadPart, 0);
40     ok_eq_longlong(FileAllInfo.BasicInformation.ChangeTime.QuadPart, 0);
41     ok_eq_ulong(FileAllInfo.BasicInformation.FileAttributes, FILE_ATTRIBUTE_NORMAL);
42     ok_eq_longlong(FileAllInfo.StandardInformation.AllocationSize.QuadPart, 8192);
43     ok_eq_longlong(FileAllInfo.StandardInformation.EndOfFile.QuadPart, 0);
44     ok_eq_ulong(FileAllInfo.StandardInformation.NumberOfLinks, 1);
45     ok_bool_true(FileAllInfo.StandardInformation.DeletePending, "DeletePending");
46     ok_bool_false(FileAllInfo.StandardInformation.Directory, "Directory");
47     ok(FileAllInfo.InternalInformation.IndexNumber.QuadPart != 0xFFFFFFFFFFFFFFFF, "FileAllInfo.InternalInformation.IndexNumber = 0xFFFFFFFFFFFFFFFF, whereas it shouldn't\n");
48     ok(FileAllInfo.InternalInformation.IndexNumber.QuadPart != 0, "FileAllInfo.InternalInformation.IndexNumber = 0, whereas it shouldn't\n");
49     ok_eq_ulong(FileAllInfo.EaInformation.EaSize, 0);
50     ok_eq_ulong(FileAllInfo.AccessInformation.AccessFlags, (FILE_GENERIC_READ | FILE_GENERIC_WRITE));
51     ok_eq_longlong(FileAllInfo.PositionInformation.CurrentByteOffset.QuadPart, 0);
52     ok_eq_ulong(FileAllInfo.ModeInformation.Mode, FILE_SYNCHRONOUS_IO_NONALERT);
53     ok_eq_ulong(FileAllInfo.AlignmentInformation.AlignmentRequirement, 0);
54     ok_eq_ulong(FileAllInfo.NameInformation.FileNameLength, sizeof(PIPE_NAME) - sizeof(WCHAR));
55     ok_eq_size(RtlCompareMemory(FileAllInfo.NameInformation.FileName, PIPE_NAME, sizeof(PIPE_NAME) - sizeof(WCHAR)), (sizeof(PIPE_NAME) - sizeof(WCHAR)));
56     ok_eq_wchar(FileAllInfo.NameInformation.FileName[sizeof(PIPE_NAME) / sizeof(WCHAR) - 1], 0xFFFF);
57     ok_eq_ulong(IoStatusBlock.Information, (FIELD_OFFSET(FILE_ALL_INFORMATION, NameInformation.FileName) + sizeof(PIPE_NAME) - sizeof(WCHAR)));
58 
59     RtlFillMemory(&FileAllInfo, sizeof(FileAllInfo), 0xFF);
60     Status = ZwQueryInformationFile(ServerHandle,
61                                     &IoStatusBlock,
62                                     &FileAllInfo,
63                                     sizeof(FILE_ALL_INFORMATION) + 4 * sizeof(WCHAR),
64                                     FileAllInformation);
65     ok_eq_hex(Status, STATUS_BUFFER_OVERFLOW);
66     ok_eq_hex(IoStatusBlock.Status, STATUS_BUFFER_OVERFLOW);
67     ok_eq_longlong(FileAllInfo.BasicInformation.CreationTime.QuadPart, 0);
68     ok_eq_longlong(FileAllInfo.BasicInformation.LastAccessTime.QuadPart, 0);
69     ok_eq_longlong(FileAllInfo.BasicInformation.LastWriteTime.QuadPart, 0);
70     ok_eq_longlong(FileAllInfo.BasicInformation.ChangeTime.QuadPart, 0);
71     ok_eq_ulong(FileAllInfo.BasicInformation.FileAttributes, FILE_ATTRIBUTE_NORMAL);
72     ok_eq_longlong(FileAllInfo.StandardInformation.AllocationSize.QuadPart, 8192);
73     ok_eq_longlong(FileAllInfo.StandardInformation.EndOfFile.QuadPart, 0);
74     ok_eq_ulong(FileAllInfo.StandardInformation.NumberOfLinks, 1);
75     ok_bool_true(FileAllInfo.StandardInformation.DeletePending, "DeletePending");
76     ok_bool_false(FileAllInfo.StandardInformation.Directory, "Directory");
77     ok(FileAllInfo.InternalInformation.IndexNumber.QuadPart != 0xFFFFFFFFFFFFFFFF, "FileAllInfo.InternalInformation.IndexNumber = 0xFFFFFFFFFFFFFFFF, whereas it shouldn't\n");
78     ok(FileAllInfo.InternalInformation.IndexNumber.QuadPart != 0, "FileAllInfo.InternalInformation.IndexNumber = 0, whereas it shouldn't\n");
79     ok_eq_ulong(FileAllInfo.EaInformation.EaSize, 0);
80     ok_eq_ulong(FileAllInfo.AccessInformation.AccessFlags, (FILE_GENERIC_READ | FILE_GENERIC_WRITE));
81     ok_eq_longlong(FileAllInfo.PositionInformation.CurrentByteOffset.QuadPart, 0);
82     ok_eq_ulong(FileAllInfo.ModeInformation.Mode, FILE_SYNCHRONOUS_IO_NONALERT);
83     ok_eq_ulong(FileAllInfo.AlignmentInformation.AlignmentRequirement, 0);
84     ok_eq_ulong(FileAllInfo.NameInformation.FileNameLength, sizeof(PIPE_NAME) - sizeof(WCHAR));
85     ok_eq_size(RtlCompareMemory(FileAllInfo.NameInformation.FileName, PIPE_NAME, 6 * sizeof(WCHAR)), (6 * sizeof(WCHAR)));
86     ok_eq_wchar(FileAllInfo.NameInformation.FileName[6], 0xFFFF);
87     ok_eq_ulong(IoStatusBlock.Information, (FIELD_OFFSET(FILE_ALL_INFORMATION, NameInformation.FileName) + 6 * sizeof(WCHAR)));
88 
89     RtlFillMemory(&FileAllInfo, sizeof(FileAllInfo), 0xFF);
90     Status = ZwQueryInformationFile(ServerHandle,
91                                     &IoStatusBlock,
92                                     &FileAllInfo,
93                                     sizeof(FILE_ALL_INFORMATION) - 4,
94                                     FileAllInformation);
95     ok_eq_hex(Status, STATUS_BUFFER_OVERFLOW);
96     ok_eq_hex(IoStatusBlock.Status, STATUS_BUFFER_OVERFLOW);
97     ok_eq_longlong(FileAllInfo.BasicInformation.CreationTime.QuadPart, 0);
98     ok_eq_longlong(FileAllInfo.BasicInformation.LastAccessTime.QuadPart, 0);
99     ok_eq_longlong(FileAllInfo.BasicInformation.LastWriteTime.QuadPart, 0);
100     ok_eq_longlong(FileAllInfo.BasicInformation.ChangeTime.QuadPart, 0);
101     ok_eq_ulong(FileAllInfo.BasicInformation.FileAttributes, FILE_ATTRIBUTE_NORMAL);
102     ok_eq_longlong(FileAllInfo.StandardInformation.AllocationSize.QuadPart, 8192);
103     ok_eq_longlong(FileAllInfo.StandardInformation.EndOfFile.QuadPart, 0);
104     ok_eq_ulong(FileAllInfo.StandardInformation.NumberOfLinks, 1);
105     ok_bool_true(FileAllInfo.StandardInformation.DeletePending, "DeletePending");
106     ok_bool_false(FileAllInfo.StandardInformation.Directory, "Directory");
107     ok(FileAllInfo.InternalInformation.IndexNumber.QuadPart != 0xFFFFFFFFFFFFFFFF, "FileAllInfo.InternalInformation.IndexNumber = 0xFFFFFFFFFFFFFFFF, whereas it shouldn't\n");
108     ok(FileAllInfo.InternalInformation.IndexNumber.QuadPart != 0, "FileAllInfo.InternalInformation.IndexNumber = 0, whereas it shouldn't\n");
109     ok_eq_ulong(FileAllInfo.EaInformation.EaSize, 0);
110     ok_eq_ulong(FileAllInfo.AccessInformation.AccessFlags, (FILE_GENERIC_READ | FILE_GENERIC_WRITE));
111     ok_eq_longlong(FileAllInfo.PositionInformation.CurrentByteOffset.QuadPart, 0);
112     ok_eq_ulong(FileAllInfo.ModeInformation.Mode, FILE_SYNCHRONOUS_IO_NONALERT);
113     ok_eq_ulong(FileAllInfo.AlignmentInformation.AlignmentRequirement, 0);
114     ok_eq_ulong(FileAllInfo.NameInformation.FileNameLength, sizeof(PIPE_NAME) - sizeof(WCHAR));
115     ok_eq_wchar(FileAllInfo.NameInformation.FileName[0], 0xFFFF);
116     ok_eq_ulong(IoStatusBlock.Information, (sizeof(FILE_ALL_INFORMATION) - 4));
117 }
118 
119 static KSTART_ROUTINE RunTest;
120 static
121 VOID
122 NTAPI
123 RunTest(
124     IN PVOID Context)
125 {
126     NTSTATUS Status;
127     HANDLE ServerHandle;
128 
129     UNREFERENCED_PARAMETER(Context);
130 
131     ServerHandle = INVALID_HANDLE_VALUE;
132     Status = NpCreatePipe(&ServerHandle,
133                           DEVICE_NAMED_PIPE PIPE_NAME,
134                           BYTE_STREAM, QUEUE, BYTE_STREAM, DUPLEX,
135                           MAX_INSTANCES,
136                           IN_QUOTA,
137                           OUT_QUOTA);
138     ok_eq_hex(Status, STATUS_SUCCESS);
139     ok(ServerHandle != NULL && ServerHandle != INVALID_HANDLE_VALUE, "ServerHandle = %p\n", ServerHandle);
140     if (!skip(NT_SUCCESS(Status) && ServerHandle != NULL && ServerHandle != INVALID_HANDLE_VALUE, "No pipe\n"))
141     {
142         TestFileInfo(ServerHandle);
143         ObCloseHandle(ServerHandle, KernelMode);
144     }
145 }
146 
147 START_TEST(NpfsFileInfo)
148 {
149     PKTHREAD Thread;
150 
151     Thread = KmtStartThread(RunTest, NULL);
152     KmtFinishThread(Thread, NULL);
153 }
154