Update of /cvsroot/mingw/msys/rt/src/winsup/cygwin In directory vz-cvs-4.sog:/tmp/cvs-serv25931 Modified Files: ChangeLog ChangeLog.MSYS Makefile.in cygheap.cc dcrt0.cc delqueue.cc dir.cc environ.cc exceptions.cc fhandler.cc fhandler.h fhandler_console.cc fhandler_mem.cc fork.cc ismsys.cc mmap.cc net.cc ntdll.h pinfo.cc pinfo.h security.cc sigproc.cc syscalls.cc sysconf.cc syslog.cc thread.cc times.cc tty.cc uinfo.cc uname.cc winsup.h Added Files: wincap.cc wincap.h Log Message: Import Cygwin 1.3.4 and port modern wincap functionality Index: dcrt0.cc =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/dcrt0.cc,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** dcrt0.cc 19 Apr 2011 00:43:38 -0000 1.12 --- dcrt0.cc 4 Sep 2011 23:46:54 -0000 1.13 *************** *** 35,39 **** #include "cygwin_version.h" #include "dll_init.h" - #include "host_dependent.h" #include "sys/strace.h" --- 35,38 ---- *************** *** 161,268 **** } - /* remember the type of Win32 OS being run for future use. */ - os_type NO_COPY os_being_run; - char NO_COPY osname[40]; - bool iswinnt; - bool isVistaWOW64; - - /* Declare the function prototype for this WIN32 API call, - in case the w32api version used to build MSYS is too old. */ - #ifndef IsWow64Process - extern "C" BOOL WINAPI IsWow64Process(HANDLE,PBOOL); - #endif - - /* set_os_type: Set global variable os_being_run with type of Win32 - operating system being run. This information is used internally - to manage the inconsistency in Win32 API calls between Win32 OSes. */ - /* Cygwin internal */ - static void - set_os_type () - { - TRACE_IN; - OSVERSIONINFO os_version_info; - const char *os; - - memset (&os_version_info, 0, sizeof os_version_info); - os_version_info.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); - GetVersionEx (&os_version_info); - - iswinnt = 0; - isVistaWOW64 = 0; - switch (os_version_info.dwPlatformId) - { - case VER_PLATFORM_WIN32_NT: - os_being_run = winNT; - os = "NT"; - iswinnt = 1; - if(os_version_info.dwMajorVersion == 6) - { - BOOL is_wow64_proc = FALSE; - if (IsWow64Process (GetCurrentProcess (), &is_wow64_proc)) - isVistaWOW64 = is_wow64_proc; - } - break; - case VER_PLATFORM_WIN32_WINDOWS: - if (os_version_info.dwMinorVersion == 0) - { - os_being_run = win95; - os = "95"; - } - else if (os_version_info.dwMinorVersion < 90) - { - os_being_run = win98; - os = "98"; - } - else /* os_version_info.dwMinorVersion == 90 */ - { - os_being_run = winME; - os = "ME"; - } - break; - default: - os_being_run = unknown; - os = "??"; - break; - } - __small_sprintf (osname, "%s-%d.%d", os, os_version_info.dwMajorVersion, - os_version_info.dwMinorVersion); - } - - host_dependent_constants NO_COPY host_dependent; - - /* Constructor for host_dependent_constants. */ - - void - host_dependent_constants::init () - { - TRACE_IN; - extern DWORD chunksize; - /* fhandler_disk_file::lock needs a platform specific upper word - value for locking entire files. - - fhandler_base::open requires host dependent file sharing - attributes. */ - - switch (os_being_run) - { - case winNT: - win32_upper = 0xffffffff; - shared = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE; - break; - - case winME: - case win98: - case win95: - case win32s: - win32_upper = 0x00000000; - shared = FILE_SHARE_READ | FILE_SHARE_WRITE; - chunksize = 32 * 1024 * 1024; - break; - - default: - api_fatal ("unrecognized system type"); - } - } - /* * Replaces -@file in the command line with the contents of the file. --- 160,163 ---- *************** *** 574,578 **** static MEMORY_BASIC_INFORMATION sm; ! #define CYGWIN_GUARD ((iswinnt) ? PAGE_GUARD : PAGE_NOACCESS) // __inline__ void --- 469,473 ---- static MEMORY_BASIC_INFORMATION sm; ! #define CYGWIN_GUARD ((wincap.has_page_guard ()) ? PAGE_GUARD : PAGE_NOACCESS) // __inline__ void *************** *** 684,688 **** /* Set the os_being_run global. */ ! set_os_type (); check_sanity_and_sync (user_data); --- 579,583 ---- /* Set the os_being_run global. */ ! wincap.init (); check_sanity_and_sync (user_data); *************** *** 757,763 **** ProtectHandle (hMainThread); - /* Initialize the host dependent constants object. */ - host_dependent.init (); - /* Initialize the cygwin subsystem if this is the first process, or attach to shared data structures if it's already running. */ --- 652,655 ---- *************** *** 932,937 **** #endif ! /* Set the os_being_run global. */ ! set_os_type (); main_environ = user_data->envptr; --- 824,829 ---- #endif ! /* Set the os capabilities. */ ! wincap.init (); main_environ = user_data->envptr; --- NEW FILE: wincap.h --- /* wincap.h: Header for OS capability class. Copyright 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc. 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. */ #ifndef _WINCAP_H #define _WINCAP_H struct wincaps { DWORD lock_file_highword; DWORD chunksize; DWORD heapslop; int shared; unsigned is_winnt : 1; unsigned is_server : 1; unsigned access_denied_on_delete : 1; unsigned has_delete_on_close : 1; unsigned has_page_guard : 1; unsigned has_security : 1; unsigned has_security_descriptor_control : 1; unsigned has_get_process_times : 1; unsigned has_lseek_bug : 1; unsigned has_lock_file_ex : 1; unsigned has_signal_object_and_wait : 1; unsigned has_eventlog : 1; unsigned has_ip_helper_lib : 1; unsigned has_set_handle_information : 1; unsigned has_set_handle_information_on_console_handles: 1; unsigned supports_smp : 1; unsigned map_view_of_file_ex_sucks : 1; unsigned altgr_is_ctrl_alt : 1; unsigned has_physical_mem_access : 1; unsigned has_working_copy_on_write : 1; unsigned share_mmaps_only_by_name : 1; unsigned virtual_protect_works_on_shared_pages : 1; unsigned has_mmap_alignment_bug : 1; unsigned has_hard_links : 1; unsigned can_open_directories : 1; unsigned has_move_file_ex : 1; unsigned has_negative_pids : 1; unsigned has_unreliable_pipes : 1; unsigned has_named_pipes : 1; unsigned has_try_enter_critical_section : 1; unsigned has_raw_devices : 1; unsigned has_valid_processorlevel : 1; unsigned has_64bit_file_access : 1; unsigned has_process_io_counters : 1; unsigned supports_reading_modem_output_lines : 1; unsigned needs_memory_protection : 1; unsigned pty_needs_alloc_console : 1; unsigned has_terminal_services : 1; unsigned has_switch_to_thread : 1; unsigned cant_debug_dll_entry : 1; unsigned has_ioctl_storage_get_media_types_ex : 1; unsigned start_proc_suspended : 1; unsigned has_extended_priority_class : 1; unsigned has_guid_volumes : 1; unsigned detect_win16_exe : 1; unsigned has_null_console_handler_routine : 1; unsigned has_disk_ex_ioctls : 1; unsigned has_working_virtual_lock : 1; unsigned has_disabled_user_tos_setting : 1; unsigned has_fileid_dirinfo : 1; unsigned has_exclusiveaddruse : 1; unsigned has_buggy_restart_scan : 1; unsigned needs_count_in_si_lpres2 : 1; unsigned has_restricted_stack_args : 1; }; class wincapc { OSVERSIONINFOEX version; char osnam[40]; ULONG wow64; void *caps; public: void init (); void set_chunksize (DWORD nchunksize); const char *osname () const { return osnam; } const bool is_wow64 () const { return wow64; } #define IMPLEMENT(cap) cap() const { return ((wincaps *) this->caps)->cap; } DWORD IMPLEMENT (lock_file_highword) DWORD IMPLEMENT (chunksize) DWORD IMPLEMENT (heapslop) int IMPLEMENT (shared) bool IMPLEMENT (is_winnt) bool IMPLEMENT (is_server) bool IMPLEMENT (access_denied_on_delete) bool IMPLEMENT (has_delete_on_close) bool IMPLEMENT (has_page_guard) bool IMPLEMENT (has_security) bool IMPLEMENT (has_security_descriptor_control) bool IMPLEMENT (has_get_process_times) bool IMPLEMENT (has_lseek_bug) bool IMPLEMENT (has_lock_file_ex) bool IMPLEMENT (has_signal_object_and_wait) bool IMPLEMENT (has_eventlog) bool IMPLEMENT (has_ip_helper_lib) bool IMPLEMENT (has_set_handle_information) bool IMPLEMENT (has_set_handle_information_on_console_handles) bool IMPLEMENT (supports_smp) bool IMPLEMENT (map_view_of_file_ex_sucks) bool IMPLEMENT (altgr_is_ctrl_alt) bool IMPLEMENT (has_physical_mem_access) bool IMPLEMENT (has_working_copy_on_write) bool IMPLEMENT (share_mmaps_only_by_name) bool IMPLEMENT (virtual_protect_works_on_shared_pages) bool IMPLEMENT (has_mmap_alignment_bug) bool IMPLEMENT (has_hard_links) bool IMPLEMENT (can_open_directories) bool IMPLEMENT (has_move_file_ex) bool IMPLEMENT (has_negative_pids) bool IMPLEMENT (has_unreliable_pipes) bool IMPLEMENT (has_named_pipes) bool IMPLEMENT (has_try_enter_critical_section) bool IMPLEMENT (has_raw_devices) bool IMPLEMENT (has_valid_processorlevel) bool IMPLEMENT (has_64bit_file_access) bool IMPLEMENT (has_process_io_counters) bool IMPLEMENT (supports_reading_modem_output_lines) bool IMPLEMENT (needs_memory_protection) bool IMPLEMENT (pty_needs_alloc_console) bool IMPLEMENT (has_terminal_services) bool IMPLEMENT (has_switch_to_thread) bool IMPLEMENT (cant_debug_dll_entry) bool IMPLEMENT (has_ioctl_storage_get_media_types_ex) bool IMPLEMENT (start_proc_suspended) bool IMPLEMENT (has_extended_priority_class) bool IMPLEMENT (has_guid_volumes) bool IMPLEMENT (detect_win16_exe) bool IMPLEMENT (has_null_console_handler_routine) bool IMPLEMENT (has_disk_ex_ioctls) bool IMPLEMENT (has_working_virtual_lock) bool IMPLEMENT (has_disabled_user_tos_setting) bool IMPLEMENT (has_fileid_dirinfo) bool IMPLEMENT (has_exclusiveaddruse) bool IMPLEMENT (has_buggy_restart_scan) bool IMPLEMENT (needs_count_in_si_lpres2) bool IMPLEMENT (has_restricted_stack_args) #undef IMPLEMENT }; extern wincapc wincap; #endif /* _WINCAP_H */ Index: security.cc =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/security.cc,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** security.cc 14 Jan 2010 04:12:52 -0000 1.3 --- security.cc 4 Sep 2011 23:46:54 -0000 1.4 *************** *** 109,113 **** cygwin_logon_user (const struct passwd *pw, const char *password) { ! if (!iswinnt) { set_errno (ENOSYS); --- 109,113 ---- cygwin_logon_user (const struct passwd *pw, const char *password) { ! if (!wincap.has_security ()) { set_errno (ENOSYS); *************** *** 1067,1071 **** uid_t *uidret, gid_t *gidret) { ! if (!iswinnt) return 0; --- 1067,1071 ---- uid_t *uidret, gid_t *gidret) { ! if (!wincap.has_security ()) return 0; *************** *** 1291,1295 **** //#if !__MSYS__ ! if (!iswinnt) //#endif return NULL; --- 1291,1295 ---- //#if !__MSYS__ ! if (!wincap.is_winnt ()) //#endif return NULL; *************** *** 1340,1350 **** * only since Win2K. */ ! static int win2KorHigher = -1; ! if (win2KorHigher == -1) ! { ! DWORD version = GetVersion (); ! win2KorHigher = (version & 0x80000000) || (version & 0xff) < 5 ? 0 : 1; ! } ! if (win2KorHigher > 0) SetSecurityDescriptorControl (&sd, SE_DACL_PROTECTED, SE_DACL_PROTECTED); --- 1340,1344 ---- * only since Win2K. */ ! if (wincap.has_security_descriptor_control ()) SetSecurityDescriptorControl (&sd, SE_DACL_PROTECTED, SE_DACL_PROTECTED); *************** *** 1565,1569 **** const char *logsrv, int attribute) { ! if (!iswinnt) return 0; --- 1559,1563 ---- const char *logsrv, int attribute) { ! if (!wincap.has_security ()) return 0; --- NEW FILE: wincap.cc --- /* wincap.cc -- figure out on which OS we're running. Set the capability class to the appropriate values. Copyright 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc. 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 "security.h" #include <ntdef.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 [...971 lines suppressed...] } if (NT_SUCCESS (NtQueryInformationProcess (GetCurrentProcess (), ProcessWow64Information, &wow64, sizeof wow64, NULL)) && !wow64) { ((wincaps *)caps)->needs_count_in_si_lpres2 = false; ((wincaps *)caps)->has_restricted_stack_args = false; } __small_sprintf (osnam, "%s-%d.%d", os, version.dwMajorVersion, version.dwMinorVersion); } void wincapc::set_chunksize (DWORD nchunksize) { ((wincaps *)caps)->chunksize = nchunksize; } Index: syslog.cc =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/syslog.cc,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** syslog.cc 15 Oct 2001 22:22:33 -0000 1.2 --- syslog.cc 4 Sep 2011 23:46:54 -0000 1.3 *************** *** 301,308 **** } ! if (!iswinnt) { ! /* Add a priority string - not needed for NT ! as NT has its own priority codes. */ switch (LOG_PRI (priority)) { --- 301,308 ---- } ! if (!wincap.has_eventlog ()) { ! /* Add a priority string - not needed for systems with ! eventlog capability. */ switch (LOG_PRI (priority)) { *************** *** 337,341 **** msg_strings[0] = total_msg; ! if (iswinnt) { /* For NT, open the event log and send the message */ --- 337,341 ---- msg_strings[0] = total_msg; ! if (wincap.has_eventlog ()) { /* For NT, open the event log and send the message */ Index: exceptions.cc =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/exceptions.cc,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** exceptions.cc 29 Dec 2006 18:48:31 -0000 1.6 --- exceptions.cc 4 Sep 2011 23:46:54 -0000 1.7 *************** *** 286,292 **** if (needargs) ! /* The arguments follow the return address */ ! for (unsigned i = 0; i < NPARAMS; i++) ! sf.Params[i] = (DWORD) *++ebp; return 1; --- 286,303 ---- if (needargs) ! { ! unsigned nparams = NPARAMS; ! ! /* The arguments follow the return address */ ! sf.Params[0] = (DWORD) *++ebp; ! /* Hack for XP/2K3 WOW64. If the first stack param points to the ! application entry point, we can only fetch one additional ! parameter. Accessing anything beyond this address results in ! a SEGV. This is fixed in Vista/2K8 WOW64. */ ! if (wincap.has_restricted_stack_args () && sf.Params[0] == 0x401000) ! nparams = 2; ! for (unsigned i = 1; i < nparams; i++) ! sf.Params[i] = (DWORD) *++ebp; ! } return 1; Index: sigproc.cc =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/sigproc.cc,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** sigproc.cc 13 Aug 2010 02:43:21 -0000 1.6 --- sigproc.cc 4 Sep 2011 23:46:54 -0000 1.7 *************** *** 851,875 **** memset (ch, 0, sizeof *ch); ch->cb = sizeof *ch; ! /* ! * Work around what appears to be a bug in Vista 64-bit. The problem ! * is related to how fork passes information to the child. Basically ! * the child_info struct * is put in the lpReserved2 field of the ! * STARTUPINFO struct that gets passed to CreateProcess(). In all ! * versions of Windows, the size of the data to be passed is in the ! * cbReserved2 field of the same structure, except on Vista 64-bit. ! * ! * It seems that WOW64 (the 32-bit emulation layer of 64-bit Vista) ! * expects the size of the data passed in lpReserved2 to be the first ! * word in that same pointer, only it expects the size in "elements" ! * of a BYTE[] and HANDLE[] arrays (the MS C runtime has this ! * convention). ! * ! * We work around it by filling in the size as (sizeof struct)/5 and ! * zero padding the end of the child_info_* structs. ! */ ! if (isVistaWOW64) ! ch->msv_count = ch_size / 5; ! else ! ch->msv_count = 0; ch->type = chtype; ch->cygpid = pid; --- 851,879 ---- memset (ch, 0, sizeof *ch); ch->cb = sizeof *ch; ! ! /* It appears that when running under WOW64 on Vista 64, the first DWORD ! value in the datastructure lpReserved2 is pointing to (msv_count in ! Cygwin), has to reflect the size of that datastructure as used in the ! Microsoft C runtime (a count value, counting the number of elements in ! two subsequent arrays, BYTE[count and HANDLE[count]), even though the C ! runtime isn't used. Otherwise, if msv_count is 0 or too small, the ! datastructure gets overwritten. ! ! This seems to be a bug in Vista's WOW64, which apparently copies the ! lpReserved2 datastructure not using the cbReserved2 size information, ! but using the information given in the first DWORD within lpReserved2 ! instead. 32 bit Windows and former WOW64 don't care if msv_count is 0 ! or a sensible non-0 count value. However, it's not clear if a non-0 ! count doesn't result in trying to evaluate the content, so we do this ! really only for Vista 64 for now. ! ! Note: It turns out that a non-zero value *does* harm operation on ! XP 64 and 2K3 64. ! ! The value is sizeof (child_info_*) / 5 which results in a count which ! covers the full datastructure, plus not more than 4 extra bytes. This ! is ok as long as the child_info structure is cosily stored within a bigger ! datastructure. */ ! ch->msv_count = wincap.needs_count_in_si_lpres2 () ? ch_size / 5 : 0; ch->type = chtype; ch->cygpid = pid; Index: pinfo.cc =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/pinfo.cc,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** pinfo.cc 23 Mar 2003 22:58:23 -0000 1.7 --- pinfo.cc 4 Sep 2011 23:46:54 -0000 1.8 *************** *** 77,81 **** if (strace.active) { - extern char osname[]; strace.prntf (1, NULL, "**********************************************"); strace.prntf (1, NULL, "Program name: %s (%d)", myself->progname, myself->pid); --- 77,80 ---- *************** *** 88,92 **** strace.prntf (1, NULL, "DLL build: %s", cygwin_version.dll_build_date); strace.prntf (1, NULL, "Shared ID: %s", cygwin_version.shared_id); ! strace.prntf (1, NULL, "OS version: Windows %s", osname); strace.prntf (1, NULL, "**********************************************"); } --- 87,91 ---- strace.prntf (1, NULL, "DLL build: %s", cygwin_version.dll_build_date); strace.prntf (1, NULL, "Shared ID: %s", cygwin_version.shared_id); ! strace.prntf (1, NULL, "OS version: Windows %s", wincap.osname ()); strace.prntf (1, NULL, "**********************************************"); } *************** *** 401,405 **** winpids::enum_init (bool winpid) { ! if (iswinnt) enum_processes = &winpids::enumNT; else --- 400,404 ---- winpids::enum_init (bool winpid) { ! if (wincap.is_winnt ()) enum_processes = &winpids::enumNT; else Index: syscalls.cc =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/syscalls.cc,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** syscalls.cc 31 Mar 2011 13:28:07 -0000 1.19 --- syscalls.cc 4 Sep 2011 23:46:54 -0000 1.20 *************** *** 146,150 **** /* Windows 9x seems to report ERROR_ACCESS_DENIED rather than sharing violation. */ ! if (!iswinnt && lasterr == ERROR_ACCESS_DENIED && !win32_name.isremote ()) { --- 146,150 ---- /* Windows 9x seems to report ERROR_ACCESS_DENIED rather than sharing violation. */ ! if (wincap.access_denied_on_delete () && lasterr == ERROR_ACCESS_DENIED && !win32_name.isremote ()) { *************** *** 574,579 **** /* Try to make hard link first on Windows NT */ ! if (iswinnt) { HANDLE hFileSource; --- 574,585 ---- /* Try to make hard link first on Windows NT */ ! if (wincap.has_hard_links ()) { + if (CreateHardLinkA (real_b.get_win32 (), real_a.get_win32 (), NULL)) + { + res = 0; + goto done; + } + HANDLE hFileSource; *************** *** 691,695 **** return -1; ! if (!iswinnt) // real chown only works on NT res = 0; // return zero (and do nothing) under Windows 9x else --- 697,701 ---- return -1; ! if (!wincap.has_security ()) // real chown only works on NT res = 0; // return zero (and do nothing) under Windows 9x else *************** *** 1058,1062 **** if ((atts == -1 || ! (atts & FILE_ATTRIBUTE_DIRECTORY) || ! (iswinnt && dtype != DRIVE_NO_ROOT_DIR && dtype != DRIVE_UNKNOWN))) --- 1064,1068 ---- if ((atts == -1 || ! (atts & FILE_ATTRIBUTE_DIRECTORY) || ! (wincap.can_open_directories () && dtype != DRIVE_NO_ROOT_DIR && dtype != DRIVE_UNKNOWN))) *************** *** 1338,1342 **** */ usleep (640); // Wait for file to be closed. ! if (iswinnt) { if (MoveFileEx (real_old.get_win32 (), real_new.get_win32 (), --- 1344,1348 ---- */ usleep (640); // Wait for file to be closed. ! if (wincap.has_move_file_ex ()) { if (MoveFileEx (real_old.get_win32 (), real_new.get_win32 (), *************** *** 1467,1471 **** /* Windows 95/98/ME don't support file system security at all. */ ! if (!iswinnt) return 0; --- 1473,1477 ---- /* Windows 95/98/ME don't support file system security at all. */ ! if (!wincap.has_security ()) return 0; *************** *** 2042,2046 **** TRACE_IN; sigframe thisframe (mainthread); ! if (iswinnt) { char orig_username[UNLEN + 1]; --- 2048,2052 ---- TRACE_IN; sigframe thisframe (mainthread); ! if (wincap.has_security ()) { char orig_username[UNLEN + 1]; *************** *** 2258,2262 **** TRACE_IN; sigframe thisframe (mainthread); ! if (iswinnt) { if (gid != (gid_t) -1) --- 2264,2268 ---- TRACE_IN; sigframe thisframe (mainthread); ! if (wincap.has_security ()) { if (gid != (gid_t) -1) Index: pinfo.h =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/pinfo.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** pinfo.h 19 Apr 2003 01:03:48 -0000 1.3 --- pinfo.h 4 Sep 2011 23:46:54 -0000 1.4 *************** *** 186,190 **** cygwin_pid (pid_t pid) { ! return (pid_t) (iswinnt) ? pid : -(int) pid; } --- 186,190 ---- cygwin_pid (pid_t pid) { ! return (pid_t) (wincap.has_negative_pids ()) ? -(int) pid : pid; } Index: fhandler.h =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/fhandler.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** fhandler.h 15 Oct 2001 22:22:32 -0000 1.2 --- fhandler.h 4 Sep 2011 23:46:54 -0000 1.3 *************** *** 443,447 **** Windows shells to "do the right thing" with pipes. Apparently the can keep one end of the pipe open when it shouldn't be. */ ! BOOL is_slow () {return iswinnt;} select_record *select_read (select_record *s); select_record *select_write (select_record *s); --- 443,447 ---- Windows shells to "do the right thing" with pipes. Apparently the can keep one end of the pipe open when it shouldn't be. */ ! BOOL is_slow () {return wincap.has_unreliable_pipes ();} select_record *select_read (select_record *s); select_record *select_write (select_record *s); Index: net.cc =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/net.cc,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** net.cc 19 May 2010 03:38:15 -0000 1.6 --- net.cc 4 Sep 2011 23:46:54 -0000 1.7 *************** *** 122,126 **** set_socket_inheritance (SOCKET sock) { ! if (iswinnt) (void) SetHandleInformation ((HANDLE) sock, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); else --- 122,126 ---- set_socket_inheritance (SOCKET sock) { ! if (wincap.has_set_handle_information ()) (void) SetHandleInformation ((HANDLE) sock, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); else *************** *** 1528,1534 **** */ reg_key r (HKEY_LOCAL_MACHINE, KEY_READ, ! (!iswinnt) ? "System" : "SYSTEM", "CurrentControlSet", "Services", ! (!iswinnt) ? "MSTCP" : "Tcpip", NULL); --- 1528,1534 ---- */ reg_key r (HKEY_LOCAL_MACHINE, KEY_READ, ! (!wincap.is_winnt ()) ? "System" : "SYSTEM", "CurrentControlSet", "Services", ! (!wincap.is_winnt ()) ? "MSTCP" : "Tcpip", NULL); *************** *** 2108,2127 **** os_version_info.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); GetVersionEx (&os_version_info); ! /* We have a win95 version... */ ! if (os_version_info.dwPlatformId != VER_PLATFORM_WIN32_NT ! && (os_version_info.dwMajorVersion < 4 ! || (os_version_info.dwMajorVersion == 4 ! && os_version_info.dwMinorVersion == 0))) ! get_95_ifconf (ifc, what); ! /* ...and a NT <= SP3 version... */ ! else if (os_version_info.dwPlatformId == VER_PLATFORM_WIN32_NT ! && (os_version_info.dwMajorVersion < 4 ! || (os_version_info.dwMajorVersion == 4 ! && strcmp (os_version_info.szCSDVersion, "Service Pack 4") < 0))) get_nt_ifconf (ifc, what); - /* ...and finally a "modern" version for win98/ME, NT >= SP4 and W2K! */ else ! get_2k_ifconf (ifc, what); ! return 0; } --- 2108,2117 ---- os_version_info.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); GetVersionEx (&os_version_info); ! if (wincap.has_ip_helper_lib ()) ! get_2k_ifconf (ifc, what); ! else if (wincap.is_winnt ()) get_nt_ifconf (ifc, what); else ! get_95_ifconf (ifc, what); return 0; } Index: ismsys.cc =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/ismsys.cc,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** ismsys.cc 15 Jan 2010 16:28:10 -0000 1.6 --- ismsys.cc 4 Sep 2011 23:46:54 -0000 1.7 *************** *** 14,18 **** #include <stdio.h> #include "winsup.h" - #include "host_dependent.h" #define FILEERROR(A) fprintf (stderr, (A)) --- 14,17 ---- *************** *** 96,100 **** CreateFile (File , GENERIC_READ ! , host_dependent.shared // host dependent flags , NULL , OPEN_EXISTING --- 95,99 ---- CreateFile (File , GENERIC_READ ! , wincap.shared () // host dependent flags , NULL , OPEN_EXISTING Index: delqueue.cc =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/delqueue.cc,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** delqueue.cc 15 Oct 2001 22:22:32 -0000 1.2 --- delqueue.cc 4 Sep 2011 23:46:54 -0000 1.3 *************** *** 88,92 **** empty = 0; if (res == ERROR_SHARING_VIOLATION || ! (!iswinnt && res == ERROR_ACCESS_DENIED)) { /* File still inuse, that's ok */ --- 88,93 ---- empty = 0; if (res == ERROR_SHARING_VIOLATION || ! (wincap.access_denied_on_delete () ! && res == ERROR_ACCESS_DENIED)) { /* File still inuse, that's ok */ Index: mmap.cc =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/mmap.cc,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** mmap.cc 15 Oct 2001 22:22:33 -0000 1.2 --- mmap.cc 4 Sep 2011 23:46:54 -0000 1.3 *************** *** 84,88 **** map_map_ = (DWORD *) calloc (MAPSIZE(PAGE_CNT (size_to_map_)), sizeof (DWORD)); ! if (iswinnt) { DWORD old_prot; --- 84,88 ---- map_map_ = (DWORD *) calloc (MAPSIZE(PAGE_CNT (size_to_map_)), sizeof (DWORD)); ! if (wincap.virtual_protect_works_on_shared_pages ()) { DWORD old_prot; *************** *** 145,149 **** if (off != (DWORD)-1) { ! if (iswinnt && !VirtualProtect (base_address_ + off * getpagesize (), len * getpagesize (), prot, &old_prot)) --- 145,149 ---- if (off != (DWORD)-1) { ! if (wincap.virtual_protect_works_on_shared_pages () && !VirtualProtect (base_address_ + off * getpagesize (), len * getpagesize (), prot, &old_prot)) *************** *** 158,162 **** off -= offset_; DWORD start = off / getpagesize (); ! if (iswinnt && !VirtualProtect (base_address_ + start * getpagesize (), len * getpagesize (), prot, &old_prot)) --- 158,162 ---- off -= offset_; DWORD start = off / getpagesize (); ! if (wincap.virtual_protect_works_on_shared_pages () && !VirtualProtect (base_address_ + start * getpagesize (), len * getpagesize (), prot, &old_prot)) *************** *** 175,179 **** off /= getpagesize (); len = PAGE_CNT (len); ! if (iswinnt && !VirtualProtect (base_address_ + off * getpagesize (), len * getpagesize (), PAGE_NOACCESS, &old_prot)) --- 175,179 ---- off /= getpagesize (); len = PAGE_CNT (len); ! if (wincap.virtual_protect_works_on_shared_pages () && !VirtualProtect (base_address_ + off * getpagesize (), len * getpagesize (), PAGE_NOACCESS, &old_prot)) *************** *** 193,197 **** mmap_record::fixup_map () { ! if (!iswinnt) return; --- 193,197 ---- mmap_record::fixup_map () { ! if (!wincap.virtual_protect_works_on_shared_pages ()) return; *************** *** 427,431 **** access we use *READ mapping on 9x when appropriate. It will still fail when needing write access, though. */ ! if ((flags & MAP_PRIVATE) && (iswinnt || (prot & ~PROT_READ))) access = FILE_MAP_COPY; --- 427,432 ---- access we use *READ mapping on 9x when appropriate. It will still fail when needing write access, though. */ ! if ((flags & MAP_PRIVATE) && (wincap.has_working_copy_on_write () ! || (prot & ~PROT_READ))) access = FILE_MAP_COPY; *************** *** 438,442 **** * description of call `MapViewOfFileEx'. */ ! if ((!iswinnt) && (flags & MAP_FIXED)) { set_errno (EINVAL); --- 439,443 ---- * description of call `MapViewOfFileEx'. */ ! if ((!wincap.is_winnt ()) && (flags & MAP_FIXED)) { set_errno (EINVAL); *************** *** 746,750 **** shared file object. This is needed since 9x/ME only shares objects between processes by name. What a mess... */ ! if (!iswinnt && get_handle () != INVALID_HANDLE_VALUE && get_device () == FH_DISK --- 747,751 ---- shared file object. This is needed since 9x/ME only shares objects between processes by name. What a mess... */ ! if (wincap.share_mmaps_only_by_name () && get_handle () != INVALID_HANDLE_VALUE && get_device () == FH_DISK Index: Makefile.in =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/Makefile.in,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** Makefile.in 14 Jan 2010 04:12:51 -0000 1.11 --- Makefile.in 4 Sep 2011 23:46:54 -0000 1.12 *************** *** 131,135 **** smallprint.o spawn.o strace.o strsep.o sync.o syscalls.o sysconf.o \ syslog.o termios.o thread.o times.o tty.o uinfo.o uname.o wait.o \ ! window.o \ $(EXTRA_DLL_OFILES) $(EXTRA_OFILES) $(MALLOC_OFILES) $(MT_SAFE_OBJECTS) --- 131,135 ---- smallprint.o spawn.o strace.o strsep.o sync.o syscalls.o sysconf.o \ syslog.o termios.o thread.o times.o tty.o uinfo.o uname.o wait.o \ ! wincap.o window.o \ $(EXTRA_DLL_OFILES) $(EXTRA_OFILES) $(MALLOC_OFILES) $(MT_SAFE_OBJECTS) Index: fhandler_console.cc =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/fhandler_console.cc,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** fhandler_console.cc 23 Apr 2006 13:01:56 -0000 1.6 --- fhandler_console.cc 4 Sep 2011 23:46:54 -0000 1.7 *************** *** 326,330 **** recognized as Alt, or as AltGr. */ bool meta; ! if (iswinnt) /* WinNT: AltGr is reported as Ctrl+Alt, and Ctrl+Alt is treated just like AltGr. However, if Ctrl+Alt+key generates --- 326,330 ---- recognized as Alt, or as AltGr. */ bool meta; ! if (wincap.altgr_is_ctrl_alt ()) /* WinNT: AltGr is reported as Ctrl+Alt, and Ctrl+Alt is treated just like AltGr. However, if Ctrl+Alt+key generates Index: uinfo.cc =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/uinfo.cc,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** uinfo.cc 23 Mar 2003 17:22:46 -0000 1.3 --- uinfo.cc 4 Sep 2011 23:46:54 -0000 1.4 *************** *** 44,48 **** debug_printf ("GetUserName() = %s", user.name ()); ! if (iswinnt) { LPWKSTA_USER_INFO_1 wui; --- 44,48 ---- debug_printf ("GetUserName() = %s", user.name ()); ! if (wincap.has_security ()) { LPWKSTA_USER_INFO_1 wui; Index: sysconf.cc =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/sysconf.cc,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** sysconf.cc 15 Oct 2001 22:22:33 -0000 1.2 --- sysconf.cc 4 Sep 2011 23:46:54 -0000 1.3 *************** *** 57,91 **** case _SC_NPROCESSORS_CONF: case _SC_NPROCESSORS_ONLN: ! if (!iswinnt) return 1; /*FALLTHRU*/ case _SC_PHYS_PAGES: case _SC_AVPHYS_PAGES: ! { ! NTSTATUS ret; ! SYSTEM_BASIC_INFORMATION sbi; ! if ((ret = NtQuerySystemInformation (SystemBasicInformation, ! (PVOID) &sbi, ! sizeof sbi, NULL)) ! != STATUS_SUCCESS) ! { ! __seterrno_from_win_error (RtlNtStatusToDosError (ret)); ! debug_printf("NtQuerySystemInformation: ret = %d, " ! "Dos(ret) = %d", ! ret, RtlNtStatusToDosError (ret)); ! return -1; ! } ! switch (in) ! { ! case _SC_NPROCESSORS_CONF: ! return sbi.NumberProcessors; ! case _SC_NPROCESSORS_ONLN: ! return sbi.ActiveProcessors; ! case _SC_PHYS_PAGES: ! return sbi.NumberOfPhysicalPages; ! case _SC_AVPHYS_PAGES: ! return sbi.HighestPhysicalPage - sbi.LowestPhysicalPage + 1; ! } ! } } --- 57,93 ---- case _SC_NPROCESSORS_CONF: case _SC_NPROCESSORS_ONLN: ! if (!wincap.supports_smp ()) return 1; /*FALLTHRU*/ case _SC_PHYS_PAGES: case _SC_AVPHYS_PAGES: ! if (!wincap.supports_smp ()) ! { ! NTSTATUS ret; ! SYSTEM_BASIC_INFORMATION sbi; ! if ((ret = NtQuerySystemInformation (SystemBasicInformation, ! (PVOID) &sbi, ! sizeof sbi, NULL)) ! != STATUS_SUCCESS) ! { ! __seterrno_from_win_error (RtlNtStatusToDosError (ret)); ! debug_printf("NtQuerySystemInformation: ret = %d, " ! "Dos(ret) = %d", ! ret, RtlNtStatusToDosError (ret)); ! return -1; ! } ! switch (in) ! { ! case _SC_NPROCESSORS_CONF: ! return sbi.NumberProcessors; ! case _SC_NPROCESSORS_ONLN: ! return sbi.ActiveProcessors; ! case _SC_PHYS_PAGES: ! return sbi.NumberOfPhysicalPages; ! case _SC_AVPHYS_PAGES: ! return sbi.HighestPhysicalPage - sbi.LowestPhysicalPage + 1; ! } ! } ! break; } Index: ChangeLog.MSYS =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/ChangeLog.MSYS,v retrieving revision 1.120 retrieving revision 1.121 diff -C2 -d -r1.120 -r1.121 *** ChangeLog.MSYS 19 Apr 2011 00:46:34 -0000 1.120 --- ChangeLog.MSYS 4 Sep 2011 23:46:54 -0000 1.121 *************** *** 1,2 **** --- 1,12 ---- + 2011.06.21 Teemu Nätkinniemi <tnatkinn> + + * Import Cygwin 1.3.4 + * Backport wincap.cc, wincap.h and ntdll.h from Cygwin 1.5.25-15 + * wincap.cc backport bugfixes from Cygwin CVS and add support for + Windows 7 + * ntdll.h (_PROCESSINFOCLASS) backport WOW64 fixes from Cygwin + HEAD + * ismsys.cc (IsMsys) use wincap capability + 2011.04.18 Cesar Strauss <ces...@gm...> Index: cygheap.cc =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/cygheap.cc,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** cygheap.cc 14 Jan 2010 04:12:52 -0000 1.7 --- cygheap.cc 4 Sep 2011 23:46:54 -0000 1.8 *************** *** 98,102 **** cygheap = ci->cygheap; cygheap_max = ci->cygheap_max; ! void *addr = iswinnt ? cygheap : NULL; void *newaddr; --- 98,102 ---- cygheap = ci->cygheap; cygheap_max = ci->cygheap_max; ! void *addr = !wincap.map_view_of_file_ex_sucks () ? cygheap : NULL; void *newaddr; Index: tty.cc =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/tty.cc,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** tty.cc 23 Apr 2006 13:01:56 -0000 1.6 --- tty.cc 4 Sep 2011 23:46:54 -0000 1.7 *************** *** 434,438 **** /* Allow the others to open us (for handle duplication) */ ! if ((iswinnt) && (SetKernelObjectSecurity (hMainProc, DACL_SECURITY_INFORMATION, get_null_sd ()) == FALSE)) --- 434,438 ---- /* Allow the others to open us (for handle duplication) */ ! if (wincap.has_security () && (SetKernelObjectSecurity (hMainProc, DACL_SECURITY_INFORMATION, get_null_sd ()) == FALSE)) Index: times.cc =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/times.cc,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** times.cc 15 Oct 2001 22:22:33 -0000 1.2 --- times.cc 4 Sep 2011 23:46:54 -0000 1.3 *************** *** 57,61 **** overflow. */ clock_t tc = (clock_t) ((long long) ticks * CLOCKS_PER_SEC / 1000); ! if (iswinnt) { GetProcessTimes (hMainProc, &creation_time, &exit_time, --- 57,61 ---- overflow. */ clock_t tc = (clock_t) ((long long) ticks * CLOCKS_PER_SEC / 1000); ! if (wincap.has_get_process_times ()) { GetProcessTimes (hMainProc, &creation_time, &exit_time, *************** *** 460,468 **** /* MSDN suggests using FILE_FLAG_BACKUP_SEMANTICS for accessing ! the times of directories. FIXME: what about Win95??? */ /* Note: It's not documented in MSDN that FILE_WRITE_ATTRIBUTES is sufficient to change the timestamps... */ HANDLE h = CreateFileA (win32.get_win32 (), ! iswinnt ? FILE_WRITE_ATTRIBUTES : GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, &sec_none_nih, --- 460,468 ---- /* MSDN suggests using FILE_FLAG_BACKUP_SEMANTICS for accessing ! the times of directories. */ /* Note: It's not documented in MSDN that FILE_WRITE_ATTRIBUTES is sufficient to change the timestamps... */ HANDLE h = CreateFileA (win32.get_win32 (), ! FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE, &sec_none_nih, Index: ntdll.h =================================================================== RCS file: /cvsroot/mingw/msys/rt/src/winsup/cygwin/ntdll.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** ntdll.h 15 Oct 2001 22:22:33 -0000 1.2 --- ntdll.h 4 Sep 2011 23:46:54 -0000 1.3 *************** *** 1,5 **** /* ntdll.h. Contains ntdll specific stuff not defined elsewhere. ! Copyright 2000, 2001 Red Hat, Inc. This file is part of Cygwin. --- 1,5 ---- /* ntdll.h. Contains ntdll specific stuff not defined elsewhere. ! Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc. This file is part of Cygwin. *************** *** 9,18 **** --- 9,138 ---- details. */ + #ifndef STATUS_INVALID_INFO_CLASS + /* Some w32api header file defines this so we need to conditionalize this + define to avoid warnings. */ + #define STATUS_INVALID_INFO_CLASS ((NTSTATUS) 0xc0000003) + #endif #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS) 0xc0000004) + #define STATUS_INVALID_PARAMETER ((NTSTATUS) 0xc000000d) + #define STATUS_BUFFER_TOO_SMALL ((NTSTATUS) 0xc0000023) + #define STATUS_OBJECT_NAME_INVALID ((NTSTATUS) 0xc0000033) + #define STATUS_WORKING_SET_QUOTA ((NTSTATUS) 0xc00000a1L) + #define STATUS_INVALID_LEVEL ((NTSTATUS) 0xc0000148) + #define STATUS_NO_MORE_FILES ((NTSTATUS)0x80000006L) + #define PDI_MODULES 0x01 + #define PDI_HEAPS 0x04 + #define LDRP_IMAGE_DLL 0x00000004 + #define WSLE_PAGE_READONLY 0x001 + #define WSLE_PAGE_EXECUTE 0x002 + #define WSLE_PAGE_EXECUTE_READ 0x003 + #define WSLE_PAGE_READWRITE 0x004 + #define WSLE_PAGE_WRITECOPY 0x005 + #define WSLE_PAGE_EXECUTE_READWRITE 0x006 + #define WSLE_PAGE_EXECUTE_WRITECOPY 0x007 + #define WSLE_PAGE_SHARE_COUNT_MASK 0x0E0 + #define WSLE_PAGE_SHAREABLE 0x100 + + typedef enum _FILE_INFORMATION_CLASS + { + FileDirectoryInformation = 1, + FileFullDirectoryInformation, // 2 + FileBothDirectoryInformation, // 3 + FileBasicInformation, // 4 wdm + FileStandardInformation, // 5 wdm + FileInternalInformation, // 6 + FileEaInformation, // 7 + FileAccessInformation, // 8 + FileNameInformation, // 9 + FileRenameInformation, // 10 + FileLinkInformation, // 11 + FileNamesInformation, // 12 + FileDispositionInformation, // 13 + FilePositionInformation, // 14 wdm + FileFullEaInformation, // 15 + FileModeInformation, // 16 + FileAlignmentInformation, // 17 + FileAllInformation, // 18 + FileAllocationInformation, // 19 + FileEndOfFileInformation, // 20 wdm + FileAlternateNameInformation, // 21 + FileStreamInformation, // 22 + FilePipeInformation, // 23 + FilePipeLocalInformation, // 24 + FilePipeRemoteInformation, // 25 + FileMailslotQueryInformation, // 26 + FileMailslotSetInformation, // 27 + FileCompressionInformation, // 28 + FileObjectIdInformation, // 29 + FileCompletionInformation, // 30 + FileMoveClusterInformation, // 31 + FileQuotaInformation, // 32 + FileReparsePointInformation, // 33 + FileNetworkOpenInformation, // 34 + FileAttributeTagInformation, // 35 + FileTrackingInformation, // 36 + FileIdBothDirectoryInformation, // 37 + FileIdFullDirectoryInformation, // 38 + FileValidDataLengthInformation, // 39 + FileShortNameInformation, // 40 + FileMaximumInformation + } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS; + + typedef struct _FILE_BOTH_DIR_INFORMATION + { + ULONG NextEntryOffset; + ULONG FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + ULONG FileAttributes; + ULONG FileNameLength; + ULONG EaSize; + CCHAR ShortNameLength; + WCHAR ShortName[12]; + WCHAR FileName[1]; + } FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION; + + typedef struct _FILE_ID_BOTH_DIR_INFORMATION + { + ULONG NextEntryOffset; + ULONG FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + ULONG FileAttributes; + ULONG FileNameLength; + ULONG EaSize; + CCHAR ShortNameLength; + WCHAR ShortName[12]; + LARGE_INTEGER FileId; + WCHAR FileName[1]; + } FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION; + + + #define AT_EXTENDABLE_FILE 0x00002000 + #define AT_ROUND_TO_PAGE 0x40000000 + + #define LOCK_VM_IN_WSL 1 + #define LOCK_VM_IN_RAM 2 + + #define DIRECTORY_QUERY 1 + + typedef ULONG KAFFINITY; typedef enum _SYSTEM_INFORMATION_CLASS { SystemBasicInformation = 0, + SystemPerformanceInformation = 2, + SystemTimeOfDayInformation = 3, SystemProcessesAndThreadsInformation = 5, + SystemProcessorTimes = 8, + SystemPagefileInformation = 18, /* There are a lot more of these... */ } SYSTEM_INFORMATION_CLASS; *************** *** 30,36 **** ULONG HighestUserAddress; ULONG ActiveProcessors; ! ULONG NumberProcessors; } SYSTEM_BASIC_INFORMATION, *PSYSTEM_BASIC_INFORMATION; typedef LONG KPRIORITY; typedef struct _VM_COUNTERS --- 150,175 ---- ULONG HighestUserAddress; ULONG ActiveProcessors; ! UCHAR NumberProcessors; } SYSTEM_BASIC_INFORMATION, *PSYSTEM_BASIC_INFORMATION; + typedef struct _SYSTEM_PAGEFILE_INFORMATION + { + ULONG NextEntryOffset; + ULONG CurrentSize; + ULONG TotalUsed; + ULONG PeakUsed; + UNICODE_STRING FileName; + } SYSTEM_PAGEFILE_INFORMATION, *PSYSTEM_PAGEFILE_INFORMATION; + + typedef struct __attribute__ ((aligned (8))) _SYSTEM_PROCESSOR_TIMES + { + LARGE_INTEGER IdleTime; + LARGE_INTEGER KernelTime; + LARGE_INTEGER UserTime; + LARGE_INTEGER DpcTime; + LARGE_INTEGER InterruptTime; + ULONG InterruptCount; + } SYSTEM_PROCESSOR_TIMES, *PSYSTEM_PROCESSOR_TIMES; + typedef LONG KPRIORITY; typedef struct _VM_COUNTERS *************** *** 112,115 **** --- 251,255 ---- THREAD_STATE State; KWAIT_REASON WaitReason; + DWORD Reserved; } SYSTEM_THREADS, *PSYSTEM_THREADS; *************** *** 117,121 **** { ULONG NextEntryDelta; ! ULONG Threadcount; ULONG Reserved1[6]; LARGE_INTEGER CreateTime; --- 257,261 ---- { ULONG NextEntryDelta; ! ULONG ThreadCount; ULONG Reserved1[6]; LARGE_INTEGER CreateTime; *************** *** 133,140 **** --- 273,615 ---- } SYSTEM_PROCESSES, *PSYSTEM_PROCESSES; + typedef struct _IO_STATUS_BLOCK + { + NTSTATUS Status; + ULONG Information; + } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; + + typedef struct _SYSTEM_PERFORMANCE_INFORMATION + { + LARGE_INTEGER IdleTime; + LARGE_INTEGER ReadTransferCount; + LARGE_INTEGER WriteTransferCount; + LARGE_INTEGER OtherTransferCount; + ULONG ReadOperationCount; + ULONG WriteOperationCount; + ULONG OtherOperationCount; + ULONG AvailablePages; + ULONG TotalCommittedPages; + ULONG TotalCommitLimit; + ULONG PeakCommitment; + ULONG PageFaults; + ULONG WriteCopyFaults; + ULONG TransitionFaults; + ULONG Reserved1; + ULONG DemandZeroFaults; + ULONG PagesRead; + ULONG PageReadIos; + ULONG Reserved2[2]; + ULONG PagefilePagesWritten; + ULONG PagefilePageWriteIos; + ULONG MappedFilePagesWritten; + ULONG MappedFilePageWriteIos; + ULONG PagedPoolUsage; + ULONG NonPagedPoolUsage; + ULONG PagedPoolAllocs; + ULONG PagedPoolFrees; + ULONG NonPagedPoolAllocs; + ULONG NonPagedPoolFrees; + ULONG TotalFreeSystemPtes; + ULONG SystemCodePage; + ULONG TotalSystemDriverPages; + ULONG TotalSystemCodePages; + ULONG SmallNonPagedLookasideListAllocateHits; + ULONG SmallPagedLookasideListAllocateHits; + ULONG Reserved3; + ULONG MmSystemCachePage; + ULONG PagedPoolPage; + ULONG SystemDriverPage; + ULONG FastReadNoWait; + ULONG FastReadWait; + ULONG FastReadResourceMiss; + ULONG FastReadNotPossible; + ULONG FastMdlReadNoWait; + ULONG FastMdlReadWait; + ULONG FastMdlReadResourceMiss; + ULONG FastMdlReadNotPossible; + ULONG MapDataNoWait; + ULONG MapDataWait; + ULONG MapDataNoWaitMiss; + ULONG MapDataWaitMiss; + ULONG PinMappedDataCount; + ULONG PinReadNoWait; + ULONG PinReadWait; + ULONG PinReadNoWaitMiss; + ULONG PinReadWaitMiss; + ULONG CopyReadNoWait; + ULONG CopyReadWait; + ULONG CopyReadNoWaitMiss; + ULONG CopyReadWaitMiss; + ULONG MdlReadNoWait; + ULONG MdlReadWait; + ULONG MdlReadNoWaitMiss; + ULONG MdlReadWaitMiss; + ULONG ReadAheadIos; + ULONG LazyWriteIos; + ULONG LazyWritePages; + ULONG DataFlushes; + ULONG DataPages; + ULONG ContextSwitches; + ULONG FirstLevelTbFills; + ULONG SecondLevelTbFills; + ULONG SystemCalls; + } SYSTEM_PERFORMANCE_INFORMATION, *PSYSTEM_PERFORMANCE_INFORMATION; + + typedef struct __attribute__ ((aligned(8))) _SYSTEM_TIME_OF_DAY_INFORMATION + { + LARGE_INTEGER BootTime; + LARGE_INTEGER CurrentTime; + LARGE_INTEGER TimeZoneBias; + ULONG CurrentTimeZoneId; + } SYSTEM_TIME_OF_DAY_INFORMATION, *PSYSTEM_TIME_OF_DAY_INFORMATION; + + typedef enum _PROCESSINFOCLASS + { + ProcessBasicInformation = 0, + ProcessQuotaLimits = 1, + ProcessVmCounters = 3, + ProcessTimes =4, + ProcessSessionInformation = 24, + ProcessWow64Information = 26 + } PROCESSINFOCLASS; + + typedef struct _DEBUG_BUFFER + { + HANDLE SectionHandle; + PVOID SectionBase; + PVOID RemoteSectionBase; + ULONG SectionBaseDelta; + HANDLE EventPairHandle; + ULONG Unknown[2]; + HANDLE RemoteThreadHandle; + ULONG InfoClassMask; + ULONG SizeOfInfo; + ULONG AllocatedSize; + ULONG SectionSize; + PVOID ModuleInformation; + PVOID BackTraceInformation; + PVOID HeapInformation; + PVOID LockInformation; + PVOID Reserved[9]; + } DEBUG_BUFFER, *PDEBUG_BUFFER; + + typedef struct _DEBUG_HEAP_INFORMATION + { + ULONG Base; + ULONG Flags; + USHORT Granularity; + USHORT Unknown; + ULONG Allocated; + ULONG Committed; + ULONG TagCount; + ULONG BlockCount; + ULONG Reserved[7]; + PVOID Tags; + PVOID Blocks; + } DEBUG_HEAP_INFORMATION, *PDEBUG_HEAP_INFORMATION; + + typedef struct _DEBUG_MODULE_INFORMATION + { + ULONG Reserved[2]; + ULONG Base; + ULONG Size; + ULONG Flags; + USHORT Index; + USHORT Unknown; + USHORT LoadCount; + USHORT ModuleNameOffset; + CHAR ImageName[256]; + } DEBUG_MODULE_INFORMATION, *PDEBUG_MODULE_INFORMATION; + + typedef struct _KERNEL_USER_TIMES + { + LARGE_INTEGER CreateTime; + LARGE_INTEGER ExitTime; + LARGE_INTEGER KernelTime; + LARGE_INTEGER UserTime; + } KERNEL_USER_TIMES, *PKERNEL_USER_TIMES; + + typedef void *PPEB; + + typedef struct _PROCESS_BASIC_INFORMATION + { + NTSTATUS ExitStatus; + PPEB PebBaseAddress; + KAFFINITY AffinityMask; + KPRIORITY BasePriority; + ULONG UniqueProcessId; + ULONG InheritedFromUniqueProcessId; + } PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION; + + typedef enum _MEMORY_INFORMATION_CLASS + { + MemoryBasicInformation, + MemoryWorkingSetList, + MemorySectionName, + MemoryBasicVlmInformation + } MEMORY_INFORMATION_CLASS; + + typedef struct _MEMORY_WORKING_SET_LIST + { + ULONG NumberOfPages; + ULONG WorkingSetList[1]; + } MEMORY_WORKING_SET_LIST, *PMEMORY_WORKING_SET_LIST; + + typedef struct _FILE_BASIC_INFORMATION { + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + ULONG FileAttributes; + } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION; + + typedef struct _FILE_STANDARD_INFORMATION { + LARGE_INTEGER AllocationSize; + LARGE_INTEGER EndOfFile; + ULONG NumberOfLinks; + BOOLEAN DeletePending; + BOOLEAN Directory; + } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION; + + typedef struct _FILE_INTERNAL_INFORMATION { + LARGE_INTEGER FileId; + } FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION; + + typedef struct _FILE_EA_INFORMATION { + ULONG EaSize; + } FILE_EA_INFORMATION, *PFILE_EA_INFORMATION; + + typedef struct _FILE_ACCESS_INFORMATION { + ACCESS_MASK AccessFlags; + } FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION; + + typedef struct _FILE_POSITION_INFORMATION { + LARGE_INTEGER CurrentByteOffset; + } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION; + + typedef struct _FILE_MODE_INFORMATION { + ULONG Mode; + } FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION; + + typedef struct _FILE_ALIGNMENT_INFORMATION { + ULONG AlignmentRequirement; + } FILE_ALIGNMENT_INFORMATION; + + typedef struct _FILE_NAME_INFORMATION { + ULONG FileNameLength; + WCHAR FileName[1]; + } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION; + + typedef struct _FILE_ALL_INFORMATION { + FILE_BASIC_INFORMATION BasicInformation; + FILE_STANDARD_INFORMATION StandardInformation; + FILE_INTERNAL_INFORMATION InternalInformation; + FILE_EA_INFORMATION EaInformation; + FILE_ACCESS_INFORMATION AccessInformation; + FILE_POSITION_INFORMATION PositionInformation; + FILE_MODE_INFORMATION ModeInformation; + FILE_ALIGNMENT_INFORMATION AlignmentInformation; + FILE_NAME_INFORMATION NameInformation; + } FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION; + + typedef struct _FILE_PIPE_LOCAL_INFORMATION + { + ULONG NamedPipeType; + ULONG NamedPipeConfiguration; + ULONG MaximumInstances; + ULONG CurrentInstances; + ULONG InboundQuota; + ULONG ReadDataAvailable; + ULONG OutboundQuota; + ULONG WriteQuotaAvailable; + ULONG NamedPipeState; + ULONG NamedPipeEnd; + } FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION; + + typedef struct _FILE_COMPRESSION_INFORMATION + { + LARGE_INTEGER CompressedSize; + USHORT CompressionFormat; + UCHAR CompressionUnitShift; + UCHAR Unknown; + UCHAR ClusterSizeShift; + } FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION; + + typedef struct _FILE_FS_VOLUME_INFORMATION + { + LARGE_INTEGER VolumeCreationTime; + ULONG VolumeSerialNumber; + ULONG VolumeLabelLength; + BOOLEAN SupportsObjects; + WCHAR VolumeLabel[1]; + } FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION; + + typedef struct _FILE_FS_SIZE_INFORMATION + { + LARGE_INTEGER TotalAllocationUnits; + LARGE_INTEGER AvailableAllocationUnits; + ULONG SectorsPerAllocationUnit; + ULONG BytesPerSector; + } FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION; + + typedef enum _FSINFOCLASS { + FileFsVolumeInformation = 1, + FileFsLabelInformation, + FileFsSizeInformation, + FileFsDeviceInformation, + FileFsAttributeInformation, + FileFsControlInformation, + FileFsFullSizeInformation, + FileFsObjectIdInformation, + FileFsDriverPathInformation, + FileFsMaximumInformation + } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS; + + typedef enum _OBJECT_INFORMATION_CLASS + { + ObjectBasicInformation = 0, + ObjectNameInformation = 1, + ObjectHandleInformation = 4 + // and many more + } OBJECT_INFORMATION_CLASS; + + typedef struct _OBJECT_NAME_INFORMATION + { + UNICODE_STRING Name; + } OBJECT_NAME_INFORMATION; + + typedef struct _DIRECTORY_BASIC_INFORMATION + { + UNICODE_STRING ObjectName; + UNICODE_STRING ObjectTypeName; + } DIRECTORY_BASIC_INFORMATION, *PDIRECTORY_BASIC_INFORMATION; + + typedef struct _FILE_GET_EA_INFORMATION + { + ULONG NextEntryOffset; + UCHAR EaNameLength; + CHAR EaName[1]; + } FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION; + + + typedef struct _FILE_FULL_EA_INFORMATION + { + ULONG NextEntryOffset; + UCHAR Flags; + UCHAR EaNameLength; + USHORT EaValueLength; + CHAR EaName[1]; + } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION; + /* Function declarations for ntdll.dll. These don't appear in any standard Win32 header. */ extern "C" { + NTSTATUS NTAPI NtClose (HANDLE); + NTSTATUS NTAPI NtCreateFile (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, + PIO_STATUS_BLOCK, PLARGE_INTEGER, ULONG, ULONG, + ULONG, ULONG, PVOID, ULONG); + NTSTATUS NTAPI NtCreateSection (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, + PLARGE_INTEGER, ULONG, ULONG, HANDLE); NTSTATUS NTAPI NtCreateToken (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, TOKEN_TYPE, PLUID, PLARGE_INTEGER, PTOKEN_USER, *************** *** 142,156 **** PTOKEN_PRIMARY_GROUP, PTOKEN_DEFAULT_DACL, PTOKEN_SOURCE); NTSTATUS NTAPI NtMapViewOfSection (HANDLE, HANDLE, PVOID *, ULONG, ULONG, PLARGE_INTEGER, PULONG, SECTION_INHERIT, ULONG, ULONG); NTSTATUS NTAPI NtOpenSection (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES); NTSTATUS NTAPI NtQuerySystemInformation (SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG); NTSTATUS NTAPI NtUnmapViewOfSection (HANDLE, PVOID); VOID NTAPI RtlInitUnicodeString (PUNICODE_STRING, PCWSTR); ULONG NTAPI RtlNtStatusToDosError (NTSTATUS); - NTSTATUS NTAPI ZwQuerySystemInformation (IN SYSTEM_INFORMATION_CLASS, - IN OUT PVOID, IN ULONG, - OUT PULONG); } --- 617,659 ---- PTOKEN_PRIMARY_GROUP, PTOKEN_DEFAULT_DACL, PTOKEN_SOURCE); + NTSTATUS NTAPI NtLockVirtualMemory (HANDLE, PVOID *, ULONG *, ULONG); NTSTATUS NTAPI NtMapViewOfSection (HANDLE, HANDLE, PVOID *, ULONG, ULONG, PLARGE_INTEGER, PULONG, SECTION_INHERIT, ULONG, ULONG); + NTSTATUS NTAPI NtOpenDirectoryObject (PHANDLE, ACCESS_MASK, + POBJECT_ATTRIBUTES); + NTSTATUS NTAPI NtOpenFile (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, + PIO_STATUS_BLOCK, ULONG, ULONG); NTSTATUS NTAPI NtOpenSection (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES); + NTSTATUS NTAPI NtQueryDirectoryFile(HANDLE, HANDLE, PVOID, PVOID, + PIO_STATUS_BLOCK, PVOID, ULONG, + FILE_INFORMATION_CLASS, BOOLEAN, + PUNICODE_STRING, BOOLEAN); + NTSTATUS NTAPI NtQueryDirectoryObject (HANDLE, PVOID, ULONG, BOOLEAN, + BOOLEAN, PULONG, PULONG); + NTSTATUS NTAPI NtQueryEaFile (HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG, + BOOLEAN, PVOID, ULONG, PULONG, BOOLEAN); + NTSTATUS NTAPI NtQueryInformationFile (HANDLE, PIO_STATUS_BLOCK, PVOID, + ULONG, FILE_INFORMATION_CLASS); + NTSTATUS NTAPI NtQueryInformationProcess (HANDLE, PROCESSINFOCLASS, + PVOID, ULONG, PULONG); + NTSTATUS NTAPI NtQueryObject (HANDLE, OBJECT_INFORMATION_CLASS, VOID *, + ULONG, ULONG *); NTSTATUS NTAPI NtQuerySystemInformation (SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG); + NTSTATUS NTAPI NtQuerySecurityObject (HANDLE, SECURITY_INFORMATION, + PSECURITY_DESCRIPTOR, ULONG, PULONG); + NTSTATUS NTAPI NtQueryVirtualMemory (HANDLE, PVOID, MEMORY_INFORMATION_CLASS, + PVOID, ULONG, PULONG); + NTSTATUS NTAPI NtQueryVolumeInformationFile (HANDLE, IO_STATUS_BLOCK *, + VOID *, ULONG, + FS_INFORMATION_CLASS); + NTSTATUS NTAPI NtSetEaFile (HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG); + NTSTATUS NTAPI NtSetSecurityObject (HANDLE, SECURITY_INFORMATION, + PSECURITY_DESCRIPTOR); + NTSTATUS NTAPI NtUnlockVirtualMemory (HANDLE, PVOID *, ULON... [truncated message content] |