4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-01-22 06:57:36 +08:00
Takashi Yano faf1e11592 Cygwin: pty: Fix script command crash on console in Win7.
- Previously, the command "cmd /c script -c cmd" in console of Win7
  crashes. This seems to be due to a bug (?) of AttachConsole().
  This patch adds workaround for this issue.

  Currently, pty reattaches to the console of the process which is
  predetermined by ConsoleProcessList() after temporarily attaching
  to another console. After that, the console output handle opened
  with the name "CONOUT$" may not be accessible in Win7.
  This seems to happen when the attached process does not have the
  same handle even if the console attached is the same. With this
  patch, cygwin-console-helper which is started when pty master is
  opened in console, is utilized to be a target process to which
  pty reattaches if the OS is Win7.
2022-05-15 07:25:56 +09:00

443 lines
13 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"
/* CV, 2008-10-23: All wincapc's have to be in the .cygwin_dll_common section,
same as wincap itself. Otherwise the capability changes made in
wincapc::init() are not propagated to any subsequently started process
in the same session. I'm only writing this longish comment because I'm
puzzled that this has never been noticed before... */
wincaps wincap_7 __attribute__((section (".cygwin_dll_common"), shared)) = {
def_guard_pages:2,
mmap_storage_high:0x070000000000LL,
{
is_server:false,
needs_query_information:true,
has_precise_system_time:false,
has_microsoft_accounts:false,
has_new_pebteb_region:false,
has_broken_whoami:true,
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_query_process_handle_info:false,
has_con_broken_tabs:false,
has_broken_attach_console:true,
},
};
wincaps wincap_8 __attribute__((section (".cygwin_dll_common"), shared)) = {
def_guard_pages:3,
mmap_storage_high:0x070000000000LL,
{
is_server:false,
needs_query_information:true,
has_precise_system_time:true,
has_microsoft_accounts:true,
has_new_pebteb_region:false,
has_broken_whoami: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_query_process_handle_info:true,
has_con_broken_tabs:false,
has_broken_attach_console:false,
},
};
wincaps wincap_8_1 __attribute__((section (".cygwin_dll_common"), shared)) = {
def_guard_pages:3,
mmap_storage_high:0x700000000000LL,
{
is_server:false,
needs_query_information:false,
has_precise_system_time:true,
has_microsoft_accounts:true,
has_new_pebteb_region:false,
has_broken_whoami: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_query_process_handle_info:true,
has_con_broken_tabs:false,
has_broken_attach_console:false,
},
};
wincaps wincap_10_1507 __attribute__((section (".cygwin_dll_common"), shared)) = {
def_guard_pages:3,
mmap_storage_high:0x700000000000LL,
{
is_server:false,
needs_query_information:false,
has_precise_system_time:true,
has_microsoft_accounts:true,
has_new_pebteb_region:false,
has_broken_whoami: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_query_process_handle_info:true,
has_con_broken_tabs:false,
has_broken_attach_console:false,
},
};
wincaps wincap_10_1607 __attribute__((section (".cygwin_dll_common"), shared)) = {
def_guard_pages:3,
mmap_storage_high:0x700000000000LL,
{
is_server:false,
needs_query_information:false,
has_precise_system_time:true,
has_microsoft_accounts:true,
has_new_pebteb_region:false,
has_broken_whoami: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_query_process_handle_info:true,
has_con_broken_tabs:false,
has_broken_attach_console:false,
},
};
wincaps wincap_10_1703 __attribute__((section (".cygwin_dll_common"), shared)) = {
def_guard_pages:3,
mmap_storage_high:0x700000000000LL,
{
is_server:false,
needs_query_information:false,
has_precise_system_time:true,
has_microsoft_accounts:true,
has_new_pebteb_region:true,
has_broken_whoami:false,
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_query_process_handle_info:true,
has_con_broken_tabs:true,
has_broken_attach_console:false,
},
};
wincaps wincap_10_1709 __attribute__((section (".cygwin_dll_common"), shared)) = {
def_guard_pages:3,
mmap_storage_high:0x700000000000LL,
{
is_server:false,
needs_query_information:false,
has_precise_system_time:true,
has_microsoft_accounts:true,
has_new_pebteb_region:true,
has_broken_whoami:false,
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_query_process_handle_info:true,
has_con_broken_tabs:true,
has_broken_attach_console:false,
},
};
wincaps wincap_10_1803 __attribute__((section (".cygwin_dll_common"), shared)) = {
def_guard_pages:3,
mmap_storage_high:0x700000000000LL,
{
is_server:false,
needs_query_information:false,
has_precise_system_time:true,
has_microsoft_accounts:true,
has_new_pebteb_region:true,
has_broken_whoami:false,
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_query_process_handle_info:true,
has_con_broken_tabs:true,
has_broken_attach_console:false,
},
};
wincaps wincap_10_1809 __attribute__((section (".cygwin_dll_common"), shared)) = {
def_guard_pages:3,
mmap_storage_high:0x700000000000LL,
{
is_server:false,
needs_query_information:false,
has_precise_system_time:true,
has_microsoft_accounts:true,
has_new_pebteb_region:true,
has_broken_whoami:false,
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_query_process_handle_info:true,
has_con_broken_tabs:true,
has_broken_attach_console:false,
},
};
wincaps wincap_10_1903 __attribute__((section (".cygwin_dll_common"), shared)) = {
def_guard_pages:3,
mmap_storage_high:0x700000000000LL,
{
is_server:false,
needs_query_information:false,
has_precise_system_time:true,
has_microsoft_accounts:true,
has_new_pebteb_region:true,
has_broken_whoami:false,
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_query_process_handle_info:true,
has_con_broken_tabs:true,
has_broken_attach_console:false,
},
};
wincaps wincap_10_2004 __attribute__((section (".cygwin_dll_common"), shared)) = {
def_guard_pages:3,
mmap_storage_high:0x700000000000LL,
{
is_server:false,
needs_query_information:false,
has_precise_system_time:true,
has_microsoft_accounts:true,
has_new_pebteb_region:true,
has_broken_whoami:false,
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_query_process_handle_info:true,
has_con_broken_tabs:true,
has_broken_attach_console:false,
},
};
wincaps wincap_11 __attribute__((section (".cygwin_dll_common"), shared)) = {
def_guard_pages:3,
mmap_storage_high:0x700000000000LL,
{
is_server:false,
needs_query_information:false,
has_precise_system_time:true,
has_microsoft_accounts:true,
has_new_pebteb_region:true,
has_broken_whoami:false,
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_query_process_handle_info:true,
has_con_broken_tabs:false,
has_broken_attach_console:false,
},
};
wincapc wincap __attribute__((section (".cygwin_dll_common"), shared));
void
wincapc::init ()
{
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:
switch (version.dwMinorVersion)
{
case 1:
caps = &wincap_7;
break;
case 2:
caps = &wincap_8;
break;
case 3:
default:
caps = &wincap_8_1;
break;
}
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;
}
((wincaps *)caps)->is_server = (version.wProductType != VER_NT_WORKSTATION);
__small_sprintf (osnam, "NT-%d.%d", version.dwMajorVersion,
version.dwMinorVersion);
}