mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-10-30 11:38:39 -05:00 
			
		
		
		
	sys: fsext: FsextProvider testing
This commit is contained in:
		| @@ -329,7 +329,7 @@ static NTSTATUS FspFsvolDeviceInit(PDEVICE_OBJECT DeviceObject) | ||||
|     if (0 != FsvolDeviceExtension->VolumeParams.FsextControlCode) | ||||
|     { | ||||
|         FSP_FSEXT_PROVIDER *Provider = FspFsextProvider( | ||||
|             FsvolDeviceExtension->VolumeParams.FsextControlCode, &Result); | ||||
|             FsvolDeviceExtension->VolumeParams.FsextControlCode, 0); | ||||
|         if (0 != Provider) | ||||
|         { | ||||
|             Result = Provider->DeviceInit(DeviceObject, &FsvolDeviceExtension->VolumeParams); | ||||
| @@ -338,10 +338,7 @@ static NTSTATUS FspFsvolDeviceInit(PDEVICE_OBJECT DeviceObject) | ||||
|             FsvolDeviceExtension->InitDoneFsext = 1; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             ASSERT(!NT_SUCCESS(Result)); | ||||
|             return Result; | ||||
|         } | ||||
|             return STATUS_OBJECT_NAME_NOT_FOUND; | ||||
|     } | ||||
|  | ||||
|     /* is there a virtual disk? */ | ||||
|   | ||||
| @@ -1188,7 +1188,7 @@ VOID FspDeviceGlobalUnlock(VOID) | ||||
|     //    STATUS_VOLUME_DISMOUNTED : STATUS_DEVICE_NOT_CONNECTED) | ||||
|  | ||||
| /* fsext */ | ||||
| FSP_FSEXT_PROVIDER *FspFsextProvider(UINT32 ControlCode, PNTSTATUS PLoadResult); | ||||
| FSP_FSEXT_PROVIDER *FspFsextProvider(UINT32 FsextControlCode, PNTSTATUS PLoadResult); | ||||
|  | ||||
| /* process buffers conditional usage */ | ||||
| static inline | ||||
|   | ||||
| @@ -25,7 +25,7 @@ | ||||
| static KSPIN_LOCK FsextSpinLock = 0; | ||||
| FSP_FSEXT_PROVIDER *FsextProvider; | ||||
|  | ||||
| FSP_FSEXT_PROVIDER *FspFsextProvider(UINT32 ControlCode, PNTSTATUS PLoadResult) | ||||
| FSP_FSEXT_PROVIDER *FspFsextProvider(UINT32 FsextControlCode, PNTSTATUS PLoadResult) | ||||
| { | ||||
|     FSP_FSEXT_PROVIDER *Provider; | ||||
|     KIRQL Irql; | ||||
| @@ -33,6 +33,8 @@ FSP_FSEXT_PROVIDER *FspFsextProvider(UINT32 ControlCode, PNTSTATUS PLoadResult) | ||||
|     KeAcquireSpinLock(&FsextSpinLock, &Irql); | ||||
|     Provider = FsextProvider; | ||||
|     KeReleaseSpinLock(&FsextSpinLock, Irql); | ||||
|     if (0 != Provider && FsextControlCode != Provider->DeviceTransactCode) | ||||
|         Provider = 0; | ||||
|  | ||||
|     if (0 != PLoadResult) | ||||
|     { | ||||
| @@ -51,15 +53,12 @@ FSP_FSEXT_PROVIDER *FspFsextProvider(UINT32 ControlCode, PNTSTATUS PLoadResult) | ||||
|  | ||||
|             RtlInitUnicodeString(&Path, L"" FSP_REGKEY "\\Fsext"); | ||||
|             RtlInitEmptyUnicodeString(&Name, Buf, sizeof Buf); | ||||
|             Result = RtlUnicodeStringPrintf(&Name, L"%08x", ControlCode); | ||||
|             Result = RtlUnicodeStringPrintf(&Name, L"%08x", FsextControlCode); | ||||
|             ASSERT(NT_SUCCESS(Result)); | ||||
|             Length = sizeof Value; | ||||
|             Result = FspRegistryGetValue(&Path, &Name, &Value.V, &Length); | ||||
|             if (STATUS_SUCCESS != Result/*!NT_SUCCESS*/) | ||||
|             if (!NT_SUCCESS(Result)) | ||||
|             { | ||||
|                 if (STATUS_BUFFER_OVERFLOW == Result) | ||||
|                     Result = STATUS_BUFFER_TOO_SMALL; | ||||
|  | ||||
|                 *PLoadResult = Result; | ||||
|                 return 0; | ||||
|             } | ||||
| @@ -84,6 +83,8 @@ FSP_FSEXT_PROVIDER *FspFsextProvider(UINT32 ControlCode, PNTSTATUS PLoadResult) | ||||
|             KeAcquireSpinLock(&FsextSpinLock, &Irql); | ||||
|             Provider = FsextProvider; | ||||
|             KeReleaseSpinLock(&FsextSpinLock, Irql); | ||||
|             if (0 != Provider && FsextControlCode != Provider->DeviceTransactCode) | ||||
|                 Provider = 0; | ||||
|         } | ||||
|  | ||||
|         *PLoadResult = 0 != Provider ? STATUS_SUCCESS : STATUS_OBJECT_NAME_NOT_FOUND; | ||||
|   | ||||
| @@ -306,6 +306,7 @@ NTSTATUS FspRegistryGetValue(PUNICODE_STRING Path, PUNICODE_STRING ValueName, | ||||
|         goto exit; | ||||
|  | ||||
|     Result = STATUS_SUCCESS; | ||||
|         /* NOTE: also converts STATUS_BUFFER_OVERFLOW to STATUS_SUCCESS */ | ||||
|  | ||||
| exit: | ||||
|     if (0 != Handle) | ||||
|   | ||||
| @@ -100,6 +100,7 @@ static NTSTATUS FspVolumeCreateNoLock( | ||||
|     UNICODE_STRING VolumeName; | ||||
|     UNICODE_STRING FsmupDeviceName; | ||||
|     WCHAR VolumeNameBuf[FSP_FSCTL_VOLUME_NAME_SIZE / sizeof(WCHAR)]; | ||||
|     FSP_FSEXT_PROVIDER *Provider = 0; | ||||
|     PDEVICE_OBJECT FsvolDeviceObject; | ||||
|     PDEVICE_OBJECT FsvrtDeviceObject; | ||||
|     FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension; | ||||
| @@ -209,6 +210,14 @@ static NTSTATUS FspVolumeCreateNoLock( | ||||
|     VolumeParams.AlwaysUseDoubleBuffering = 1; | ||||
| #endif | ||||
|  | ||||
|     /* load any fsext provider */ | ||||
|     if (0 != VolumeParams.FsextControlCode) | ||||
|     { | ||||
|         Provider = FspFsextProvider(VolumeParams.FsextControlCode, &Result); | ||||
|         if (0 == Provider) | ||||
|             return Result; | ||||
|     } | ||||
|  | ||||
|     /* create volume guid */ | ||||
|     Result = FspCreateGuid(&Guid); | ||||
|     if (!NT_SUCCESS(Result)) | ||||
| @@ -226,7 +235,8 @@ static NTSTATUS FspVolumeCreateNoLock( | ||||
|     VolumeName.MaximumLength = VolumeName.Length; | ||||
|  | ||||
|     /* create the volume (and virtual disk) device(s) */ | ||||
|     Result = FspDeviceCreate(FspFsvolDeviceExtensionKind, 0, | ||||
|     Result = FspDeviceCreate(FspFsvolDeviceExtensionKind, | ||||
|         0 == Provider ? 0 : Provider->DeviceExtensionSize, | ||||
|         FsctlDeviceObject->DeviceType, | ||||
|         FILE_DEVICE_DISK_FILE_SYSTEM == FsctlDeviceObject->DeviceType ? 0 : FILE_REMOTE_DEVICE, | ||||
|         &FsvolDeviceObject); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user