mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #7121] [Bug] Windows Ghidra lane refuses DOS MZ (16-bit real mode) targets and cannot open an existing Ghidra project #4279
Open
opened 2026-10-31 00:48:27 +00:00 by bsakaguchi
·
10 comments
No Branch/Tag specified
main
codex/procedure-reference-stacked
release-please--branches--main--components--rea-agents
release-please--branches--main--components--rea-agents--release-notes
codex/kuna-independent-retry
codex/byte-search-overlay-coverage
codex/open-failure-target-receipt
codex/kuna-xref-evidence
codex/ghidra-ambiguous-procedure-recovery
codex/function-source-bundle
codex/trace-function-integration-prototype
codex/snapshot-source-closure
codex/recorded-evidence-array-pages
codex/evidence-recovery-redesign
codex/trace-feature-address-scope
codex/call-discovery-scope
codex/ghidra-literal-candidate-evidence
codex/decompile-directory-independent-retry
codex/retry-provenance-base
codex/value-flow-capability-experiment
codex/ghidra-containing-instruction
cursor/readme-discord-button-ef9f
dependabot/github_actions/actions/setup-node-7.1.0
dependabot/github_actions/actions/upload-artifact-7.0.2
dependabot/npm_and_yarn/npm-minor-and-patch-d8d97ce6df
codex/kuna-1989
fix/8559-native-ui-fixture-ownership
fix/8555-go-verifier-mcp-ownership
codex/provider-capability-recovery
fix/8642-rizin-target-stdin
codex/ghidra-memory-effect-scope
codex/ghidra-annotation-entry-selector
codex/ghidra-readonly-recovery
codex/ghidra-regex-verifier-recovery
codex/evidence-discovery-view-guidance
fix/8545-bulk-append-overflow
fix/8428-navigation-refusal-alternatives
codex/address-context-recovery
codex/matching-member-limitations
codex/unknown-scope-contract
codex/evidence-view-guidance
feat/8373-native-trace-views
codex/ghidra-snapshot-verifier-binding
codex/elf-export-visibility
codex/evidence-view-recovery
codex/native-reference-cli-help
codex/provider-candidate-observation-scope
codex/kuna-session-verification
codex/ghidra-switch-lifetime-guidance
codex/pseudocode-paging-discovery
codex/clarify-evidence-view-support
codex/kuna-xrefs-selector-recovery
codex/context-capacity-recovery
codex/evidence-closure-large-links
codex/same-function-evidence-identity
codex/ghidra-verifier-inspected-jdk
codex/audit-guided-workflows
codex/crash-prompt-retained-dossiers
codex/analysis-view-error-recovery
codex/kuna-verifier-target-selection
codex/ghidra-selected-project-call-coverage
codex/docs-native-analysis-scope
codex/ghidra-java-socket-boundary
codex/ghidra-retained-snapshot-verifier
codex/ghidra-search-inventory-facts
fix/8284-zero-argument-parameter-bindings
fix/8198-ui-action-handler-offset
fix/8257-elf-entry-label-identity
fix/8304-deferred-output-schema-projection
fix/8277-call-path-computed-target-uncertainty
fix/pr-8089-conflicts
fix/ci-static-duplicate-export
dependabot/npm_and_yarn/lint-staged-17.6.0
dependabot/github_actions/actions/download-artifact-8.0.2
dependabot/npm_and_yarn/write-file-atomic-8.0.0
dependabot/npm_and_yarn/canonicalize-5.1.0
dependabot/github_actions/actions/cache/restore-6.1.0
dependabot/npm_and_yarn/toon-format/toon-4.4.0
dependabot/github_actions/actions/deploy-pages-5.0.1
codex/review-fixes-pr-2403
codex/review-fixes-pr-2400
codex/process-terminal-width
codex/test-brittleness-cleanup
verify/7167-browser-connect-macos
fix/7167-browser-connect
feat/native-matching-allowance-setting
feat/browser-scenario-dry-run
test/managed-caller-parameters-20261024
codex/parser-fortythird-boundaries
fix/6926-pinvoke-platform-decorations-20261023
fix/6889-har-body-encoding-20261023
fix/6888-sqlite-schema-budget-20261023
fix/dependency-security-gates-6708
cursor/evidence-overwrite-rebase-b4ac
feat/4057-verify-native-exports
fix/windows-acl-observer-overhead-20261022
cursor/erlang-beam-restack-4476
cursor/pe-certificate-review-bf32
fix/6116-javascript-application-fs-errors
fix/6061-unmapped-runtime-script-unknown
feat/browser-scenario-summary
fix/pe-certificates
codex/verify-3407
cursor/rebase-5699
cursor/rebase-5352
cursor/rebase-5600
cursor/fix-cli-schema-omission-10a8
codex/audit-hopper-shutdown-reasons-20261021
fix/demangle-swift-omitted-record
fix/nib-boolean-value-types
cursor/cancellation-partial-observation-a5ac
fix/ib-object-limit-reasons
fix/electron-fuse-limit-advice
fix/kuna-doctor-dangling-cache
fix/fixed-budget-refusal-advice
fix/js-ipc-listener-dedup
fix/js-return-member-provenance
fix/dmg-integrity-retry-advice
fix/ida-doctor-readiness
fix/kuna-version-probe-output-drain
fix/legacy-swift-runtime-name-matching
fix/dylib-lazy-load-commands
fix/browser-scenario-startup-cancel
fix/swift-nested-punycode-classification
fix/compare-unselected-scopes
fix/objc-method-budget-coverage
fix/dmg-mounted-root-observations
audit/ci-tests-20261019-round2
release/6.7.0
fix/wabt-cleanup-retry-resolution
fix/electron-fuse-elf-pe-architecture
fix/native-plist-descriptor-ownership
fix/kuna-caller-cleanup-ownership
experiment/atomic-codemode-20261016
review/first-contributor-3776
fix/call-resolution-full-read-cycles
fix/member-mutation-selection-repeat
experiment/atomic-re-tools-20261015
perf/member-mutation-lazy-origins
perf/static-network-mutation-index
fix/hopper-startup-lifecycle
audit/3050-windows-proof-20261015
feat/windows-window-capture-2183
audit/3049-windows-proof-20261015
audit/3735-macos-fixtures-20261015
fix/batch-decompile-null-pseudocode
fix/kuna-inventory-honors-jobs
experiment/browser-codemode-tool-design-20261015
fix/hopper-clean-runtime-argv
codex/review-2049-27f1b367
review-fixes/pr-2787-routing
fix/3360-scoped-this-emitters
fix/3367-replaced-global-effects
fix/3838-compact-any-value-items
test/hopper-download-probe-20261015
codex/windows-runtime-creation-red-green-20261015
codex/windows-readonly-root-red-green-20261015
codex/windows-root-share-red-green-20261015
codex/exp-1685-win-mcp-startup
codex/bug-sweep-20261015
investigate/2190-windows-package-phases
investigate/3543-macos-cli-deadline
perf/3281-reverse-tools-feedback-quality
fix/3406-hopper-doctor-fixture
fix/3341-wrapper-require-test-context
fix/3301-owned-uninstall-fixtures
fix/3164-compiler-input-ownership
fix/pcap-cleanup-stdout-newline-20261014
perf/interface-builder-summary
codex/review-fixes-pr-1977
fix/ghidra-effective-jvm-platform
fix/docs-turkish-rust-link-20261013
fix/main-maintenance-ci-20261010
fix/recover-binary-session-process-effects
codex/review-fixes-pr-2457
codex/ci-required-cancellation-gate
fix/main-format-baseline-20261013
fix/setup-preserve-entry-fields
cursor/restore-main-checks-1ffc
fix/ghidra-bridge-hashmap-import
codex/shared-ci-jadx-json-default-20261013
codex/shared-ci-ghidra-test-groups-20261013
codex/shared-ci-java-fixture-format-20261013
codex/fix-intrinsic-invocation-boundaries
test/release-preflight-reusable-jobs
test/js-parameter-provenance-expectation
fix/linux-hopper-verification-current
test/2419-ghidra-elf-probe-size
followup/pr-1544-native-ida
codex/fold-pr-2230-contribution
docs/readme-responsible-use
fix/issue-2064
fix/issue-2050
fix/issue-2053
fix/issue-1968
fix/issue-1945
experiment/codemode-bridge-20261011
fix/tool-effects-negative-wording-1904-20261012
fix/1842-electron-interop-provenance
feat/recover-javascript-multi-input
refactor/website-i18n-prep
fix/nativeaot-pe-virtual-extent
fix/browser-verifier-ci-hang
fix/pe-resources-input-selection
docs/beginner-friendly-guides
docs/beginner-setup-guide
fix/javascript-analysis-worker-1563
fix/1649-ghidra-duplicate-names
fix/javascript-export-keys-integration-1369
test/maintenance-boundary-contracts-20261011
review/javascript-export-keys-1369
review/process-live-progress-1483
test/javascript-1495-growth-ratio
fix/ci-escape-timing
docs/normalized-terminal-geometry-1450
release/6.3.0
archive/release-6.3.0-pr1381
release/6.2.0
fix/electron-preload-dynamic-override
fix/javascript-self-referential-bundler-edges
release/6.1.0
cursor/grok-client-cherry-pick-0b56
feat/signature-posture
feat/dyld-shared-cache
feat/artifact-integrity-policy
feat/pkg-inventory
release/6.0.0
chore/sync-release-5.0.0
release/5.0.0
cursor/cloud-agent-node-787e
fix/javascript-xhr-open-endpoints
review/pr-711-realpath-fallback-wording
cleanup/replay-confinement
codex/test-suite-performance
codex/issue-foundations
codex/address-open-issues-2026-07-20
agent/javascript-vite-rollup-esbuild-adapters
agent/process-cleanup
agent/triage-integration
agent/unknown-commands-registry
feat/mcp-identity-metadata
morlvps/issue_cleanup
codex/installer-redesign
morl/roadmap-investigation-core
morl/roadmap-investigation-docs
release-please--branches--main--components--rea
rea-agents-6.8.0
rea-agents-6.7.0
rea-agents-6.6.0
experiment/atomic-codemode-wait-runtime-20261016
rea-agents-6.5.0
rea-agents-6.4.0
rea-agents-6.3.0
rea-agents-6.2.0
rea-agents-6.1.0
rea-agents-6.0.0
rea-agents-5.0.0
rea-agents-4.1.0
rea-agents-4.0.1
rea-agents-4.0.0
rea-agents-3.2.1
rea-agents-3.2.0
rea-agents-3.1.0
rea-agents-3.0.0
rea-agents-2.7.0
rea-agents-2.6.0
rea-agents-2.5.1
rea-agents-2.5.0
rea-agents-2.4.0
rea-agents-2.3.0
rea-agents-2.2.0
rea-agents-2.1.0
rea-agents-2.0.0
rea-agents-1.7.0
rea-agents-1.6.0
rea-agents-1.5.0
rea-agents-1.4.0
rea-agents-1.3.0
rea-agents-1.2.0
rea-agents-1.1.0
rea-agents-1.0.0
rea-agents-0.5.0
rea-agents-0.4.0
rea-agents-0.3.0
rea-0.2.1
rea-0.2.0
Labels
Clear labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
Mirrored from GitHub Pull Request
question
roadmap
triage
No labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
question
roadmap
triage
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
morluto/rea#4279
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @pietrondo on GitHub (Oct 25, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/7121
Observed behavior
open_binarydetects the target as a DOS executable, but no provider can analyse it on Windows, and every subsequent operation fails withprovider_unavailable. The Ghidra lane refuses the format because the Windows admission boundary (inspectWindowsP0TargetSupportindist/ghidra/GhidraProvider.js) only admits native PE and explicitly selected raw 6502 images.Observed MCP result for
open_binary:and the next call (
search_strings/binary_overview/ any read) fails with:The
dos-comformat documented onopen_binaryis refused by the same check on Windows.Reproduction
open_binarywithpath= a 16-bit DOS MZ executable (DOS MZ, x86 real mode).dos-mz/x86detection.binary_overview,search_strings,list_procedures,procedure_pseudo_code, ...).provider_unavailablewith the four provider rejections quoted above. Reproduced on every attempt (5/5).Variants that were also run:
open_binary(path=<MZ exe>)dos-mz; every later operation fails as aboveopen_binary(path=<MZ exe>, format="raw-binary", architecture="x86", entry_point="0xAE00")open_binary, thenbinary_overviewfails with the same P0 refusal fortarget_format: "raw-binary"open_binary(path="...\\SimEarth.gpr")(an existing Ghidra project)target_unavailable- "Cannot open artifact: truncated or unsupported binary header."open_binary(path="...\\SimEarth.rep")(the project directory)rea doctorghidra: healthy(12.1.2, win32 x64),ghidra-platform: healthy,ghidra-architecture: healthy- the installation is fine, the format is not admittedExpected behavior
The DOS lanes that REA supports elsewhere (
dos-mz,dos-com) are reachable on Windows, as the GameCube DOL comment in the same source file implies they are on POSIX ("DOL is verified on POSIX hosts only; Windows P0 does not admit it, like the other non-PE lanes"). Ghidra itself supports the target language (x86:LE:16:Real Mode), so the admission boundary - not the engine - is what refuses it.A second, independent path would be to accept an existing Ghidra project as an
analysis-databasetarget, so an analysis that was already computed withanalyzeHeadlesscan be reused instead of recomputed.This expectation is inferred from the provider's own POSIX behaviour and from #3767 (which analyses a DOS MZ image); it was not verified against a known-good Windows build.
Impact and scope
A 16-bit DOS executable cannot be analysed through REA on Windows at all - there is no provider to fall back to (Hopper is macOS-only, IDA and Kuna are not configured here). The workaround is a separate Ghidra headless installation plus a project file, and REA cannot read that result either, so every observation has to leave the MCP tool. Frequency: every attempt, 5/5.
REA version
6.8.0 (
rea --version, npm packagerea-agents)Runtime and platform
Windows, win32 x64; Node 24.14.0; Ghidra 12.1.2 at
C:\Users\pietr\Downloads\ghidra_12.1.2_PUBLIC; no Hopper, no IDA, no Kuna on this host.Target and artifact context
A 16-bit DOS MZ executable, x86 real mode:
simearth.exe(Maxis SimEarth, 1990). The image is loaded atPSP+0x10with a0x5200-byte header, so the code lives at file offset0x5200and the analysis of interest starts there. Its analysis already exists in a Ghidra project (analyzeHeadless, languagex86:LE:16:Real Mode).Interface
MCP
Earliest failure stage
Setup or provider admission
Relevant output or evidence
Command or MCP request actually run:
Relevant result, error, or artifact: the JSON blocks quoted in "Observed behavior" above, and the source-derived admission rule:
Source-only findings are labelled as such: the code path above is from the installed 6.8.0 package, not from a repository revision.
Missing evidence or remaining uncertainty: I did not test a POSIX host, so I cannot confirm from observation that the same
dos-mztarget is admitted there; the DOS MZ support referenced in #3767 was not re-verified.Typed outcome or recovery expected
Either
open_binaryacceptsdos-mz/dos-comon Windows with a caller-supplied language and entry point (the shapeREA_GHIDRA_LANGUAGE_IDandformat="raw-binary"already have), or the failure names the supported Windows formats as a typedtarget_format_unsupportedatopen_binarytime instead of at the first provider operation - the target is detected successfully, so the refusal arrives one step later than the user expects.Analysis or suspected cause
The refusal is by design in the Windows P0 boundary, not a broken installation:
rea doctorreports Ghidra healthy, and the same function that rejects DOS MZ also rejects DOL with the comment that non-PE lanes are "verified on POSIX hosts only". The DOS MZ lane is therefore reachable through Ghidra on POSIX, and unreachable on Windows.Additional context
This blocks an active reconstruction task: the target is a 1990 DOS game whose per-turn simulation has to be validated against the original binary, and every code observation currently has to be made outside REA with a hand-driven Ghidra headless project.
@XinwangTao commented on GitHub (Oct 25, 2026):
这个 bug 确认是真实的,而且是文档与 admission 边界不一致的典型:open_binary 能识别并对外宣称支持 dos-mz / x86,但 Windows Ghidra lane 的 P0 边界只放行 native PE 和显式 6502,等于"前端承诺、后端拒绝",用户拿到的 provider_unavailable 也没有给出可操作的补救路径。你列出的三种变体(原始 MZ、raw-binary 强改、已存在 .gpr 项目)都失败,说明问题不在单点格式,而是 admission 判定维度太窄。建议从两个方向考虑:(1) 把 dos-mz / raw-binary 也纳入 Windows Ghidra P0 的接受集合,或用 target_format 之外的入口点/架构参数做更精确的放行,Ghidra 本身完全能加载 16-bit MZ;(2) 若短期不做,至少让拒绝信息返回可操作的 fallback 提示(如建议用户以 raw-binary + entry_point 重开、或改用支持 win32 的 provider),而不是四个拒绝理由里三个是 not_configured。另外 .gpr 项目打不开这点值得单独验证——Ghidra headless 导入已有项目属于常规能力,若只是桥接层没传对路径/项目名参数,修起来成本很低。可以对照 #3767 看看 Linux 侧是否已有类似放行逻辑可复用。
@pietrondo commented on GitHub (Oct 25, 2026):
Thanks - I went through 6.8.0 (the current release) to aim the two suggestions at the right lines, and two of them need a correction.
The blocker is one short-circuit, and the DOS loader support is already there
dist/ghidra/GhidraProvider.jsreaches the target support like this:and
inspectWindowsP0TargetSupportacceptsformat === "pe"(x86, x86-64, ARM, ARM64, application/shared-library role, non-managed) plusformat === "raw-binary" && architecture === "6502". Every check after the format gate is PE-specific, so a DOS branch would sit before thetarget.format !== "pe"line, exactly like thegamecube-dolbranch does.The rest of the Ghidra lane already speaks DOS -
dist/ghidra/GhidraLauncher.js:dosMz: true/dosCom: trueare already plumbed from the target format into the launcher (GhidraProviderClient.js,GhidraLauncher.js),dos-comeven gets its ownprepareCompre-script, and the DOS import commits its language (a generic override is refused for it: "A Ghidra language override cannot be combined with a DOS import"). So admittingdos-mzanddos-comin the Windows set reads like a set-membership change, not a new lane - anddos-comwould bring #3767's seeded-image workaround with it, unchanged.raw-binarywould not be a valid fallback for a DOS MZI would keep it out of the error text.
ghidraRawBinaryLanguage("x86")returnsx86:LE:32:defaultwith cspecgcc- 16-bit real-mode code decoded as 32-bit - and the override is explicitly refused for raw imports:so
REA_GHIDRA_LANGUAGE_IDcannot turn the raw lane into a real-mode one either. What does work on a Windows host today is the Rizin lane, which reads the same file:(Rizin maps the MZ flat, so its addresses are file offsets.)
The
.gprhypothesis does not hold, I thinkThere is no Ghidra-project import path to fix.
dist/domain/binaryTarget.jsparseExecutableHeaderrecognises ELF, MZ, Mach-O, FAT and PE and nothing else:and the
analysis-databasevalue in the target-format enum is REA's own session analysis database - the Ghidra program's ephemeral database, written byclose_binary(snapshot_path)and re-imported byopen_binary(snapshot_path=...)- not a Ghidra project.Concretely, in Ghidra 12 the
SimEarth.gprfile is a zero-byte marker and the project data lives inSimEarth.rep/, so my attempt fell into thebytes.length < 8branch above and never reached a path or argument problem. Opening an existing Ghidra project would be a new feature (a project-directory target), not a bridge fix.On the actionable message
Agreed. Three things would have helped me, in this order:
dos-comonce admitted - the #3767 seeded image - and the Rizin lane today);rea doctoralready says the install is healthy);not_configuredproviders as if they were refusals - IDA and Kuna are not configured on my host, and their absence is not why the target was refused.One measurement, so "Ghidra can load it" is not taken on faith
On this Windows host, Ghidra 12.1.2 imports the very same MZ with REA's own parameters (
-loader MzLoader -processor x86:LE:16:Real Mode -cspec default) and analyses it: the decompiler runs over the image at1000:02a9,1000:2602,1000:4427,1000:de8band more - the MZ loaded at segment0x1000, the same place the MzLoader lane puts it. The 874-function inventory this repository measured earlier came from the same file with the same processor, with Ghidra auto-detecting the MZ loader.So the engine is not the obstacle on Windows; the admission set is.
@pietrondo commented on GitHub (Oct 25, 2026):
One more number, since I had the import running anyway: the Windows Ghidra 12.1.2 on this host imports the MZ with REA's own parameters and the analysis succeeds.
983 functions on Windows with the MzLoader lane's parameters - against the 874 the earlier import of the same file found with Ghidra auto-detecting the loader. So the engine path is complete on Windows; only
inspectWindowsP0TargetSupportstands in front of it.(The decompiler itself is the usual 16-bit-real-mode story:
WARN Decompiling ... pcode error at 1000:02a9and friends, which is why the inventory is the usable output.)@dark13b commented on GitHub (Oct 25, 2026):
I'm working on this in draft #7144.
It admits
dos-mzininspectWindowsP0TargetSupport, before the PE-only checks, and nothing else changes in the provider. The MzLoader import, the committedx86:LE:16:Real Modelanguage and the load-image attestation are the existing DOS path. On Windows 11 x64 with Ghidra 12.1.4, the generated-fixture lanenpm run verify:ghidra:dospasses. It uses no third-party binary and covers:verified;Windows P0 stays read-only, so annotation and naming edits are refused there. The lane now checks that refusal.
Thanks for the measurements and the corrections, which match what I found in the source:
dos-comis not in this PR. The import code would accept it, butverify:ghidra:comis built around annotation edits, which Windows P0 doesn't allow. I'd rather port that lane to read-only checks in a follow-up than admit COM without real-provider evidence..gpris a zero-byte marker. I've left it out.dos-mzadmitted, your target no longer reaches that path. The registry wording, where unconfigured providers turn a format refusal intoprovider_unavailable, is unchanged here and could be its own issue.@XinwangTao commented on GitHub (Oct 25, 2026):
Confirmed bug shape: the admission boundary rejects dos-mz outright, so open_binary succeeds (format detection) but every follow-up fails with provider_unavailable — the user ends up with a dead-end state instead of a clear 'unsupported on this platform' error. Suggestions: (1) have open_binary return a meaningful unsupported-format error for DOS MZ on Windows rather than accepting then failing later; (2) if 16-bit real-mode is genuinely out of scope, say so in the format matrix so callers can route to another lane; (3) alternatively extend admission to treat dos-mz like raw x86 with a documented caveat (Ghidra can still load MZ with a DOS loader if the language is set correctly).
@pietrondo commented on GitHub (Oct 25, 2026):
On the second round of suggestions: three, and what #7144 does to each.
1.
open_binaryaccepting and then failing. Agreed for the formats that stay refused, and #7144 removes the case fordos-mz. The general shape survives it, though:open_binarydetects the format and the provider is only consulted later, so a target no configured lane admits is accepted and then fails. The cheapest fix is in the failure, not in the admission: whenprovider_unavailablelistsnot_configuredproviders, name the lane that does work for the target. For a DOS MZ on Windows that is the Rizin lane today (execute_rizin_command, the MZ mapped flat, addresses are file offsets). That one line is what turned my own session around, and it costs nothing.2. "If 16-bit real mode is out of scope, say so in the matrix." It is not out of scope, and the matrix should not say so. Measured on this host (Windows 11, Ghidra 12.1.2) with REA's own parameters: the import succeeds, the analysis succeeds, and the function inventory is 983 (
-loader MzLoader -processor "x86:LE:16:Real Mode" -cspec default). What is partial is decompilation: the decompiler emitspcode errorat 16-bit addresses (1000:02a9and friends), soprocedure_pseudo_codeis unreliable even wherelist_procedures, the call refs and the inventory are correct. That is the caveat worth one line in the DOS row — analysis yes, pseudocode partial — and it would have saved me from concluding the whole lane was broken.3. "Treat
dos-mzlike raw x86, with a caveat." This one cannot work, and it is worth recording why in the issue so nobody tries it:ghidraRawBinaryLanguage("x86")resolves tox86:LE:32:defaultwith thegcccspec, and the language override is refused for raw imports (A Ghidra language override cannot be combined with a raw-binary import.). A raw import of an MZ decodes 16-bit real-mode code as 32-bit. The MzLoader lane, which is what #7144 admits, is the right path and needs no caveat of that shape.On #7144's "not included": the
provider_unavailablewording. That is the one item of the original report left out, and it is the one that turns a five-minute detour into an hour: three of the four rejection reasons arenot_configured, which reads as "install IDA" when the real answer is "the Windows admission set is PE-only". If it is out of scope for this PR it deserves its own issue rather than being dropped silently.One more datum for the scope question, since widening the documented format set is what maintainers are being asked to approve: on Windows the MzLoader lane imports the MZ at segment
0x1000, the same place the POSIX lane puts it, so the load-image attestation and the address spaceexecute_read/list_proceduresreport are host-independent. Nothing in the evidence changes with the platform; only the admission set does.@XinwangTao commented on GitHub (Oct 26, 2026):
Thanks for the detailed verification — the concrete numbers (983-function inventory with Ghidra 12.1.2, decompiler pcode errors at 16-bit addresses) settle the scope nicely: the DOS row in the format matrix should say "analysis yes, pseudocode partial", and the Rizin-lane pointer for the failure message is a cheap, high-value fix. Also agree the provider_unavailable wording should not be dropped — if it stays out of #7144 it deserves its own issue, so nobody else loses an hour on what is really a PE-only admission set. Happy to help file that if useful.
@pietrondo commented on GitHub (Oct 26, 2026):
Filed it as #7214, with the scope you named: when the rejection set holds no format-level refusal, say that once and name a lane that works for the target (Rizin for a DOS image on Windows), and keep a provider that declined the format saying so - the distinction is the point. The dos-com case on Windows is the one that survives #7144, so the issue is framed around it rather than around dos-mz.
Thanks for taking #7144 through to a non-draft PR; the erify:ghidra:dos lane running on Windows is more than I would have asked for, and it is what makes the DOS row in the matrix credible rather than aspirational.
@pietrondo commented on GitHub (Oct 27, 2026):
One lane does read this target on Windows today:
execute_rizin_command.rizin -N -q -c "<cmd>" simearth.exegets the MZ mapped flat, so the addresses in its output are file offsets, and that was enough to triage the binary:So the
dos-mzrefusal here is the selection layer, not a missing path:open_binarybinds the target andexecute_rizin_commandruns on the same file whilebinary_overview/search_strings/list_stringsreturnprovider_unavailable. Two things from this session:candidate_ids: [ghidra, hopper, ida, kuna], two of which were never configured,provider_unavailablereads as "nothing can open this file" when one lane can. That is the conflation in #7214.available_lanes: ["rizin"]) would have saved this detour.Nothing else: the Ghidra 16-bit lane in the draft PR is what I need for pseudocode; rizin gives strings and disassembly only.
@XinwangTao commented on GitHub (Oct 28, 2026):
Agreed — rizin covers the triage (strings/disassembly) but not pseudocode, so #7144's Ghidra 16-bit lane is still the one that unblocks the reconstruction task. Listing available_lanes (e.g. ["rizin"]) in the rejection details is a cheap, high-value improvement: right now a user seeing three not_configured reasons is sent hunting for an install problem when one lane can already read the file. Looking forward to the DOS row in the format matrix flipping to verified once #7144 lands.