diff --git a/packages/util/native-command/README.i18n.yaml b/packages/util/native-command/README.i18n.yaml
index b2268f1e2d..cbfe2d6fb6 100644
--- a/packages/util/native-command/README.i18n.yaml
+++ b/packages/util/native-command/README.i18n.yaml
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/util/native-command/README.md
-README.md: ef9a066e38e584e592196ca4e6c80a266df135ad
-README.zh.md: 33ba66a2718bb5dbda2d5f346d656733eaeb4376
+README.md: ca820c4bc6c3ccdc9a54d4392176eb382ce5ae12
+README.zh.md: a948befc487c624d88426b27d15ecb0a91a8f813
diff --git a/packages/util/native-command/README.md b/packages/util/native-command/README.md
index ef9a066e38..ca820c4bc6 100644
--- a/packages/util/native-command/README.md
+++ b/packages/util/native-command/README.md
@@ -108,7 +108,7 @@ Linux association discovery and explicit launching require GIO. Missing native c
These limits define when this runner is not the right tool. They are current package constraints, not a task backlog.
-- **No output bounding** — both streams buffer unbounded in memory; every current caller invokes small native tools whose output is a path or an error line. Adopt `dsh-output-retention` bounding before pointing this at commands with meaningful output volume.
+- Command output uses Node’s `execFile` buffer limit; oversized replies reject. Use the subprocess capability for streaming output.
### Dev Note
diff --git a/packages/util/native-command/README.zh.md b/packages/util/native-command/README.zh.md
index 33ba66a271..a948befc48 100644
--- a/packages/util/native-command/README.zh.md
+++ b/packages/util/native-command/README.zh.md
@@ -108,7 +108,7 @@ Linux 的关联查询和指定应用启动需要 GIO。缺少原生命令时查
这些限制说明本运行器何时不是合适的工具。它们是当前包约束,不是任务积压。
-- **不做输出限量**——两路流在内存中无界缓冲;当前每个调用方只运行输出为一个路径或一行错误的小型原生工具。把它指向输出量可观的命令之前,先接入 `dsh-output-retention` 限量。
+- 命令输出受 Node 的 `execFile` 缓冲上限约束,超过上限时拒绝结果。流式输出由 subprocess 能力处理。
### 开发备注
diff --git a/packages/util/native-command/src/file-applications-windows.ts b/packages/util/native-command/src/file-applications-windows.ts
index 64b4290551..a468c9979c 100644
--- a/packages/util/native-command/src/file-applications-windows.ts
+++ b/packages/util/native-command/src/file-applications-windows.ts
@@ -99,8 +99,9 @@ public static class DshFileAssociations {
} finally {
SHSetInstanceExplorer(IntPtr.Zero);
SHSetThreadRef(IntPtr.Zero);
- if (reference != IntPtr.Zero) Marshal.Release(reference);
- Marshal.FreeHGlobal(count);
+ int remaining = reference == IntPtr.Zero ? 0 : Marshal.Release(reference);
+ // An interrupted drain leaves its counter owned by the terminating helper process.
+ if (remaining == 0) Marshal.FreeHGlobal(count);
}
}