diff --git a/build/VStudio/testing/winfsp-tests.vcxproj b/build/VStudio/testing/winfsp-tests.vcxproj
index c1cb3345..7ffd6992 100644
--- a/build/VStudio/testing/winfsp-tests.vcxproj
+++ b/build/VStudio/testing/winfsp-tests.vcxproj
@@ -176,6 +176,7 @@
TurnOffAllWarnings
TurnOffAllWarnings
+
@@ -183,6 +184,7 @@
+
diff --git a/build/VStudio/testing/winfsp-tests.vcxproj.filters b/build/VStudio/testing/winfsp-tests.vcxproj.filters
index 47ab4f4b..8caa66e6 100644
--- a/build/VStudio/testing/winfsp-tests.vcxproj.filters
+++ b/build/VStudio/testing/winfsp-tests.vcxproj.filters
@@ -25,10 +25,16 @@
Source
+
+ Source
+
Source\tlib
+
+ Source
+
\ No newline at end of file
diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h
index 3530db0a..c0bed788 100644
--- a/inc/winfsp/winfsp.h
+++ b/inc/winfsp/winfsp.h
@@ -178,4 +178,5 @@ FSP_API VOID FspPathCombine(PWSTR Prefix, PWSTR Suffix);
*/
FSP_API NTSTATUS FspNtStatusFromWin32(DWORD Error);
FSP_API VOID FspDebugLog(const char *format, ...);
+
#endif
diff --git a/tst/winfsp-tests/memfs.c b/tst/winfsp-tests/memfs.c
new file mode 100644
index 00000000..cec536a1
--- /dev/null
+++ b/tst/winfsp-tests/memfs.c
@@ -0,0 +1,97 @@
+/**
+ * @file memfs.c
+ *
+ * @copyright 2015 Bill Zissimopoulos
+ */
+
+#include "memfs.h"
+
+static NTSTATUS GetSecurity(FSP_FILE_SYSTEM *FileSystem,
+ PWSTR FileName, PDWORD PFileAttributes,
+ PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize)
+{
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ FSP_FILE_NODE_INFO *Info)
+{
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+static NTSTATUS Open(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ FSP_FILE_NODE_INFO *Info)
+{
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+static NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ PVOID FileNode, DWORD FileAttributes, BOOLEAN ReplaceFileAttributes,
+ FSP_FILE_SIZE_INFO *Info)
+{
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+static VOID Cleanup(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ PVOID FileNode, BOOLEAN Delete)
+{
+}
+
+static VOID Close(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request,
+ PVOID FileNode)
+{
+}
+
+static FSP_FILE_SYSTEM_INTERFACE MemfsInterface =
+{
+ .GetSecurity = GetSecurity,
+ .Create = Create,
+ .Open = Open,
+ .Overwrite = Overwrite,
+ .Cleanup = Cleanup,
+ .Close = Close,
+};
+
+NTSTATUS MemfsCreate(PWSTR DevicePath, ULONG MaxFileNodes, ULONG MaxFileSize,
+ MEMFS **PMemfs)
+{
+ NTSTATUS Result;
+ FSP_FSCTL_VOLUME_PARAMS VolumeParams;
+ MEMFS *Memfs;
+
+ *PMemfs = 0;
+
+ Memfs = malloc(sizeof *Memfs);
+ if (0 == Memfs)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ memset(Memfs, 0, sizeof *Memfs);
+ Memfs->MaxFileNodes = MaxFileNodes;
+ Memfs->MaxFileSize = MaxFileSize;
+
+ memset(&VolumeParams, 0, sizeof VolumeParams);
+ VolumeParams.FileNameRequired = TRUE;
+ wcscpy_s(VolumeParams.Prefix, sizeof VolumeParams.Prefix / sizeof(WCHAR), L"\\memfs\\share");
+
+ Result = FspFileSystemCreate(DevicePath, &VolumeParams, &MemfsInterface, &Memfs->FileSystem);
+ if (!NT_SUCCESS(Result))
+ {
+ free(Memfs);
+ return Result;
+ }
+
+ *PMemfs = Memfs;
+
+ return STATUS_SUCCESS;
+}
+
+VOID MemfsDelete(MEMFS *Memfs)
+{
+ FspFileSystemDelete(Memfs->FileSystem);
+ free(Memfs);
+}
diff --git a/tst/winfsp-tests/memfs.h b/tst/winfsp-tests/memfs.h
new file mode 100644
index 00000000..0fd677f7
--- /dev/null
+++ b/tst/winfsp-tests/memfs.h
@@ -0,0 +1,23 @@
+/**
+ * @file memfs.h
+ *
+ * @copyright 2015 Bill Zissimopoulos
+ */
+
+#ifndef MEMFS_H_INCLUDED
+#define MEMFS_H_INCLUDED
+
+#include
+
+typedef struct _MEMFS
+{
+ FSP_FILE_SYSTEM *FileSystem;
+ ULONG MaxFileNodes;
+ ULONG MaxFileSize;
+} MEMFS;
+
+NTSTATUS MemfsCreate(PWSTR DevicePath, ULONG MaxFileNodes, ULONG MaxFileSize,
+ MEMFS **PMemfs);
+VOID MemfsDelete(MEMFS *Memfs);
+
+#endif