Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: icu.dll with its forwarders, written from the public ICU API documentation and UAX #11, #14 and #29, with its test
msi.dll and msiexec.exe name the custom action server's pipe
\\.\pipe\msica_<pid in hex>_<width> in a WCHAR[24]. Raven gives guest
processes their Linux process ids, which pass 0xfffff on a desktop that
has run for a while; the name then takes 25 characters with its
terminator, the server opens a truncated name and exits, and the
installer waits for it forever. Both buffers now hold 32 characters,
enough for eight hex digits.
The new test runs the custom action fixture in a process id namespace
whose ids start at 0x100000, and is skipped where the system allows no
such namespace.
Fixes#103
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: reproduced the hang by advancing the process id counter past 0x100000, wrote the patch and the test
- provision-installer: keep a download as .part until its checksum
matches, so an interrupted one is not reused, and say how to recover
- provision-installer: find the MinGW headers on the compiler's search
path; Fedora keeps them under sys-root/mingw/include
- rpcrt4, msvfw32: pass the pointer types GCC 16 requires
- platform_api: guard the CryptoAPI session ciphers with RAVEN_OPENSSL,
as OpenSSL is optional
- README: list the installer build tools and the Fedora packages
Fixes#98
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: reproduced each failure in a Fedora 44 root and wrote the fixes
The headers of MinGW-w64 12, which RHEL 10 and EPEL 10 ship, lack
declarations the Windows components use: E_BOUNDS, webservices.h, the
UISettings4 to 6 interfaces, ID3D11FunctionLinkingGraph, the BCrypt
algorithm pseudo-handles, IID_ILogonTrigger and IID_IBootTrigger, and
MIDL_STUB_MESSAGE.CorrDespIncrement. The build then failed in eight
targets, and the installer components in rpcrt4, with errors that do not
name the cause.
Configuring now stops when a MinGW-w64 compiler's headers are older than
13, and so does provision-installer, naming the compiler and the version
found. The README states the version.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: reproduced the build on AlmaLinux 10.2, wrote the version checks and tested them with generated compiler versions
On RPM-based distributions GNUInstallDirs installs libpng into
install/lib64, while the script prints install/lib/libpng16.a. Configured
with the printed path, CMake does not find libpng and disables the PNG
tests. The library directory is now set to lib explicitly.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: reproduced the lib64 install on AlmaLinux 10.2 and wrote the one-line fix
raven-web.dll serves HttpClient, HttpBaseProtocolFilter with its cache
control, HttpMethod, HttpRequestMessage, HttpResponseMessage, the request,
response and content header collections (with Connection, User-Agent,
dates, lengths and Retry-After typed), response content read as a
buffer, string or stream, and Windows.Foundation.Uri over urlmon's IUri.
Requests go through WinINet, which Windows' base protocol filter sits on
too; redirections are followed and reflected in the request's URI.
winget checks its package source's version with a HEAD request this way.
The interfaces are the C declarations generated from Microsoft's
published metadata (windows.web.http.h, on raven-winrt's foundation.h);
the component is always built. native/upstream/raven-winrt holds the
plumbing the classes share (objects answering several interfaces,
asynchronous operations, boxed values, buffers, string maps, item
lists), for later components to use as well. Typed header values not
modelled yet, the request property bag, transport information and
custom certificate validation answer E_NOTIMPL.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: the component, the shared plumbing, CMake and registry wiring, the web_client test
scripts/generate-winrt-header.py writes, from the bindings windows-rs
generates from Microsoft's Windows metadata (pinned revision, each file
SHA-256 checked), the C declarations raven-web and the shared
raven-winrt plumbing use:
- native/upstream/raven-web/windows.web.http.h, the Windows.Web.Http,
Headers and Filters namespaces, with what they need of other
namespaces at its minimum (the certificate and socket enumerations,
forward declarations of the classes they pass);
- native/upstream/raven-winrt/foundation.h, what they need of
Windows.Foundation, its collections and Windows.Storage.Streams, and
the generic instances of those types alone.
They hold each interface's identifier, its methods in vtable order with
their types, the structures and enumerations, and the generic instances
used, whose identifiers are computed from their type signatures as the
Windows Runtime type system specifies; the generic interfaces come from
windows-rs's collections, future and reference crates. Every method is
checked against its raw vtable entry, for as many arguments and as
indirect, before anything is written.
Nothing depends on widl or on Wine's IDL files, nor on MinGW's headers
for these namespaces, whose declarations differ between its releases
(13.0 lacks IInputStream, which 14.0 has); only its classic COM headers
are included. Each interface is guarded as widl's headers guard it.
--check compares the committed headers with what the pinned sources
give.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: the generator and the headers it writes, checked against widl's header from the previous IDL and MinGW's headers
Raven's own installer components failed to provision with GCC 16 and
MinGW-w64 14 (Arch Linux), where the default C runtime is the UCRT:
- rpcrt4 and msvfw32 passed pointers of the wrong type, which GCC 14
and later reject: the stub's server object to the interlocked
exchange, the pickling callbacks' size as a ULONG where midles.h
declares unsigned int, and a BITMAPINFO where ICCompress takes its
header.
- msxml3 named the MSXML 6.0 class identifiers that this msxml2.h
leaves out (they are in msxml6.h); it now defines them itself, as it
already did for others, under its own names.
- msxml3 linked with -lmsvcrt directly, which on a UCRT toolchain is
the UCRT; it now goes through runtime() like the other components.
- propsys read propkey.h from Debian's header directory; it uses the
directory msxml3 already reads, which both layouts provide.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: found each provisioning failure on Arch's toolchain and wrote the fixes
raven-appx.dll serves the AppxFactory and AppxBundleFactory classes
that package managers open packages with (winget reads its source
package this way). A package reader checks that the package is a ZIP
archive (ZIP64 records included) with a manifest, a block map and
content types, and that the block map lists every payload file with its
size; a file's content is then inflated and checked against the block
map's hash one 64 KiB block at a time as it is read, failing with
APPX_E_CORRUPT_CONTENT where it differs. The manifest reader gives the
identity with the package's full and family names, properties,
dependencies, target device families, capabilities, resources,
prerequisites and applications; the block map reader its files and
blocks. A bundle opened as a package, or a package as a bundle, answers
APPX_E_MISSING_REQUIRED_FILE, as programs tell the two apart.
The component is built by provision-installer.py beside cabinet.dll, on
the same zlib, and reads XML with xmllite; the factories are registered
in both registry views. Writing packages, reading bundles, block maps
validated against a signature, IAppxDigestProvider and the later
manifest reader interfaces answer E_NOTIMPL.
The test writes its packages with appx_fixtures.py, as package writers
make them, and reads them back in 64-bit and 32-bit processes.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: the component, its provisioning, registry and packaging wiring, the fixture generator and the appx_client test
MinGW has no appxpackaging.h. scripts/generate-appx-header.py writes it
as C declarations from the bindings windows-rs generates from
Microsoft's Windows metadata (pinned revision, SHA-256 checked): each
interface's identifier and base and its methods in vtable order from the
raw ABI, parameter names from the vtable shims, and the interfaces
behind the ABI's untyped pointers from the wrapper methods, checked
against one another; the structures, enumerations, class identifiers
and APPX_E_ error codes come with them. --check compares the committed
header with what the pinned sources give.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: the generator script and the header it writes
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: Switched provisioning and packaging to the own components, removed the replaced ReactOS sources and the xmllite patch that no longer applied.
Windows has carried SQLite as winsqlite3.dll since Windows 10, and
programs such as winget keep their package index in it.
scripts/provision-sqlite.py builds the pinned public-domain
amalgamation (3.54.1, SHA3-256 checked) with MinGW, exporting the
unsuffixed sqlite3_* interface; the runtime places it in the system
directory like its other components.
Only the 64-bit library for now: Windows' 32-bit winsqlite3 uses the
standard calling convention for its interface and callbacks, which the
published amalgamation does not declare.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: provisioning script, CMake wiring, license records and the sqlite_client test
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: Wrote the window controls, dialog manager, message boxes, text layout, drawing helpers and generated resources as own code from Microsoft's documentation, using published test expectations for behaviour only; removed the retired text component and its layout tests.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: Wrote the guest heap, kernel32 fast paths, generic tables and memory functions as own code, with stress tests against the documented behaviour.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: Wrote the XmlLite reader and writer as own code from Microsoft's public documentation of the interfaces.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: Wrote cabinet.dll as own code from the public Microsoft Cabinet Format, LZX and Quantum descriptions and the documented FCI and FDI interfaces.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: Wrote regsvr32 as a new command-line tool from its public description, with tests for its documented exit codes.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: Wrote rundll32 as a new command-line tool from its public description, listed it for prefixes and packages, and added tests.
Availability was decided by matching the structure names quoted in the
compiler diagnostics. GCC quotes them with «» outside the English locales,
so nothing matched, the trimming loop made no progress and generation
failed on VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_METERING_FEATURES_NV,
which the headers provide only under VK_ENABLE_BETA_EXTENSIONS.
The same matching also mistook a spelling suggestion for a missing name and
silently dropped VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_BARRIER_FEATURES_NV
from the table.
Read the preprocessed header instead, so the table lists what the headers
really provide whatever language the compiler speaks, and keep one syntax
check so incomplete structures still fail here.
Checked by generating the table with ru_RU.UTF-8 and LC_ALL=C (identical
output, 367 structures, present barrier kept, present metering excluded)
and by building native with the regenerated table.
Assisted-by: opencode:deepseek-v4.1-flash-free
AI-Scope: diagnosed the locale-dependent diagnostics parsing and the
suggestion false positive in scripts/generate-vulkan-chains.py, and wrote
the preprocessor-based availability check plus the size syntax check.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: Wrote the twinapi Windows Runtime system classes, their shell and netlist hooks and the twinapi client test, after Office stopped at startup on missing runtime classes.
starship and watchexec, through the windows crate's agile objects, import it
from combase. The marshaler is an aggregatable object whose IMarshal passes an
interface pointer to another apartment of the process as the pointer itself;
a destination outside the process is refused, since no other process takes
COM calls here. combase.dll now lists the function, which raven-shell serves.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: the marshaler, from the COM documentation of IMarshal and CoCreateFreeThreadedMarshaler
(cherry picked from commit fee6c66a3a43ecd7afcfc725f7752999f1855e1c)