sys: FspSiloEnumerate, FspDriverFinalizeDevicesForUnload

This commit is contained in:
Bill Zissimopoulos 2022-10-01 10:47:18 +01:00
parent c237a55951
commit 0eb6912296
4 changed files with 71 additions and 1 deletions

View File

@ -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))

View File

@ -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)

View File

@ -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);
}

View File

@ -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 (