mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 08:23:05 -05:00
sys: fsext: FsextProvider testing
This commit is contained in:
parent
adc759447e
commit
dcf7e4c5a6
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%
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user