Skip to content

kernel32 + user32: stub GetOEMCP / SetFileApisToOEM / CharToOem* / OemToChar*#119

Draft
HarryR wants to merge 1 commit intodecompals:mainfrom
HarryR:HarryR-oem-stubs
Draft

kernel32 + user32: stub GetOEMCP / SetFileApisToOEM / CharToOem* / OemToChar*#119
HarryR wants to merge 1 commit intodecompals:mainfrom
HarryR:HarryR-oem-stubs

Conversation

@HarryR
Copy link
Copy Markdown

@HarryR HarryR commented Apr 16, 2026

Several NT 3.5-era build tools (MC.EXE message compiler, RC.EXE resource compiler, CL.EXE legacy front-end) probe the current OEM codepage and apply ANSI<->OEM translation to argv and message payloads. Under wibo the relevant stubs were unimplemented, causing "call reached missing import" aborts on first use.

Add minimal, well-behaved stubs:

  • kernel32!GetOEMCP - returns 437 (IBM PC US), the canonical OEM codepage for English locales.
  • kernel32!SetFileApisToOEM - no-op success (our Ansi<->Oem mappings are effectively 1:1 for ASCII, which is what NT build pipelines feed).
  • user32!CharToOem{A,BuffA} - ASCII-identity conversion; correct for filenames/argv which are pure ASCII, and a safe high-byte passthrough.
  • user32!OemToChar{A,BuffA}

These cover the translation paths NT build tools actually exercise without pulling in any codepage tables.

…mToChar*

Several NT 3.5-era build tools (MC.EXE message compiler, RC.EXE resource
compiler, CL.EXE legacy front-end) probe the current OEM codepage and
apply ANSI<->OEM translation to argv and message payloads. Under wibo
the relevant stubs were unimplemented, causing "call reached missing
import" aborts on first use.

Add minimal, well-behaved stubs:

  kernel32!GetOEMCP            - returns 437 (IBM PC US), the canonical
                                 OEM codepage for English locales.
  kernel32!SetFileApisToOEM    - no-op success (our Ansi<->Oem mappings
                                 are effectively 1:1 for ASCII, which
                                 is what NT build pipelines feed).
  user32!CharToOem{A,BuffA}    - ASCII-identity conversion; correct for
  user32!OemToChar{A,BuffA}      filenames/argv which are pure ASCII,
                                 and a safe high-byte passthrough.

These cover the translation paths NT build tools actually exercise
without pulling in any codepage tables.
@HarryR HarryR marked this pull request as draft April 18, 2026 11:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant