mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-10-30 19:48:38 -05:00 
			
		
		
		
	sys: FspFsextProvider
This commit is contained in:
		| @@ -29,6 +29,7 @@ | ||||
| #include <ntstrsafe.h> | ||||
| #include <wdmsec.h> | ||||
| #include <winfsp/fsctl.h> | ||||
| #include <winfsp/fsext.h> | ||||
|  | ||||
| /* 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) | ||||
|   | ||||
| @@ -22,7 +22,37 @@ | ||||
| #include <sys/driver.h> | ||||
| #include <winfsp/fsext.h> | ||||
|  | ||||
| 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; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user