2.1.5.10.39.1 Algorithm to Zero Data Beyond ValidDataLength

This algorithm returns no value.

The inputs for the algorithm are:

  • ThisOpen: The Open for the stream being zeroed.

  • StartingZero: A 64-bit signed integer. The offset into the stream to begin zeroing.

  • ByteCount: The number of bytes to zero.

The algorithm uses the following local variables:

  • 64-bit signed integers: ZeroStart, BeyondZeroEnd, LastCompressionUnit, ClustersToDeallocate

Pseudocode for the algorithm is as follows:

  • Set ZeroStart to BlockAlign(StartingZero, ThisOpen.File.Volume.LogicalBytesPerSector).

  • Set BeyondZeroEnd to BlockAlign(StartingZero + ByteCount, ThisOpen.File.Volume.LogicalBytesPerSector).

  • If (ThisOpen.Stream.IsCompressed is FALSE) and (ThisOpen.Stream.IsSparse is FALSE) and (ZeroStart != StartingZero):

    • The object store MUST write zeroes into the stream from StartingZero to ZeroStart.

  • EndIf

  • If ((ThisOpen.Stream.IsCompressed is TRUE) or

    (ThisOpen.Stream.IsSparse is TRUE)) and

    (ByteCount > ThisOpen.File.Volume.CompressionUnitSize * 2):

    • If BlockAlign(ZeroStart, ThisOpen.File.Volume.CompressionUnitSize) != ZeroStart:

      • The object store MUST write zeroes into the stream from ZeroStart to BlockAlign(ZeroStart, ThisOpen.File.Volume.CompressionUnitSize).

      • The object store MUST set ThisOpen.Stream.ValidDataLength to BlockAlign(ZeroStart, ThisOpen.File.Volume.CompressionUnitSize).

      • Set ZeroStart equal to BlockAlign(ZeroStart, ThisOpen.File.Volume.CompressionUnitSize).

    • EndIf

    • Set LastCompressionUnit equal to BlockAlignTruncate(BeyondZeroEnd, ThisOpen.File.Volume.CompressionUnitSize).

    • Set ClustersToDeallocate equal to ClustersFromBytes(ThisOpen.File.Volume, LastCompressionUnit - ZeroStart).

    • The object store MUST delete ClusterToDeallocate clusters of allocation from the stream starting with the cluster at ClustersFromBytes(ThisOpen.File.Volume, ZeroStart).

    • If LastCompressionUnit != BeyondZeroEnd:

      • The object store MUST write zeroes into the stream from LastCompressionUnit to BeyondZeroEnd.

      • The object store MUST set ThisOpen.Stream.ValidDataLength equal to StartingZero + ByteCount.

    • EndIf

    • The algorithm returns at this point.

  • EndIf

  • If ZeroStart = BeyondZeroEnd

    • The algorithm returns at this point.

  • EndIf

  • The object store MUST write zeroes into the stream from ZeroStart to BeyondZeroEnd.

  • The object store MUST set ThisOpen.Stream.ValidDataLength equal to StartingZero + ByteCount.