logoalt Hacker News

sumtechguytoday at 1:04 PM1 replyview on HN

Had one project where for some reason one of the devs wanted to access the messages before it got translated. The reasons are lost to time. You technically could create other types of application that is not CLI or 'windows'. But then you are own your own making the queues or console items. Think they were typically used for device drivers or background service manager tasks.

https://learn.microsoft.com/en-us/cpp/build/reference/subsys...

Pretty sure it just changes out what the default function that is called before winmain. So you probably could just switch out the first function called (dont remember the cli option for that).

Most of the time you just picked the right type at project creation so it would feed correctly into the project solution which would set the right flags on build. But technically you could pick the most basic one and do it all yourself.


Replies

jasomilltoday at 4:37 PM

Presumably you're talking about /SUBSYSTEM:NATIVE, and while you're correct that it changes the default entry point (to NtProcessStartup in this case), it also sets the Subsystem field in the PE optional header to IMAGE_SUBSYSTEM_NATIVE, which causes CreateProcess to fail to start the executable with ERROR_CHILD_NOT_COMPLETE ("The %1 application cannot be run in Win32 mode.").

To see this, try press Windows+R and try running C:\Windows\System32\autochk.exe.

There are workarounds, but AFAIK there's no officially supported way to launch a native executable.

But that doesn't matter unless you want to avoid creating Win32 process structures, loading default Win32 DLLs, etc., as no windows are created and no messages are dispatched by code other than your own unless peculiar startup code is injected into your process at load time.

In particular, you have access to untranslated messages by default, and if you don't want translated messages to be posted, just don't call TranslateMessage in your message loop.