BSOD (PAGE_FAULT_IN_NONPAGED_AREA / bindflt.sys) triggered by Cowork VM Service starting while a Python-based MCP extension (uv run) scans its own directory under %APPDATA%\Claude
Summary
Windows kernel crash (BSOD, stop code 0x50 / PAGE_FAULT_IN_NONPAGED_AREA) occurring
3 times within ~1 hour, each time correlated with Cowork VM Service (cowork-svc.exe)
starting a new VM session. !analyze -v on the kernel dump points to a race condition
inside Windows' own bindflt.sys driver (bindflt!BfMergeEnumerationContexts), withpython.exe as the faulting process.
Environment
- Claude Desktop: 1.52386.6.0 (Windows, x64)
- OS: Windows 10, build 19041.1 (KB5126256 batch installed 2026-09-09)
- Hyper-V: fully disabled; only
VirtualMachinePlatformoptional feature enabled - Trigger: installing/connecting a Blender MCP extension (community
blender-mcp,
launched via uv run blender-mcp) while Claude Desktop / Cowork was active
Timeline (2026-09-15, all times local UTC+8)
- 11:25:06 CoworkVMService starts → 11:25:27 BSOD
- 11:35:42 CoworkVMService starts → 11:36:09 BSOD
- 12:19:22 CoworkVMService starts → 12:19:38 BSOD
Each crash happens 15-25s after cowork-service.log shows:Warning: failed to configure recovery actions (a crashed service will stay down
until reboot): open service: Access is denied.
(this warning itself appears benign - logged on every service start since 2026-09-04
without incident - but the timing is a reliable marker of the crash window.)
Suspected structural cause
The MCP extension's launcher sets its working directory inside the same tree
Cowork bind-merges:
cd /d "C:\Users\<user>\AppData\Roaming\Claude\Claude Extensions\ant.dir.gh.blender.blender-mcp"
uv.exe run blender-mcp
cowork-service.log shows Cowork creating a VM session for the same root:Created new VM session for <user>:C:\Users\<user>\AppData\Roaming\Claude
uv run performs directory enumeration (project discovery, venv check) in that
directory at startup. When this races against Cowork's bindflt merge-mount setup
for the same tree, bindflt!BfMergeEnumerationContexts dereferences a bad/freed
pointer and crashes the kernel - this is a bug in bindflt.sys itself, not in the
extension, but the concurrent-access pattern appears to be specifically induced by
how Cowork extensions are launched from within its own merged directory.
!analyze -v key output
PAGE_FAULT_IN_NONPAGED_AREA (50)
Arg1: ffffc78aa633c42c (bad address, Read)
Arg3: fffff8075eb6b0a6 (faulting instruction)
PROCESS_NAME: python.exe
FAILURE_BUCKET_ID: AV_bindflt!BfMergeEnumerationContexts
MODULE_NAME: bindflt
IMAGE_NAME: bindflt.sys
STACK_TEXT:
nt!KeBugCheckEx
nt!MiSystemFault+0x1b70a3
nt!MmAccessFault+0x400
nt!KiPageFault+0x36d
bindflt!BfMergeEnumerationContexts+0xba
bindflt!BfPreDirectoryControl+0x550
FLTMGR!FltpPerformPreCallbacksWorker+0x36c
FLTMGR!FltpPassThroughInternal+0xca
FLTMGR!FltpPassThrough+0x541
FLTMGR!FltpDispatch+0x8b
nt!IofCallDriver+0x55
nt!IopSynchronousServiceTail+0x361
nt!NtQueryDirectoryFileEx+0xaf
Possibly related
Community reports (Reddit r/Anthropic, r/ClaudeCode, and this repo's issues) mention
Cowork VM service failing to start / losing disk access after a Windows update
released around 2026-09-08, reportedly acknowledged by Anthropic as a
Microsoft-side regression under investigation. This crash may be a more severe
manifestation of the same underlying interaction, now with a concrete kernel-level
root cause. Haven't independently cross-checked those specific threads, flagging
for the team to correlate.
Request
Could the Cowork team take a look at whether extension processes should avoid
enumerating directories inside Cowork's own bind-merged path while a VM session is
being created/torn down? Happy to provide the full raw !analyze -v output or the
kernel dump if useful.
Showing cached comments. Read the full discussion on GitHub ↗
3 Comments
Same crash here, and the faulting instruction matches: three BSODs in one evening, all
0x50 PAGE_FAULT_IN_NONPAGED_AREAinbindflt.sys, and the faulting instruction ends in...b0a6every time. That is the same offset as theArg3in your!analyzeoutput (bindflt!BfMergeEnumerationContexts+0xba).Environment
bindflt.sys10.0.19041.5678)%APPDATA%\Claude\Claude Extensionswas involved as far as I can tell. Cowork itself had not been used for weeks, and the VM was never booted ([VM] VM already stopped).Bugchecks (2026-09-26, local time UTC+2)
| Reboot | Arg1 (read address) | Arg3 (faulting IP) | Arg4 |
|---|---|---|---|
| ~20:33 |
ffffca8732620d65|fffff8061f89b0a6| 0 || ~20:41 |
ffffe78eb383a863|fffff80489cab0a6| 2 || ~23:50 |
ffff9e0795cba49b|fffff8065696b0a6| 2 |Correlation with
cowork-service.logCreated new VM session for <SID>:C:\Users\<user>\AppData\Roaming\Claude, then BSOD, then reboot at 20:41:16So on my machine the crash came about 4 minutes after session creation, not 15 to 25 seconds. I could not open
MEMORY.DMPwithout elevation, so the faulting process is unconfirmed on my side.Workaround, and a detail others will hit
services.msc, even when elevated. The field stays greyed out because the package service's security descriptor only grantsSERVICE_CHANGE_CONFIGto the service SID.Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Services\CoworkVMService -Name Start -Value 4followed by a stop (Authenticated Users haveSERVICE_STOP). With that the service stays stopped, and the app can no longer start it. I expect an app update to re-register the service and reset this.It would help to have a supported way to turn Cowork off entirely (so the service is not registered or started) for users who do not use it, at least until the
bindfltrace is fixed.Hitting what looks like the same bug. Adding a data point because in my case no Cowork VM session was involved — the trigger seems to be any per-user Python launched by Claude Code inside Claude Desktop.
Environment
bindflt.sys10.0.19041.5678%LOCALAPPDATA%\Programs\Python\Python313Crashes
0x50 PAGE_FAULT_IN_NONPAGED_AREAsince 2026-09-09 (the first one happened before that month's cumulative update was installed). Arg3 ends in…b0a6every time.bindflt+0x1b0a6= function start0x1afec+0xba, which matchesBfMergeEnumerationContexts+0xbareported here (I had no symbols loaded, so the name is inferred from the offset).nt!IofCallDriver→ FltMgr →bindflt+0x1b870→bindflt+0x1b0a6. The faulting instruction (mov r15d,[rax+r14], rax=0x3c, rdx=0x5e) looks like it is readingFileNameLengthof aFILE_BOTH_DIR_INFORMATIONentry through a stale pointer.python.exe(Python313) enumerating its own…\Python313\Lib\directory, i.e. just Python starting up / importing.Claude.exe(MSIX) →claude.exe(Claude Code CLI) →bash.exe→python.exe→pyftsubset.exe→python.exe(faulting). A second Claude Code session was running anotherpython.exeat the same time. Novmwp.exe/vmcompute.exe/vmmemwas running;cowork-svc.exewas only idling as a service.Why every Claude Code subprocess goes through bindflt's merge path
%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude-code\2.1.284\claude.exe.%APPDATA%\Claude\claude-code\2.1.284\claude.exeexists; from acmd.exestarted via WMI (outside the container) it does not.GetCurrentPackageFullName()returnsAPPMODEL_ERROR_NO_PACKAGEin the Claude Code shell, yet that shell still sees the Desktop container's merged AppData view.%APPDATA%/%LOCALAPPDATA%that Claude Code's subprocesses enumerate goes throughBfMergeEnumerationContexts. A per-user Python install does that on every start, which seems to be enough to hit the race, especially with several sessions running Python in parallel.Workaround I'm applying
Possible fix on the Desktop side: spawn Claude Code and its tool subprocesses fully outside the MSIX file-system virtualization, or install claude-code outside the package's LocalCache. Happy to pull more details from the dumps if useful.
Another data point for this issue, same driver but a different function (
BfPreCreatehere,BfMergeEnumerationContextsin the original report), on Windows 11 24H2 rather than Windows 10.Summary
Four kernel crashes in ~17 hours, all
0x50 PAGE_FAULT_IN_NONPAGED_AREA, all at the same instruction in Microsoft'sbindflt.sys(BfPreCreate+0x1864), all with the same faulting process: a GoogleTest binary (assistant_tests.exe) from a C++ project, launched viactest -jby a Claude Code session. Every crash came within one to two minutes of a parallelctestrun starting.bindfltonly inspects/redirects file opens when bind mappings exist. On this machine the only known source of mappings is the Claude desktop app's Cowork VM Service (cowork-svc.exe), whose log shows a live VM session during three of the four crashes. The Cowork feature itself was never used here: the only thing in use was the Claude desktop app, running Claude Code from its Code tab in ultracode mode. The service still created a VM session each time the desktop app connected to it. After a reboot on which the service was never started, the same full suite (3,221 tests, 260 s) ran clean on the first attempt, the first full run to survive since the crashes began.This is a Microsoft driver bug (missing empty-string check), but it is only reachable on machines where something has set up bind mappings, which Cowork does.
Environment
| | |
|---|---|
| OS | Windows 11 Pro 24H2, kernel 10.0.26100.9457 (KB5129195 / KB5126052 installed 2026-09-15) |
| bindflt.sys | 10.0.26100.9278 |
| CPU | AMD Ryzen 9 9950X3D (16C/32T) |
| Claude Desktop | 2.16120.0.0 (MSIX,
Claude_pzs8sxrjxfjjc) || Claude Code | 2.1.284, run inside the Claude desktop app (Code tab) in ultracode mode; Cowork never used |
| CoworkVMService | running as LocalSystem,
app\resources\cowork-svc.exe|| Also present | VMware Workstation 17.6.4, WSL (no distros), Hyper-V/VBS enabled, ESET 19.2 |
| Not present | Docker, Windows Sandbox package |
| Dumps | Kernel minidumps only; full
MEMORY.DMPfailed every time (volmgr event 161,BugCheckProgress 0x20063) |Timeline (local, UTC+1)
| # | Crash | Cowork state (from
C:\ProgramData\Claude\Logs\cowork-service.log) | Test activity (from Claude Code session log) ||---|---|---|---|
| 1 | 2026-09-30 23:41:08 | Service running; sessions created 12:27, 12:47, 17:41; idle timeout at 21:04 |
ctestwith 7 parallelassistant_tests.exe; crash mid-run || 2 | 2026-10-01 14:19:42 | Session created 10:47 (
...\Roaming\Work), still active |ctest -jstarted 14:17:48 || 3 | 2026-10-01 15:06:50 | Session created 14:48 (
...\Roaming\Second), active |ctest -j 6started 15:06:08 (42 s before crash) || 4 | 2026-10-01 16:57:29 | Session created 15:43; service stopped 15:51, not restarted |
cteststarted 16:56:41 (48 s before crash) || after | 2026-10-01 16:58 reboot onwards | Service never started this boot (disabled) | Full suite 3,221 tests / 259.66 s 100% passed at 18:07; smaller runs also clean; 0 crashes |
Crash 4 happened after the service was stopped but before a reboot. The simplest reading is that the mappings created by the 15:43 session outlived the service process until the 16:58 reboot cleared them.
Session paths in the log are of the form
<SID>:C:\Users\<user>\AppData\Local\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\<profile>.!analyze -v(crash 1; crashes 2 to 4 are identical apart from addresses)All four dumps:
| Dump | Time | Arg1 | Arg3 | Process | Bucket |
|---|---|---|---|---|---|
|
093026-23750-01.dmp| 09-30 23:41 |fffffffffffffffe|fffff803'6430b284| assistant_tests | AV_bindflt!BfPreCreate ||
100126-23796-01.dmp| 10-01 14:19 |fffffffffffffffe|fffff806'7ab4b284| assistant_tests | AV_bindflt!BfPreCreate ||
100126-24031-01.dmp| 10-01 15:06 |fffffffffffffffe|fffff807'6645b284| assistant_tests | AV_bindflt!BfPreCreate ||
100126-24140-01.dmp| 10-01 16:57 |fffffffffffffffe|fffff800'69d2b284| assistant_tests | AV_bindflt!BfPreCreate |(Arg3 low 16 bits are
b284every time = same offset0x1b284in bindflt.sys, different load base per boot.)What the faulting code is doing
Disassembly around the fault (bindflt.sys 10.0.26100.9278):
The filter has matched a bind mapping and is completing the create with
STATUS_REPARSE. While adjusting the reparse tag's unparsed-name length it reads the last character of the name's final component without checking for an empty one. HereFinalComponent.Buffer == NULLandLength == 0, so the read hits0 + 0 - 2 = 0xFFFFFFFFFFFFFFFE.So the user-mode trigger is a
NtCreateFilewhose path falls under a bind mapping and has an empty final component (e.g. a name ending in\). The exact path is not recoverable from the minidumps (trap frame holds only volatile registers; the callback data is not in the dump). The test suite does ordinary file I/O viastd::filesystem,std::fstreamandCreateFileW.Why this differs from #94454
BfPreCreate(file open) vsBfMergeEnumerationContexts(directory enumeration).%APPDATA%\Claude.Other things ruled out
SetProcessAffinityMaskcall on the test processes; the other three had no affinity change.bindflt/bindlinkreferences in the CLI or desktop package binaries; nobindfltapi.dllloaded in anyclaude.exe.-2, same instruction four times.