2.1.5.12.29 FileStreamInformation
OutputBuffer is of type FILE_STREAM_INFORMATION, as described in [MS-FSCC] section 2.4.47. Object stores that do not support alternate data streams SHOULD<170> return STATUS_INVALID_INFO_CLASS.
This routine uses the following local variables:
32-bit unsigned integer: StreamNameLength, RemainingLength, ThisElementSize, PreviousElementPadding
Stream: ThisStream
Pointer to a buffer of type FILE_STREAM_INFORMATION: CurrentPosition, LastPosition
Pseudocode for the operation is as follows:
If OutputBufferSize is smaller than sizeof(FILE_STREAM_INFORMATION), the operation MUST be failed with STATUS_INFO_LENGTH_MISMATCH.
Initialize PreviousElementPadding to 0.
Initialize CurrentPosition to point to the 0th byte of OutputBuffer.
Initialize RemainingLength to be equal to OutputBufferSize.
For each Stream ThisStream of Open.File:
Set StreamNameLength equal to the length, in bytes, of ThisStream.Name plus the length, in bytes, of the Unicode string "$DATA" plus the length, in bytes, of two Unicode characters. This accommodates the length of the full stream name in the form :<ThisStream.Name>:$DATA.
Set ThisElementSize equal to the byte offset of CurrentPosition.StreamName plus StreamNameLength.
If ThisElementSize plus PreviousElementPadding is greater than RemainingLength, the operation MUST be failed with STATUS_BUFFER_OVERFLOW.
The object store MUST set CurrentPosition.StreamSize equal to ThisStream.Size.
The object store MUST set CurrentPosition.AllocationSize equal to ThisStream.AllocationSize.
The object store MUST set CurrentPosition.StreamNameLength equal to StreamNameLength.
The object store MUST set CurrentPosition.StreamName to the Unicode character ":", then append ThisStream.Name, then append the Unicode character ":", then append the Unicode string "$DATA".
Set PreviousElementPadding equal to BlockAlign(ThisElementSize, 8) minus ThisElementSize. The value PreviousElementPadding is used to align each FILE_STREAM_INFORMATION element in OutputBuffer on an 8-byte boundary.
The object store MUST set CurrentPosition.NextEntryOffset equal to ThisElementSize plus PreviousElementPadding.
Set RemainingLength equal to RemainingLength minus (ThisElementSize plus PreviousElementPadding).
Set LastPosition equal to CurrentPosition.
Advance CurrentPosition by a number of bytes equal to ThisElementSize plus PreviousElementPadding.
EndFor
The object store MUST set LastPosition.NextEntryOffset equal to 0.
The operation returns STATUS_SUCCESS.