mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-25 01:42:24 -05:00
108 lines
2.7 KiB
C
108 lines
2.7 KiB
C
/**
|
|
* @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
|
|
* 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 <dll/library.h>
|
|
|
|
HINSTANCE DllInstance;
|
|
|
|
BOOL WINAPI DllMain(HINSTANCE Instance, DWORD Reason, PVOID Reserved)
|
|
{
|
|
BOOLEAN Dynamic;
|
|
|
|
switch (Reason)
|
|
{
|
|
case DLL_PROCESS_ATTACH:
|
|
DllInstance = Instance;
|
|
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);
|
|
FspEventLogFinalize(Dynamic);
|
|
FspPosixFinalize(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*/;
|
|
}
|