sys: testing

This commit is contained in:
Bill Zissimopoulos 2015-11-30 22:00:56 -08:00
parent 7f182ac04d
commit cb25c6456d
5 changed files with 16 additions and 8 deletions

View File

@ -50,6 +50,7 @@ typedef struct
{ {
UINT16 Version; UINT16 Version;
UINT16 SectorSize; UINT16 SectorSize;
UINT32 SerialNumber;
} FSP_FSCTL_VOLUME_PARAMS; } FSP_FSCTL_VOLUME_PARAMS;
typedef struct typedef struct
{ {

View File

@ -113,7 +113,8 @@ FSP_API NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath,
} }
if (!DeviceIoControl(DeviceHandle, FSP_FSCTL_CREATE, if (!DeviceIoControl(DeviceHandle, FSP_FSCTL_CREATE,
ParamsBuf, sizeof *ParamsBuf + SecurityDescriptorSize, VolumePathBuf, (DWORD)VolumePathSize, ParamsBuf, FSP_FSCTL_VOLUME_PARAMS_SIZE + SecurityDescriptorSize,
VolumePathBuf, (DWORD)VolumePathSize,
&Bytes, 0)) &Bytes, 0))
{ {
Result = FspNtStatusFromWin32(GetLastError()); Result = FspNtStatusFromWin32(GetLastError());

View File

@ -98,7 +98,7 @@
(const char *)&FspDeviceExtension(IrpSp->DeviceObject)->Kind,\ (const char *)&FspDeviceExtension(IrpSp->DeviceObject)->Kind,\
Irp->RequestorMode == KernelMode ? 'K' : 'U',\ Irp->RequestorMode == KernelMode ? 'K' : 'U',\
IrpMajorFunctionSym(IrpSp->MajorFunction),\ IrpMajorFunctionSym(IrpSp->MajorFunction),\
IrpMinorFunctionSym(IrpSp->MajorFunction, IrpSp->MajorFunction),\ IrpMinorFunctionSym(IrpSp->MajorFunction, IrpSp->MinorFunction),\
__VA_ARGS__, \ __VA_ARGS__, \
NtStatusSym(Result), \ NtStatusSym(Result), \
(LONGLONG)Irp->IoStatus.Information);\ (LONGLONG)Irp->IoStatus.Information);\
@ -135,7 +135,7 @@
(const char *)&FspDeviceExtension(IrpSp->DeviceObject)->Kind,\ (const char *)&FspDeviceExtension(IrpSp->DeviceObject)->Kind,\
Irp->RequestorMode == KernelMode ? 'K' : 'U',\ Irp->RequestorMode == KernelMode ? 'K' : 'U',\
IrpMajorFunctionSym(IrpSp->MajorFunction),\ IrpMajorFunctionSym(IrpSp->MajorFunction),\
IrpMinorFunctionSym(IrpSp->MajorFunction, IrpSp->MajorFunction),\ IrpMinorFunctionSym(IrpSp->MajorFunction, IrpSp->MinorFunction),\
__VA_ARGS__, \ __VA_ARGS__, \
NtStatusSym(Result), \ NtStatusSym(Result), \
(LONGLONG)Irp->IoStatus.Information);\ (LONGLONG)Irp->IoStatus.Information);\

View File

