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