Summary
A Cloud Files sync provider (CfRegisterSyncRoot / CfConnectSyncRoot, Win32 cfapi) cannot answer some CF_CALLBACK_TYPE_FETCH_PLACEHOLDERS callbacks when the sync root lives in a user profile that FSLogix redirects to a per-user VHDX profile container. Every CfExecute(CF_OPERATION_TYPE_TRANSFER_PLACEHOLDERS) for such a callback fails with E_INVALIDARG (0x80070057), including the error completion. The request stays pending until the platform cancels it after about 60 s, and the application that triggered it (File Explorer, Office background processes, line-of-business applications) hangs for that time.
The condition is reproducible with a minimal standalone provider (one PowerShell script, no third-party software) on a clean Windows Server 2022 and Windows Server 2025 with FSLogix profile containers, with the current FSLogix 26.08 and the October 2026 cumulative update. The same script passes on the same machine for a user whose profile is excluded from FSLogix, on the same OS builds without FSLogix, and on Windows 11.
Exact trigger
The callback must be raised by a name lookup of a child that does not exist inside a placeholder directory with on-demand population enabled (for example CreateFileW("<dir>\missing.txt", FILE_READ_ATTRIBUTES, ..., FILE_FLAG_OPEN_REPARSE_POINT) or GetFileAttributesExW on that path), and nobody has had the directory open for roughly one to two minutes.
- The same callback raised by a directory enumeration (
FindFirstFile / NtQueryDirectoryFile) on the same kind of directory is answered fine, every time.
- A name lookup on a directory that was opened or listed a few seconds earlier is answered fine.
- Measured limit with the production provider: a directory probed 60 s after its last open is fine, 120 s and 300 s are rejected.
Minimal reproduction
Script: Repro-CfExecuteRejectedOnFSLogixProfile.ps1 (Windows PowerShell 5.1, non-elevated user, no third-party software), available here together with the two full logs: https://gist.github.com/pdupont1/85cc0b4a708a784db03087bdcdbe74c8
It registers a throwaway sync root at %USERPROFILE%\CfReproTest\root, connects with a FETCH_PLACEHOLDERS callback, creates three directory placeholders with on-demand population enabled, waits 150 s, then lets a separate process touch each directory once:
| Case |
Requester |
Provider answer |
| A_NameLookup |
CreateFileW("<dir>\missing.txt", FILE_READ_ATTRIBUTES, share all, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT) |
empty TRANSFER_PLACEHOLDERS directly from the callback; if rejected, open the directory with FILE_LIST_DIRECTORY, close it, send the identical answer again |
| B_Enumeration (control) |
enumerates the directory |
same empty TRANSFER_PLACEHOLDERS |
| C_NameLookup_ProviderOpensFirst |
same as A |
provider opens the directory with FILE_LIST_DIRECTORY and closes it before the first answer, then the same empty TRANSFER_PLACEHOLDERS |
The answer is always identical: CfExecute(CF_OPERATION_TYPE_TRANSFER_PLACEHOLDERS), PlaceholderCount = 0, PlaceholderArray = NULL, Flags = CF_OPERATION_TRANSFER_PLACEHOLDERS_FLAG_DISABLE_ON_DEMAND_POPULATION, CompletionStatus = STATUS_SUCCESS, CF_OPERATION_INFO filled from the callback's ConnectionKey, TransferKey, CorrelationVector and RequestKey.
Expected
A, B, C: S_OK on the first answer. This is what happens on the same machine for a user with a local profile, on the same OS builds without FSLogix, and on Windows 11.
Actual (profile in an FSLogix VHDX container)
Run on Windows Server 2022 Datacenter 20348.5761 (cldflt revision 5499), FSLogix 26.08 (3.26.826.17182), user whose profile is redirected to a VHDX container (frx list-redirects shows \Users\<user> => \Device\HarddiskVolume4\Profile), non-elevated, no third-party software. Full log in the gist (..._20261016_021838.log).
- A_NameLookup: the callback arrives with pattern
*, flags 0, request key 0. The first CfExecute returns E_INVALIDARG (0x80070057) within 2 ms. The provider then opens the directory with FILE_LIST_DIRECTORY, closes it, and sends the byte-identical answer again: S_OK. The requester's CreateFileW returns ERROR_FILE_NOT_FOUND after 6 ms, as it should.
- B_Enumeration: first answer
S_OK.
- C_NameLookup_ProviderOpensFirst: first answer
S_OK.
- Script verdict:
REPRODUCED.
Control run ten minutes later on the same server, same build, same FSLogix 26.08, as a local user in the "FSLogix Profile Exclude List" group (frx list-redirects: no redirections active). Full log in the gist (..._20261016_023151.log).
- A, B, C: first answer
S_OK each. Script verdict: NOT REPRODUCED (all answers accepted).
The two runs differ only in the user. The script, the Cloud Files registration, the reported volume (C:, same serial), the sync root path shape and the machine state are identical. For the redirected user, frx list-redirects reports the profile on \Device\HarddiskVolume4, while the path APIs and the callback's volume fields still report C:.
Environment matrix (same script, same scenario)
| System |
OS build |
cldflt revision |
FSLogix |
Result |
| Windows Server 2022 |
20348.5761 (October 2026 CU) |
5499 |
26.08 (3.26.826.17182), profile in VHDX container |
rejected (REPRODUCED) |
| Windows Server 2022, same machine |
20348.5761 |
5499 |
26.08 installed, user in Profile Exclude List (local profile) |
accepted (NOT REPRODUCED) |
| Windows Server 2022 |
20348.5622 |
5499 |
earlier 3.26 release, profile in VHDX container |
rejected (REPRODUCED) |
| Windows Server 2022 |
20348.3328 |
2849 |
profile in VHDX container |
rejected, identical step pattern |
| Windows Server 2022 |
20348.4529 |
2849 |
not installed |
accepted (9 of 9) |
| Windows Server 2025 |
26100.1742 |
1150 |
profile in VHDX container |
rejected, identical step pattern |
| Windows Server 2025 |
26100.1742 |
1150 |
installed, user in Profile Exclude List (local profile) |
accepted (9 of 9) |
| Windows Server 2025 |
26100.1742 |
1150 |
not installed, sync root on a plain VHDX with drive letter |
accepted |
| Windows Server 2025 |
26100.1742 |
1150 |
not installed, same VHDX mounted at a folder on C: |
accepted |
| Windows 11 |
26200 |
- |
not installed |
accepted (9 of 9) |
The only condition we could isolate is the sync root living in a user profile that FSLogix redirects to the per-user VHDX container. The OS patch level (reproduced on 20348.3328, 20348.5622 and 20348.5761), the FSLogix release (reproduced before and after the update to 26.08), a VHDX-backed volume as such, a mount-point reparse point, and FSLogix being installed but not redirecting the profile did not make a difference in our tests.
For reference, fltmc on the affected machines lists (altitudes): frxccd 306000, frxdrv 265700, CldFlt 180451, frxdrvvt 132700. fltmc instances shows a CldFlt instance on C: and one on each attached profile volume.
What does not help
- Waiting (100 ms, 8 s) before answering: still rejected.
- Opening the directory with
FILE_READ_ATTRIBUTES only (with FILE_FLAG_OPEN_REPARSE_POINT): still rejected.
- Omitting
CorrelationVector, RequestKey and SyncStatus from CF_OPERATION_INFO: still rejected.
- Payload shape: empty answers and answers with 1 to 500 placeholders are rejected alike.
- Sending the error completion (
CompletionStatus = STATUS_CLOUD_FILE_UNSUCCESSFUL with a CF_SYNC_STATUS): rejected as well, so the request cannot be failed either; it stays pending until the platform cancels it (about 60 s, CANCEL_FETCH_PLACEHOLDERS then arrives with the same keys).
What makes the same request answerable
- The provider opens the directory with
FILE_LIST_DIRECTORY (FILE_FLAG_BACKUP_SEMANTICS) and may close it again, either before the first answer or after a rejection. The identical CfExecute then returns S_OK.
-
CfUpdatePlaceholder(CF_UPDATE_FLAG_DISABLE_ON_DEMAND_POPULATION) on the directory from inside the callback, followed by the same answer: S_OK.
- A requester that holds the directory open with list access while probing the child name: answered
S_OK on the first try.
We shipped a fix for our provider with the "list access before answering the request"-workaround above.