From e6bf7156b76959b516588ffdc611fea981e2e95f Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Wed, 23 Dec 2015 14:58:28 -0800 Subject: [PATCH] Major refactoring: testing --- src/sys/close.c | 3 -- src/sys/device.c | 2 +- src/sys/volume.c | 42 +++++++++++++-------------- tst/winfsp-tests/mount-test.c | 53 ++++++++++++++++++++++++----------- 4 files changed, 59 insertions(+), 41 deletions(-) diff --git a/src/sys/close.c b/src/sys/close.c index ed67c3fe..384534b2 100644 --- a/src/sys/close.c +++ b/src/sys/close.c @@ -28,9 +28,6 @@ static NTSTATUS FspFsctlClose( { PAGED_CODE(); - FspFree(IrpSp->FileObject->FsContext2); - IrpSp->FileObject->FsContext2 = 0; - Irp->IoStatus.Information = 0; return STATUS_SUCCESS; } diff --git a/src/sys/device.c b/src/sys/device.c index 46433ec3..38f9166b 100644 --- a/src/sys/device.c +++ b/src/sys/device.c @@ -86,7 +86,7 @@ NTSTATUS FspDeviceCreateSecure(UINT32 Kind, ULONG ExtraSize, break; case FspFsvrtDeviceExtensionKind: case FspFsctlDeviceExtensionKind: - DeviceExtensionSize = 0; + DeviceExtensionSize = sizeof(FSP_DEVICE_EXTENSION); break; default: ASSERT(0); diff --git a/src/sys/volume.c b/src/sys/volume.c index 6430ceae..a476a0c7 100644 --- a/src/sys/volume.c +++ b/src/sys/volume.c @@ -41,6 +41,14 @@ NTSTATUS FspVolumeCreate( { PAGED_CODE(); + ASSERT(IRP_MJ_CREATE == IrpSp->MajorFunction); + ASSERT(0 == IrpSp->FileObject->RelatedFileObject); + ASSERT(PREFIXW_SIZE <= IrpSp->FileObject->FileName.Length && + RtlEqualMemory(PREFIXW, IrpSp->FileObject->FileName.Buffer, PREFIXW_SIZE)); + ASSERT( + FILE_DEVICE_DISK_FILE_SYSTEM == FsctlDeviceObject->DeviceType || + FILE_DEVICE_NETWORK_FILE_SYSTEM == FsctlDeviceObject->DeviceType); + NTSTATUS Result; PFILE_OBJECT FileObject = IrpSp->FileObject; FSP_FSCTL_VOLUME_PARAMS VolumeParams = { 0 }; @@ -54,23 +62,14 @@ NTSTATUS FspVolumeCreate( HANDLE MupHandle = 0; FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension; - ASSERT(IRP_MJ_CREATE == IrpSp->MajorFunction); - ASSERT(0 == FileObject->RelatedFileObject); - ASSERT(PREFIXW_SIZE <= FileObject->FileName.Length && - RtlEqualMemory(PREFIXW, FileObject->FileName.Buffer, PREFIXW_SIZE)); - ASSERT( - FILE_DEVICE_DISK_FILE_SYSTEM == FsctlDeviceObject->DeviceType || - FILE_DEVICE_NETWORK_FILE_SYSTEM == FsctlDeviceObject->DeviceType); - /* check parameters */ if (PREFIXW_SIZE + sizeof(FSP_FSCTL_VOLUME_PARAMS) * sizeof(WCHAR) > FileObject->FileName.Length) return STATUS_INVALID_PARAMETER; /* copy the VolumeParams */ - for (USHORT Index = PREFIXW_SIZE / sizeof(WCHAR), Length = FileObject->FileName.Length / 2; - Length > Index; Index++) + for (USHORT Index = 0, Length = sizeof(FSP_FSCTL_VOLUME_PARAMS); Length > Index; Index++) { - WCHAR Value = FileObject->FileName.Buffer[Index]; + WCHAR Value = FileObject->FileName.Buffer[PREFIXW_SIZE / sizeof(WCHAR) + Index]; if (0xF000 != (Value & 0xFF00)) return STATUS_INVALID_PARAMETER; ((PUINT8)&VolumeParams)[Index] = Value & 0xFF; @@ -94,16 +93,17 @@ NTSTATUS FspVolumeCreate( if (FspFsctlIrpCapacityMinimum > VolumeParams.IrpCapacity || VolumeParams.IrpCapacity > FspFsctlIrpCapacityMaximum) VolumeParams.IrpCapacity = FspFsctlIrpCapacityDefault; - VolumeParams.Prefix[sizeof VolumeParams.Prefix / 2 - 1] = L'\0'; - while (L'\0' != VolumeParams.Prefix[PrefixLength++]) - ; - while (0 < PrefixLength && L'\\' == VolumeParams.Prefix[--PrefixLength]) - ; - VolumeParams.Prefix[PrefixLength] = L'\0'; - if (FILE_DEVICE_DISK_FILE_SYSTEM == FsctlDeviceObject->DeviceType && 0 != PrefixLength) - return STATUS_INVALID_PARAMETER; - if (FILE_DEVICE_NETWORK_FILE_SYSTEM == FsctlDeviceObject->DeviceType && 0 == PrefixLength) - return STATUS_INVALID_PARAMETER; + if (FILE_DEVICE_NETWORK_FILE_SYSTEM == FsctlDeviceObject->DeviceType) + { + VolumeParams.Prefix[sizeof VolumeParams.Prefix / 2 - 1] = L'\0'; + while (L'\0' != VolumeParams.Prefix[PrefixLength++]) + ; + while (0 < PrefixLength && L'\\' == VolumeParams.Prefix[--PrefixLength]) + ; + VolumeParams.Prefix[PrefixLength] = L'\0'; + if (0 == PrefixLength) + return STATUS_INVALID_PARAMETER; + } /* create volume guid */ Result = FspCreateGuid(&Guid); diff --git a/tst/winfsp-tests/mount-test.c b/tst/winfsp-tests/mount-test.c index adb023db..ee5a01a0 100644 --- a/tst/winfsp-tests/mount-test.c +++ b/tst/winfsp-tests/mount-test.c @@ -22,38 +22,58 @@ void mount_invalid_test(void) ASSERT(INVALID_HANDLE_VALUE == VolumeHandle); } -#if 0 -void mount_create_delete_dotest(PWSTR DeviceName) +void mount_open_device_dotest(PWSTR DeviceName) +{ + BOOL Success; + HANDLE DeviceHandle; + WCHAR DevicePath[MAX_PATH]; + + StringCbPrintfW(DevicePath, sizeof DevicePath, L"\\\\?\\GLOBALROOT\\Device\\%s", DeviceName); + DeviceHandle = CreateFileW(DevicePath, + 0, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); + ASSERT(INVALID_HANDLE_VALUE != DeviceHandle); + + Success = CloseHandle(DeviceHandle); + ASSERT(Success); +} + +void mount_open_device_test(void) +{ + if (WinFspDiskTests) + mount_open_device_dotest(L"WinFsp.Disk"); + if (WinFspNetTests) + mount_open_device_dotest(L"WinFsp.Net"); +} + +void mount_create_volume_dotest(PWSTR DeviceName) { NTSTATUS Result; BOOL Success; - FSP_FSCTL_VOLUME_PARAMS Params = { 0 }; + FSP_FSCTL_VOLUME_PARAMS VolumeParams = { 0 }; WCHAR VolumePath[MAX_PATH]; HANDLE VolumeHandle; - Params.SectorSize = 16384; - Params.SerialNumber = 0x12345678; - Result = FspFsctlCreateVolume(DeviceName, &Params, 0, VolumePath, sizeof VolumePath); - ASSERT(STATUS_SUCCESS == Result); - - Result = FspFsctlOpenVolume(VolumePath, &VolumeHandle); - ASSERT(STATUS_SUCCESS == Result); - - Result = FspFsctlDeleteVolume(VolumeHandle); + VolumeParams.SectorSize = 16384; + VolumeParams.SerialNumber = 0x12345678; + Result = FspFsctlCreateVolume(DeviceName, &VolumeParams, + VolumePath, sizeof VolumePath, &VolumeHandle); ASSERT(STATUS_SUCCESS == Result); + ASSERT(0 == wcsncmp(L"\\Device\\Volume{", VolumePath, 15)); + ASSERT(INVALID_HANDLE_VALUE != VolumeHandle); Success = CloseHandle(VolumeHandle); ASSERT(Success); } -void mount_create_delete_test(void) +void mount_create_volume_test(void) { if (WinFspDiskTests) - mount_create_delete_dotest(L"WinFsp.Disk"); + mount_create_volume_dotest(L"WinFsp.Disk"); if (WinFspNetTests) - mount_create_delete_dotest(L"WinFsp.Net"); + mount_create_volume_dotest(L"WinFsp.Net"); } +#if 0 static unsigned __stdcall mount_volume_cancel_dotest_thread(void *FilePath) { FspDebugLog(__FUNCTION__ ": \"%S\"\n", FilePath); @@ -234,8 +254,9 @@ void mount_volume_transact_test(void) void mount_tests(void) { TEST(mount_invalid_test); + TEST(mount_open_device_test); + TEST(mount_create_volume_test); #if 0 - TEST(mount_create_delete_test); TEST(mount_volume_cancel_test); TEST(mount_volume_transact_test); #endif