From 56c6b5287f912805c36b8d61edde6f9d816e3dbe Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Thu, 21 Jan 2016 17:34:50 -0800 Subject: [PATCH] sys: RelatedFileObject: testing --- build/VStudio/testing/winfsp-tests.vcxproj | 4 ++ src/sys/create.c | 5 +- tst/winfsp-tests/create-test.c | 56 ++++++++++++++++++++++ 3 files changed, 63 insertions(+), 2 deletions(-) diff --git a/build/VStudio/testing/winfsp-tests.vcxproj b/build/VStudio/testing/winfsp-tests.vcxproj index 15a0daa8..46c5fd37 100644 --- a/build/VStudio/testing/winfsp-tests.vcxproj +++ b/build/VStudio/testing/winfsp-tests.vcxproj @@ -107,6 +107,7 @@ Console true + ntdll.lib;%(AdditionalDependencies) @@ -123,6 +124,7 @@ Console true + ntdll.lib;%(AdditionalDependencies) @@ -143,6 +145,7 @@ true true true + ntdll.lib;%(AdditionalDependencies) @@ -163,6 +166,7 @@ true true true + ntdll.lib;%(AdditionalDependencies) diff --git a/src/sys/create.c b/src/sys/create.c index f235096d..bd3604bb 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -98,7 +98,8 @@ static NTSTATUS FspFsvolCreate( UNICODE_STRING FileName = FileObject->FileName; /* open the volume object? */ - if ((0 == RelatedFileObject || RelatedFileObject->FsContext) && 0 == FileName.Length) + if ((0 == RelatedFileObject || !FspFileNodeIsValid(RelatedFileObject->FsContext)) && + 0 == FileName.Length) { if (0 != FsvolDeviceExtension->FsvrtDeviceObject) #pragma prefast(disable:28175, "We are a filesystem: ok to access Vpb") @@ -262,7 +263,7 @@ static NTSTATUS FspFsvolCreate( ASSERT(NT_SUCCESS(Result)); /* check and remove any volume prefix */ - if (0 < FsvolDeviceExtension->VolumePrefix.Length) + if (0 == RelatedFileObject && 0 < FsvolDeviceExtension->VolumePrefix.Length) { if (FileNode->FileName.Length <= FsvolDeviceExtension->VolumePrefix.Length || !RtlEqualMemory(FileNode->FileName.Buffer, FsvolDeviceExtension->VolumePrefix.Buffer, diff --git a/tst/winfsp-tests/create-test.c b/tst/winfsp-tests/create-test.c index ec96de9b..767aa05b 100644 --- a/tst/winfsp-tests/create-test.c +++ b/tst/winfsp-tests/create-test.c @@ -172,6 +172,61 @@ void create_test(void) create_dotest(MemfsNet, L"\\\\memfs\\share"); } +void create_related_dotest(ULONG Flags, PWSTR Prefix) +{ + void *memfs = memfs_start(Flags); + + HANDLE DirHandle, FileHandle; + NTSTATUS Result; + BOOLEAN Success; + WCHAR FilePath[MAX_PATH]; + WCHAR UnicodePathBuf[MAX_PATH] = L"file2"; + UNICODE_STRING UnicodePath; + OBJECT_ATTRIBUTES Obja; + IO_STATUS_BLOCK Iosb; + LARGE_INTEGER LargeZero = { 0 }; + + StringCbPrintfW(FilePath, sizeof FilePath, L"%s%s\\dir1", + Prefix ? L"" : L"\\\\?\\GLOBALROOT", Prefix ? Prefix : memfs_volumename(memfs)); + + Success = CreateDirectory(FilePath, 0); + ASSERT(Success); + + DirHandle = CreateFileW(FilePath, + GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_DELETE_ON_CLOSE, 0); + ASSERT(INVALID_HANDLE_VALUE != DirHandle); + + UnicodePath.Length = (USHORT)wcslen(UnicodePathBuf) * sizeof(WCHAR); + UnicodePath.MaximumLength = sizeof UnicodePathBuf; + UnicodePath.Buffer = UnicodePathBuf; + InitializeObjectAttributes(&Obja, &UnicodePath, 0, DirHandle, 0); + Result = NtCreateFile(&FileHandle, + FILE_GENERIC_READ | FILE_GENERIC_WRITE | DELETE, &Obja, &Iosb, + &LargeZero, FILE_ATTRIBUTE_NORMAL, 0, + FILE_CREATE, FILE_DELETE_ON_CLOSE, 0, 0); + ASSERT(STATUS_SUCCESS == Result); + CloseHandle(FileHandle); + + CloseHandle(DirHandle); + + DirHandle = CreateFileW(FilePath, + GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_DELETE_ON_CLOSE, 0); + ASSERT(INVALID_HANDLE_VALUE == DirHandle); + ASSERT(ERROR_FILE_NOT_FOUND == GetLastError()); + + memfs_stop(memfs); +} + +void create_related_test(void) +{ + if (WinFspDiskTests) + create_related_dotest(MemfsDisk, 0); + if (WinFspNetTests) + create_related_dotest(MemfsNet, L"\\\\memfs\\share"); +} + void create_sd_dotest(ULONG Flags, PWSTR Prefix) { void *memfs = memfs_start(Flags); @@ -347,6 +402,7 @@ void create_share_test(void) void create_tests(void) { TEST(create_test); + TEST(create_related_test); TEST(create_sd_test); TEST(create_share_test); }