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