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.
smime.p7s
Description: Signature cryptographique S/MIME
_______________________________________________ Ros-dev mailing list Ros-dev@reactos.org http://www.reactos.org/mailman/listinfo/ros-dev