diff --git a/opt/fsext/lib/winfsp-x64.lib b/opt/fsext/lib/winfsp-x64.lib index a1192e27..9d30816f 100644 Binary files a/opt/fsext/lib/winfsp-x64.lib and b/opt/fsext/lib/winfsp-x64.lib differ diff --git a/opt/fsext/lib/winfsp-x86.lib b/opt/fsext/lib/winfsp-x86.lib index f34538f0..6616c9bb 100644 Binary files a/opt/fsext/lib/winfsp-x86.lib and b/opt/fsext/lib/winfsp-x86.lib differ diff --git a/src/sys/device.c b/src/sys/device.c index 321dcd6c..63cf14e0 100644 --- a/src/sys/device.c +++ b/src/sys/device.c @@ -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? */ diff --git a/src/sys/driver.h b/src/sys/driver.h index ecf63697..73e20fd3 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -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 diff --git a/src/sys/fsext.c b/src/sys/fsext.c index b11a428f..38272502 100644 --- a/src/sys/fsext.c +++ b/src/sys/fsext.c @@ -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; diff --git a/src/sys/util.c b/src/sys/util.c index 92ddcc04..1268f7cf 100644 --- a/src/sys/util.c +++ b/src/sys/util.c @@ -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) diff --git a/src/sys/volume.c b/src/sys/volume.c index 77792dba..7e9ae3b0 100644 --- a/src/sys/volume.c +++ b/src/sys/volume.c @@ -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); diff --git a/tools/impdef.bat b/tools/impdef.bat index 60e13df5..8abbec83 100644 --- a/tools/impdef.bat +++ b/tools/impdef.bat @@ -10,7 +10,7 @@ set infile=%infile:/=\% set outfile=%2 set outfile=%outfile:/=\% set workdir=!infile!.work -set workbase=!workdir!\%~n1 +set workbase=!workdir!\%~n2 set outarch=%~n2 set outarch=%outarch:~-3%