From 4cf4eebb95af0156dde6d43595b48be7b84e8442 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sun, 29 Nov 2015 19:11:35 +0000 Subject: [PATCH] [KMTESTS:IO] - Add more path open tests - Also test creating files CORE-10483 svn path=/trunk/; revision=70209 --- rostests/kmtests/ntos_io/IoFilesystem.c | 98 ++++++++++++++++++++++--- 1 file changed, 86 insertions(+), 12 deletions(-) diff --git a/rostests/kmtests/ntos_io/IoFilesystem.c b/rostests/kmtests/ntos_io/IoFilesystem.c index c8edfe50fe3..dcc4bcf4779 100644 --- a/rostests/kmtests/ntos_io/IoFilesystem.c +++ b/rostests/kmtests/ntos_io/IoFilesystem.c @@ -277,11 +277,12 @@ TestRelativeNames(VOID) PCWSTR RelativePathTemplate; BOOLEAN IsDirectory; NTSTATUS Status; + BOOLEAN IsDrive; } Tests[] = { - { NULL, L"C:\\", TRUE, STATUS_SUCCESS }, - { NULL, L"C:\\\\", TRUE, STATUS_SUCCESS }, - { NULL, L"C:\\\\\\", TRUE, STATUS_OBJECT_NAME_INVALID }, + { NULL, L"C:\\", TRUE, STATUS_SUCCESS, TRUE }, + { NULL, L"C:\\\\", TRUE, STATUS_SUCCESS, TRUE }, + { NULL, L"C:\\\\\\", TRUE, STATUS_OBJECT_NAME_INVALID, TRUE }, { NULL, L"C:\\ReactOS", TRUE, STATUS_SUCCESS }, { NULL, L"C:\\ReactOS\\", TRUE, STATUS_SUCCESS }, { NULL, L"C:\\ReactOS\\\\", TRUE, STATUS_SUCCESS }, @@ -303,6 +304,7 @@ TestRelativeNames(VOID) { L"C:\\ReactOS", L"", TRUE, STATUS_SUCCESS }, { L"C:\\ReactOS", L"explorer.exe", FALSE, STATUS_SUCCESS }, { L"C:\\ReactOS\\explorer.exe", L"", FALSE, STATUS_SUCCESS }, + { L"C:\\ReactOS\\explorer.exe", L"file", FALSE, STATUS_OBJECT_PATH_NOT_FOUND }, /* Let's try some nonexistent things */ { NULL, L"C:\\ReactOS\\IDoNotExist", FALSE, STATUS_OBJECT_NAME_NOT_FOUND }, { NULL, L"C:\\ReactOS\\IDoNotExist\\file", FALSE, STATUS_OBJECT_PATH_NOT_FOUND }, @@ -310,15 +312,26 @@ TestRelativeNames(VOID) { NULL, L"C:\\ReactOS\\IDoNotExist\\file\\\\",TRUE,STATUS_OBJECT_PATH_NOT_FOUND }, { NULL, L"C:\\ReactOS\\IDoNotExist\\file\\\\\\",TRUE,STATUS_OBJECT_PATH_NOT_FOUND }, { NULL, L"C:\\ReactOS\\AmIInvalid?", FALSE, STATUS_OBJECT_NAME_INVALID }, - { NULL, L"C:\\ReactOS\\.", FALSE, STATUS_OBJECT_NAME_NOT_FOUND }, - { NULL, L"C:\\ReactOS\\..", FALSE, STATUS_OBJECT_NAME_NOT_FOUND }, - { NULL, L"C:\\ReactOS\\...", FALSE, STATUS_OBJECT_NAME_NOT_FOUND }, - { L"C:\\", L".", FALSE, STATUS_OBJECT_NAME_NOT_FOUND }, - { L"C:\\", L"..", FALSE, STATUS_OBJECT_NAME_NOT_FOUND }, - { L"C:\\", L"...", FALSE, STATUS_OBJECT_NAME_NOT_FOUND }, - { L"C:\\ReactOS", L".", FALSE, STATUS_OBJECT_NAME_NOT_FOUND }, - { L"C:\\ReactOS", L"..", FALSE, STATUS_OBJECT_NAME_NOT_FOUND }, - { L"C:\\ReactOS", L"...", FALSE, STATUS_OBJECT_NAME_NOT_FOUND }, + { NULL, L"C:\\ReactOS\\.", TRUE, STATUS_OBJECT_NAME_NOT_FOUND }, + { NULL, L"C:\\ReactOS\\..", TRUE, STATUS_OBJECT_NAME_NOT_FOUND }, + { NULL, L"C:\\ReactOS\\...", TRUE, STATUS_OBJECT_NAME_NOT_FOUND }, + { NULL, L"C:\\ReactOS\\.\\system32", TRUE, STATUS_OBJECT_PATH_NOT_FOUND }, + { NULL, L"C:\\ReactOS\\..\\ReactOS", TRUE, STATUS_OBJECT_PATH_NOT_FOUND }, + { L"C:\\", L".", TRUE, STATUS_OBJECT_NAME_NOT_FOUND }, + { L"C:\\", L"..", TRUE, STATUS_OBJECT_NAME_NOT_FOUND }, + { L"C:\\", L"...", TRUE, STATUS_OBJECT_NAME_NOT_FOUND }, + { L"C:\\", L".\\ReactOS", TRUE, STATUS_OBJECT_PATH_NOT_FOUND }, + { L"C:\\", L"..\\ReactOS", TRUE, STATUS_OBJECT_PATH_NOT_FOUND }, + { L"C:\\ReactOS", L".", TRUE, STATUS_OBJECT_NAME_NOT_FOUND }, + { L"C:\\ReactOS", L"..", TRUE, STATUS_OBJECT_NAME_NOT_FOUND }, + { L"C:\\ReactOS", L"...", TRUE, STATUS_OBJECT_NAME_NOT_FOUND }, + { L"C:\\ReactOS", L".\\system32", TRUE, STATUS_OBJECT_PATH_NOT_FOUND }, + { L"C:\\ReactOS", L"..\\ReactOS", TRUE, STATUS_OBJECT_PATH_NOT_FOUND }, + /* Volume open */ + { NULL, L"C:", FALSE, STATUS_SUCCESS, TRUE }, + { L"C:", L"", FALSE, STATUS_SUCCESS, TRUE }, + { L"C:", L"\\", TRUE, STATUS_OBJECT_PATH_NOT_FOUND }, + { L"C:", L"file", TRUE, STATUS_OBJECT_PATH_NOT_FOUND }, }; ULONG i; OBJECT_ATTRIBUTES ObjectAttributes; @@ -335,6 +348,8 @@ TestRelativeNames(VOID) PWSTR SystemRootName; PWCHAR Buffer = NULL; BOOLEAN TrailingBackslash; + LARGE_INTEGER AllocationSize; + FILE_DISPOSITION_INFORMATION DispositionInfo; /* Query \SystemRoot */ InitializeObjectAttributes(&ObjectAttributes, @@ -466,6 +481,65 @@ TestRelativeNames(VOID) if (NT_SUCCESS(Status)) ObCloseHandle(FileHandle, KernelMode); + /* (4) Directory + Non-Directory */ + Status = ZwOpenFile(&FileHandle, + GENERIC_READ, + &ObjectAttributes, + &IoStatus, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + FILE_DIRECTORY_FILE | FILE_NON_DIRECTORY_FILE); + if (Tests[i].Status == STATUS_OBJECT_NAME_INVALID && Tests[i].IsDrive) + ok(Status == STATUS_OBJECT_NAME_INVALID, + "[%lu] Status = %lx, expected STATUS_OBJECT_NAME_INVALID\n", i, Status); + else + ok(Status == STATUS_INVALID_PARAMETER, + "[%lu] Status = %lx, expected STATUS_INVALID_PARAMETER\n", i, Status); + if (NT_SUCCESS(Status)) + ObCloseHandle(FileHandle, KernelMode); + + /* (5) Try to create it */ + AllocationSize.QuadPart = 0; + Status = ZwCreateFile(&FileHandle, + GENERIC_READ | DELETE, + &ObjectAttributes, + &IoStatus, + &AllocationSize, + FILE_ATTRIBUTE_NORMAL, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + FILE_CREATE, + 0, + NULL, + 0); + if (Tests[i].Status == STATUS_OBJECT_NAME_NOT_FOUND) + ok(Status == STATUS_SUCCESS, + "[%lu] Status = %lx, expected STATUS_SUCCESS\n", i, Status); + else if (Tests[i].Status == STATUS_OBJECT_NAME_INVALID && Tests[i].IsDrive) + ok(Status == STATUS_OBJECT_NAME_INVALID, + "[%lu] Status = %lx, expected STATUS_OBJECT_NAME_INVALID\n", i, Status);else if (Tests[i].IsDrive) + ok(Status == STATUS_ACCESS_DENIED, + "[%lu] Status = %lx, expected STATUS_ACCESS_DENIED\n", i, Status); + else if (Tests[i].Status == STATUS_SUCCESS) + ok(Status == STATUS_OBJECT_NAME_COLLISION, + "[%lu] Status = %lx, expected STATUS_OBJECT_NAME_COLLISION\n", i, Status); + else + ok(Status == Tests[i].Status, + "[%lu] Status = %lx, expected %lx; %ls -- %ls\n", i, Status, Tests[i].Status, Tests[i].ParentPathTemplate, Tests[i].RelativePathTemplate); + if (NT_SUCCESS(Status)) + { + if (IoStatus.Information == FILE_CREATED) + { + DispositionInfo.DeleteFile = TRUE; + Status = ZwSetInformationFile(FileHandle, + &IoStatus, + &DispositionInfo, + sizeof(DispositionInfo), + FileDispositionInformation); + ok(Status == STATUS_SUCCESS, + "[%lu] Status = %lx, expected STATUS_SUCCESS\n", i, Status); + } + ObCloseHandle(FileHandle, KernelMode); + } + /* And close */ ObCloseHandle(ParentHandle, KernelMode); }