@ -106,17 +106,18 @@ static NTSTATUS FspFsctlCreateVolume(
ULONG InputBufferLength = IrpSp->Parameters.FileSystemControl.InputBufferLength; ULONG InputBufferLength = IrpSp->Parameters.FileSystemControl.InputBufferLength;
ULONG OutputBufferLength = IrpSp->Parameters.FileSystemControl.OutputBufferLength; ULONG OutputBufferLength = IrpSp->Parameters.FileSystemControl.OutputBufferLength;
PVOID SystemBuffer = Irp->AssociatedIrp.SystemBuffer; PVOID SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
const FSP_FSCTL_VOLUME_PARAMS *Params = SystemBuffer; PSECURITY_DESCRIPTOR SecurityDescriptor =
PSECURITY_DESCRIPTOR SecurityDescriptor = (PVOID)((PUINT8)Params + FSP_FSCTL_VOLUME_PARAMS_SIZE); (PVOID)((PUINT8)SystemBuffer + FSP_FSCTL_VOLUME_PARAMS_SIZE);
DWORD SecurityDescriptorSize = InputBufferLength - FSP_FSCTL_VOLUME_PARAMS_SIZE; DWORD SecurityDescriptorSize = InputBufferLength - FSP_FSCTL_VOLUME_PARAMS_SIZE;
if (FSP_FSCTL_VOLUME_PARAMS_SIZE >= InputBufferLength || 0 == SystemBuffer || if (FSP_FSCTL_VOLUME_PARAMS_SIZE >= InputBufferLength || 0 == SystemBuffer ||
!FspValidRelativeSecurityDescriptor(SecurityDescriptor, SecurityDescriptorSize, !FspValidRelativeSecurityDescriptor(SecurityDescriptor, SecurityDescriptorSize,
OWNER_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION)) DACL_SECURITY_INFORMATION))
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
if (FSP_FSCTL_CREATE_BUFFER_SIZE > OutputBufferLength) if (FSP_FSCTL_CREATE_BUFFER_SIZE > OutputBufferLength)
return STATUS_BUFFER_TOO_SMALL; return STATUS_BUFFER_TOO_SMALL;
NTSTATUS Result; NTSTATUS Result;
FSP_FSCTL_VOLUME_PARAMS Params = *(FSP_FSCTL_VOLUME_PARAMS *)SystemBuffer;
PVOID SecurityDescriptorBuf = 0; PVOID SecurityDescriptorBuf = 0;
FSP_FSVRT_DEVICE_EXTENSION *FsvrtDeviceExtension; FSP_FSVRT_DEVICE_EXTENSION *FsvrtDeviceExtension;
@ -150,9 +151,11 @@ static NTSTATUS FspFsctlCreateVolume(
&FsvrtDeviceObject); &FsvrtDeviceObject);
if (NT_SUCCESS(Result)) if (NT_SUCCESS(Result))
{ {
#pragma prefast(suppress:28175, "We are a filesystem: ok to access SectorSize")
FsvrtDeviceObject->SectorSize = Params.SectorSize;
FsvrtDeviceExtension = FspFsvrtDeviceExtension(FsvrtDeviceObject); FsvrtDeviceExtension = FspFsvrtDeviceExtension(FsvrtDeviceObject);
FsvrtDeviceExtension->FsctlDeviceObject = DeviceObject; FsvrtDeviceExtension->FsctlDeviceObject = DeviceObject;
FsvrtDeviceExtension->VolumeParams = *Params; FsvrtDeviceExtension->VolumeParams = Params;
RtlCopyMemory(FsvrtDeviceExtension->SecurityDescriptorBuf, RtlCopyMemory(FsvrtDeviceExtension->SecurityDescriptorBuf,
SecurityDescriptorBuf, SecurityDescriptorSize); SecurityDescriptorBuf, SecurityDescriptorSize);
ClearFlag(FsvrtDeviceObject->Flags, DO_DEVICE_INITIALIZING); ClearFlag(FsvrtDeviceObject->Flags, DO_DEVICE_INITIALIZING);
@ -215,13 +218,14 @@ static NTSTATUS FspFsctlMountVolume(
&FsvolDeviceObject); &FsvolDeviceObject);
if (NT_SUCCESS(Result)) if (NT_SUCCESS(Result))
{ {
FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject);
#pragma prefast(suppress:28175, "We are a filesystem: ok to access SectorSize") #pragma prefast(suppress:28175, "We are a filesystem: ok to access SectorSize")
FsvolDeviceObject->SectorSize = FsvrtDeviceExtension->VolumeParams.SectorSize; FsvolDeviceObject->SectorSize = FsvrtDeviceExtension->VolumeParams.SectorSize;
FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject);
FsvolDeviceExtension->FsvrtDeviceObject = FsvrtDeviceObject; FsvolDeviceExtension->FsvrtDeviceObject = FsvrtDeviceObject;
FsvrtDeviceExtension->FsvolDeviceObject = FsvolDeviceObject; FsvrtDeviceExtension->FsvolDeviceObject = FsvolDeviceObject;
ClearFlag(FsvolDeviceObject->Flags, DO_DEVICE_INITIALIZING); ClearFlag(FsvolDeviceObject->Flags, DO_DEVICE_INITIALIZING);
Vpb->DeviceObject = FsvolDeviceObject; Vpb->DeviceObject = FsvolDeviceObject;
Vpb->SerialNumber = FsvrtDeviceExtension->VolumeParams.SerialNumber;
Irp->IoStatus.Information = 0; Irp->IoStatus.Information = 0;
} }

View File

@ -10,6 +10,7 @@ void mount_invalid_test(void)
HANDLE VolumeHandle; HANDLE VolumeHandle;
Params.SectorSize = 16384; Params.SectorSize = 16384;
Params.SerialNumber = 0x12345678;
Result = FspFsctlCreateVolume(L"WinFsp.DoesNotExist", &Params, 0, VolumePath, sizeof VolumePath); Result = FspFsctlCreateVolume(L"WinFsp.DoesNotExist", &Params, 0, VolumePath, sizeof VolumePath);
ASSERT(STATUS_NO_SUCH_DEVICE == Result); ASSERT(STATUS_NO_SUCH_DEVICE == Result);
@ -26,6 +27,7 @@ void mount_dotest(PWSTR DeviceName)
HANDLE VolumeHandle; HANDLE VolumeHandle;
Params.SectorSize = 16384; Params.SectorSize = 16384;
Params.SerialNumber = 0x12345678;
Result = FspFsctlCreateVolume(DeviceName, &Params, 0, VolumePath, sizeof VolumePath); Result = FspFsctlCreateVolume(DeviceName, &Params, 0, VolumePath, sizeof VolumePath);
ASSERT(STATUS_SUCCESS == Result); ASSERT(STATUS_SUCCESS == Result);