4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-02-22 00:38:06 +08:00
Jeremy Drake 46f7bcc1e5 Cygwin: cache IsWow64Process2 host arch in wincap.
This was already used in the FAST_CWD check, and could be used in a
couple other places.

I found the "emulated"/process value returned from the function largely
useless, so I did not cache it.  It is useless because, as the docs say,
it is set to IMAGE_FILE_MACHINE_UNKNOWN (0) if the process is not
running under WOW64, but Microsoft also doesn't consider x64-on-ARM64 to
be WOW64, so it is set to 0 regardless if the process is ARM64 or x64.
You can tell the difference via
GetProcessInformation(ProcessMachineTypeInfo), but for the current
process even that's overkill: what we really want to know is the
IMAGE_FILE_MACHINE_* constant for the Cygwin dll itself, which is
conveniently located in memory already, so cache that in wincap also for
easy comparisons.

Signed-off-by: Jeremy Drake <cygwin@jdrake.com>
2024-11-28 23:52:40 +01:00

305 lines
8.6 KiB
C++

/* wincap.cc -- figure out on which OS we're running. Set the
capability class to the appropriate values.
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#include "winsup.h"
#include "miscfuncs.h"
#include "security.h"
#include "ntdll.h"
#include "memory_layout.h"
static const wincaps wincap_8_1 = {
{
has_new_pebteb_region:false,
has_unprivileged_createsymlink:false,
has_precise_interrupt_time:false,
has_posix_unlink_semantics:false,
has_posix_unlink_semantics_with_ignore_readonly:false,
has_case_sensitive_dirs:false,
has_posix_rename_semantics:false,
has_con_24bit_colors:false,
has_con_broken_csi3j:false,
has_con_broken_il_dl:false,
has_con_esc_rep:false,
has_extended_mem_api:false,
has_tcp_fastopen:false,
has_linux_tcp_keepalive_sockopts:false,
has_tcp_maxrtms:false,
has_con_broken_tabs:false,
has_user_shstk:false,
},
};
static const wincaps wincap_10_1507 = {
{
has_new_pebteb_region:false,
has_unprivileged_createsymlink:false,
has_precise_interrupt_time:true,
has_posix_unlink_semantics:false,
has_posix_unlink_semantics_with_ignore_readonly:false,
has_case_sensitive_dirs:false,
has_posix_rename_semantics:false,
has_con_24bit_colors:false,
has_con_broken_csi3j:false,
has_con_broken_il_dl:false,
has_con_esc_rep:false,
has_extended_mem_api:false,
has_tcp_fastopen:false,
has_linux_tcp_keepalive_sockopts:false,
has_tcp_maxrtms:false,
has_con_broken_tabs:false,
has_user_shstk:false,
},
};
static const wincaps wincap_10_1607 = {
{
has_new_pebteb_region:false,
has_unprivileged_createsymlink:false,
has_precise_interrupt_time:true,
has_posix_unlink_semantics:false,
has_posix_unlink_semantics_with_ignore_readonly:false,
has_case_sensitive_dirs:false,
has_posix_rename_semantics:false,
has_con_24bit_colors:false,
has_con_broken_csi3j:false,
has_con_broken_il_dl:false,
has_con_esc_rep:false,
has_extended_mem_api:false,
has_tcp_fastopen:true,
has_linux_tcp_keepalive_sockopts:false,
has_tcp_maxrtms:true,
has_con_broken_tabs:false,
has_user_shstk:false,
},
};
static const wincaps wincap_10_1703 = {
{
has_new_pebteb_region:true,
has_unprivileged_createsymlink:true,
has_precise_interrupt_time:true,
has_posix_unlink_semantics:false,
has_posix_unlink_semantics_with_ignore_readonly:false,
has_case_sensitive_dirs:false,
has_posix_rename_semantics:false,
has_con_24bit_colors:true,
has_con_broken_csi3j:false,
has_con_broken_il_dl:false,
has_con_esc_rep:false,
has_extended_mem_api:false,
has_tcp_fastopen:true,
has_linux_tcp_keepalive_sockopts:false,
has_tcp_maxrtms:true,
has_con_broken_tabs:true,
has_user_shstk:false,
},
};
static const wincaps wincap_10_1709 = {
{
has_new_pebteb_region:true,
has_unprivileged_createsymlink:true,
has_precise_interrupt_time:true,
has_posix_unlink_semantics:true,
has_posix_unlink_semantics_with_ignore_readonly:false,
has_case_sensitive_dirs:false,
has_posix_rename_semantics:false,
has_con_24bit_colors:true,
has_con_broken_csi3j:false,
has_con_broken_il_dl:false,
has_con_esc_rep:false,
has_extended_mem_api:false,
has_tcp_fastopen:true,
has_linux_tcp_keepalive_sockopts:true,
has_tcp_maxrtms:true,
has_con_broken_tabs:true,
has_user_shstk:false,
},
};
static const wincaps wincap_10_1803 = {
{
has_new_pebteb_region:true,
has_unprivileged_createsymlink:true,
has_precise_interrupt_time:true,
has_posix_unlink_semantics:true,
has_posix_unlink_semantics_with_ignore_readonly:false,
has_case_sensitive_dirs:true,
has_posix_rename_semantics:false,
has_con_24bit_colors:true,
has_con_broken_csi3j:false,
has_con_broken_il_dl:false,
has_con_esc_rep:false,
has_extended_mem_api:true,
has_tcp_fastopen:true,
has_linux_tcp_keepalive_sockopts:true,
has_tcp_maxrtms:true,
has_con_broken_tabs:true,
has_user_shstk:false,
},
};
static const wincaps wincap_10_1809 = {
{
has_new_pebteb_region:true,
has_unprivileged_createsymlink:true,
has_precise_interrupt_time:true,
has_posix_unlink_semantics:true,
has_posix_unlink_semantics_with_ignore_readonly:true,
has_case_sensitive_dirs:true,
has_posix_rename_semantics:true,
has_con_24bit_colors:true,
has_con_broken_csi3j:true,
has_con_broken_il_dl:false,
has_con_esc_rep:false,
has_extended_mem_api:true,
has_tcp_fastopen:true,
has_linux_tcp_keepalive_sockopts:true,
has_tcp_maxrtms:true,
has_con_broken_tabs:true,
has_user_shstk:false,
},
};
static const wincaps wincap_10_1903 = {
{
has_new_pebteb_region:true,
has_unprivileged_createsymlink:true,
has_precise_interrupt_time:true,
has_posix_unlink_semantics:true,
has_posix_unlink_semantics_with_ignore_readonly:true,
has_case_sensitive_dirs:true,
has_posix_rename_semantics:true,
has_con_24bit_colors:true,
has_con_broken_csi3j:false,
has_con_broken_il_dl:true,
has_con_esc_rep:true,
has_extended_mem_api:true,
has_tcp_fastopen:true,
has_linux_tcp_keepalive_sockopts:true,
has_tcp_maxrtms:true,
has_con_broken_tabs:true,
has_user_shstk:false,
},
};
static const wincaps wincap_10_2004 = {
{
has_new_pebteb_region:true,
has_unprivileged_createsymlink:true,
has_precise_interrupt_time:true,
has_posix_unlink_semantics:true,
has_posix_unlink_semantics_with_ignore_readonly:true,
has_case_sensitive_dirs:true,
has_posix_rename_semantics:true,
has_con_24bit_colors:true,
has_con_broken_csi3j:false,
has_con_broken_il_dl:false,
has_con_esc_rep:true,
has_extended_mem_api:true,
has_tcp_fastopen:true,
has_linux_tcp_keepalive_sockopts:true,
has_tcp_maxrtms:true,
has_con_broken_tabs:true,
has_user_shstk:true,
},
};
static const wincaps wincap_11 = {
{
has_new_pebteb_region:true,
has_unprivileged_createsymlink:true,
has_precise_interrupt_time:true,
has_posix_unlink_semantics:true,
has_posix_unlink_semantics_with_ignore_readonly:true,
has_case_sensitive_dirs:true,
has_posix_rename_semantics:true,
has_con_24bit_colors:true,
has_con_broken_csi3j:false,
has_con_broken_il_dl:false,
has_con_esc_rep:true,
has_extended_mem_api:true,
has_tcp_fastopen:true,
has_linux_tcp_keepalive_sockopts:true,
has_tcp_maxrtms:true,
has_con_broken_tabs:false,
has_user_shstk:true,
},
};
wincapc wincap __attribute__((section (".cygwin_dll_common"), shared));
extern IMAGE_DOS_HEADER
__image_base__;
void
wincapc::init ()
{
PIMAGE_NT_HEADERS ntheader;
USHORT emul_mach;
if (caps)
return; // already initialized
GetSystemInfo (&system_info);
version.dwOSVersionInfoSize = sizeof (RTL_OSVERSIONINFOEXW);
RtlGetVersion (&version);
/* Overwrite unreliable kernel version with correct values returned by
RtlGetNtVersionNumbers. See git log of this change for a description. */
RtlGetNtVersionNumbers (&version.dwMajorVersion,
&version.dwMinorVersion,
&version.dwBuildNumber);
version.dwBuildNumber &= 0xffff;
switch (version.dwMajorVersion)
{
case 6:
caps = &wincap_8_1;
break;
case 10:
default:
if (likely (version.dwBuildNumber >= 22000))
caps = &wincap_11;
else if (version.dwBuildNumber >= 19041)
caps = &wincap_10_2004;
else if (version.dwBuildNumber >= 18362)
caps = &wincap_10_1903;
else if (version.dwBuildNumber >= 17763)
caps = &wincap_10_1809;
else if (version.dwBuildNumber >= 17134)
caps = &wincap_10_1803;
else if (version.dwBuildNumber >= 16299)
caps = &wincap_10_1709;
else if (version.dwBuildNumber >= 15063)
caps = &wincap_10_1703;
else if (version.dwBuildNumber >= 14393)
caps = &wincap_10_1607;
else
caps = & wincap_10_1507;
}
_is_server = (version.wProductType != VER_NT_WORKSTATION);
__small_sprintf (osnam, "NT-%d.%d", version.dwMajorVersion,
version.dwMinorVersion);
if (!IsWow64Process2 (GetCurrentProcess (), &emul_mach, &host_mach))
{
/* If IsWow64Process2 succeeded, it filled in host_mach. Assume the only
way it fails for the current process is that we're running on an OS
version where it's not implemented yet. As such, the only realistic
option for host_mach is AMD64 */
host_mach = IMAGE_FILE_MACHINE_AMD64;
}
ntheader = (PIMAGE_NT_HEADERS)((LPBYTE) &__image_base__
+ __image_base__.e_lfanew);
cygwin_mach = ntheader->FileHeader.Machine;
}