Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygensymtest.c
Go to the documentation of this file.
00001 // ntest.cpp : Defines the entry point for the console application. 00002 // 00003 #include "stdafx.h" 00004 #include "windows.h" 00005 #include "ntndk.h" 00006 00007 ULONG Runs; 00008 ULONG Failures; 00009 00010 #define TEST_ASSERT( exp ) \ 00011 ((!(exp)) ? \ 00012 (printf("%s, %s, %d\n", #exp, __FILE__, __LINE__), Failures++, FALSE) : \ 00013 TRUE), Runs++ 00014 00015 HANDLE 00016 SymlinkCreateTests(OUT PHANDLE OddLink) 00017 { 00018 NTSTATUS Status; 00019 HANDLE LinkHandle; 00020 UNICODE_STRING TargetName = RTL_CONSTANT_STRING(L"\\"); 00021 UNICODE_STRING TargetName2 = RTL_CONSTANT_STRING(L"\\"); 00022 UNICODE_STRING TargetName3 = RTL_CONSTANT_STRING(L"\\"); 00023 UNICODE_STRING TargetName4 = RTL_CONSTANT_STRING(L"\\"); 00024 UNICODE_STRING TargetName5 = RTL_CONSTANT_STRING(L"\\"); 00025 UNICODE_STRING OkName = RTL_CONSTANT_STRING(L"\\OddLink"); 00026 UNICODE_STRING OkName2 = RTL_CONSTANT_STRING(L"\\TestLink"); 00027 00028 // 00029 // Test1: Empty Attributes 00030 // 00031 { 00032 OBJECT_ATTRIBUTES Test1 = RTL_INIT_OBJECT_ATTRIBUTES(NULL, 0); 00033 Status = NtCreateSymbolicLinkObject(&LinkHandle, 00034 SYMBOLIC_LINK_ALL_ACCESS, 00035 &Test1, 00036 &TargetName); 00037 TEST_ASSERT(NT_SUCCESS(Status)); 00038 } 00039 00040 // 00041 // Test2: No Attributes 00042 // 00043 { 00044 POBJECT_ATTRIBUTES Test2 = NULL; 00045 Status = NtCreateSymbolicLinkObject(&LinkHandle, 00046 SYMBOLIC_LINK_ALL_ACCESS, 00047 Test2, 00048 &TargetName); 00049 TEST_ASSERT(NT_SUCCESS(Status)); 00050 } 00051 00052 // 00053 // Test3: Attributes with an empty name 00054 // 00055 { 00056 UNICODE_STRING TestName1 = {0, 0, NULL}; 00057 OBJECT_ATTRIBUTES Test3 = RTL_INIT_OBJECT_ATTRIBUTES(&TestName1, 0); 00058 Status = NtCreateSymbolicLinkObject(&LinkHandle, 00059 SYMBOLIC_LINK_ALL_ACCESS, 00060 &Test3, 00061 &TargetName); 00062 TEST_ASSERT(NT_SUCCESS(Status)); 00063 } 00064 00065 // 00066 // Test4: Attributes with an invalid name 00067 // 00068 { 00069 UNICODE_STRING TestName2 = {10, 12, UlongToPtr(0x81000000)}; 00070 OBJECT_ATTRIBUTES Test4 = RTL_INIT_OBJECT_ATTRIBUTES(&TestName2, 0); 00071 Status = NtCreateSymbolicLinkObject(&LinkHandle, 00072 SYMBOLIC_LINK_ALL_ACCESS, 00073 &Test4, 00074 &TargetName); 00075 TEST_ASSERT(Status == STATUS_ACCESS_VIOLATION); 00076 } 00077 00078 // 00079 // Test5: Target with an odd name len 00080 // 00081 { 00082 UNICODE_STRING OddName = RTL_CONSTANT_STRING(L"\\TestLink"); 00083 OBJECT_ATTRIBUTES Test5 = RTL_INIT_OBJECT_ATTRIBUTES(&OkName, 0); 00084 TargetName3.Length--; 00085 Status = NtCreateSymbolicLinkObject(&LinkHandle, 00086 SYMBOLIC_LINK_ALL_ACCESS, 00087 &Test5, 00088 &TargetName3); 00089 TEST_ASSERT(Status == STATUS_INVALID_PARAMETER); 00090 } 00091 00092 // 00093 // Test6: Target with an emtpy name len 00094 // 00095 { 00096 OBJECT_ATTRIBUTES Test5 = RTL_INIT_OBJECT_ATTRIBUTES(&OkName, 0); 00097 TargetName4.MaximumLength = 0; 00098 Status = NtCreateSymbolicLinkObject(&LinkHandle, 00099 SYMBOLIC_LINK_ALL_ACCESS, 00100 &Test5, 00101 &TargetName4); 00102 TEST_ASSERT(Status == STATUS_INVALID_PARAMETER); 00103 } 00104 00105 // 00106 // Test7: Target with an name len larger then maxlen 00107 // 00108 { 00109 OBJECT_ATTRIBUTES Test6 = RTL_INIT_OBJECT_ATTRIBUTES(&OkName, 0); 00110 TargetName5.Length = TargetName5.MaximumLength + 2; 00111 Status = NtCreateSymbolicLinkObject(&LinkHandle, 00112 SYMBOLIC_LINK_ALL_ACCESS, 00113 &Test6, 00114 &TargetName5); 00115 TEST_ASSERT(Status == STATUS_INVALID_PARAMETER); 00116 } 00117 00118 // 00119 // Test5: Target with an odd name maxlen 00120 // 00121 { 00122 OBJECT_ATTRIBUTES Test5 = RTL_INIT_OBJECT_ATTRIBUTES(&OkName, 0); 00123 TargetName2.MaximumLength--; 00124 TEST_ASSERT(TargetName2.MaximumLength % sizeof(WCHAR)); 00125 Status = NtCreateSymbolicLinkObject(&LinkHandle, 00126 SYMBOLIC_LINK_ALL_ACCESS, 00127 &Test5, 00128 &TargetName2); 00129 *OddLink = LinkHandle; 00130 TEST_ASSERT(NT_SUCCESS(Status)); 00131 TEST_ASSERT(TargetName2.MaximumLength % sizeof(WCHAR)); 00132 } 00133 00134 // 00135 // Test6: collission 00136 // 00137 { 00138 OBJECT_ATTRIBUTES Test6 = RTL_INIT_OBJECT_ATTRIBUTES(&OkName, 0); 00139 TargetName2.MaximumLength++; 00140 Status = NtCreateSymbolicLinkObject(&LinkHandle, 00141 SYMBOLIC_LINK_ALL_ACCESS, 00142 &Test6, 00143 &TargetName2); 00144 TEST_ASSERT(Status == STATUS_OBJECT_NAME_COLLISION); 00145 } 00146 00147 // 00148 // Test7: OK! 00149 // 00150 { 00151 OBJECT_ATTRIBUTES Test7 = RTL_INIT_OBJECT_ATTRIBUTES(&OkName2, 0); 00152 Status = NtCreateSymbolicLinkObject(&LinkHandle, 00153 SYMBOLIC_LINK_ALL_ACCESS, 00154 &Test7, 00155 &TargetName2); 00156 TEST_ASSERT(NT_SUCCESS(Status)); 00157 } 00158 00159 // 00160 // Return the last valid handle 00161 // 00162 return LinkHandle; 00163 }; 00164 00165 00166 int _tmain(int argc, _TCHAR* argv[]) 00167 { 00168 NTSTATUS Status; 00169 HANDLE LinkHandle, OddHandle; 00170 WCHAR TargetBuffer[MAX_PATH] = {0}; 00171 WCHAR TargetBuffer2[MAX_PATH] = {0}; 00172 UNICODE_STRING TargetName; 00173 UNICODE_STRING TargetName2; 00174 UNICODE_STRING OkName = RTL_CONSTANT_STRING(L"\\TestLink"); 00175 ULONG NameSize; 00176 00177 // 00178 // Start with the create tests 00179 // 00180 LinkHandle = SymlinkCreateTests(&OddHandle); 00181 00182 // 00183 // Setup the two empty strings. One will have a magic-char at the end 00184 // 00185 RtlInitEmptyUnicodeString(&TargetName, TargetBuffer, sizeof(TargetBuffer)); 00186 RtlInitEmptyUnicodeString(&TargetName2, TargetBuffer2, sizeof(TargetBuffer2)); 00187 00188 // 00189 // Now query the odd link 00190 // 00191 Status = NtQuerySymbolicLinkObject(OddHandle, 00192 &TargetName, 00193 &NameSize); 00194 TEST_ASSERT(NT_SUCCESS(Status)); 00195 TEST_ASSERT(NameSize == sizeof(WCHAR)); 00196 TEST_ASSERT(TargetName.Length == NameSize); 00197 TEST_ASSERT(TargetName.Buffer[0] == OBJ_NAME_PATH_SEPARATOR); 00198 NtClose(OddHandle); 00199 00200 // 00201 // Now query the test link 00202 // 00203 Status = NtQuerySymbolicLinkObject(LinkHandle, 00204 &TargetName, 00205 &NameSize); 00206 TEST_ASSERT(NT_SUCCESS(Status)); 00207 TEST_ASSERT(NameSize == 2 * sizeof(WCHAR)); 00208 TEST_ASSERT(TargetName.Length == NameSize - sizeof(WCHAR)); 00209 TEST_ASSERT(TargetName.Buffer[0] == OBJ_NAME_PATH_SEPARATOR); 00210 00211 // 00212 // Corrupt the characters 00213 // 00214 TargetName.Buffer[(NameSize - 2) / sizeof(WCHAR)] = 'v'; 00215 TargetName.Buffer[(NameSize - 3) / sizeof(WCHAR)] = 'v'; 00216 00217 // 00218 // Now query the test link 00219 // 00220 Status = NtQuerySymbolicLinkObject(LinkHandle, 00221 &TargetName, 00222 &NameSize); 00223 TEST_ASSERT(NT_SUCCESS(Status)); 00224 TEST_ASSERT(TargetName.Buffer[0] == OBJ_NAME_PATH_SEPARATOR); 00225 TEST_ASSERT(TargetName.Buffer[1] == UNICODE_NULL); 00226 00227 // 00228 // Corrupt the characters 00229 // 00230 TargetName.Buffer[(NameSize - 2) / sizeof(WCHAR)] = 'v'; 00231 TargetName.Buffer[(NameSize - 3) / sizeof(WCHAR)] = 'v'; 00232 00233 // 00234 // Now query the test link 00235 // 00236 Status = NtQuerySymbolicLinkObject(LinkHandle, 00237 &TargetName, 00238 NULL); 00239 TEST_ASSERT(NT_SUCCESS(Status)); 00240 TEST_ASSERT(TargetName.Buffer[0] == OBJ_NAME_PATH_SEPARATOR); 00241 TEST_ASSERT(TargetName.Buffer[1] == 'v'); 00242 00243 // 00244 // Print out results 00245 // 00246 { 00247 RTL_OSVERSIONINFOW VersionInfo; 00248 VersionInfo.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOW); 00249 RtlGetVersion(&VersionInfo); 00250 printf("Test complete on: %d\n", VersionInfo.dwBuildNumber); 00251 printf("Number of Failures: %d\n", Failures); 00252 printf("Number of Runs: %d\n", Runs); 00253 } 00254 return 0; 00255 } 00256 Generated on Sun May 27 2012 04:37:41 for ReactOS by
1.7.6.1
|