Commit Graph
203 Commits
Author SHA1 Message Date
mirkobrombin dc099f20ba test: give the private wait case room to start before its deadline 2026-11-03 05:23:00 +00:00
mirkobrombin 40de9e9c92 chore: merge pull request #96 from rayzorben 2026-11-02 14:59:46 +00:00
mirkobrombin 5df7d425db chore: merge pull request #95 from rayzorben 2026-11-02 14:59:30 +00:00
mirkobrombin c345304134 feat: provision the fonts and Skia build text needs
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: provisioning script with pinned font package and Skia commit, README steps
2026-11-02 14:09:26 +00:00
mirkobrombin ffff97ab9b chore: merge pull request #113 from rayzorben 2026-11-02 14:03:58 +00:00
mirkobrombin 4bdc6ebef9 chore: merge pull request #100 from rayzorben 2026-11-02 13:54:38 +00:00
mirkobrombin d14a169f6a Merge pull request #102 from rayzorben/build/require-mingw-w64-13 2026-11-02 13:54:14 +00:00
mirkobrombin 3fc0bedd0e Merge pull request #99 from rayzorben/fix/installer-build-toolchains 2026-11-02 13:54:12 +00:00
mirkobrombin 3b8cc962ca Merge pull request #111 from RedX2501/fix/installer-widl-tlb-search-path 2026-11-02 13:54:11 +00:00
mirkobrombin 12bbd3c8eb Merge pull request #101 from rayzorben/fix/libpng-lib-dir 2026-11-02 13:54:09 +00:00
mirkobrombin 0392e067f0 feat: complete the Windows Installer engine
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: patches, searches, feature and source list calls, administrative images and their tests
2026-11-02 12:42:18 +00:00
mirkobrombin 5904447fe4 feat: add an own Windows Installer engine
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: own msi.dll and msiexec.exe replacing the adapted installer, with tests and packaging
2026-11-01 22:02:09 +00:00
mirkobrombin 8c5c13b21a feat: add shell folders
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: shell folder objects, item helpers and their test
2026-11-01 18:51:13 +00:00
mirkobrombin b946b68095 feat: add an own ICU library for programs that import it
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
2026-11-01 21:17:19 +00:00
mirkobrombin f5eda87880 feat: add Unicode normalization
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: Wrote NormalizeString and IsNormalizedString on UAX #15, the table generator and the test.
2026-11-01 17:01:32 +00:00
Raymond Bennett c4fd4916e8 fix: name the custom action pipe with process ids of six hex digits
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
2026-10-31 22:06:36 -04:00
Guilherme Bufolo 3323c1cdcf Fix WIDL type library search during installer provisioning 2026-11-01 10:57:59 +09:00
Raymond Bennett 93e89df584 fix: build on Fedora 44
- 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
2026-10-31 21:18:23 -04:00
Raymond Bennett e5583e0e7a build: require MinGW-w64 13 and say so when the headers are older
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
2026-10-31 21:11:45 -04:00
Raymond Bennett df3cfa0d67 fix: install libpng into the lib directory provision-libpng names
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
2026-10-31 21:07:58 -04:00
Raymond Bennett d0a986492c feat: provide Windows.Web.Http and Windows.Foundation.Uri over WinINet
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
2026-10-31 14:40:21 -07:00
Raymond Bennett 788eb0f142 build: generate the Windows Runtime declarations from pinned windows-rs metadata
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
2026-10-31 14:40:21 -07:00
Raymond Bennett f742ebaf07 fix: build the installer components with GCC 14 and later on a UCRT MinGW
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
2026-10-31 14:13:44 -07:00
Raymond Bennett aadce22347 feat: read .appx and .msix packages through the packaging API
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
2026-10-31 13:57:58 -07:00
Raymond Bennett 466b1d8352 build: generate the packaging API's declarations from pinned windows-rs metadata
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
2026-10-31 13:56:52 -07:00
mirkobrombin f923e63650 feat: add MDI windows and the running object table 2026-10-31 20:21:55 +00:00
mirkobrombin 9d3621a4db feat: add own rpcrt4 2026-10-31 14:09:33 +00:00
mirkobrombin 8e50498947 feat: add own riched20 2026-10-31 12:46:51 +00:00
mirkobrombin f784c4bd35 feat: add own gdiplus 2026-10-31 11:11:27 +00:00
mirkobrombin 916cd25c6f feat: add own windowscodecs 2026-10-31 10:56:40 +00:00
mirkobrombin b07118579d feat: add own msvfw32
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: Wrote the msvfw32 component, its provisioning and its license entries.
2026-10-31 08:36:12 +00:00
mirkobrombin da4b7e22ae chore: merge pull request #88 from rayzorben/feat/winsqlite3 2026-10-31 08:15:54 +00:00
mirkobrombin 1adc182ba7 chore: build the installer stack from the own components
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.
2026-10-31 07:10:22 +00:00
mirkobrombin 31a3704ebd chore: replace the ReactOS comctl32 2026-10-31 07:05:36 +00:00
Raymond Bennett 0c7cd11934 feat: ship SQLite as winsqlite3.dll for 64-bit programs
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
2026-10-30 08:17:47 -07:00
mirkobrombin 9401355749 chore: replace the ReactOS user32 controls
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.
2026-10-30 14:46:09 +00:00
mirkobrombin 7606d2ff64 chore: replace the ReactOS RTL
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.
2026-10-30 13:58:51 +00:00
mirkobrombin 84f770404c chore: replace the ReactOS xmllite
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.
2026-10-30 13:31:25 +00:00
mirkobrombin b293259f54 chore: replace the ReactOS cabinet
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.
2026-10-30 13:09:48 +00:00
mirkobrombin 7b645bce72 chore: replace the ReactOS regsvr32
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.
2026-10-30 12:43:02 +00:00
mirkobrombin f4c3da131b feat: add rundll32
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.
2026-10-30 10:34:51 +00:00
mirkobrombin b17b15c5df chore: merge pull request #84 from SoapyMan/main 2026-10-30 06:33:00 +00:00
mirkobrombin 18f26ca3f5 chore: merge pull request #41 from rayzorben/feat/free-threaded-marshaler 2026-10-30 06:32:58 +00:00
mirkobrombin 1d561e2ecd fix: give each window its own GPU surface, hidden ones included 2026-10-29 23:18:44 +00:00
SoapyMan bb892c7c73 fix: generate the Vulkan chain table under any compiler locale
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.
2026-10-30 00:47:58 +03:00
mirkobrombin 957b4f38c0 feat: export OpenThemeDataForDpi 2026-10-29 20:58:27 +00:00
mirkobrombin bf43c24725 feat: keep the licenses programs install in the protection store
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: Wrote the protection store license install and query functions and the system client test.
2026-10-29 18:34:55 +00:00
mirkobrombin 0bb7dd6f04 feat: serve Windows Runtime system classes Office asks for at startup
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.
2026-10-29 17:10:05 +00:00
mirkobrombin ba02478235 feat: compile HLSL through an own d3dcompiler_47 2026-10-29 11:10:04 +00:00
Raymond Bennett 9cdba187a8 feat: add CoCreateFreeThreadedMarshaler
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)
2026-10-28 23:14:32 -07:00