ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

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;
}

Generated on Sun May 27 2012 05:23:30 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.