Index: CMakeLists.txt =================================================================== --- modues/rostests/kmtests/CMakeLists.txt (revision 58805) +++ modues/rostests/kmtests/CMakeLists.txt (working copy) @@ -5,6 +5,7 @@ # subdirectories containing special-purpose drivers # add_subdirectory(example) +add_subdirectory(kernel32) add_subdirectory(ntos_io) list(APPEND COMMON_SOURCE @@ -87,6 +88,7 @@ kmtest/testlist.c example/Example_user.c + kernel32/FindFile_user.c ntos_io/IoDeviceObject_user.c ${COMMON_SOURCE} Index: include/kmt_test.h =================================================================== --- modues/rostests/kmtests/include/kmt_test.h (revision 58805) +++ modues/rostests/kmtests/include/kmt_test.h (working copy) @@ -66,6 +66,7 @@ TESTENTRY_NO_CREATE_DEVICE = 1, TESTENTRY_NO_REGISTER_DISPATCH = 2, TESTENTRY_NO_REGISTER_UNLOAD = 4, + TESTENTRY_NO_EXCLUSIVE_DEVICE = 8, } KMT_TESTENTRY_FLAGS; NTSTATUS TestEntry(IN PDRIVER_OBJECT DriverObject, IN PCUNICODE_STRING RegistryPath, OUT PCWSTR *DeviceName, IN OUT INT *Flags); @@ -98,6 +99,7 @@ DWORD KmtSendToDriver(IN DWORD ControlCode); DWORD KmtSendStringToDriver(IN DWORD ControlCode, IN PCSTR String); +DWORD KmtSendWStringToDriver(IN DWORD ControlCode, IN PCWSTR String); DWORD KmtSendBufferToDriver(IN DWORD ControlCode, IN OUT PVOID Buffer OPTIONAL, IN DWORD InLength, IN OUT PDWORD OutLength); #else /* if !defined KMT_KERNEL_MODE && !defined KMT_USER_MODE */ #error either KMT_KERNEL_MODE or KMT_USER_MODE must be defined Index: kernel32 =================================================================== --- modues/rostests/kmtests/kernel32 (revision 0) +++ modues/rostests/kmtests/kernel32 (working copy) Property changes on: kernel32 ___________________________________________________________________ Added: bugtraq:logregex ## -0,0 +1,2 ## +([Ii]ssue|[Bb]ug)s? #?(\d+)(,? ?#?(\d+))*(,? ?(and |or )?#?(\d+))? +(\d+) \ No newline at end of property Added: bugtraq:url ## -0,0 +1 ## +http://www.reactos.org/bugzilla/show_bug.cgi?id=%BUGID% \ No newline at end of property Added: bugtraq:message ## -0,0 +1 ## +See issue #%BUGID% for more details. \ No newline at end of property Added: tsvn:logminsize ## -0,0 +1 ## +10 \ No newline at end of property Index: kernel32/CMakeLists.txt =================================================================== --- modues/rostests/kmtests/kernel32/CMakeLists.txt (revision 0) +++ modues/rostests/kmtests/kernel32/CMakeLists.txt (working copy) @@ -0,0 +1,16 @@ +include_directories( + ../include) + +list(APPEND FINDFILE_DRV_SOURCE + ../kmtest_drv/kmtest_standalone.c + FindFile_drv.c) + +add_library(findfile_drv SHARED ${FINDFILE_DRV_SOURCE}) + +set_module_type(findfile_drv kernelmodedriver) +target_link_libraries(findfile_drv kmtest_printf ${PSEH_LIB}) +add_importlibs(findfile_drv ntoskrnl hal) +add_target_compile_definitions(findfile_drv KMT_STANDALONE_DRIVER) +#add_pch(findfile_drv ../include/kmt_test.h) + +add_cd_file(TARGET findfile_drv DESTINATION reactos/bin FOR all) Index: kernel32/FindFile.h =================================================================== --- modues/rostests/kmtests/kernel32/FindFile.h (revision 0) +++ modues/rostests/kmtests/kernel32/FindFile.h (working copy) @@ -0,0 +1,13 @@ +/* + * PROJECT: ReactOS kernel-mode tests + * LICENSE: GPLv2+ - See COPYING in the top level directory + * PURPOSE: FindFirstFile wildcard substitution test declarations + * PROGRAMMER: Thomas Faber + */ + +#ifndef _KMTEST_FINDFILE_H_ +#define _KMTEST_FINDFILE_H_ + +#define IOCTL_EXPECT 1 + +#endif /* !defined _KMTEST_FINDFILE_H_ */ Index: kernel32/FindFile_drv.c =================================================================== --- modues/rostests/kmtests/kernel32/FindFile_drv.c (revision 0) +++ modues/rostests/kmtests/kernel32/FindFile_drv.c (working copy) @@ -0,0 +1,123 @@ +/* + * PROJECT: ReactOS kernel-mode tests + * LICENSE: GPLv2+ - See COPYING in the top level directory + * PURPOSE: Test driver for FindFirstFile's wildcard substitution + * PROGRAMMER: Thomas Faber + */ + +#include + +#define NDEBUG +#include + +#include "FindFile.h" + +static KMT_MESSAGE_HANDLER TestMessageHandler; +static KMT_IRP_HANDLER TestIrpHandler; + +static UNICODE_STRING ExpectedExpression = RTL_CONSTANT_STRING(L""); +static WCHAR ExpressionBuffer[MAX_PATH]; + +NTSTATUS +TestEntry( + IN PDRIVER_OBJECT DriverObject, + IN PCUNICODE_STRING RegistryPath, + OUT PCWSTR *DeviceName, + IN OUT INT *Flags) +{ + NTSTATUS Status = STATUS_SUCCESS; + + PAGED_CODE(); + + UNREFERENCED_PARAMETER(RegistryPath); + + *DeviceName = L"FindFile"; + *Flags = TESTENTRY_NO_EXCLUSIVE_DEVICE; + + KmtRegisterIrpHandler(IRP_MJ_DIRECTORY_CONTROL, NULL, TestIrpHandler); + KmtRegisterMessageHandler(0, NULL, TestMessageHandler); + + return Status; +} + +VOID +TestUnload( + IN PDRIVER_OBJECT DriverObject) +{ + PAGED_CODE(); +} + +static +NTSTATUS +TestMessageHandler( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG ControlCode, + IN PVOID Buffer OPTIONAL, + IN SIZE_T InLength, + IN OUT PSIZE_T OutLength) +{ + NTSTATUS Status = STATUS_SUCCESS; + + PAGED_CODE(); + + switch (ControlCode) + { + case IOCTL_EXPECT: + { + C_ASSERT(sizeof(ExpressionBuffer) <= UNICODE_STRING_MAX_BYTES); + DPRINT("IOCTL_EXPECT, InLength = %lu\n", InLength); + if (InLength > sizeof(ExpressionBuffer)) + return STATUS_BUFFER_OVERFLOW; + + if (InLength % sizeof(WCHAR) != 0) + return STATUS_INVALID_PARAMETER; + + RtlInitEmptyUnicodeString(&ExpectedExpression, ExpressionBuffer, sizeof(ExpressionBuffer)); + RtlCopyMemory(ExpressionBuffer, Buffer, InLength); + ExpectedExpression.Length = (USHORT)InLength; + DPRINT("IOCTL_EXPECT: %wZ\n", &ExpectedExpression); + + break; + } + default: + return STATUS_NOT_SUPPORTED; + } + + return Status; +} + +static +NTSTATUS +TestIrpHandler( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PIO_STACK_LOCATION IoStackLocation) +{ + NTSTATUS Status = STATUS_NOT_SUPPORTED; + + PAGED_CODE(); + + DPRINT("IRP %x/%x\n", IoStackLocation->MajorFunction, IoStackLocation->MinorFunction); + ASSERT(IoStackLocation->MajorFunction == IRP_MJ_DIRECTORY_CONTROL); + + ok(IoStackLocation->MinorFunction == IRP_MN_QUERY_DIRECTORY, "Minor function: %u\n", IoStackLocation->MinorFunction); + if (IoStackLocation->MinorFunction == IRP_MN_QUERY_DIRECTORY) + { + ok(IoStackLocation->Parameters.QueryDirectory.FileInformationClass == FileBothDirectoryInformation, + "FileInformationClass: %d\n", IoStackLocation->Parameters.QueryDirectory.FileInformationClass); + if (IoStackLocation->Parameters.QueryDirectory.FileInformationClass == FileBothDirectoryInformation) + { + ok(RtlEqualUnicodeString(IoStackLocation->Parameters.QueryDirectory.FileName, &ExpectedExpression, FALSE), + "Expression is '%wZ', expected '%wZ'\n", IoStackLocation->Parameters.QueryDirectory.FileName, &ExpectedExpression); + RtlZeroMemory(Irp->UserBuffer, IoStackLocation->Parameters.QueryDirectory.Length); + Status = STATUS_SUCCESS; + } + } + + Irp->IoStatus.Status = Status; + Irp->IoStatus.Information = 0; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return Status; +} Index: kernel32/FindFile_user.c =================================================================== --- modues/rostests/kmtests/kernel32/FindFile_user.c (revision 0) +++ modues/rostests/kmtests/kernel32/FindFile_user.c (working copy) @@ -0,0 +1,71 @@ +/* + * PROJECT: ReactOS kernel-mode tests + * LICENSE: GPLv2+ - See COPYING in the top level directory + * PURPOSE: Test for FindFirstFile's wildcard substitution + * PROGRAMMER: Thomas Faber + */ + +#include + +#include "FindFile.h" + +START_TEST(FindFile) +{ + HANDLE FindHandle; + WIN32_FIND_DATAW FindData; + struct + { + PCWSTR Expression; + PCWSTR ExpectedExpression; + } Tests[] = + { + { L"Hello", L"Hello" }, + { L"*", L"*" }, + { L"a*", L"a*" }, + { L"*a", L"*a" }, + { L"a*a", L"a*a" }, + + { L"*.*", L"*" }, + { L"a*.*", L"a<\"*" }, + { L"*.*a", L"<\"*a" }, + { L"a*.*a", L"a<\"*a" }, + + { L".*", L"\"*" }, + { L"a.*", L"a\"*" }, + { L".*a", L"\"*a" }, + { L"a.*a", L"a\"*a" }, + + { L"*.", L"<" }, + { L"a*.", L"a<" }, + { L"*.a", L"<.a" }, + { L"a*.a", L"a<.a" }, + + { L"?", L">" }, + { L"a?", L"a>" }, + { L"?a", L">a" }, + { L"a?a", L"a>a" }, + + /* have fun */ + }; + const INT TestCount = sizeof(Tests) / sizeof(Tests[0]); + INT i; + WCHAR ExpressionBuffer[MAX_PATH]; + + KmtLoadDriver(L"FindFile", FALSE); + KmtOpenDriver(); + + for (i = 0; i < TestCount; i++) + { + trace("[%d] '%ls', '%ls'\n", i, Tests[i].Expression, Tests[i].ExpectedExpression); + KmtSendWStringToDriver(IOCTL_EXPECT, Tests[i].ExpectedExpression); + wcscpy(ExpressionBuffer, L"\\\\.\\Global\\GLOBALROOT\\Device\\Kmtest-FindFile\\"); + wcscat(ExpressionBuffer, Tests[i].Expression); + FindHandle = FindFirstFileW(ExpressionBuffer, &FindData); + ok(FindHandle != NULL && FindHandle != INVALID_HANDLE_VALUE, "Handle: %p, error=%lu\n", (PVOID)FindHandle, GetLastError()); + if (FindHandle != INVALID_HANDLE_VALUE) + FindClose(FindHandle); + } + + KmtCloseDriver(); + KmtUnloadDriver(); +} Index: kmtest/support.c =================================================================== --- modues/rostests/kmtests/kmtest/support.c (revision 58805) +++ modues/rostests/kmtests/kmtest/support.c (working copy) @@ -188,6 +188,31 @@ } /** + * @name KmtSendStringToDriver + * + * Unload special-purpose driver (stop the service) + * + * @param ControlCode + * @param String + * + * @return Win32 error code as returned by DeviceIoControl + */ +DWORD +KmtSendWStringToDriver( + IN DWORD ControlCode, + IN PCWSTR String) +{ + DWORD BytesRead; + + assert(ControlCode < 0x400); + + if (!DeviceIoControl(TestDeviceHandle, KMT_MAKE_CODE(ControlCode), (PVOID)String, (DWORD)wcslen(String) * sizeof(WCHAR), NULL, 0, &BytesRead, NULL)) + return GetLastError(); + + return ERROR_SUCCESS; +} + +/** * @name KmtSendBufferToDriver * * @param ControlCode Index: kmtest/testlist.c =================================================================== --- modues/rostests/kmtests/kmtest/testlist.c (revision 58805) +++ modues/rostests/kmtests/kmtest/testlist.c (working copy) @@ -8,6 +8,7 @@ #include KMT_TESTFUNC Test_Example; +KMT_TESTFUNC Test_FindFile; KMT_TESTFUNC Test_IoDeviceObject; KMT_TESTFUNC Test_RtlAvlTree; KMT_TESTFUNC Test_RtlException; @@ -19,6 +20,7 @@ const KMT_TEST TestList[] = { { "Example", Test_Example }, + { "FindFile", Test_FindFile }, { "IoDeviceObject", Test_IoDeviceObject }, { "RtlAvlTree", Test_RtlAvlTree }, { "RtlException", Test_RtlException }, Index: kmtest_drv/kmtest_standalone.c =================================================================== --- modues/rostests/kmtests/kmtest_drv/kmtest_standalone.c (revision 58805) +++ modues/rostests/kmtests/kmtest_drv/kmtest_standalone.c (working copy) @@ -122,7 +122,8 @@ Status = IoCreateDevice(DriverObject, 0, &DeviceName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN | FILE_READ_ONLY_DEVICE, - TRUE, &TestDeviceObject); + Flags & TESTENTRY_NO_EXCLUSIVE_DEVICE ? FALSE : TRUE, + &TestDeviceObject); if (!NT_SUCCESS(Status)) {