2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: LGPLv2+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Kernel-Mode Test Suite FsRtl Test
5 * PROGRAMMER: Ashuha Arseny, Moscow State Technical University
6 * Marina Volosnikova, Moscow State Technical University
7 * Denis Petkevich, Moscow State Technical University
16 Tested with the system kmtest
17 the following functions:
18 FsRtlInitializeTunnelCache
19 FsRtlDeleteTunnelCache
21 FsRtlDeleteKeyFromTunnelCache
22 FsRtlFindInTunnelCache
30 PUNICODE_STRING
CopyUS(PUNICODE_STRING a
)
32 PUNICODE_STRING b
= (PUNICODE_STRING
)ExAllocatePool(PagedPool
,sizeof(UNICODE_STRING
));
33 ok(b
!= NULL
, "US is NULL after allocated memory\n");
35 b
->MaximumLength
=a
->MaximumLength
;
38 b
->Buffer
= (PWSTR
)ExAllocatePoolWithTag(PagedPool
, b
->MaximumLength
, 1633);
39 ok(b
->Buffer
!= NULL
, "US->Buffer is NULL after allocated memory\n");
40 RtlCopyUnicodeString(b
, a
);
49 void TestFsRtlInitializeTunnelCache()
52 T
= ExAllocatePool(PagedPool
, sizeof(TUNNEL
));
53 ok(T
!= NULL
, "PTUNEL is NULL after allocated memory\n");
54 Tb
= ExAllocatePool(PagedPool
, sizeof(TUNNEL
));
55 ok(Tb
!= NULL
, "PTUNEL is NULL after allocated memory\n");
57 memset((void*)T
, 0, sizeof(TUNNEL
));
58 memset((void*)Tb
, 0, sizeof(TUNNEL
));
60 FsRtlInitializeTunnelCache(T
);
62 eq
= RtlCompareMemory((const VOID
*)T
, (const VOID
*)Tb
, sizeof(TUNNEL
));
64 ok ( eq
!= sizeof(TUNNEL
), "FsRtlInitializeTunnelCache function did not change anything in the memory at the address PTUNEL.\n");
67 void TestFsRtlAddToTunnelCache(ULONGLONG DirectoryKey
, PUNICODE_STRING s_name
, PUNICODE_STRING l_name
, BOOLEAN KeyByShortName
)
71 PUNICODE_STRING bs_name
;
72 PUNICODE_STRING bl_name
;
76 Buf
= ExAllocatePool(PagedPool
, BufSize
);
77 ok(Buf
!= NULL
, "Buff in TestFsRtlAddToTunnelCache is NULL after allocated memory\n");
78 Bufb
= ExAllocatePool(PagedPool
, BufSize
);
79 ok(Bufb
!= NULL
, "Buff in TestFsRtlAddToTunnelCache is NULL after allocated memory\n");
81 // Allocate memory for the bufs_name
82 bs_name
= CopyUS(s_name
);
84 // Allocate memory for the l_name and bl_name
85 bl_name
= CopyUS(l_name
);
87 memset((void*)Buf
, 0, BufSize
);
88 memset((void*)Bufb
, 0, BufSize
);
90 FsRtlAddToTunnelCache(T
, DirectoryKey
, s_name
, l_name
, KeyByShortName
, BufSize
, Buf
);
92 eq
= RtlCompareMemory((const VOID
*)Buf
, (const VOID
*)Bufb
, BufSize
);
94 ok( eq
!= sizeof(TUNNEL
),"FsRtlAddToTunnelCache function did not change anything in the memory at the address Buf.\n");
96 b
= RtlCompareUnicodeString(l_name
, bl_name
, TRUE
);
97 ok (b
== 0, "long name after call FsRtlAddToTunnelCache != long name befo call FsRtlAddToTunnelCache\n\n");
98 b
= RtlCompareUnicodeString(s_name
, bs_name
, TRUE
);
99 ok (b
== 0, "short name after call FsRtlAddToTunnelCache != short name befo call FsRtlAddToTunnelCache\n\n");
101 if (bs_name
->Buffer
) ExFreePool(bs_name
->Buffer
);
103 if (bl_name
->Buffer
) ExFreePool(bl_name
->Buffer
);
109 BOOLEAN
TestFsRtlFindInTunnelCache(ULONG DirectoryKey
, PUNICODE_STRING name
, PUNICODE_STRING s_name
, PUNICODE_STRING l_name
)
111 // Allocate memory for the Buf
112 ULONG BufsizeTemp
= BufSize
;
113 PVOID Buf
= ExAllocatePool(PagedPool
, BufSize
*2);
114 ok(Buf
!= NULL
, "Buff in FsRtlFindInTunnelCache is NULL after allocated memory\n");
116 return FsRtlFindInTunnelCache(T
, DirectoryKey
, name
, s_name
, l_name
, &BufsizeTemp
, Buf
);
119 void TestFsRtlDeleteKeyFromTunnelCache(ULONGLONG a
)
121 FsRtlDeleteKeyFromTunnelCache(T
, a
);
125 void DuplicatesTest()
127 UNICODE_STRING ShortName
, LongName
, OutShort
, OutLong
, ShortName2
, LongName2
;
128 ULONG First
, Second
, OutLength
, OutData
;
134 RtlInitUnicodeString(&ShortName
, L
"LONGFI~1.TXT");
135 RtlInitUnicodeString(&LongName
, L
"Longfilename.txt");
136 RtlInitUnicodeString(&ShortName2
, L
"LONGFI~2.TXT");
137 RtlInitUnicodeString(&LongName2
, L
"Longfilenamr.txt");
138 Tunnel
= ExAllocatePool(NonPagedPool
, sizeof(TUNNEL
));
139 RtlZeroMemory(Tunnel
, sizeof(TUNNEL
));
140 OutShort
.MaximumLength
= 13 * sizeof(WCHAR
);
141 OutShort
.Buffer
= ExAllocatePool(PagedPool
, OutShort
.MaximumLength
);
142 OutLong
.MaximumLength
= 17 * sizeof(WCHAR
);
143 OutLong
.Buffer
= Buffer
= ExAllocatePool(PagedPool
, OutLong
.MaximumLength
);
145 FsRtlInitializeTunnelCache(Tunnel
);
146 FsRtlAddToTunnelCache(Tunnel
, 1, &ShortName
, &LongName
, TRUE
, sizeof(ULONG
), &First
);
147 ok_bool_true(FsRtlFindInTunnelCache(Tunnel
, 1, &ShortName
, &OutShort
, &OutLong
, &OutLength
, &OutData
), "First call");
148 ok_eq_ulong(OutLength
, sizeof(ULONG
));
149 ok_eq_ulong(OutData
, 1);
150 ok_eq_pointer(OutLong
.Buffer
, Buffer
);
152 FsRtlAddToTunnelCache(Tunnel
, 1, &ShortName
, &LongName
, TRUE
, sizeof(ULONG
), &Second
);
153 ok_bool_true(FsRtlFindInTunnelCache(Tunnel
, 1, &ShortName
, &OutShort
, &OutLong
, &OutLength
, &OutData
), "Second call");
154 ok_eq_ulong(OutLength
, sizeof(ULONG
));
155 ok_eq_ulong(OutData
, 2);
156 ok_eq_pointer(OutLong
.Buffer
, Buffer
);
158 OutLong
.MaximumLength
= 13 * sizeof(WCHAR
);
159 ok_bool_true(FsRtlFindInTunnelCache(Tunnel
, 1, &ShortName
, &OutShort
, &OutLong
, &OutLength
, &OutData
), "Third call");
160 ok_eq_ulong(OutLength
, sizeof(ULONG
));
161 ok_eq_ulong(OutData
, 2);
162 ok(OutLong
.Buffer
!= Buffer
, "Buffer didn't get reallocated!\n");
163 ok_eq_uint(OutLong
.MaximumLength
, 16 * sizeof(WCHAR
));
165 FsRtlDeleteKeyFromTunnelCache(Tunnel
, 1);
166 ok_bool_false(FsRtlFindInTunnelCache(Tunnel
, 1, &ShortName
, &OutShort
, &OutLong
, &OutLength
, &OutData
), "Fourth call");
168 FsRtlAddToTunnelCache(Tunnel
, 1, &ShortName
, &LongName
, TRUE
, sizeof(ULONG
), &First
);
169 ok_bool_true(FsRtlFindInTunnelCache(Tunnel
, 1, &ShortName
, &OutShort
, &OutLong
, &OutLength
, &OutData
), "Fifth call");
170 ok_eq_ulong(OutLength
, sizeof(ULONG
));
171 ok_eq_ulong(OutData
, 1);
173 FsRtlAddToTunnelCache(Tunnel
, 1, &ShortName2
, &LongName2
, TRUE
, sizeof(ULONG
), &First
);
174 ok_bool_true(FsRtlFindInTunnelCache(Tunnel
, 1, &ShortName
, &OutShort
, &OutLong
, &OutLength
, &OutData
), "Sixth call");
175 ok_eq_ulong(OutLength
, sizeof(ULONG
));
176 ok_eq_ulong(OutData
, 1);
177 ok_bool_true(FsRtlFindInTunnelCache(Tunnel
, 1, &ShortName2
, &OutShort
, &OutLong
, &OutLength
, &OutData
), "Seventh call");
178 ok_eq_ulong(OutLength
, sizeof(ULONG
));
179 ok_eq_ulong(OutData
, 1);
181 FsRtlAddToTunnelCache(Tunnel
, 1, &ShortName
, &LongName
, TRUE
, sizeof(ULONG
), &Second
);
182 ok_bool_true(FsRtlFindInTunnelCache(Tunnel
, 1, &ShortName
, &OutShort
, &OutLong
, &OutLength
, &OutData
), "Eighth call");
183 ok_eq_ulong(OutLength
, sizeof(ULONG
));
184 ok_eq_ulong(OutData
, 2);
185 ok_bool_true(FsRtlFindInTunnelCache(Tunnel
, 1, &ShortName2
, &OutShort
, &OutLong
, &OutLength
, &OutData
), "Ninth call");
186 ok_eq_ulong(OutLength
, sizeof(ULONG
));
187 ok_eq_ulong(OutData
, 1);
189 FsRtlAddToTunnelCache(Tunnel
, 1, &ShortName2
, &LongName2
, TRUE
, sizeof(ULONG
), &Second
);
190 ok_bool_true(FsRtlFindInTunnelCache(Tunnel
, 1, &ShortName
, &OutShort
, &OutLong
, &OutLength
, &OutData
), "Tenth call");
191 ok_eq_ulong(OutLength
, sizeof(ULONG
));
192 ok_eq_ulong(OutData
, 2);
193 ok_bool_true(FsRtlFindInTunnelCache(Tunnel
, 1, &ShortName2
, &OutShort
, &OutLong
, &OutLength
, &OutData
), "Eleventh call");
194 ok_eq_ulong(OutLength
, sizeof(ULONG
));
195 ok_eq_ulong(OutData
, 2);
197 FsRtlDeleteKeyFromTunnelCache(Tunnel
, 1);
198 ok_bool_false(FsRtlFindInTunnelCache(Tunnel
, 1, &ShortName
, &OutShort
, &OutLong
, &OutLength
, &OutData
), "Twelfth call");
199 ok_bool_false(FsRtlFindInTunnelCache(Tunnel
, 1, &ShortName2
, &OutShort
, &OutLong
, &OutLength
, &OutData
), "Thirteenth call");
201 FsRtlAddToTunnelCache(Tunnel
, 1, &ShortName
, &LongName
, TRUE
, sizeof(ULONG
), &First
);
202 ok_bool_true(FsRtlFindInTunnelCache(Tunnel
, 1, &ShortName
, &OutShort
, &OutLong
, &OutLength
, &OutData
), "Fourteenth call");
203 ok_eq_ulong(OutLength
, sizeof(ULONG
));
204 ok_eq_ulong(OutData
, 1);
206 FsRtlAddToTunnelCache(Tunnel
, 1, &ShortName
, &LongName
, TRUE
, sizeof(ULONG
), &Second
);
207 ok_bool_true(FsRtlFindInTunnelCache(Tunnel
, 1, &ShortName
, &OutShort
, &OutLong
, &OutLength
, &OutData
), "Fifteenth call");
208 ok_eq_ulong(OutLength
, sizeof(ULONG
));
209 ok_eq_ulong(OutData
, 2);
211 FsRtlAddToTunnelCache(Tunnel
, 1, &ShortName2
, &LongName2
, TRUE
, sizeof(ULONG
), &First
);
212 ok_bool_true(FsRtlFindInTunnelCache(Tunnel
, 1, &ShortName
, &OutShort
, &OutLong
, &OutLength
, &OutData
), "Sixteenth call");
213 ok_eq_ulong(OutLength
, sizeof(ULONG
));
214 ok_eq_ulong(OutData
, 2);
215 ok_bool_true(FsRtlFindInTunnelCache(Tunnel
, 1, &ShortName2
, &OutShort
, &OutLong
, &OutLength
, &OutData
), "Seventeenth call");
216 ok_eq_ulong(OutLength
, sizeof(ULONG
));
217 ok_eq_ulong(OutData
, 1);
219 FsRtlAddToTunnelCache(Tunnel
, 1, &ShortName2
, &LongName2
, TRUE
, sizeof(ULONG
), &Second
);
220 ok_bool_true(FsRtlFindInTunnelCache(Tunnel
, 1, &ShortName
, &OutShort
, &OutLong
, &OutLength
, &OutData
), "Eighteenth call");
221 ok_eq_ulong(OutLength
, sizeof(ULONG
));
222 ok_eq_ulong(OutData
, 2);
223 ok_bool_true(FsRtlFindInTunnelCache(Tunnel
, 1, &ShortName2
, &OutShort
, &OutLong
, &OutLength
, &OutData
), "Nineteenth call");
224 ok_eq_ulong(OutLength
, sizeof(ULONG
));
225 ok_eq_ulong(OutData
, 2);
227 FsRtlDeleteTunnelCache(Tunnel
);
228 ExFreePool(OutShort
.Buffer
);
229 ExFreePool(OutLong
.Buffer
);
234 START_TEST(FsRtlTunnel
)
236 UNICODE_STRING s_name
;
237 UNICODE_STRING l_name
;
243 TestFsRtlInitializeTunnelCache();
246 s_name
.MaximumLength
= 64 * sizeof(WCHAR
);
247 s_name
.Buffer
= ExAllocatePoolWithTag(PagedPool
, s_name
.MaximumLength
, 'sFmK');
248 ok(s_name
.Buffer
!= NULL
, "s_name.Buffer in TestFsRtlAddToTunnelCache is NULL after allocated memory\n");
249 RtlAppendUnicodeToString(&s_name
, L
"smal");
252 l_name
.MaximumLength
= 64 * sizeof(WCHAR
);
253 l_name
.Buffer
= ExAllocatePoolWithTag(PagedPool
, l_name
.MaximumLength
, 'lFmK');
254 ok(l_name
.Buffer
!= NULL
, "l_name.Buffer in TestFsRtlAddToTunnelCache is NULL after allocated memory\n");
255 RtlAppendUnicodeToString(&l_name
, L
"bigbigbigbigbig");
258 TestFsRtlAddToTunnelCache(12345, &s_name
, &l_name
, TRUE
);
261 name
.MaximumLength
= 64 * sizeof(WCHAR
);
262 name
.Buffer
= ExAllocatePoolWithTag(PagedPool
, name
.MaximumLength
, 'nFmK');
263 ok(name
.Buffer
!= NULL
, "name.Buffer in FsRtlFindInTunnelCache is NULL after allocated memory\n");
264 RtlAppendUnicodeToString(&name
, L
"smal");
267 is
= TestFsRtlFindInTunnelCache(12345, &name
, &s_name
, &l_name
);
268 ok(is
== TRUE
, "FsRtlFindInTunnelCache dosn't find elem id = 12345\n");
270 TestFsRtlDeleteKeyFromTunnelCache(12345); //Delete
271 is
= TestFsRtlFindInTunnelCache(12345, &name
, &s_name
, &l_name
);
272 ok(is
== FALSE
, "TestFsRtlDeleteKeyFromTunnelCache dosn't delete elem id = 12345\n");
274 is
= TestFsRtlFindInTunnelCache(12347, &name
, &s_name
, &l_name
);
275 ok(is
== FALSE
, "FsRtlDeleteTunnelCache dosn't clear cash\n");
277 TestFsRtlAddToTunnelCache(12345, &s_name
, &l_name
, TRUE
);
278 TestFsRtlAddToTunnelCache(12347, &s_name
, &l_name
, TRUE
);
279 RtlInitUnicodeString(&a
, NULL
);
280 TestFsRtlAddToTunnelCache(12346, &a
, &l_name
, FALSE
);
283 FsRtlDeleteTunnelCache(T
);
285 is
= TestFsRtlFindInTunnelCache(12345, &name
, &s_name
, &l_name
);
286 ok(is
== FALSE
, "FsRtlDeleteTunnelCache dosn't clear cash\n");
288 is
= TestFsRtlFindInTunnelCache(12346, &name
, &a
, &l_name
);
289 ok(is
== FALSE
, "FsRtlDeleteTunnelCache dosn't clear cash\n");
291 is
= TestFsRtlFindInTunnelCache(12347, &name
, &s_name
, &l_name
);
292 ok(is
== FALSE
, "FsRtlDeleteTunnelCache dosn't clear cash\n");
294 ExFreePoolWithTag(name
.Buffer
, 'nFmK');
295 ExFreePoolWithTag(l_name
.Buffer
, 'lFmK');
296 ExFreePoolWithTag(s_name
.Buffer
, 'sFmK');