/** * @file dll/library.c * * @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. */ #include HINSTANCE DllInstance; HANDLE ProcessHeap; BOOL WINAPI DllMain(HINSTANCE Instance, DWORD Reason, PVOID Reserved) { BOOLEAN Dynamic; switch (Reason) { case DLL_PROCESS_ATTACH: DllInstance = Instance; ProcessHeap = GetProcessHeap(); if (0 == ProcessHeap) return FALSE; /* * These functions are called during DLL_PROCESS_ATTACH. We must therefore keep * initialization tasks to a minimum. * * See the DLL best practices document: * https://msdn.microsoft.com/en-us/library/windows/desktop/dn633971(v=vs.85).aspx */ Dynamic = 0 == Reserved; FspNtStatusInitialize(Dynamic); FspEventLogInitialize(Dynamic); FspFileSystemInitialize(Dynamic); FspServiceInitialize(Dynamic); fsp_fuse_initialize(Dynamic); break; case DLL_PROCESS_DETACH: /* * These functions are called during DLL_PROCESS_DETACH. We must therefore keep * finalization tasks to a minimum. * * See the following documents: * https://msdn.microsoft.com/en-us/library/windows/desktop/dn633971(v=vs.85).aspx * https://blogs.msdn.microsoft.com/oldnewthing/20070503-00/?p=27003/ * https://blogs.msdn.microsoft.com/oldnewthing/20100122-00/?p=15193/ */ Dynamic = 0 == Reserved; fsp_fuse_finalize(Dynamic); FspServiceFinalize(Dynamic); FspFileSystemFinalize(Dynamic); FspEventLogFinalize(Dynamic); FspNtStatusFinalize(Dynamic); break; case DLL_THREAD_DETACH: fsp_fuse_finalize_thread(); break; } return TRUE; } /* see comments in shared/minimal.h */ BOOL WINAPI _DllMainCRTStartup(HINSTANCE Instance, DWORD Reason, PVOID Reserved) { return DllMain(Instance, Reason, Reserved); } HRESULT WINAPI DllRegisterServer(VOID) { NTSTATUS Result; Result = FspFsctlRegister(); FspDebugLog("FspFsctlRegister = %lx\n", Result); if (!NT_SUCCESS(Result)) goto exit; /* ignore errors below; these are non-critical */ Result = FspNpRegister(); FspDebugLog("FspNpRegister = %lx\n", Result); Result = FspEventLogRegister(); FspDebugLog("FspEventLogRegister = %lx\n", Result); Result = STATUS_SUCCESS; exit: return NT_SUCCESS(Result) ? S_OK : 0x80040201/*SELFREG_E_CLASS*/; } HRESULT WINAPI DllUnregisterServer(VOID) { NTSTATUS Result; Result = FspFsctlUnregister(); FspDebugLog("FspFsctlUnregister = %lx\n", Result); if (!NT_SUCCESS(Result)) goto exit; /* ignore errors below; these are non-critical */ Result = FspNpUnregister(); FspDebugLog("FspNpUnregister = %lx\n", Result); Result = FspEventLogUnregister(); FspDebugLog("FspEventLogUnregister = %lx\n", Result); Result = STATUS_SUCCESS; exit: return NT_SUCCESS(Result) ? S_OK : 0x80040201/*SELFREG_E_CLASS*/; }