1 /*
2 * PROJECT: ReactOS API Tests
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Test for RtlValidateUnicodeString
5 * COPYRIGHT: Copyright 2020 Hermes Belusca-Maito
6 */
7
8 #include "precomp.h"
9
START_TEST(RtlValidateUnicodeString)10 START_TEST(RtlValidateUnicodeString)
11 {
12 NTSTATUS Status;
13 UNICODE_STRING String;
14 UNICODE_STRING ValidString = RTL_CONSTANT_STRING(L"My Wild String!");
15
16 /* Start with a valid Unicode string */
17 String = ValidString;
18
19 /* Non-zero flags are unsupported! */
20 Status = RtlValidateUnicodeString(0, &String);
21 ok(Status == STATUS_SUCCESS, "Status = 0x%lx\n", Status);
22 Status = RtlValidateUnicodeString(1, &String);
23 ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
24 Status = RtlValidateUnicodeString(0xdeadbeef, &String);
25 ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
26
27 /* Empty string is allowed. Test also the flags. */
28 RtlInitEmptyUnicodeString(&String, NULL, 0);
29 Status = RtlValidateUnicodeString(0, &String);
30 ok(Status == STATUS_SUCCESS, "Status = 0x%lx\n", Status);
31 Status = RtlValidateUnicodeString(1, &String);
32 ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
33 Status = RtlValidateUnicodeString(0xdeadbeef, &String);
34 ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
35
36 // With a non-NULL but empty buffer, and zero lengths.
37 RtlInitEmptyUnicodeString(&String, L"", 0);
38 Status = RtlValidateUnicodeString(0, &String);
39 ok(Status == STATUS_SUCCESS, "Status = 0x%lx\n", Status);
40 Status = RtlValidateUnicodeString(1, &String);
41 ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
42 Status = RtlValidateUnicodeString(0xdeadbeef, &String);
43 ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
44
45 // With a non-NULL but empty buffer, and zero Length, non-zero MaximumLength.
46 RtlInitEmptyUnicodeString(&String, L"", sizeof(WCHAR));
47 String.Length = 0;
48 Status = RtlValidateUnicodeString(0, &String);
49 ok(Status == STATUS_SUCCESS, "Status = 0x%lx\n", Status);
50 Status = RtlValidateUnicodeString(1, &String);
51 ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
52 Status = RtlValidateUnicodeString(0xdeadbeef, &String);
53 ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
54
55 /* NULL pointer is also allowed! Test also the flags. */
56 Status = RtlValidateUnicodeString(0, NULL);
57 ok(Status == STATUS_SUCCESS, "Status = 0x%lx\n", Status);
58 Status = RtlValidateUnicodeString(1, NULL);
59 ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
60 Status = RtlValidateUnicodeString(0xdeadbeef, NULL);
61 ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
62
63
64 /*
65 * Now test invalid strings.
66 */
67
68 // NULL buffer but non-zero lengths.
69 String = ValidString;
70 String.Buffer = NULL;
71 Status = RtlValidateUnicodeString(0, &String);
72 ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
73
74 // NULL buffer, zero Length, non-zero MaximumLength.
75 String = ValidString;
76 String.Buffer = NULL;
77 String.Length = 0;
78 Status = RtlValidateUnicodeString(0, &String);
79 ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
80
81 // NULL buffer, non-zero Length, zero MaximumLength
82 // (tests also the case Length > MaximumLength that must fail).
83 String = ValidString;
84 String.Buffer = NULL;
85 String.MaximumLength = 0;
86 Status = RtlValidateUnicodeString(0, &String);
87 ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
88
89 // Non-NULL buffer, non-zero Length, zero MaximumLength.
90 String = ValidString;
91 String.MaximumLength = 0;
92 Status = RtlValidateUnicodeString(0, &String);
93 ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
94
95 /* Non-NULL buffer, odd lengths */
96
97 String = ValidString;
98 String.Length--; // Length was already >= 2 so it remains > 0.
99 Status = RtlValidateUnicodeString(0, &String);
100 ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
101
102 String.MaximumLength--; // MaximumLength was already >= 2 so it remains > 0.
103 Status = RtlValidateUnicodeString(0, &String);
104 ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
105 }
106