diff --git a/src/sys/driver.h b/src/sys/driver.h index 973c8ae0..9621edfb 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -29,6 +29,7 @@ #include #include #include +#include /* disable warnings */ #pragma warning(disable:4100) /* unreferenced formal parameter */ @@ -1085,6 +1086,7 @@ typedef struct PNOTIFY_SYNC NotifySync; LIST_ENTRY NotifyList; FSP_STATISTICS *Statistics; + FSP_FSCTL_DECLSPEC_ALIGN UINT8 FsextData[]; } FSP_FSVOL_DEVICE_EXTENSION; typedef struct { @@ -1176,6 +1178,9 @@ VOID FspDeviceGlobalUnlock(VOID) //(FILE_DEVICE_DISK_FILE_SYSTEM == (DeviceObject)->DeviceType ?\ // STATUS_VOLUME_DISMOUNTED : STATUS_DEVICE_NOT_CONNECTED) +/* fsext */ +FSP_FSEXT_PROVIDER *FspFsextProvider(VOID); + /* process buffers conditional usage */ static inline BOOLEAN FspReadIrpShouldUseProcessBuffer(PIRP Irp, SIZE_T BufferSize) diff --git a/src/sys/fsext.c b/src/sys/fsext.c index 58459c1e..1c3e1ce3 100644 --- a/src/sys/fsext.c +++ b/src/sys/fsext.c @@ -22,7 +22,37 @@ #include #include +static KSPIN_LOCK FsextSpinLock = 0; +FSP_FSEXT_PROVIDER *FsextProvider; + +FSP_FSEXT_PROVIDER *FspFsextProvider(VOID) +{ + FSP_FSEXT_PROVIDER *Provider; + KIRQL Irql; + + KeAcquireSpinLock(&FsextSpinLock, &Irql); + Provider = FsextProvider; + KeReleaseSpinLock(&FsextSpinLock, Irql); + + return Provider; +} + NTSTATUS FspFsextProviderRegister(FSP_FSEXT_PROVIDER *Provider) { - return STATUS_TOO_LATE; + NTSTATUS Result; + KIRQL Irql; + + KeAcquireSpinLock(&FsextSpinLock, &Irql); + if (0 != FsextProvider) + { + Result = STATUS_TOO_LATE; + goto exit; + } + Provider->DeviceExtensionOffset = FIELD_OFFSET(FSP_FSVOL_DEVICE_EXTENSION, FsextData); + FsextProvider = Provider; + Result = STATUS_SUCCESS; +exit: + KeReleaseSpinLock(&FsextSpinLock, Irql); + + return Result; }