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);
}