1 /* 2 * PROJECT: ReactOS kernel-mode tests 3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory 4 * PURPOSE: Test for FindFirstFile's wildcard substitution 5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org> 6 */ 7 8 #include <kmt_test.h> 9 10 #include "kernel32_test.h" 11 12 START_TEST(FindFile) 13 { 14 HANDLE FindHandle; 15 WIN32_FIND_DATAW FindData; 16 struct 17 { 18 PCWSTR Expression; 19 PCWSTR ExpectedExpression; 20 } Tests[] = 21 { 22 { L"Hello", L"Hello" }, 23 24 { L"*", L"*" }, 25 { L"a*", L"a*" }, 26 { L"*a", L"*a" }, 27 { L"a*a", L"a*a" }, 28 { L"**", L"**" }, 29 { L"*a*", L"*a*" }, 30 { L"a*a*a", L"a*a*a" }, 31 32 { L"*.*", L"*" }, 33 { L"a*.*", L"a<\"*" }, 34 { L"*.*a", L"<\"*a" }, 35 { L"a*.*a", L"a<\"*a" }, 36 { L"*.**.*", L"<\"*<\"*" }, 37 { L"*.*a*.*", L"<\"*a<\"*" }, 38 { L"a*.*a*.*a", L"a<\"*a<\"*a" }, 39 40 { L".*", L"\"*" }, 41 { L"a.*", L"a\"*" }, 42 { L".*a", L"\"*a" }, 43 { L"a.*a", L"a\"*a" }, 44 { L".*.*", L"\"<\"*" }, 45 { L".*a.*", L"\"*a\"*" }, 46 { L"a.*a.*a", L"a\"*a\"*a" }, 47 48 { L"*.", L"<" }, 49 { L"a*.", L"a<" }, 50 { L"*.a", L"<.a" }, 51 { L"a*.a", L"a<.a" }, 52 { L"*.*.", L"*" }, 53 { L"*.a*.", L"<.a<" }, 54 { L"a*.a*.a", L"a<.a<.a" }, 55 56 { L"?", L">" }, 57 { L"a?", L"a>" }, 58 { L"?a", L">a" }, 59 { L"a?a", L"a>a" }, 60 { L"??", L">>" }, 61 { L"?a?", L">a>" }, 62 { L"a?a?a", L"a>a>a" }, 63 64 { L"?.?", L">\">" }, 65 { L"a?.?", L"a>\">" }, 66 { L"?.?a", L">\">a" }, 67 { L"a?.?a", L"a>\">a" }, 68 { L"?.??.?", L">\">>\">" }, 69 { L"?.?a?.?", L">\">a>\">" }, 70 { L"a?.?a?.?a", L"a>\">a>\">a" }, 71 72 { L".?", L"\">" }, 73 { L"a.?", L"a\">" }, 74 { L".?a", L"\">a" }, 75 { L"a.?a", L"a\">a" }, 76 { L".?.?", L"\">\">" }, 77 { L".?a.?", L"\">a\">" }, 78 { L"a.?a.?a", L"a\">a\">a" }, 79 80 { L"?.", L">" }, 81 { L"a?.", L"a>" }, 82 { L"?.a", L">.a" }, 83 { L"a?.a", L"a>.a" }, 84 { L"?.?.", L">\">" }, 85 { L"?.a?.", L">.a>" }, 86 { L"a?.a?.a", L"a>.a>.a" }, 87 88 { L"f*.", L"f<" }, 89 { L"f.*", L"f\"*" }, 90 { L"f*.*", L"f<\"*" }, 91 { L"f*.f*", L"f<.f*" }, 92 { L"f*f.*", L"f*f\"*" }, 93 { L"f*.*f", L"f<\"*f" }, 94 95 /* TODO: add more. Have fun */ 96 }; 97 const INT TestCount = sizeof(Tests) / sizeof(Tests[0]); 98 INT i; 99 WCHAR ExpressionBuffer[MAX_PATH]; 100 DWORD Error; 101 102 Error = KmtLoadAndOpenDriver(L"kernel32", FALSE); 103 ok_eq_int(Error, ERROR_SUCCESS); 104 if (Error) 105 return; 106 107 for (i = 0; i < TestCount; i++) 108 { 109 trace("[%d] '%ls', '%ls'\n", i, Tests[i].Expression, Tests[i].ExpectedExpression); 110 KmtSendWStringToDriver(IOCTL_EXPECT_EXPRESSION, Tests[i].ExpectedExpression); 111 wcscpy(ExpressionBuffer, L"\\\\.\\Global\\GLOBALROOT\\Device\\Kmtest-kernel32\\"); 112 wcscat(ExpressionBuffer, Tests[i].Expression); 113 FindHandle = FindFirstFileW(ExpressionBuffer, &FindData); 114 ok(FindHandle != NULL && FindHandle != INVALID_HANDLE_VALUE, "Handle: %p, error=%lu\n", (PVOID)FindHandle, GetLastError()); 115 if (FindHandle != INVALID_HANDLE_VALUE) 116 FindClose(FindHandle); 117 } 118 119 KmtCloseDriver(); 120 KmtUnloadDriver(); 121 } 122