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)
|
||||
{
|
||||
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);
|
||||
|
@ -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%
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user