Comment inline.

Le 19/07/2016 à 17:31, tthomp...@svn.reactos.org a écrit :
> Author: tthompson
> Date: Tue Jul 19 15:31:22 2016
> New Revision: 71968
> 
> URL: http://svn.reactos.org/svn/reactos?rev=71968&view=rev
> Log:
> [NTFS]
> +FreeClusters(). Fix a DPRINT.
> 
> Modified:
>     branches/GSoC_2016/NTFS/drivers/filesystems/ntfs/attrib.c
>     branches/GSoC_2016/NTFS/drivers/filesystems/ntfs/mft.c
>     branches/GSoC_2016/NTFS/drivers/filesystems/ntfs/ntfs.h
> 
> Modified: branches/GSoC_2016/NTFS/drivers/filesystems/ntfs/attrib.c
> URL: 
> http://svn.reactos.org/svn/reactos/branches/GSoC_2016/NTFS/drivers/filesystems/ntfs/attrib.c?rev=71968&r1=71967&r2=71968&view=diff
> ==============================================================================
> --- branches/GSoC_2016/NTFS/drivers/filesystems/ntfs/attrib.c [iso-8859-1] 
> (original)
> +++ branches/GSoC_2016/NTFS/drivers/filesystems/ntfs/attrib.c [iso-8859-1] 
> Tue Jul 19 15:31:22 2016
> @@ -409,6 +409,208 @@
>      return TRUE;
>  }
>  
> +/**
> +* @name FreeClusters
> +* @implemented
> +*
> +* Shrinks the allocation size of a non-resident attribute by a given number 
> of clusters.
> +* Frees the clusters from the volume's $BITMAP file as well as the 
> attribute's data runs.
> +*
> +* @param Vcb
> +* Pointer to an NTFS_VCB for the destination volume.
> +*
> +* @param AttrContext
> +* Pointer to an NTFS_ATTR_CONTEXT describing the attribute from which the 
> clusters will be freed.
> +*
> +* @param AttrOffset
> +* Byte offset of the destination attribute relative to its file record.
> +*
> +* @param FileRecord
> +* Pointer to a complete copy of the file record containing the attribute. 
> Must be at least
> +* Vcb->NtfsInfo.BytesPerFileRecord bytes long.
> +*
> +* @param ClustersToFree
> +* Number of clusters that should be freed from the end of the data stream. 
> Must be no more
> +* Than the number of clusters assigned to the attribute (HighestVCN + 1).
> +*
> +* @return
> +* STATUS_SUCCESS on success. STATUS_INVALID_PARAMETER if AttrContext 
> describes a resident attribute,
> +* or if the caller requested more clusters be freed than the attribute has 
> been allocated.
> +* STATUS_INSUFFICIENT_RESOURCES if ConvertDataRunsToLargeMCB() fails.
> +* STATUS_BUFFER_TOO_SMALL if ConvertLargeMCBToDataRuns() fails.
> +*
> +*
> +*/
> +NTSTATUS
> +FreeClusters(PNTFS_VCB Vcb,
> +             PNTFS_ATTR_CONTEXT AttrContext,
> +             ULONG AttrOffset,
> +             PFILE_RECORD_HEADER FileRecord,
> +             ULONG ClustersToFree)
> +{
> +    NTSTATUS Status = STATUS_SUCCESS;
> +    ULONG ClustersLeftToFree = ClustersToFree;
> +
> +    // convert data runs to mcb
> +    PUCHAR DataRun = (PUCHAR)&AttrContext->Record + 
> AttrContext->Record.NonResident.MappingPairsOffset;
> +    PNTFS_ATTR_RECORD DestinationAttribute = 
> (PNTFS_ATTR_RECORD)((ULONG_PTR)FileRecord + AttrOffset);
> +    LARGE_MCB DataRunsMCB;
> +    ULONG NextAttributeOffset = AttrOffset + AttrContext->Record.Length;
> +    PNTFS_ATTR_RECORD NextAttribute = 
> (PNTFS_ATTR_RECORD)((ULONG_PTR)FileRecord + NextAttributeOffset);
> +    ULONGLONG NextVBN = AttrContext->Record.NonResident.LowestVCN;
> +
> +    // Allocate some memory for the RunBuffer
> +    PUCHAR RunBuffer = ExAllocatePoolWithTag(NonPagedPool, 
> Vcb->NtfsInfo.BytesPerFileRecord, TAG_NTFS);
> +    ULONG RunBufferOffset = 0;

Two notes regarding this allocation:
- You should check allocation worked (obviously ;-));
- You should start memory work only after checking the record is not
resident.

-- 
Pierre Schweitzer <pierre at reactos.org>
System & Network Administrator
Senior Kernel Developer
ReactOS Deutschland e.V.

Attachment: smime.p7s
Description: Signature cryptographique S/MIME

_______________________________________________
Ros-dev mailing list
Ros-dev@reactos.org
http://www.reactos.org/mailman/listinfo/ros-dev

Reply via email to