1 // ntest.cpp : Defines the entry point for the console application.
10 #define TEST_ASSERT( exp ) \
12 (printf("%s, %s, %d\n", #exp, __FILE__, __LINE__), Failures++, FALSE) : \
16 SymlinkCreateTests(OUT PHANDLE OddLink
)
20 UNICODE_STRING TargetName
= RTL_CONSTANT_STRING(L
"\\");
21 UNICODE_STRING TargetName2
= RTL_CONSTANT_STRING(L
"\\");
22 UNICODE_STRING TargetName3
= RTL_CONSTANT_STRING(L
"\\");
23 UNICODE_STRING TargetName4
= RTL_CONSTANT_STRING(L
"\\");
24 UNICODE_STRING TargetName5
= RTL_CONSTANT_STRING(L
"\\");
25 UNICODE_STRING OkName
= RTL_CONSTANT_STRING(L
"\\OddLink");
26 UNICODE_STRING OkName2
= RTL_CONSTANT_STRING(L
"\\TestLink");
29 // Test1: Empty Attributes
32 OBJECT_ATTRIBUTES Test1
= RTL_INIT_OBJECT_ATTRIBUTES(NULL
, 0);
33 Status
= NtCreateSymbolicLinkObject(&LinkHandle
,
34 SYMBOLIC_LINK_ALL_ACCESS
,
37 TEST_ASSERT(NT_SUCCESS(Status
));
41 // Test2: No Attributes
44 POBJECT_ATTRIBUTES Test2
= NULL
;
45 Status
= NtCreateSymbolicLinkObject(&LinkHandle
,
46 SYMBOLIC_LINK_ALL_ACCESS
,
49 TEST_ASSERT(NT_SUCCESS(Status
));
53 // Test3: Attributes with an empty name
56 UNICODE_STRING TestName1
= {0, 0, NULL
};
57 OBJECT_ATTRIBUTES Test3
= RTL_INIT_OBJECT_ATTRIBUTES(&TestName1
, 0);
58 Status
= NtCreateSymbolicLinkObject(&LinkHandle
,
59 SYMBOLIC_LINK_ALL_ACCESS
,
62 TEST_ASSERT(NT_SUCCESS(Status
));
66 // Test4: Attributes with an invalid name
69 UNICODE_STRING TestName2
= {10, 12, UlongToPtr(0x81000000)};
70 OBJECT_ATTRIBUTES Test4
= RTL_INIT_OBJECT_ATTRIBUTES(&TestName2
, 0);
71 Status
= NtCreateSymbolicLinkObject(&LinkHandle
,
72 SYMBOLIC_LINK_ALL_ACCESS
,
75 TEST_ASSERT(Status
== STATUS_ACCESS_VIOLATION
);
79 // Test5: Target with an odd name len
82 UNICODE_STRING OddName
= RTL_CONSTANT_STRING(L
"\\TestLink");
83 OBJECT_ATTRIBUTES Test5
= RTL_INIT_OBJECT_ATTRIBUTES(&OkName
, 0);
85 Status
= NtCreateSymbolicLinkObject(&LinkHandle
,
86 SYMBOLIC_LINK_ALL_ACCESS
,
89 TEST_ASSERT(Status
== STATUS_INVALID_PARAMETER
);
93 // Test6: Target with an emtpy name len
96 OBJECT_ATTRIBUTES Test5
= RTL_INIT_OBJECT_ATTRIBUTES(&OkName
, 0);
97 TargetName4
.MaximumLength
= 0;
98 Status
= NtCreateSymbolicLinkObject(&LinkHandle
,
99 SYMBOLIC_LINK_ALL_ACCESS
,
102 TEST_ASSERT(Status
== STATUS_INVALID_PARAMETER
);
106 // Test7: Target with an name len larger then maxlen
109 OBJECT_ATTRIBUTES Test6
= RTL_INIT_OBJECT_ATTRIBUTES(&OkName
, 0);
110 TargetName5
.Length
= TargetName5
.MaximumLength
+ 2;
111 Status
= NtCreateSymbolicLinkObject(&LinkHandle
,
112 SYMBOLIC_LINK_ALL_ACCESS
,
115 TEST_ASSERT(Status
== STATUS_INVALID_PARAMETER
);
119 // Test5: Target with an odd name maxlen
122 OBJECT_ATTRIBUTES Test5
= RTL_INIT_OBJECT_ATTRIBUTES(&OkName
, 0);
123 TargetName2
.MaximumLength
--;
124 TEST_ASSERT(TargetName2
.MaximumLength
% sizeof(WCHAR
));
125 Status
= NtCreateSymbolicLinkObject(&LinkHandle
,
126 SYMBOLIC_LINK_ALL_ACCESS
,
129 *OddLink
= LinkHandle
;
130 TEST_ASSERT(NT_SUCCESS(Status
));
131 TEST_ASSERT(TargetName2
.MaximumLength
% sizeof(WCHAR
));
138 OBJECT_ATTRIBUTES Test6
= RTL_INIT_OBJECT_ATTRIBUTES(&OkName
, 0);
139 TargetName2
.MaximumLength
++;
140 Status
= NtCreateSymbolicLinkObject(&LinkHandle
,
141 SYMBOLIC_LINK_ALL_ACCESS
,
144 TEST_ASSERT(Status
== STATUS_OBJECT_NAME_COLLISION
);
151 OBJECT_ATTRIBUTES Test7
= RTL_INIT_OBJECT_ATTRIBUTES(&OkName2
, 0);
152 Status
= NtCreateSymbolicLinkObject(&LinkHandle
,
153 SYMBOLIC_LINK_ALL_ACCESS
,
156 TEST_ASSERT(NT_SUCCESS(Status
));
160 // Return the last valid handle
166 int _tmain(int argc
, _TCHAR
* argv
[])
169 HANDLE LinkHandle
, OddHandle
;
170 WCHAR TargetBuffer
[MAX_PATH
] = {0};
171 WCHAR TargetBuffer2
[MAX_PATH
] = {0};
172 UNICODE_STRING TargetName
;
173 UNICODE_STRING TargetName2
;
174 UNICODE_STRING OkName
= RTL_CONSTANT_STRING(L
"\\TestLink");
178 // Start with the create tests
180 LinkHandle
= SymlinkCreateTests(&OddHandle
);
183 // Setup the two empty strings. One will have a magic-char at the end
185 RtlInitEmptyUnicodeString(&TargetName
, TargetBuffer
, sizeof(TargetBuffer
));
186 RtlInitEmptyUnicodeString(&TargetName2
, TargetBuffer2
, sizeof(TargetBuffer2
));
189 // Now query the odd link
191 Status
= NtQuerySymbolicLinkObject(OddHandle
,
194 TEST_ASSERT(NT_SUCCESS(Status
));
195 TEST_ASSERT(NameSize
== sizeof(WCHAR
));
196 TEST_ASSERT(TargetName
.Length
== NameSize
);
197 TEST_ASSERT(TargetName
.Buffer
[0] == OBJ_NAME_PATH_SEPARATOR
);
201 // Now query the test link
203 Status
= NtQuerySymbolicLinkObject(LinkHandle
,
206 TEST_ASSERT(NT_SUCCESS(Status
));
207 TEST_ASSERT(NameSize
== 2 * sizeof(WCHAR
));
208 TEST_ASSERT(TargetName
.Length
== NameSize
- sizeof(WCHAR
));
209 TEST_ASSERT(TargetName
.Buffer
[0] == OBJ_NAME_PATH_SEPARATOR
);
212 // Corrupt the characters
214 TargetName
.Buffer
[(NameSize
- 2) / sizeof(WCHAR
)] = 'v';
215 TargetName
.Buffer
[(NameSize
- 3) / sizeof(WCHAR
)] = 'v';
218 // Now query the test link
220 Status
= NtQuerySymbolicLinkObject(LinkHandle
,
223 TEST_ASSERT(NT_SUCCESS(Status
));
224 TEST_ASSERT(TargetName
.Buffer
[0] == OBJ_NAME_PATH_SEPARATOR
);
225 TEST_ASSERT(TargetName
.Buffer
[1] == UNICODE_NULL
);
228 // Corrupt the characters
230 TargetName
.Buffer
[(NameSize
- 2) / sizeof(WCHAR
)] = 'v';
231 TargetName
.Buffer
[(NameSize
- 3) / sizeof(WCHAR
)] = 'v';
234 // Now query the test link
236 Status
= NtQuerySymbolicLinkObject(LinkHandle
,
239 TEST_ASSERT(NT_SUCCESS(Status
));
240 TEST_ASSERT(TargetName
.Buffer
[0] == OBJ_NAME_PATH_SEPARATOR
);
241 TEST_ASSERT(TargetName
.Buffer
[1] == 'v');
247 RTL_OSVERSIONINFOW VersionInfo
;
248 VersionInfo
.dwOSVersionInfoSize
= sizeof(RTL_OSVERSIONINFOW
);
249 RtlGetVersion(&VersionInfo
);
250 printf("Test complete on: %d\n", VersionInfo
.dwBuildNumber
);
251 printf("Number of Failures: %d\n", Failures
);
252 printf("Number of Runs: %d\n", Runs
);