Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: version layer for its setup, expanded service paths, seeded services, 64-bit packages in the native engine, dism KB4019990, missing shell and event log calls
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: Added missing window, GDI, memory, text and multibyte behavior in the host that the own guest components need.
GetPackageFullName, GetPackageFamilyName and GetApplicationUserModelId
ask about a process by its handle; winget asks them about itself before
it decides where its data lives. No process in a prefix has package
identity, so they answer APPMODEL_ERROR_NO_PACKAGE with a length of
zero, as the GetCurrentPackage* forms already did.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: the handlers and the package_identity_client test
Programs built without kernel32 imports, Zig's among them, call ntdll's
RtlUpcaseUnicodeChar, RtlQueryPerformanceCounter and
RtlQueryPerformanceFrequency, RtlAddVectoredExceptionHandler and its
relatives, and leave through RtlExitUserProcess. Each is the function
kernel32 has (CharUpper of one character, QueryPerformanceCounter and
QueryPerformanceFrequency, AddVectoredExceptionHandler and the others,
ExitProcess) and now runs the same handler.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: the added names
(cherry picked from commit 6b9a401a7364d6aa1a360ee6217ef53bb3aa9456)
In a Windows process the system libraries have taken TLS slot 0 before the
program runs, so a program's first TlsAlloc never returns 0. Older Rust
standard libraries use 0 for "no key yet" and stop with "assertion failed:
key != 0" when TlsAlloc gives it, as htmlq 0.4 did. Slot 0 is now taken at
start, for 64-bit and 32-bit programs.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: the change
(cherry picked from commit dd2a8667c2b72bb6ff97d3fbe627759cb8f18baa)
The standard search order for a library ends with the current directory and
the folders of the PATH variable; Raven stopped at the system folders, so a
program built with llvm-mingw's clang++ could not find libc++.dll on PATH,
and LoadLibrary never found a library there either.
The libraries a program imports are now also looked for in the directory it
starts in and the folders of its PATH (from the environment it was given, or
RAVEN_GUEST_PATH for a program started from the host), and LoadLibrary's
search ends with the PATH the program has at the time.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: the search step and the PATH helpers
(cherry picked from commit 1865571d0ccd6e36ace096193e9a7bf71de48161)
The .NET runtime asks where a CONTEXT keeps an extended state feature. Of the
two features GetEnabledXStateFeatures reports, the legacy floating-point state
is the FXSAVE area and the SSE state its XMM registers; no other feature is in
a context, so it answers none.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: the handler
(cherry picked from commit 3fff212f6dd9d9248d0132bf0d09618acaa8f408)
GetTimeZoneInformation gave the bias and the names but no transition dates,
so a program saw no change between standard and daylight time. eza -l, dust
and Nushell's ls stopped on GetTimeZoneInformationForYear.
The year's transitions are now found from the host zone's offsets and given
as the recurring rule Windows uses (the nth weekday of the month, 5 for the
last, at the local time on the clock being left). Checked under Raven against
America/New_York (second Sunday of March, first Sunday of November, 02:00)
and Australia/Sydney (first Sunday of October 02:00, first Sunday of April
03:00). GetTimeZoneInformationForYear answers the same for any year, for the
current zone or one given with the same key name.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: the transition search and the handler
(cherry picked from commit 1aa9ad0b24f55dde119eded7b6f7e990b8561fd7)
GetModuleHandleExW looked modules up by file name only, so a full path never
matched, and on 64 bits GetModuleHandleW had no path lookup either. The .NET
host loads hostfxr.dll by its full path and then pins it with
GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_PIN, path), so PowerShell 7
stopped with "Failed to pin library".
Both now use GetModuleHandle's own lookup: by name, with API sets and the
trailing-dot rule, or by path, where the 64-bit loader matches the module of
that file name to the file it was loaded from (or, for the libraries Raven
serves, to the system folder GetModuleFileName reports for them).
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: the shared lookup and the 64-bit path lookup
(cherry picked from commit 9ea61e7f3c61546be696103a103181cd6ed3e5c3)
eza's GNU build imports them from ntdll, which exports part of a C runtime.
The comparisons read no byte past the first difference, the terminator or
the count.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: the handlers
(cherry picked from commit bb244301ebef9726e2e55012184d63c8bcb060a1)
DuckDB stops at start-up on GetCurrentProcessorNumber. The number is the host
processor the calling thread runs on, in group 0 and within the processor count
GetActiveProcessorCount reports; the Ex forms fill PROCESSOR_NUMBER.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: the handlers
(cherry picked from commit 7d0c81ae4019d0dbfb4d1b05604b225be92fd2a1)
Rust's standard library removes variables without checking first and panics
when that fails; zoxide stopped at start-up removing RUST_LIB_BACKTRACE.
Removing a variable that does not exist succeeds on Windows.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: the change
(cherry picked from commit 143115b20d2a36af03cbb5ac53a1a5f8adce105a)
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: Fixed the string header layout and wrote the activation factory registry, device family and package queries from the public headers.