2.1.5.10.29.2 Algorithm for REFS_STREAM_SNAPSHOT_OPERATION_LIST

Given a set of an arbitrary number (N) of DataStreams (S), as well as (N) named attributes where each named attribute references one DataStream, then:

  • Let Q be the query string, as represented by InputBuffer.SnapshotName.

  • A search for Q is performed within the File containing S. This will match all named attributes within the file whose names match the query string Q.<115>

  • Let X be a pointer to an array of bytes, initialized to point to the first entry in the output buffer.

  • Let Y be the total amount of bytes currently written to the output buffer. Y = 0.

  • Let Z be the number of entries currently written to the output buffer. Z = 0.

  • For every matching attribute M_i,

    • Copy the M_i name into X.SnapshotName.

    • Copy the M_i name length into X.SnapshotNameLength.

    • Copy the M_i creation time into X.SnapshotCreationTime.

    • Copy the M_i stream size into X.StreamSize.

    • Copy the M_i stream allocation size into X.StreamAllocationSize.

    • Set X.Reserved to zero.

    • Set X.NextEntryOffset to QuadAlign(FIELD_OFFSET(REFS_STREAM_SNAPSHOT_LIST_OUTPUT_BUFFER_ENTRY, SnapshotName) + X.SnapshotNameLength).

    • Advance the pointer X by X.NextEntryOffset bytes.

    • Z = Z + 1.

    • Y = Y + X.

    • If Y > OutputBufferLength, then no more entries are written to the output buffer. The rest of the entries are enumerated only incrementing Y.

  • Set OutputBuffer.Reserved to zero.

  • Set OutputBuffer.EntryCount to Z.

  • Set OutputBuffer.BufferSizeRequiredForQuery to Y.

  • If Y > OutputBufferLength, then return STATUS_BUFFER_OVERFLOW. Otherwise return STATUS_SUCCESS.