diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index a36aba0c..9b2b27d4 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -52,6 +52,7 @@ typedef struct UINT16 Version; UINT16 SectorSize; UINT32 SerialNumber; + BOOLEAN EaSupported; } FSP_FSCTL_VOLUME_PARAMS; typedef struct { diff --git a/src/sys/create.c b/src/sys/create.c index a67ba757..c181cc33 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -48,8 +48,56 @@ static NTSTATUS FspFsvolCreate( { PAGED_CODE(); - /* !!!: DEVELOPMENT HACK! */ - return STATUS_CANCELLED; + FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject); + FSP_FSVRT_DEVICE_EXTENSION *FsvrtDeviceExtension = + FspFsvrtDeviceExtension(FsvolDeviceExtension->FsvrtDeviceObject); + + PFILE_OBJECT FileObject = IrpSp->FileObject; + PFILE_OBJECT RelatedFileObject = FileObject->RelatedFileObject; + UNICODE_STRING FileName = FileObject->FileName; + ULONG Flags = IrpSp->Flags; + KPROCESSOR_MODE RequestorMode = FlagOn(Flags, SL_FORCE_ACCESS_CHECK) ? UserMode : Irp->RequestorMode; + PACCESS_STATE AccessState = IrpSp->Parameters.Create.SecurityContext->AccessState; + ACCESS_MASK DesiredAccess = IrpSp->Parameters.Create.SecurityContext->DesiredAccess; + USHORT ShareAccess = IrpSp->Parameters.Create.ShareAccess; + ULONG CreateDisposition = IrpSp->Parameters.Create.Options >> 24; + ULONG CreateOptions = IrpSp->Parameters.Create.Options & 0xffffff; + USHORT FileAttributes = IrpSp->Parameters.Create.FileAttributes; + LARGE_INTEGER AllocationSize = Irp->Overlay.AllocationSize; + PFILE_FULL_EA_INFORMATION EaBuffer = Irp->AssociatedIrp.SystemBuffer; + ULONG EaLength = IrpSp->Parameters.Create.EaLength; + BOOLEAN HasTraversePrivilege = BooleanFlagOn(AccessState->Flags, TOKEN_HAS_TRAVERSE_PRIVILEGE); + + /* cannot open the volume object */ + if (0 == RelatedFileObject && 0 == FileName.Length) + return STATUS_ACCESS_DENIED; // need error code like UNIX EPERM (STATUS_NOT_SUPPORTED?) + + /* cannot open paging file */ + if (FlagOn(Flags, SL_OPEN_PAGING_FILE)) + return STATUS_ACCESS_DENIED; + + /* cannot open files by fileid */ + if (FlagOn(CreateOptions, FILE_OPEN_BY_FILE_ID)) + return STATUS_NOT_IMPLEMENTED; + + /* do we support EA? */ + if (0 != EaBuffer && !FsvrtDeviceExtension->VolumeParams.EaSupported) + return STATUS_EAS_NOT_SUPPORTED; + + /* according to fastfat, filenames that begin with two backslashes are ok */ + if (sizeof(WCHAR) * 2 <= FileName.Length && + L'\\' == FileName.Buffer[1] && L'\\' == FileName.Buffer[0]) + { + FileName.Length -= sizeof(WCHAR); + FileName.MaximumLength -= sizeof(WCHAR); + FileName.Buffer++; + + if (sizeof(WCHAR) * 2 <= FileName.Length && + L'\\' == FileName.Buffer[1] && L'\\' == FileName.Buffer[0]) + return STATUS_OBJECT_NAME_INVALID; + } + + return STATUS_PENDING; } NTSTATUS FspCreate( diff --git a/src/sys/driver.h b/src/sys/driver.h index 7f7c349a..0969a99f 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -117,7 +117,7 @@ { \ /* this can only happen if the Ioq was stopped */\ ASSERT(FspIoqStopped(&FsvrtDeviceExtension->Ioq));\ - FspIopCompleteRequest(Irp, STATUS_ACCESS_DENIED);\ + FspIopCompleteRequest(Irp, Result = STATUS_CANCELLED);\ } \ } \ } \