Hello Matthew,
Based on the six Microsoft Learn references you cited, the documented contracts do not support a single combined guarantee covering all of the properties in the question. Several of the requested properties are explicitly outside the contract of these Win32 APIs.
My reading of the documented behavior is:
| Item |
Result |
Documentation-based reason |
| 1. Attribute/tag/payload |
GUARANTEED, with conditions |
FILE_ATTRIBUTE_TAG_INFO contains FileAttributes and ReparseTag; it does not contain the reparse payload. CreateFile also documents that dwDesiredAccess = 0 can permit querying certain metadata without requesting read/write access to the file. However, this does not constitute a general guarantee that no filesystem/filter/provider will access underlying data. |
| -------- |
-------- |
-------- |
| 1. Attribute/tag/payload |
GUARANTEED, with conditions |
FILE_ATTRIBUTE_TAG_INFO contains FileAttributes and ReparseTag; it does not contain the reparse payload. CreateFile also documents that dwDesiredAccess = 0 can permit querying certain metadata without requesting read/write access to the file. However, this does not constitute a general guarantee that no filesystem/filter/provider will access underlying data. |
| 2. Referral / reparse behavior |
CONDITIONAL |
FILE_FLAG_OPEN_REPARSE_POINT changes the final-component behavior: Windows attempts to open the reparse point itself rather than performing normal reparse processing. For symbolic links, Microsoft explicitly documents that without the flag the handle is to the target, while with it the handle is to the symbolic link. The cited documentation does not establish a blanket guarantee about every intermediate path component or every possible filesystem/filter-provider referral. |
| 3. Identity |
CONDITIONAL |
GetFileInformationByHandle documents that VolumeSerialNumber and FileIndex can be compared to determine whether two paths map to the same target. GetFinalPathNameByHandle reports the final path associated with an already-open handle. Neither API establishes uninterrupted historical binding from the original pathname, nor does equality prove that no earlier referral occurred. Concurrent changes and filesystem/provider semantics remain relevant. |
| 4. Effects |
NOT_GUARANTEED |
FILE_FLAG_OPEN_NO_RECALL is documented as a request that file data remain in remote storage rather than being transported back to local storage; it is not documented as a universal prohibition on provider activity, synchronization, metadata changes, or other side effects. Likewise, requesting metadata does not create a general contract that no filesystem/filter/provider activity occurs. |
| 5. Enumeration |
CONDITIONAL |
FindFirstFileEx returns directory-entry information, but the documentation explicitly notes that results can become stale because another process can create/delete an entry between the query and subsequent use. It also does not promise a snapshot, completeness under concurrent modification, bounded execution time, or absence of filesystem/provider activity. If the path itself is a symbolic link, the returned data describes the link rather than its target. |
| 6. Failure/completion |
NOT_GUARANTEED |
CancelSynchronousIo specifically does not wait for canceled operations to complete. Microsoft states that some operations can continue toward completion and that the caller must examine the eventual completion status. Therefore cancellation is a cancellation request, not a documented deadline. |
1. Attribute/tag versus payload
The strongest explicit contract among these references is the separation represented by FILE_ATTRIBUTE_TAG_INFO:
FileAttributes
ReparseTag
The structure has no reparse-data/payload field. The payload is a separate concept obtained through APIs intended to retrieve reparse data.
More importantly, CreateFile explicitly documents that dwDesiredAccess = 0 permits an application to query certain metadata without accessing the file/device for read or write access. That is an access-right statement, not an absolute statement about what every filesystem or minifilter/provider will physically do internally.
2. Reparse/no-follow scope
FILE_FLAG_OPEN_REPARSE_POINT has a documented meaning for the object being opened. In particular, Microsoft's symbolic-link section explicitly distinguishes:
- without the flag → the handle is to the symbolic-link target;
with the flag → the handle is to the symbolic link itself.
That is sufficient to establish final-component behavior for the documented symbolic-link case. It is not sufficient to infer a universal "no referral anywhere in the pathname" guarantee, especially for arbitrary reparse tags, filesystems, or filesystem filters.
3. Names and identifiers
GetFinalPathNameByHandle is explicitly about the object represented by an existing handle. FILE_NAME_OPENED returns the opened name, whereas FILE_NAME_NORMALIZED returns the normalized final path. The documentation also says that a final path is the path obtained when a path is fully resolved.
GetFileInformationByHandle provides the VolumeSerialNumber and FileIndex information and explicitly says these can be compared to determine whether two paths map to the same target.
Neither statement establishes a temporal guarantee such as:
"This pathname was continuously bound to this object from the beginning of the operation."
Nor does identifier equality prove that no reparse/referral occurred before the object was opened.
4. OPEN_NO_RECALL
This flag should not be interpreted more strongly than Microsoft's wording.
Microsoft says FILE_FLAG_OPEN_NO_RECALL means that the requested file data should continue to be located in remote storage and should not be transported back to local storage. That is specifically about recall/localization of file data. It is not documented as a general "provider must perform no work" or "storage state cannot change" guarantee.
Similarly, the fact that an operation requests metadata rather than file contents does not create a universal guarantee against filesystem, filter, network redirector, or storage-provider activity.
5. Enumeration
FindFirstFileEx is particularly important here because the documentation explicitly warns about concurrent changes: another process can create or delete a file between obtaining the information and acting on it. Therefore the API should not be interpreted as providing an immutable directory snapshot.
The documentation also says that, when the path itself is a symbolic link, WIN32_FIND_DATA describes the symbolic link rather than its target.
Nothing in the cited reference provides a hard upper bound on enumeration time or guarantees that filesystem/provider work cannot occur.
6. Cancellation and completion
This is the clearest NOT_GUARANTEED case.
CancelSynchronousIo:
marks pending synchronous I/O for cancellation;
may allow some operations to continue toward completion;
does not wait for those operations to finish;
requires the caller to determine the eventual completion status.
Microsoft explicitly lists three possible completion outcomes: normal completion, cancellation (ERROR_OPERATION_ABORTED), or another failure.
Therefore there is no documented hard completion deadline in this API, and cancellation cannot be used as evidence that the underlying operation has already stopped.
Bottom line
The six references support specific API-level contracts, but they do not collectively establish the stronger composite invariant described in the question:
metadata-only + no referral + no provider activity + no recall/hydration + no storage-state change + complete finite enumeration + hard cancellation deadline.
For that stronger guarantee, additional contracts would have to be identified for the relevant Windows version, filesystem, network redirector, minifilter/provider, reparse-tag semantics, and access mode. The six cited Win32 pages alone do not provide such a universal guarantee.Hello Matthew,
Based on the six Microsoft Learn references you cited, the documented contracts do not support a single combined guarantee covering all of the properties in the question. Several of the requested properties are explicitly outside the contract of these Win32 APIs.
My reading of the documented behavior is:
| Item |
Result |
Documentation-based reason |
| 1. Attribute/tag/payload |
GUARANTEED, with conditions |
FILE_ATTRIBUTE_TAG_INFO contains FileAttributes and ReparseTag; it does not contain the reparse payload. CreateFile also documents that dwDesiredAccess = 0 can permit querying certain metadata without requesting read/write access to the file. However, this does not constitute a general guarantee that no filesystem/filter/provider will access underlying data. |
| 2. Referral / reparse behavior |
CONDITIONAL |
FILE_FLAG_OPEN_REPARSE_POINT changes the final-component behavior: Windows attempts to open the reparse point itself rather than performing normal reparse processing. For symbolic links, Microsoft explicitly documents that without the flag the handle is to the target, while with it the handle is to the symbolic link. The cited documentation does not establish a blanket guarantee about every intermediate path component or every possible filesystem/filter-provider referral. |
| 3. Identity |
CONDITIONAL |
GetFileInformationByHandle documents that VolumeSerialNumber and FileIndex can be compared to determine whether two paths map to the same target. GetFinalPathNameByHandle reports the final path associated with an already-open handle. Neither API establishes uninterrupted historical binding from the original pathname, nor does equality prove that no earlier referral occurred. Concurrent changes and filesystem/provider semantics remain relevant. |
| 4. Effects |
NOT_GUARANTEED |
FILE_FLAG_OPEN_NO_RECALL is documented as a request that file data remain in remote storage rather than being transported back to local storage; it is not documented as a universal prohibition on provider activity, synchronization, metadata changes, or other side effects. Likewise, requesting metadata does not create a general contract that no filesystem/filter/provider activity occurs. |
| 5. Enumeration |
CONDITIONAL |
FindFirstFileEx returns directory-entry information, but the documentation explicitly notes that results can become stale because another process can create/delete an entry between the query and subsequent use. It also does not promise a snapshot, completeness under concurrent modification, bounded execution time, or absence of filesystem/provider activity. If the path itself is a symbolic link, the returned data describes the link rather than its target. |
| 6. Failure/completion |
NOT_GUARANTEED |
CancelSynchronousIo specifically does not wait for canceled operations to complete. Microsoft states that some operations can continue toward completion and that the caller must examine the eventual completion status. Therefore cancellation is a cancellation request, not a documented deadline. |
1. Attribute/tag versus payload
The strongest explicit contract among these references is the separation represented by FILE_ATTRIBUTE_TAG_INFO:
FileAttributes
ReparseTag
The structure has no reparse-data/payload field. The payload is a separate concept obtained through APIs intended to retrieve reparse data.
More importantly, CreateFile explicitly documents that dwDesiredAccess = 0 permits an application to query certain metadata without accessing the file/device for read or write access. That is an access-right statement, not an absolute statement about what every filesystem or minifilter/provider will physically do internally.
2. Reparse/no-follow scope
FILE_FLAG_OPEN_REPARSE_POINT has a documented meaning for the object being opened. In particular, Microsoft's symbolic-link section explicitly distinguishes:
without the flag → the handle is to the symbolic-link target;
with the flag → the handle is to the symbolic link itself.
That is sufficient to establish final-component behavior for the documented symbolic-link case. It is not sufficient to infer a universal "no referral anywhere in the pathname" guarantee, especially for arbitrary reparse tags, filesystems, or filesystem filters.
3. Names and identifiers
GetFinalPathNameByHandle is explicitly about the object represented by an existing handle. FILE_NAME_OPENED returns the opened name, whereas FILE_NAME_NORMALIZED returns the normalized final path. The documentation also says that a final path is the path obtained when a path is fully resolved.
GetFileInformationByHandle provides the VolumeSerialNumber and FileIndex information and explicitly says these can be compared to determine whether two paths map to the same target.
Neither statement establishes a temporal guarantee such as:
"This pathname was continuously bound to this object from the beginning of the operation."
Nor does identifier equality prove that no reparse/referral occurred before the object was opened.
4. OPEN_NO_RECALL
This flag should not be interpreted more strongly than Microsoft's wording.
Microsoft says FILE_FLAG_OPEN_NO_RECALL means that the requested file data should continue to be located in remote storage and should not be transported back to local storage. That is specifically about recall/localization of file data. It is not documented as a general "provider must perform no work" or "storage state cannot change" guarantee.
Similarly, the fact that an operation requests metadata rather than file contents does not create a universal guarantee against filesystem, filter, network redirector, or storage-provider activity.
5. Enumeration
FindFirstFileEx is particularly important here because the documentation explicitly warns about concurrent changes: another process can create or delete a file between obtaining the information and acting on it. Therefore the API should not be interpreted as providing an immutable directory snapshot.
The documentation also says that, when the path itself is a symbolic link, WIN32_FIND_DATA describes the symbolic link rather than its target.
Nothing in the cited reference provides a hard upper bound on enumeration time or guarantees that filesystem/provider work cannot occur.
6. Cancellation and completion
This is the clearest NOT_GUARANTEED case.
CancelSynchronousIo:
marks pending synchronous I/O for cancellation;
may allow some operations to continue toward completion;
does not wait for those operations to finish;
requires the caller to determine the eventual completion status.
Microsoft explicitly lists three possible completion outcomes: normal completion, cancellation (ERROR_OPERATION_ABORTED), or another failure.
Therefore there is no documented hard completion deadline in this API, and cancellation cannot be used as evidence that the underlying operation has already stopped.
Bottom line
The six references support specific API-level contracts, but they do not collectively establish the stronger composite invariant described in the question:
metadata-only + no referral + no provider activity + no recall/hydration + no storage-state change + complete finite enumeration + hard cancellation deadline.
For that stronger guarantee, additional contracts would have to be identified for the relevant Windows version, filesystem, network redirector, minifilter/provider, reparse-tag semantics, and access mode. The six cited Win32 pages alone do not provide such a universal guarantee.