Skip to content

Commit 4d1dfdb

Browse files
committed
[KMTESTS:NPFS]
Add more tests for file info Tested by Thomas. CORE-7451 svn path=/trunk/; revision=62742
1 parent 304ce1d commit 4d1dfdb

File tree

3 files changed

+156
-0
lines changed

3 files changed

+156
-0
lines changed

rostests/kmtests/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ list(APPEND KMTEST_DRV_SOURCE
3030
example/KernelType.c
3131
npfs/NpfsConnect.c
3232
npfs/NpfsCreate.c
33+
npfs/NpfsFileInfo.c
3334
npfs/NpfsHelpers.c
3435
npfs/NpfsReadWrite.c
3536
npfs/NpfsVolumeInfo.c

rostests/kmtests/kmtest_drv/testlist.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ KMT_TESTFUNC Test_KernelType;
4040
KMT_TESTFUNC Test_MmSection;
4141
KMT_TESTFUNC Test_NpfsConnect;
4242
KMT_TESTFUNC Test_NpfsCreate;
43+
KMT_TESTFUNC Test_NpfsFileInfo;
4344
KMT_TESTFUNC Test_NpfsReadWrite;
4445
KMT_TESTFUNC Test_NpfsVolumeInfo;
4546
KMT_TESTFUNC Test_ObReference;
@@ -95,6 +96,7 @@ const KMT_TEST TestList[] =
9596
{ "MmSection", Test_MmSection },
9697
{ "NpfsConnect", Test_NpfsConnect },
9798
{ "NpfsCreate", Test_NpfsCreate },
99+
{ "NpfsFileInfo", Test_NpfsFileInfo },
98100
{ "NpfsReadWrite", Test_NpfsReadWrite },
99101
{ "NpfsVolumeInfo", Test_NpfsVolumeInfo },
100102
{ "ObReference", Test_ObReference },

rostests/kmtests/npfs/NpfsFileInfo.c

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
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 <[email protected]>
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+
}

0 commit comments

Comments
 (0)