diff --git a/build/VStudio/winfsp_dll.vcxproj b/build/VStudio/winfsp_dll.vcxproj
index 0f9638e6..7fd0ff17 100644
--- a/build/VStudio/winfsp_dll.vcxproj
+++ b/build/VStudio/winfsp_dll.vcxproj
@@ -23,6 +23,7 @@
+
diff --git a/build/VStudio/winfsp_dll.vcxproj.filters b/build/VStudio/winfsp_dll.vcxproj.filters
index d015fe01..b5b3be22 100644
--- a/build/VStudio/winfsp_dll.vcxproj.filters
+++ b/build/VStudio/winfsp_dll.vcxproj.filters
@@ -12,6 +12,9 @@
{1d6501f4-cebd-4a00-a774-deb782b59fb5}
+
+ {c7b83307-0aa0-4593-b2d4-26ff2f1edfc6}
+
@@ -23,6 +26,9 @@
Source
+
+ Include\shared
+
diff --git a/src/dll/library.c b/src/dll/library.c
index aa2863dd..8cf0cf9e 100644
--- a/src/dll/library.c
+++ b/src/dll/library.c
@@ -67,13 +67,11 @@ BOOL WINAPI DllMain(HINSTANCE Instance, DWORD Reason, PVOID Reserved)
return TRUE;
}
-/* see comments in library.h */
-#if defined(WINFSP_DLL_NODEFAULTLIB)
+/* see comments in shared/minimal.h */
BOOL WINAPI _DllMainCRTStartup(HINSTANCE Instance, DWORD Reason, PVOID Reserved)
{
return DllMain(Instance, Reason, Reserved);
}
-#endif
HRESULT WINAPI DllRegisterServer(VOID)
{
diff --git a/src/dll/library.h b/src/dll/library.h
index bc9ec55a..50b24fd3 100644
--- a/src/dll/library.h
+++ b/src/dll/library.h
@@ -19,8 +19,8 @@
#define WINFSP_DLL_LIBRARY_H_INCLUDED
#define WINFSP_DLL_INTERNAL
-#define WINFSP_DLL_NODEFAULTLIB
#include
+#include
#include
#define LIBRARY_NAME "WinFsp"
@@ -36,73 +36,6 @@
#define DEBUGLOGSD(fmt, SD) ((void)0)
#endif
-static inline PVOID MemAlloc(SIZE_T Size)
-{
- extern HANDLE ProcessHeap;
- return HeapAlloc(ProcessHeap, 0, Size);
-}
-static inline VOID MemFree(PVOID Pointer)
-{
- extern HANDLE ProcessHeap;
- if (0 != Pointer)
- HeapFree(ProcessHeap, 0, Pointer);
-}
-
-/*
- * Define WINFSP_DLL_NODEFAULTLIB to eliminate dependency on the MSVCRT libraries.
- *
- * For this to work the following project settings must be set:
- * - "C/C++ > General > SDL checks" must be empty (not "Yes" or "No").
- * - "C/C++ > Code Generation > Basic Runtime Checks" must be set to "Default"
- * - "C/C++ > Code Generation > Security Check" must be disabled (/GS-).
- * - "Linker > Input > Ignore All Default Libraries" must be "Yes".
- */
-#if defined(WINFSP_DLL_NODEFAULTLIB)
-#undef RtlFillMemory
-#undef RtlMoveMemory
-NTSYSAPI VOID NTAPI RtlFillMemory(VOID *Destination, DWORD Length, BYTE Fill);
-NTSYSAPI VOID NTAPI RtlMoveMemory(VOID *Destination, CONST VOID *Source, DWORD Length);
-
-#pragma function(memcpy)
-#pragma function(memset)
-static inline
-void *memcpy(void *dst, const void *src, size_t siz)
-{
- RtlMoveMemory(dst, src, (DWORD)siz);
- return dst;
-}
-static inline
-void *memset(void *dst, int val, size_t siz)
-{
- RtlFillMemory(dst, (DWORD)siz, val);
- return dst;
-}
-#endif
-
-static FORCEINLINE
-VOID InsertTailList(PLIST_ENTRY ListHead, PLIST_ENTRY Entry)
-{
- PLIST_ENTRY Blink;
-
- Blink = ListHead->Blink;
- Entry->Flink = ListHead;
- Entry->Blink = Blink;
- Blink->Flink = Entry;
- ListHead->Blink = Entry;
-}
-static FORCEINLINE
-BOOLEAN RemoveEntryList(PLIST_ENTRY Entry)
-{
- PLIST_ENTRY Blink;
- PLIST_ENTRY Flink;
-
- Flink = Entry->Flink;
- Blink = Entry->Blink;
- Blink->Flink = Flink;
- Flink->Blink = Blink;
- return Flink == Blink;
-}
-
VOID FspNtStatusInitialize(BOOLEAN Dynamic);
VOID FspNtStatusFinalize(BOOLEAN Dynamic);
VOID FspEventLogInitialize(BOOLEAN Dynamic);
diff --git a/src/shared/minimal.h b/src/shared/minimal.h
new file mode 100644
index 00000000..e3244f9f
--- /dev/null
+++ b/src/shared/minimal.h
@@ -0,0 +1,87 @@
+/**
+ * @file shared/minimal.h
+ *
+ * @copyright 2015-2016 Bill Zissimopoulos
+ */
+/*
+ * This file is part of WinFsp.
+ *
+ * You can redistribute it and/or modify it under the terms of the
+ * GNU Affero General Public License version 3 as published by the
+ * Free Software Foundation.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * software.
+ */
+
+#ifndef WINFSP_SHARED_MINIMAL_H_INCLUDED
+#define WINFSP_SHARED_MINIMAL_H_INCLUDED
+
+/*
+ * Eliminate dependency on the MSVCRT libraries.
+ *
+ * For this to work the following project settings must be set:
+ * - "C/C++ > General > SDL checks" must be empty (not "Yes" or "No").
+ * - "C/C++ > Code Generation > Basic Runtime Checks" must be set to "Default"
+ * - "C/C++ > Code Generation > Security Check" must be disabled (/GS-).
+ * - "Linker > Input > Ignore All Default Libraries" must be "Yes".
+ */
+
+#undef RtlFillMemory
+#undef RtlMoveMemory
+NTSYSAPI VOID NTAPI RtlFillMemory(VOID *Destination, DWORD Length, BYTE Fill);
+NTSYSAPI VOID NTAPI RtlMoveMemory(VOID *Destination, CONST VOID *Source, DWORD Length);
+
+#pragma function(memcpy)
+#pragma function(memset)
+static inline
+void *memcpy(void *dst, const void *src, size_t siz)
+{
+ RtlMoveMemory(dst, src, (DWORD)siz);
+ return dst;
+}
+static inline
+void *memset(void *dst, int val, size_t siz)
+{
+ RtlFillMemory(dst, (DWORD)siz, val);
+ return dst;
+}
+
+static inline PVOID MemAlloc(SIZE_T Size)
+{
+ extern HANDLE ProcessHeap;
+ return HeapAlloc(ProcessHeap, 0, Size);
+}
+static inline VOID MemFree(PVOID Pointer)
+{
+ extern HANDLE ProcessHeap;
+ if (0 != Pointer)
+ HeapFree(ProcessHeap, 0, Pointer);
+}
+
+static FORCEINLINE
+VOID InsertTailList(PLIST_ENTRY ListHead, PLIST_ENTRY Entry)
+{
+ PLIST_ENTRY Blink;
+
+ Blink = ListHead->Blink;
+ Entry->Flink = ListHead;
+ Entry->Blink = Blink;
+ Blink->Flink = Entry;
+ ListHead->Blink = Entry;
+}
+static FORCEINLINE
+BOOLEAN RemoveEntryList(PLIST_ENTRY Entry)
+{
+ PLIST_ENTRY Blink;
+ PLIST_ENTRY Flink;
+
+ Flink = Entry->Flink;
+ Blink = Entry->Blink;
+ Blink->Flink = Flink;
+ Flink->Blink = Blink;
+ return Flink == Blink;
+}
+
+#endif