sys: fsext: FsextProvider testing

This commit is contained in:
Bill Zissimopoulos 2019-06-22 14:30:23 -07:00
parent adc759447e
commit dcf7e4c5a6
8 changed files with 23 additions and 14 deletions

Binary file not shown.

Binary file not shown.

View File

@ -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? */

View File

@ -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

View File

@ -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;

View File

@ -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)

View File

@ -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);

View File

@ -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%