CfExecute(TRANSFER_PLACEHOLDERS) returns E_INVALIDARG for name-lookup FETCH_PLACEHOLDERS inside an FSLogix profile container

Pierre Dupont 0 Reputation points
2026-10-16T10:16:58.77+00:00

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.

Windows for business | Windows Client for IT Pros | User experience | FSLogix
0 comments No comments

1 answer

Sort by: Oldest
  1. Chance Maurice Niyonzima 500 Reputation points Independent Advisor
    2026-10-16T16:01:41.05+00:00

    Hello Pierre,

    Thank you for posting your question on the Microsoft Windows Forum!

    Thank you for the exceptionally detailed investigation. Based on the evidence you've already gathered, I would not approach this as an application bug in your provider implementation.

    What stands out is that you've already isolated the failure to a very specific condition:

    • The same provider code succeeds on Windows Server when the profile is not redirected by FSLogix.
    • The same provider code succeeds on Windows 11.
    • The same provider code succeeds for enumeration-triggered FETCH_PLACEHOLDERS.
    • The failure only occurs when the sync root resides inside a FSLogix profile container (VHDX) and the callback originates from a name-lookup of a missing child after the directory has been idle for some time.

    That level of isolation significantly reduces the set of plausible causes.

    What the Evidence Suggests

    The most significant finding, in my opinion, is this:

    The identical CF_OPERATION_TRANSFER_PLACEHOLDERS payload
    returns E_INVALIDARG,
    but succeeds immediately after the provider opens the directory
    with FILE_LIST_DIRECTORY.
    

    Since:

    • The callback keys are unchanged.
    • The payload is unchanged.
    • The same request succeeds moments later.

    This argues against a malformed CF_OPERATION_INFO or CF_OPERATION_PARAMETERS structure and points more toward a platform state issue involving the directory object being referenced by the callback.

    Why This Looks Platform-Related

    You demonstrated that:

    Name lookup + idle directory + FSLogix profile container
    

    fails,

    while:

    Enumeration + same directory
    

    succeeds.

    You also demonstrated that:

    Provider opens directory first
    

    causes the formerly rejected request to succeed immediately.

    That pattern is difficult to explain as a pure CFAPI contract violation because the exact same operation becomes valid after a directory open refresh.

    Microsoft Documentation Context

    The Cloud Files API documents CF_CALLBACK_TYPE_FETCH_PLACEHOLDERS and CF_OPERATION_TYPE_TRANSFER_PLACEHOLDERS, but does not describe a scenario where opening the backing directory is required before answering a name-lookup-triggered request. From a documented API perspective, the provider's original response appears reasonable. Microsoft documentation also does not describe special handling requirements for sync roots hosted inside FSLogix profile containers. Therefore, the behavior you've identified does not appear to be explained by published CFAPI requirements. Relevant documentation includes:

    Based on the reproduction matrix, I would currently treat this as a potential interaction issue between Cloud Files (CldFlt) and FSLogix profile redirection, rather than a provider implementation defect.

    The strongest evidence is:

    FSLogix profile container → REPRODUCED

    Local profile → NOT REPRODUCED

    across multiple Server builds and multiple FSLogix releases.

    The fact that your workaround:

    Open directory with FILE_LIST_DIRECTORY

    → then answer the callback

    reliably succeeds also suggests you've already identified a viable mitigation for production workloads.

    Recommendation

    At this stage, I would preserve the workaround you've implemented and continue treating the issue as a platform interaction until proven otherwise. The data you've collected (minimal reproducible provider, FSLogix/no-FSLogix comparison, Server 2022/2025 comparison, Windows 11 control case, and callback-level timing analysis) is exactly the type of evidence that would be useful if the issue requires escalation to the Cloud Files or FSLogix engineering teams.

    I hope this answer has brought you useful information. If so, please click on "Accept Answer" and consider upvoting it. Doing so helps other community members identify useful solutions to similar issues.

    Was this answer helpful?

    0 comments No comments

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.