diff --git a/build/VStudio/testing/winfsp-tests.vcxproj b/build/VStudio/testing/winfsp-tests.vcxproj
index 9251d9ae..15a0daa8 100644
--- a/build/VStudio/testing/winfsp-tests.vcxproj
+++ b/build/VStudio/testing/winfsp-tests.vcxproj
@@ -176,6 +176,8 @@
TurnOffAllWarnings
TurnOffAllWarnings
+
+
diff --git a/build/VStudio/testing/winfsp-tests.vcxproj.filters b/build/VStudio/testing/winfsp-tests.vcxproj.filters
index 4bd992f1..b70b6055 100644
--- a/build/VStudio/testing/winfsp-tests.vcxproj.filters
+++ b/build/VStudio/testing/winfsp-tests.vcxproj.filters
@@ -28,6 +28,12 @@
Source
+
+ Source
+
+
+ Source
+
diff --git a/tst/winfsp-tests/create-test.c b/tst/winfsp-tests/create-test.c
new file mode 100644
index 00000000..356b97c4
--- /dev/null
+++ b/tst/winfsp-tests/create-test.c
@@ -0,0 +1,29 @@
+#include
+#include
+#include "memfs.h"
+
+void *memfs_start(ULONG Flags);
+void memfs_stop(void *data);
+
+extern int WinFspDiskTests;
+extern int WinFspNetTests;
+
+void create_dotest(ULONG Flags)
+{
+ void *memfs = memfs_start(Flags);
+
+ memfs_stop(memfs);
+}
+
+void create_test(void)
+{
+ if (WinFspDiskTests)
+ create_dotest(MemfsDisk);
+ if (WinFspNetTests)
+ create_dotest(MemfsNet);
+}
+
+void create_tests(void)
+{
+ TEST(create_test);
+}
diff --git a/tst/winfsp-tests/memfs-test.c b/tst/winfsp-tests/memfs-test.c
new file mode 100644
index 00000000..74d662c1
--- /dev/null
+++ b/tst/winfsp-tests/memfs-test.c
@@ -0,0 +1,79 @@
+#include
+#include
+#include
+#include "memfs.h"
+
+extern int WinFspDiskTests;
+extern int WinFspNetTests;
+
+struct memfs_data
+{
+ MEMFS *Memfs;
+ HANDLE Thread;
+};
+
+static unsigned __stdcall memfs_thread(void *Memfs0)
+{
+ MEMFS *Memfs = Memfs0;
+ return FspFileSystemLoop(MemfsFileSystem(Memfs));
+}
+
+void *memfs_start(ULONG Flags)
+{
+ struct memfs_data *data;
+ MEMFS *Memfs;
+ HANDLE Thread;
+ NTSTATUS Result;
+
+ data = malloc(sizeof *data);
+ ASSERT(0 != data);
+
+ Result = MemfsCreate(Flags, 1000, 65500, &Memfs);
+ ASSERT(NT_SUCCESS(Result));
+ ASSERT(0 != Memfs);
+
+ Thread = (HANDLE)_beginthreadex(0, 0, memfs_thread, Memfs, 0, 0);
+ ASSERT(0 != Thread);
+
+ data->Memfs = Memfs;
+ data->Thread = Thread;
+
+ return data;
+}
+
+void memfs_stop(void *data)
+{
+ MEMFS *Memfs = ((struct memfs_data *)data)->Memfs;
+ HANDLE Thread = ((struct memfs_data *)data)->Thread;
+ DWORD ExitCode;
+
+ FspFileSystemSetDispatcherResult(MemfsFileSystem(Memfs), STATUS_CANCELLED);
+
+ WaitForSingleObject(Thread, INFINITE);
+ GetExitCodeThread(Thread, &ExitCode);
+ CloseHandle(Thread);
+
+ ASSERT(STATUS_CANCELLED == ExitCode);
+
+ MemfsDelete(Memfs);
+}
+
+void memfs_dotest(ULONG Flags)
+{
+ void *memfs = memfs_start(Flags);
+
+ memfs_stop(memfs);
+}
+
+void memfs_test(void)
+{
+ if (WinFspDiskTests)
+ memfs_dotest(MemfsDisk);
+ if (WinFspNetTests)
+ memfs_dotest(MemfsNet);
+}
+
+void memfs_tests(void)
+{
+ TEST(memfs_test);
+}
diff --git a/tst/winfsp-tests/memfs.cpp b/tst/winfsp-tests/memfs.cpp
index a05b35e4..0a9c0772 100644
--- a/tst/winfsp-tests/memfs.cpp
+++ b/tst/winfsp-tests/memfs.cpp
@@ -419,3 +419,8 @@ VOID MemfsDelete(MEMFS *Memfs)
free(Memfs);
}
+
+FSP_FILE_SYSTEM *MemfsFileSystem(MEMFS *Memfs)
+{
+ return Memfs->FileSystem;
+}
diff --git a/tst/winfsp-tests/memfs.h b/tst/winfsp-tests/memfs.h
index 87ac6323..08d3c451 100644
--- a/tst/winfsp-tests/memfs.h
+++ b/tst/winfsp-tests/memfs.h
@@ -26,6 +26,7 @@ enum
NTSTATUS MemfsCreate(ULONG Flags, ULONG MaxFileNodes, ULONG MaxFileSize,
MEMFS **PMemfs);
VOID MemfsDelete(MEMFS *Memfs);
+FSP_FILE_SYSTEM *MemfsFileSystem(MEMFS *Memfs);
#ifdef __cplusplus
}
diff --git a/tst/winfsp-tests/winfsp-tests.c b/tst/winfsp-tests/winfsp-tests.c
index cde6c340..1c74147a 100644
--- a/tst/winfsp-tests/winfsp-tests.c
+++ b/tst/winfsp-tests/winfsp-tests.c
@@ -8,6 +8,8 @@ int main(int argc, char *argv[])
TESTSUITE(path_tests);
TESTSUITE(mount_tests);
TESTSUITE(timeout_tests);
+ TESTSUITE(memfs_tests);
+ TESTSUITE(create_tests);
tlib_run_tests(argc, argv);
return 0;