mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 08:23:05 -05:00
sys: FspSiloEnumerate, FspDriverFinalizeDevicesForUnload
This commit is contained in:
parent
c237a55951
commit
0eb6912296
@ -26,6 +26,7 @@ static DRIVER_UNLOAD DriverUnload;
|
|||||||
static VOID FspDriverMultiVersionInitialize(VOID);
|
static VOID FspDriverMultiVersionInitialize(VOID);
|
||||||
static NTSTATUS FspDriverInitializeDevices(VOID);
|
static NTSTATUS FspDriverInitializeDevices(VOID);
|
||||||
static VOID FspDriverFinalizeDevices(VOID);
|
static VOID FspDriverFinalizeDevices(VOID);
|
||||||
|
static VOID FspDriverFinalizeDevicesForUnload(VOID);
|
||||||
static VOID FspDriverFinalizeDevicesEx(BOOLEAN DeleteDevices);
|
static VOID FspDriverFinalizeDevicesEx(BOOLEAN DeleteDevices);
|
||||||
NTSTATUS FspDriverUnload(
|
NTSTATUS FspDriverUnload(
|
||||||
PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
|
PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
|
||||||
@ -36,6 +37,7 @@ NTSTATUS FspDriverUnload(
|
|||||||
#pragma alloc_text(INIT, FspDriverMultiVersionInitialize)
|
#pragma alloc_text(INIT, FspDriverMultiVersionInitialize)
|
||||||
#pragma alloc_text(PAGE, FspDriverInitializeDevices)
|
#pragma alloc_text(PAGE, FspDriverInitializeDevices)
|
||||||
#pragma alloc_text(PAGE, FspDriverFinalizeDevices)
|
#pragma alloc_text(PAGE, FspDriverFinalizeDevices)
|
||||||
|
#pragma alloc_text(PAGE, FspDriverFinalizeDevicesForUnload)
|
||||||
#pragma alloc_text(PAGE, FspDriverFinalizeDevicesEx)
|
#pragma alloc_text(PAGE, FspDriverFinalizeDevicesEx)
|
||||||
#pragma alloc_text(PAGE, FspDriverUnload)
|
#pragma alloc_text(PAGE, FspDriverUnload)
|
||||||
#endif
|
#endif
|
||||||
@ -406,6 +408,13 @@ static VOID FspDriverFinalizeDevices(VOID)
|
|||||||
FspDriverFinalizeDevicesEx(TRUE);
|
FspDriverFinalizeDevicesEx(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VOID FspDriverFinalizeDevicesForUnload(VOID)
|
||||||
|
{
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
|
FspDriverFinalizeDevicesEx(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
static VOID FspDriverFinalizeDevicesEx(BOOLEAN DeleteDevices)
|
static VOID FspDriverFinalizeDevicesEx(BOOLEAN DeleteDevices)
|
||||||
{
|
{
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
@ -510,7 +519,8 @@ NTSTATUS FspDriverUnload(
|
|||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
FspDriverFinalizeDevicesEx(FALSE);
|
FspSiloEnumerate(FspDriverFinalizeDevicesForUnload);
|
||||||
|
FspDriverFinalizeDevicesForUnload();
|
||||||
|
|
||||||
Result = FspDeviceCopyList(&DeviceObjects, &DeviceObjectCount);
|
Result = FspDeviceCopyList(&DeviceObjects, &DeviceObjectCount);
|
||||||
if (NT_SUCCESS(Result))
|
if (NT_SUCCESS(Result))
|
||||||
|
@ -751,6 +751,8 @@ PUNICODE_STRING FspSxsSuffix(VOID);
|
|||||||
/* silos */
|
/* silos */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
PVOID Silo;
|
||||||
|
LIST_ENTRY ListEntry;
|
||||||
PDEVICE_OBJECT FsctlDiskDeviceObject;
|
PDEVICE_OBJECT FsctlDiskDeviceObject;
|
||||||
PDEVICE_OBJECT FsctlNetDeviceObject;
|
PDEVICE_OBJECT FsctlNetDeviceObject;
|
||||||
PDEVICE_OBJECT FsmupDeviceObject;
|
PDEVICE_OBJECT FsmupDeviceObject;
|
||||||
@ -760,6 +762,7 @@ typedef struct
|
|||||||
} FSP_SILO_GLOBALS;
|
} FSP_SILO_GLOBALS;
|
||||||
typedef NTSTATUS (*FSP_SILO_INIT_CALLBACK)(VOID);
|
typedef NTSTATUS (*FSP_SILO_INIT_CALLBACK)(VOID);
|
||||||
typedef VOID (*FSP_SILO_FINI_CALLBACK)(VOID);
|
typedef VOID (*FSP_SILO_FINI_CALLBACK)(VOID);
|
||||||
|
typedef VOID (*FSP_SILO_ENUM_CALLBACK)(VOID);
|
||||||
BOOLEAN FspSiloIsHost(VOID);
|
BOOLEAN FspSiloIsHost(VOID);
|
||||||
NTSTATUS FspSiloGetGlobals(FSP_SILO_GLOBALS **PGlobals);
|
NTSTATUS FspSiloGetGlobals(FSP_SILO_GLOBALS **PGlobals);
|
||||||
VOID FspSiloDereferenceGlobals(FSP_SILO_GLOBALS *Globals);
|
VOID FspSiloDereferenceGlobals(FSP_SILO_GLOBALS *Globals);
|
||||||
@ -767,6 +770,7 @@ VOID FspSiloGetContainerId(GUID *ContainerId);
|
|||||||
NTSTATUS FspSiloInitialize(FSP_SILO_INIT_CALLBACK Init, FSP_SILO_FINI_CALLBACK Fini);
|
NTSTATUS FspSiloInitialize(FSP_SILO_INIT_CALLBACK Init, FSP_SILO_FINI_CALLBACK Fini);
|
||||||
NTSTATUS FspSiloPostInitialize(VOID);
|
NTSTATUS FspSiloPostInitialize(VOID);
|
||||||
VOID FspSiloFinalize(VOID);
|
VOID FspSiloFinalize(VOID);
|
||||||
|
VOID FspSiloEnumerate(FSP_SILO_ENUM_CALLBACK EnumFn);
|
||||||
|
|
||||||
/* process buffers */
|
/* process buffers */
|
||||||
#define FspProcessBufferSizeMax (64 * 1024)
|
#define FspProcessBufferSizeMax (64 * 1024)
|
||||||
|
@ -110,6 +110,9 @@ static FSP_SILO_INIT_CALLBACK FspSiloInitCallback;
|
|||||||
static FSP_SILO_FINI_CALLBACK FspSiloFiniCallback;
|
static FSP_SILO_FINI_CALLBACK FspSiloFiniCallback;
|
||||||
static BOOLEAN FspSiloInitDone = FALSE;
|
static BOOLEAN FspSiloInitDone = FALSE;
|
||||||
|
|
||||||
|
static FAST_MUTEX FspSiloListMutex;
|
||||||
|
static LIST_ENTRY FspSiloList;
|
||||||
|
|
||||||
static FSP_SILO_GLOBALS FspSiloHostGlobals;
|
static FSP_SILO_GLOBALS FspSiloHostGlobals;
|
||||||
|
|
||||||
#define FSP_SILO_MONITOR_REGISTRATION_VERSION 1
|
#define FSP_SILO_MONITOR_REGISTRATION_VERSION 1
|
||||||
@ -196,6 +199,7 @@ static NTSTATUS NTAPI FspSiloMonitorCreateCallback(FSP_PESILO Silo)
|
|||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
goto exit;
|
goto exit;
|
||||||
RtlZeroMemory(Globals, sizeof(FSP_SILO_GLOBALS));
|
RtlZeroMemory(Globals, sizeof(FSP_SILO_GLOBALS));
|
||||||
|
Globals->Silo = Silo;
|
||||||
|
|
||||||
/* PsInsertSiloContext adds reference to Globals */
|
/* PsInsertSiloContext adds reference to Globals */
|
||||||
Result = CALL(PsInsertSiloContext)(Silo, ContextSlot, Globals);
|
Result = CALL(PsInsertSiloContext)(Silo, ContextSlot, Globals);
|
||||||
@ -203,6 +207,8 @@ static NTSTATUS NTAPI FspSiloMonitorCreateCallback(FSP_PESILO Silo)
|
|||||||
goto exit;
|
goto exit;
|
||||||
Inserted = TRUE;
|
Inserted = TRUE;
|
||||||
|
|
||||||
|
ExAcquireFastMutexUnsafe(&FspSiloListMutex);
|
||||||
|
|
||||||
if (0 != FspSiloInitCallback)
|
if (0 != FspSiloInitCallback)
|
||||||
{
|
{
|
||||||
FSP_PESILO PreviousSilo = CALL(PsAttachSiloToCurrentThread)(Silo);
|
FSP_PESILO PreviousSilo = CALL(PsAttachSiloToCurrentThread)(Silo);
|
||||||
@ -210,6 +216,11 @@ static NTSTATUS NTAPI FspSiloMonitorCreateCallback(FSP_PESILO Silo)
|
|||||||
CALL(PsDetachSiloFromCurrentThread)(PreviousSilo);
|
CALL(PsDetachSiloFromCurrentThread)(PreviousSilo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (NT_SUCCESS(Result))
|
||||||
|
InsertTailList(&FspSiloList, &Globals->ListEntry);
|
||||||
|
|
||||||
|
ExReleaseFastMutexUnsafe(&FspSiloListMutex);
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
{
|
{
|
||||||
@ -244,6 +255,10 @@ static VOID NTAPI FspSiloMonitorTerminateCallback(FSP_PESILO Silo)
|
|||||||
Result = CALL(PsGetSiloContext)(Silo, ContextSlot, &Globals);
|
Result = CALL(PsGetSiloContext)(Silo, ContextSlot, &Globals);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
ExAcquireFastMutexUnsafe(&FspSiloListMutex);
|
||||||
|
|
||||||
|
RemoveEntryList(&Globals->ListEntry);
|
||||||
CALL(PsDereferenceSiloContext)(Globals);
|
CALL(PsDereferenceSiloContext)(Globals);
|
||||||
Globals = 0;
|
Globals = 0;
|
||||||
|
|
||||||
@ -254,6 +269,8 @@ static VOID NTAPI FspSiloMonitorTerminateCallback(FSP_PESILO Silo)
|
|||||||
CALL(PsDetachSiloFromCurrentThread)(PreviousSilo);
|
CALL(PsDetachSiloFromCurrentThread)(PreviousSilo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ExReleaseFastMutexUnsafe(&FspSiloListMutex);
|
||||||
|
|
||||||
/* PsRemoveSiloContext removes reference to Globals (possibly freeing it) */
|
/* PsRemoveSiloContext removes reference to Globals (possibly freeing it) */
|
||||||
CALL(PsRemoveSiloContext)(Silo, ContextSlot, 0);
|
CALL(PsRemoveSiloContext)(Silo, ContextSlot, 0);
|
||||||
}
|
}
|
||||||
@ -300,6 +317,9 @@ NTSTATUS FspSiloInitialize(FSP_SILO_INIT_CALLBACK Init, FSP_SILO_FINI_CALLBACK F
|
|||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
|
ExInitializeFastMutex(&FspSiloListMutex);
|
||||||
|
InitializeListHead(&FspSiloList);
|
||||||
|
|
||||||
FspSiloMonitor = Monitor;
|
FspSiloMonitor = Monitor;
|
||||||
FspSiloInitCallback = Init;
|
FspSiloInitCallback = Init;
|
||||||
FspSiloFiniCallback = Fini;
|
FspSiloFiniCallback = Fini;
|
||||||
@ -334,8 +354,43 @@ VOID FspSiloFinalize(VOID)
|
|||||||
|
|
||||||
CALL(PsUnregisterSiloMonitor)(FspSiloMonitor);
|
CALL(PsUnregisterSiloMonitor)(FspSiloMonitor);
|
||||||
|
|
||||||
|
#if DBG
|
||||||
|
ExAcquireFastMutexUnsafe(&FspSiloListMutex);
|
||||||
|
ASSERT(IsListEmpty(&FspSiloList));
|
||||||
|
ExReleaseFastMutexUnsafe(&FspSiloListMutex);
|
||||||
|
#endif
|
||||||
|
|
||||||
FspSiloMonitor = 0;
|
FspSiloMonitor = 0;
|
||||||
FspSiloInitCallback = 0;
|
FspSiloInitCallback = 0;
|
||||||
FspSiloFiniCallback = 0;
|
FspSiloFiniCallback = 0;
|
||||||
FspSiloInitDone = FALSE;
|
FspSiloInitDone = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VOID FspSiloEnumerate(FSP_SILO_ENUM_CALLBACK EnumFn)
|
||||||
|
{
|
||||||
|
KAPC_STATE ApcState;
|
||||||
|
PLIST_ENTRY ListEntry;
|
||||||
|
FSP_SILO_GLOBALS *Globals;
|
||||||
|
|
||||||
|
ExAcquireFastMutexUnsafe(&FspSiloListMutex);
|
||||||
|
|
||||||
|
if (!IsListEmpty(&FspSiloList))
|
||||||
|
{
|
||||||
|
KeStackAttachProcess(PsInitialSystemProcess, &ApcState);
|
||||||
|
|
||||||
|
for (ListEntry = FspSiloList.Flink;
|
||||||
|
&FspSiloList != ListEntry;
|
||||||
|
ListEntry = ListEntry->Flink)
|
||||||
|
{
|
||||||
|
Globals = CONTAINING_RECORD(ListEntry, FSP_SILO_GLOBALS, ListEntry);
|
||||||
|
|
||||||
|
FSP_PESILO PreviousSilo = CALL(PsAttachSiloToCurrentThread)(Globals->Silo);
|
||||||
|
EnumFn();
|
||||||
|
CALL(PsDetachSiloFromCurrentThread)(PreviousSilo);
|
||||||
|
}
|
||||||
|
|
||||||
|
KeUnstackDetachProcess(&ApcState);
|
||||||
|
}
|
||||||
|
|
||||||
|
ExReleaseFastMutexUnsafe(&FspSiloListMutex);
|
||||||
|
}
|
||||||
|
@ -27,6 +27,7 @@ for %%f in (
|
|||||||
winfsp-%Suffix%.dll
|
winfsp-%Suffix%.dll
|
||||||
winfsp-tests-%Suffix%.exe
|
winfsp-tests-%Suffix%.exe
|
||||||
memfs-%Suffix%.exe
|
memfs-%Suffix%.exe
|
||||||
|
fsptool-%Suffix%.exe
|
||||||
deploy-setup.bat
|
deploy-setup.bat
|
||||||
docker-run.bat
|
docker-run.bat
|
||||||
) do (
|
) do (
|
||||||
|
Loading…
x
Reference in New Issue
Block a user