Home | Info | Community | Development | myReactOS | Contact Us
Definition at line 448 of file finfo.c.
Referenced by FatSetInformation().
{ PFILE_OBJECT FileObject; PIO_STACK_LOCATION IrpSp; FILE_INFORMATION_CLASS InfoClass; TYPE_OF_OPEN TypeOfOpen; PVCB Vcb; PFCB Fcb; PCCB Ccb; LONG Length; PVOID Buffer; NTSTATUS Status = STATUS_SUCCESS; BOOLEAN VcbAcquired = FALSE, FcbAcquired = FALSE; /* Get IRP stack location */ IrpSp = IoGetCurrentIrpStackLocation(Irp); /* Get the file object */ FileObject = IrpSp->FileObject; /* Copy variables to something with shorter names */ InfoClass = IrpSp->Parameters.SetFile.FileInformationClass; Length = IrpSp->Parameters.SetFile.Length; Buffer = Irp->AssociatedIrp.SystemBuffer; DPRINT("FatiSetInformation\n", 0); DPRINT("\tIrp = %08lx\n", Irp); DPRINT("\tLength = %08lx\n", Length); DPRINT("\tFileInformationClass = %08lx\n", InfoClass); DPRINT("\tFileObject = %08lx\n", IrpSp->Parameters.SetFile.FileObject); DPRINT("\tBuffer = %08lx\n", Buffer); TypeOfOpen = FatDecodeFileObject(FileObject, &Vcb, &Fcb, &Ccb); DPRINT("Vcb %p, Fcb %p, Ccb %p, open type %d\n", Vcb, Fcb, Ccb, TypeOfOpen); switch (TypeOfOpen) { case UserVolumeOpen: Status = STATUS_INVALID_PARAMETER; /* Complete request and return status */ FatCompleteRequest(IrpContext, Irp, Status); return Status; case UserFileOpen: /* Check oplocks */ if (!FlagOn(Fcb->State, FCB_STATE_PAGEFILE) && ((InfoClass == FileEndOfFileInformation) || (InfoClass == FileAllocationInformation))) { Status = FsRtlCheckOplock(&Fcb->Fcb.Oplock, Irp, IrpContext, NULL, NULL); if (Status != STATUS_SUCCESS) { /* Complete request and return status */ FatCompleteRequest(IrpContext, Irp, Status); return Status; } /* Update Fast IO flag */ Fcb->Header.IsFastIoPossible = FatIsFastIoPossible(Fcb); } break; case UserDirectoryOpen: break; default: Status = STATUS_INVALID_PARAMETER; /* Complete request and return status */ FatCompleteRequest(IrpContext, Irp, Status); return Status; } /* If it's a root DCB - fail */ if (FatNodeType(Fcb) == FAT_NTC_ROOT_DCB) { if (InfoClass == FileDispositionInformation) Status = STATUS_CANNOT_DELETE; else Status = STATUS_INVALID_PARAMETER; /* Complete request and return status */ FatCompleteRequest(IrpContext, Irp, Status); return Status; } /* Acquire the volume lock if needed */ if (InfoClass == FileDispositionInformation || InfoClass == FileRenameInformation) { if (!FatAcquireExclusiveVcb(IrpContext, Vcb)) { UNIMPLEMENTED; } VcbAcquired = TRUE; } /* Acquire FCB lock */ if (!FlagOn(Fcb->State, FCB_STATE_PAGEFILE)) { if (!FatAcquireExclusiveFcb(IrpContext, Fcb)) { UNIMPLEMENTED; } FcbAcquired = TRUE; } // TODO: VerifyFcb switch (InfoClass) { case FileBasicInformation: //Status = FatSetBasicInfo(IrpContext, Irp, Fcb, Ccb); DPRINT1("FileBasicInformation\n"); break; case FileDispositionInformation: if (FlagOn(Vcb->State, VCB_STATE_FLAG_DEFERRED_FLUSH) && !FlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT)) { UNIMPLEMENTED; } else { //Status = FatSetDispositionInfo(IrpContext, Irp, FileObject, Fcb); DPRINT1("FileDispositionInformation\n"); } break; case FileRenameInformation: if (!FlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT)) { UNIMPLEMENTED; } else { //Status = FatSetRenameInfo(IrpContext, Irp, Vcb, Fcb, Ccb); DPRINT1("FileRenameInformation\n"); /* NOTE: Request must not be completed here! That's why Irp/IrpContext are set to NULL */ if (Status == STATUS_PENDING) { Irp = NULL; IrpContext = NULL; } } break; case FilePositionInformation: //Status = FatSetPositionInfo(IrpContext, Irp, FileObject); DPRINT1("FilePositionInformation\n"); break; case FileLinkInformation: Status = STATUS_INVALID_DEVICE_REQUEST; break; case FileAllocationInformation: //Status = FatSetAllocationInfo(IrpContext, Irp, Fcb, FileObject); DPRINT1("FileAllocationInformation\n"); break; case FileEndOfFileInformation: Status = FatSetEndOfFileInfo(IrpContext, Irp, FileObject, Vcb, Fcb); break; default: Status = STATUS_INVALID_PARAMETER; } /* Release locks */ if (FcbAcquired) FatReleaseFcb(IrpContext, Fcb); if (VcbAcquired) FatReleaseVcb(IrpContext, Vcb); /* Complete request and return status */ FatCompleteRequest(IrpContext, Irp, Status); return Status; }