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 NTSTATUS FspDriverInitializeDevices(VOID);
static VOID FspDriverFinalizeDevices(VOID);
static VOID FspDriverFinalizeDevicesForUnload(VOID);
static VOID FspDriverFinalizeDevicesEx(BOOLEAN DeleteDevices);
NTSTATUS FspDriverUnload(
PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
@ -36,6 +37,7 @@ NTSTATUS FspDriverUnload(
#pragma alloc_text(INIT, FspDriverMultiVersionInitialize)
#pragma alloc_text(PAGE, FspDriverInitializeDevices)
#pragma alloc_text(PAGE, FspDriverFinalizeDevices)
#pragma alloc_text(PAGE, FspDriverFinalizeDevicesForUnload)
#pragma alloc_text(PAGE, FspDriverFinalizeDevicesEx)
#pragma alloc_text(PAGE, FspDriverUnload)
#endif
@ -406,6 +408,13 @@ static VOID FspDriverFinalizeDevices(VOID)
FspDriverFinalizeDevicesEx(TRUE);
}
static VOID FspDriverFinalizeDevicesForUnload(VOID)
{
PAGED_CODE();
FspDriverFinalizeDevicesEx(FALSE);
}
static VOID FspDriverFinalizeDevicesEx(BOOLEAN DeleteDevices)
{
PAGED_CODE();
@ -510,7 +519,8 @@ NTSTATUS FspDriverUnload(
if (!NT_SUCCESS(Result))
goto exit;
FspDriverFinalizeDevicesEx(FALSE);
FspSiloEnumerate(FspDriverFinalizeDevicesForUnload);
FspDriverFinalizeDevicesForUnload();
Result = FspDeviceCopyList(&DeviceObjects, &DeviceObjectCount);
if (NT_SUCCESS(Result))

View File

@ -751,6 +751,8 @@ PUNICODE_STRING FspSxsSuffix(VOID);
/* silos */
typedef struct
{
PVOID Silo;
LIST_ENTRY ListEntry;
PDEVICE_OBJECT FsctlDiskDeviceObject;
PDEVICE_OBJECT FsctlNetDeviceObject;
PDEVICE_OBJECT FsmupDeviceObject;
@ -760,6 +762,7 @@ typedef struct
} FSP_SILO_GLOBALS;
typedef NTSTATUS (*FSP_SILO_INIT_CALLBACK)(VOID);
typedef VOID (*FSP_SILO_FINI_CALLBACK)(VOID);
typedef VOID (*FSP_SILO_ENUM_CALLBACK)(VOID);
BOOLEAN FspSiloIsHost(VOID);
NTSTATUS FspSiloGetGlobals(FSP_SILO_GLOBALS **PGlobals);
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 FspSiloPostInitialize(VOID);
VOID FspSiloFinalize(VOID);
VOID FspSiloEnumerate(FSP_SILO_ENUM_CALLBACK EnumFn);
/* process buffers */
#define FspProcessBufferSizeMax (64 * 1024)

View File

@ -110,6 +110,9 @@ static FSP_SILO_INIT_CALLBACK FspSiloInitCallback;
static FSP_SILO_FINI_CALLBACK FspSiloFiniCallback;
static BOOLEAN FspSiloInitDone = FALSE;
static FAST_MUTEX FspSiloListMutex;
static LIST_ENTRY FspSiloList;
static FSP_SILO_GLOBALS FspSiloHostGlobals;
#define FSP_SILO_MONITOR_REGISTRATION_VERSION 1
@ -196,6 +199,7 @@ static NTSTATUS NTAPI FspSiloMonitorCreateCallback(FSP_PESILO Silo)
if (!NT_SUCCESS(Result))
goto exit;
RtlZeroMemory(Globals, sizeof(FSP_SILO_GLOBALS));
Globals->Silo = Silo;
/* PsInsertSiloContext adds reference to Globals */
Result = CALL(PsInsertSiloContext)(Silo, ContextSlot, Globals);
@ -203,6 +207,8 @@ static NTSTATUS NTAPI FspSiloMonitorCreateCallback(FSP_PESILO Silo)
goto exit;
Inserted = TRUE;
ExAcquireFastMutexUnsafe(&FspSiloListMutex);
if (0 != FspSiloInitCallback)
{
FSP_PESILO PreviousSilo = CALL(PsAttachSiloToCurrentThread)(Silo);
@ -210,6 +216,11 @@ static NTSTATUS NTAPI FspSiloMonitorCreateCallback(FSP_PESILO Silo)
CALL(PsDetachSiloFromCurrentThread)(PreviousSilo);
}
if (NT_SUCCESS(Result))
InsertTailList(&FspSiloList, &Globals->ListEntry);
ExReleaseFastMutexUnsafe(&FspSiloListMutex);
exit:
if (!NT_SUCCESS(Result))
{
@ -244,6 +255,10 @@ static VOID NTAPI FspSiloMonitorTerminateCallback(FSP_PESILO Silo)
Result = CALL(PsGetSiloContext)(Silo, ContextSlot, &Globals);
if (!NT_SUCCESS(Result))
return;
ExAcquireFastMutexUnsafe(&FspSiloListMutex);
RemoveEntryList(&Globals->ListEntry);
CALL(PsDereferenceSiloContext)(Globals);
Globals = 0;
@ -254,6 +269,8 @@ static VOID NTAPI FspSiloMonitorTerminateCallback(FSP_PESILO Silo)
CALL(PsDetachSiloFromCurrentThread)(PreviousSilo);
}
ExReleaseFastMutexUnsafe(&FspSiloListMutex);
/* PsRemoveSiloContext removes reference to Globals (possibly freeing it) */
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))
goto exit;
ExInitializeFastMutex(&FspSiloListMutex);
InitializeListHead(&FspSiloList);
FspSiloMonitor = Monitor;
FspSiloInitCallback = Init;
FspSiloFiniCallback = Fini;
@ -334,8 +354,43 @@ VOID FspSiloFinalize(VOID)
CALL(PsUnregisterSiloMonitor)(FspSiloMonitor);
#if DBG
ExAcquireFastMutexUnsafe(&FspSiloListMutex);
ASSERT(IsListEmpty(&FspSiloList));
ExReleaseFastMutexUnsafe(&FspSiloListMutex);
#endif
FspSiloMonitor = 0;
FspSiloInitCallback = 0;
FspSiloFiniCallback = 0;
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-tests-%Suffix%.exe
memfs-%Suffix%.exe
fsptool-%Suffix%.exe
deploy-setup.bat
docker-run.bat
) do (