Major refactoring: testing

This commit is contained in:
Bill Zissimopoulos 2015-12-23 14:58:28 -08:00
parent 838adc67bb
commit e6bf7156b7
4 changed files with 59 additions and 41 deletions

View File

@ -28,9 +28,6 @@ static NTSTATUS FspFsctlClose(
{ {
PAGED_CODE(); PAGED_CODE();
FspFree(IrpSp->FileObject->FsContext2);
IrpSp->FileObject->FsContext2 = 0;
Irp->IoStatus.Information = 0; Irp->IoStatus.Information = 0;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }

View File

@ -86,7 +86,7 @@ NTSTATUS FspDeviceCreateSecure(UINT32 Kind, ULONG ExtraSize,
break; break;
case FspFsvrtDeviceExtensionKind: case FspFsvrtDeviceExtensionKind:
case FspFsctlDeviceExtensionKind: case FspFsctlDeviceExtensionKind:
DeviceExtensionSize = 0; DeviceExtensionSize = sizeof(FSP_DEVICE_EXTENSION);
break; break;
default: default:
ASSERT(0); ASSERT(0);

View File

@ -41,6 +41,14 @@ NTSTATUS FspVolumeCreate(
{ {
PAGED_CODE(); 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; NTSTATUS Result;
PFILE_OBJECT FileObject = IrpSp->FileObject; PFILE_OBJECT FileObject = IrpSp->FileObject;
FSP_FSCTL_VOLUME_PARAMS VolumeParams = { 0 }; FSP_FSCTL_VOLUME_PARAMS VolumeParams = { 0 };
@ -54,23 +62,14 @@ NTSTATUS FspVolumeCreate(
HANDLE MupHandle = 0; HANDLE MupHandle = 0;
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension; 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 */ /* check parameters */
if (PREFIXW_SIZE + sizeof(FSP_FSCTL_VOLUME_PARAMS) * sizeof(WCHAR) > FileObject->FileName.Length) if (PREFIXW_SIZE + sizeof(FSP_FSCTL_VOLUME_PARAMS) * sizeof(WCHAR) > FileObject->FileName.Length)
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
/* copy the VolumeParams */ /* copy the VolumeParams */
for (USHORT Index = PREFIXW_SIZE / sizeof(WCHAR), Length = FileObject->FileName.Length / 2; for (USHORT Index = 0, Length = sizeof(FSP_FSCTL_VOLUME_PARAMS); Length > Index; Index++)
Length > Index; Index++)
{ {
WCHAR Value = FileObject->FileName.Buffer[Index]; WCHAR Value = FileObject->FileName.Buffer[PREFIXW_SIZE / sizeof(WCHAR) + Index];
if (0xF000 != (Value & 0xFF00)) if (0xF000 != (Value & 0xFF00))
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
((PUINT8)&VolumeParams)[Index] = Value & 0xFF; ((PUINT8)&VolumeParams)[Index] = Value & 0xFF;
@ -94,16 +93,17 @@ NTSTATUS FspVolumeCreate(
if (FspFsctlIrpCapacityMinimum > VolumeParams.IrpCapacity || if (FspFsctlIrpCapacityMinimum > VolumeParams.IrpCapacity ||
VolumeParams.IrpCapacity > FspFsctlIrpCapacityMaximum) VolumeParams.IrpCapacity > FspFsctlIrpCapacityMaximum)
VolumeParams.IrpCapacity = FspFsctlIrpCapacityDefault; VolumeParams.IrpCapacity = FspFsctlIrpCapacityDefault;
if (FILE_DEVICE_NETWORK_FILE_SYSTEM == FsctlDeviceObject->DeviceType)
{
VolumeParams.Prefix[sizeof VolumeParams.Prefix / 2 - 1] = L'\0'; VolumeParams.Prefix[sizeof VolumeParams.Prefix / 2 - 1] = L'\0';
while (L'\0' != VolumeParams.Prefix[PrefixLength++]) while (L'\0' != VolumeParams.Prefix[PrefixLength++])
; ;
while (0 < PrefixLength && L'\\' == VolumeParams.Prefix[--PrefixLength]) while (0 < PrefixLength && L'\\' == VolumeParams.Prefix[--PrefixLength])
; ;
VolumeParams.Prefix[PrefixLength] = L'\0'; VolumeParams.Prefix[PrefixLength] = L'\0';
if (FILE_DEVICE_DISK_FILE_SYSTEM == FsctlDeviceObject->DeviceType && 0 != PrefixLength) if (0 == PrefixLength)
return STATUS_INVALID_PARAMETER;
if (FILE_DEVICE_NETWORK_FILE_SYSTEM == FsctlDeviceObject->DeviceType && 0 == PrefixLength)
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
}
/* create volume guid */ /* create volume guid */
Result = FspCreateGuid(&Guid); Result = FspCreateGuid(&Guid);

View File

@ -22,38 +22,58 @@ void mount_invalid_test(void)
ASSERT(INVALID_HANDLE_VALUE == VolumeHandle); ASSERT(INVALID_HANDLE_VALUE == VolumeHandle);
} }
#if 0 void mount_open_device_dotest(PWSTR DeviceName)
void mount_create_delete_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; NTSTATUS Result;
BOOL Success; BOOL Success;
FSP_FSCTL_VOLUME_PARAMS Params = { 0 }; FSP_FSCTL_VOLUME_PARAMS VolumeParams = { 0 };
WCHAR VolumePath[MAX_PATH]; WCHAR VolumePath[MAX_PATH];
HANDLE VolumeHandle; HANDLE VolumeHandle;
Params.SectorSize = 16384; VolumeParams.SectorSize = 16384;
Params.SerialNumber = 0x12345678; VolumeParams.SerialNumber = 0x12345678;
Result = FspFsctlCreateVolume(DeviceName, &Params, 0, VolumePath, sizeof VolumePath); Result = FspFsctlCreateVolume(DeviceName, &VolumeParams,
ASSERT(STATUS_SUCCESS == Result); VolumePath, sizeof VolumePath, &VolumeHandle);
Result = FspFsctlOpenVolume(VolumePath, &VolumeHandle);
ASSERT(STATUS_SUCCESS == Result);
Result = FspFsctlDeleteVolume(VolumeHandle);
ASSERT(STATUS_SUCCESS == Result); ASSERT(STATUS_SUCCESS == Result);
ASSERT(0 == wcsncmp(L"\\Device\\Volume{", VolumePath, 15));
ASSERT(INVALID_HANDLE_VALUE != VolumeHandle);
Success = CloseHandle(VolumeHandle); Success = CloseHandle(VolumeHandle);
ASSERT(Success); ASSERT(Success);
} }
void mount_create_delete_test(void) void mount_create_volume_test(void)
{ {
if (WinFspDiskTests) if (WinFspDiskTests)
mount_create_delete_dotest(L"WinFsp.Disk"); mount_create_volume_dotest(L"WinFsp.Disk");
if (WinFspNetTests) 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) static unsigned __stdcall mount_volume_cancel_dotest_thread(void *FilePath)
{ {
FspDebugLog(__FUNCTION__ ": \"%S\"\n", FilePath); FspDebugLog(__FUNCTION__ ": \"%S\"\n", FilePath);
@ -234,8 +254,9 @@ void mount_volume_transact_test(void)
void mount_tests(void) void mount_tests(void)
{ {
TEST(mount_invalid_test); TEST(mount_invalid_test);
TEST(mount_open_device_test);
TEST(mount_create_volume_test);
#if 0 #if 0
TEST(mount_create_delete_test);
TEST(mount_volume_cancel_test); TEST(mount_volume_cancel_test);
TEST(mount_volume_transact_test); TEST(mount_volume_transact_test);
#endif #endif