* fhandler.cc (fhandler_base::set_no_inheritance): Always use

SetHandleInformation.
	* fhandler_disk_file.cc (fhandler_disk_file::lock): Always use
	UnlockFileEx/LockFileEx functions.
	* net.cc (fdsock): Don't bother to duplicate socket for inheritance.
	* sysconf.cc (get_nproc_values): Take NT for granted.
	(get_avphys): Ditto.
	* syslog.cc (WIN95_EVENT_LOG_PATH): Remove define.
	(get_win95_event_log_path): Remove.
	(vsyslog): Fix formatting.  Take NT for granted.
	* wincap.cc: Remove has_lock_file_ex, has_signal_object_and_wait,
	has_eventlog, has_set_handle_information,
	has_set_handle_information_on_console_handles and supports_smp
	throughout.
	* wincap.h: Ditto.
This commit is contained in:
Corinna Vinschen 2007-02-22 17:09:46 +00:00
parent 64f211c87c
commit eef57fe1e3
9 changed files with 209 additions and 386 deletions

View File

@ -1,3 +1,21 @@
2007-02-22 Corinna Vinschen <corinna@vinschen.de>
* fhandler.cc (fhandler_base::set_no_inheritance): Always use
SetHandleInformation.
* fhandler_disk_file.cc (fhandler_disk_file::lock): Always use
UnlockFileEx/LockFileEx functions.
* net.cc (fdsock): Don't bother to duplicate socket for inheritance.
* sysconf.cc (get_nproc_values): Take NT for granted.
(get_avphys): Ditto.
* syslog.cc (WIN95_EVENT_LOG_PATH): Remove define.
(get_win95_event_log_path): Remove.
(vsyslog): Fix formatting. Take NT for granted.
* wincap.cc: Remove has_lock_file_ex, has_signal_object_and_wait,
has_eventlog, has_set_handle_information,
has_set_handle_information_on_console_handles and supports_smp
throughout.
* wincap.h: Ditto.
2007-02-22 Corinna Vinschen <corinna@vinschen.de> 2007-02-22 Corinna Vinschen <corinna@vinschen.de>
* dir.cc (rmdir): Move existance check in front of * dir.cc (rmdir): Move existance check in front of

View File

@ -1481,21 +1481,9 @@ fhandler_dev_null::open (int flags, mode_t mode)
void void
fhandler_base::set_no_inheritance (HANDLE &h, bool not_inheriting) fhandler_base::set_no_inheritance (HANDLE &h, bool not_inheriting)
{ {
if (wincap.has_set_handle_information ()) if (!SetHandleInformation (h, HANDLE_FLAG_INHERIT,
{ not_inheriting ? 0 : HANDLE_FLAG_INHERIT))
if (!SetHandleInformation (h, HANDLE_FLAG_INHERIT, not_inheriting ? 0 : HANDLE_FLAG_INHERIT)) debug_printf ("SetHandleInformation failed, %E");
debug_printf ("SetHandleInformation failed, %E");
}
else
{
HANDLE oh = h;
if (!DuplicateHandle (hMainProc, oh, hMainProc, &h, 0, !not_inheriting,
DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE))
debug_printf ("DuplicateHandle failed, %E");
if (oh != h)
VerifyHandle (h);
}
#ifdef DEBUGGING_AND_FDS_PROTECTED #ifdef DEBUGGING_AND_FDS_PROTECTED
if (h) if (h)
setclexec (oh, h, not_inheriting); setclexec (oh, h, not_inheriting);

View File

@ -1281,49 +1281,38 @@ fhandler_disk_file::lock (int cmd, struct __flock64 *fl)
BOOL res; BOOL res;
if (wincap.has_lock_file_ex ()) DWORD lock_flags = (cmd == F_SETLK) ? LOCKFILE_FAIL_IMMEDIATELY : 0;
lock_flags |= (fl->l_type == F_WRLCK) ? LOCKFILE_EXCLUSIVE_LOCK : 0;
OVERLAPPED ov;
ov.Internal = 0;
ov.InternalHigh = 0;
ov.Offset = off_low;
ov.OffsetHigh = off_high;
ov.hEvent = (HANDLE) 0;
if (fl->l_type == F_UNLCK)
{ {
DWORD lock_flags = (cmd == F_SETLK) ? LOCKFILE_FAIL_IMMEDIATELY : 0; res = UnlockFileEx (get_handle (), 0, len_low, len_high, &ov);
lock_flags |= (fl->l_type == F_WRLCK) ? LOCKFILE_EXCLUSIVE_LOCK : 0; if (res == 0 && GetLastError () == ERROR_NOT_LOCKED)
res = 1;
OVERLAPPED ov;
ov.Internal = 0;
ov.InternalHigh = 0;
ov.Offset = off_low;
ov.OffsetHigh = off_high;
ov.hEvent = (HANDLE) 0;
if (fl->l_type == F_UNLCK)
{
res = UnlockFileEx (get_handle (), 0, len_low, len_high, &ov);
if (res == 0 && GetLastError () == ERROR_NOT_LOCKED)
res = 1;
}
else
{
res = LockFileEx (get_handle (), lock_flags, 0,
len_low, len_high, &ov);
/* Deal with the fail immediately case. */
/*
* FIXME !! I think this is the right error to check for
* but I must admit I haven't checked....
*/
if ((res == 0) && (lock_flags & LOCKFILE_FAIL_IMMEDIATELY) &&
(GetLastError () == ERROR_LOCK_FAILED))
{
set_errno (EAGAIN);
return -1;
}
}
} }
else else
{ {
/* Windows 95 -- use primitive lock call */ res = LockFileEx (get_handle (), lock_flags, 0,
if (fl->l_type == F_UNLCK) len_low, len_high, &ov);
res = UnlockFile (get_handle (), off_low, off_high, len_low, len_high); /* Deal with the fail immediately case. */
else /*
res = LockFile (get_handle (), off_low, off_high, len_low, len_high); * FIXME !! I think this is the right error to check for
* but I must admit I haven't checked....
*/
if ((res == 0) && (lock_flags & LOCKFILE_FAIL_IMMEDIATELY) &&
(GetLastError () == ERROR_LOCK_FAILED))
{
set_errno (EAGAIN);
return -1;
}
} }
if (res == 0) if (res == 0)

View File

@ -501,16 +501,6 @@ cygwin_getprotobynumber (int number)
bool bool
fdsock (cygheap_fdmanip& fd, const device *dev, SOCKET soc) fdsock (cygheap_fdmanip& fd, const device *dev, SOCKET soc)
{ {
/* NT systems apparently set sockets to inheritable by default */
if (!wincap.has_set_handle_information ()
&& !DuplicateHandle (hMainProc, (HANDLE) soc,
hMainProc, (HANDLE *) &soc,
0, TRUE,
DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE))
{
debug_printf ("set socket inheritance failed, %E");
return false;
}
fd = build_fh_dev (*dev); fd = build_fh_dev (*dev);
if (!fd.isopen ()) if (!fd.isopen ())
return false; return false;

View File

@ -40,46 +40,32 @@ get_page_size (int in)
static long static long
get_nproc_values (int in) get_nproc_values (int in)
{ {
NTSTATUS ret;
SYSTEM_BASIC_INFORMATION sbi;
if ((ret = NtQuerySystemInformation (SystemBasicInformation, (PVOID) &sbi,
sizeof sbi, NULL)) != STATUS_SUCCESS)
{
__seterrno_from_nt_status (ret);
debug_printf ("NtQuerySystemInformation: ret %d, Dos(ret) %E",
ret);
return -1;
}
switch (in) switch (in)
{ {
case _SC_NPROCESSORS_CONF: case _SC_NPROCESSORS_CONF:
return sbi.NumberProcessors;
case _SC_NPROCESSORS_ONLN: case _SC_NPROCESSORS_ONLN:
if (!wincap.supports_smp ()) {
return 1; int i = 0;
/*FALLTHRU*/ do
if (sbi.ActiveProcessors & 1)
i++;
while (sbi.ActiveProcessors >>= 1);
return i;
}
case _SC_PHYS_PAGES: case _SC_PHYS_PAGES:
if (wincap.supports_smp ()) return sbi.NumberOfPhysicalPages
{ / (getpagesize () / getsystempagesize ());
NTSTATUS ret;
SYSTEM_BASIC_INFORMATION sbi;
if ((ret = NtQuerySystemInformation (SystemBasicInformation,
(PVOID) &sbi,
sizeof sbi, NULL))
!= STATUS_SUCCESS)
{
__seterrno_from_nt_status (ret);
debug_printf ("NtQuerySystemInformation: ret %d, Dos(ret) %E",
ret);
return -1;
}
switch (in)
{
case _SC_NPROCESSORS_CONF:
return sbi.NumberProcessors;
case _SC_NPROCESSORS_ONLN:
{
int i = 0;
do
if (sbi.ActiveProcessors & 1)
i++;
while (sbi.ActiveProcessors >>= 1);
return i;
}
case _SC_PHYS_PAGES:
return sbi.NumberOfPhysicalPages
/ (getpagesize () / getsystempagesize ());
}
}
} }
return -1; return -1;
} }
@ -87,23 +73,18 @@ get_nproc_values (int in)
static long static long
get_avphys (int in) get_avphys (int in)
{ {
if (wincap.supports_smp ()) NTSTATUS ret;
SYSTEM_PERFORMANCE_INFORMATION spi;
if ((ret = NtQuerySystemInformation (SystemPerformanceInformation,
(PVOID) &spi, sizeof spi, NULL))
!= STATUS_SUCCESS)
{ {
NTSTATUS ret; __seterrno_from_nt_status (ret);
SYSTEM_PERFORMANCE_INFORMATION spi; debug_printf ("NtQuerySystemInformation: ret %d, Dos(ret) %E",
if ((ret = NtQuerySystemInformation (SystemPerformanceInformation, ret);
(PVOID) &spi, return -1;
sizeof spi, NULL))
!= STATUS_SUCCESS)
{
__seterrno_from_nt_status (ret);
debug_printf ("NtQuerySystemInformation: ret %d, Dos(ret) %E",
ret);
return -1;
}
return spi.AvailablePages / (getpagesize () / getsystempagesize ());
} }
return -1; return spi.AvailablePages / (getpagesize () / getsystempagesize ());
} }
enum sc_type { nsup, cons, func }; enum sc_type { nsup, cons, func };

View File

@ -1,7 +1,7 @@
/* syslog.cc /* syslog.cc
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2006 Red Hat, Inc. 2006, 2007 Red Hat, Inc.
This file is part of Cygwin. This file is part of Cygwin.
@ -28,22 +28,8 @@ details. */
#include "thread.h" #include "thread.h"
#include "cygtls.h" #include "cygtls.h"
/* FIXME: These should probably be in the registry. */
/* FIXME: The Win95 path should be whatever slash is */
#define WIN95_EVENT_LOG_PATH "C:\\CYGWIN_SYSLOG.TXT"
#define CYGWIN_LOG_NAME "Cygwin" #define CYGWIN_LOG_NAME "Cygwin"
/*
* Utility function to help enable moving
* WIN95_EVENT_LOG_PATH into registry later.
*/
static const char *
get_win95_event_log_path ()
{
return WIN95_EVENT_LOG_PATH;
}
/* openlog: save the passed args. Don't open the /* openlog: save the passed args. Don't open the
system log (NT) or log file (95) yet. */ system log (NT) or log file (95) yet. */
extern "C" void extern "C" void
@ -286,212 +272,137 @@ try_connect_syslogd (int priority, const char *msg, int len)
extern "C" void extern "C" void
vsyslog (int priority, const char *message, va_list ap) vsyslog (int priority, const char *message, va_list ap)
{ {
debug_printf ("%x %s", priority, message); debug_printf ("%x %s", priority, message);
/* If the priority fails the current mask, reject */ /* If the priority fails the current mask, reject */
if ((LOG_MASK (LOG_PRI (priority)) & _my_tls.locals.process_logmask) == 0) if ((LOG_MASK (LOG_PRI (priority)) & _my_tls.locals.process_logmask) == 0)
{
debug_printf ("failing message %x due to priority mask %x",
priority, _my_tls.locals.process_logmask);
return;
}
/* Add default facility if not in the given priority. */
if (!(priority & LOG_FACMASK))
priority |= _my_tls.locals.process_facility;
/* Translate %m in the message to error text */
char *errtext = strerror (get_errno ());
int errlen = strlen (errtext);
int numfound = 0;
for (const char *cp = message; *cp; cp++)
if (*cp == '%' && cp[1] == 'm')
numfound++;
char *newmessage = (char *) alloca (strlen (message) +
(errlen * numfound) + 1);
if (newmessage == NULL)
{
debug_printf ("failed to allocate newmessage");
return;
}
char *dst = newmessage;
for (const char *cp2 = message; *cp2; cp2++)
if (*cp2 == '%' && cp2[1] == 'm')
{ {
debug_printf ("failing message %x due to priority mask %x", cp2++;
priority, _my_tls.locals.process_logmask); strcpy (dst, errtext);
return; while (*dst)
} dst++;
/* Add default facility if not in the given priority. */
if (!(priority & LOG_FACMASK))
priority |= _my_tls.locals.process_facility;
/* Translate %m in the message to error text */
char *errtext = strerror (get_errno ());
int errlen = strlen (errtext);
int numfound = 0;
for (const char *cp = message; *cp; cp++)
if (*cp == '%' && cp[1] == 'm')
numfound++;
char *newmessage = (char *) alloca (strlen (message) +
(errlen * numfound) + 1);
if (newmessage == NULL)
{
debug_printf ("failed to allocate newmessage");
return;
}
char *dst = newmessage;
for (const char *cp2 = message; *cp2; cp2++)
if (*cp2 == '%' && cp2[1] == 'm')
{
cp2++;
strcpy (dst, errtext);
while (*dst)
dst++;
}
else
*dst++ = *cp2;
*dst = '\0';
message = newmessage;
/* Work out the priority type - we ignore the facility for now.. */
WORD eventType;
switch (LOG_PRI (priority))
{
case LOG_EMERG:
case LOG_ALERT:
case LOG_CRIT:
case LOG_ERR:
eventType = EVENTLOG_ERROR_TYPE;
break;
case LOG_WARNING:
eventType = EVENTLOG_WARNING_TYPE;
break;
case LOG_NOTICE:
case LOG_INFO:
case LOG_DEBUG:
eventType = EVENTLOG_INFORMATION_TYPE;
break;
default:
eventType = EVENTLOG_ERROR_TYPE;
break;
}
/* We need to know how long the buffer needs to be.
The only legal way I can see of doing this is to
do a vfprintf to /dev/null, and count the bytes
output, then do it again to a malloc'ed string. This
is ugly, slow, but prevents core dumps :-).
*/
pass_handler pass;
for (int pass_number = 0; pass_number < 2; ++pass_number)
{
int n = pass.initialize (pass_number);
if (n == -1)
return;
else if (n > 0)
pass.set_message ((char *) alloca (n));
/* Deal with ident_string */
if (_my_tls.locals.process_ident != NULL)
{
if (pass.print ("%s: ", _my_tls.locals.process_ident) == -1)
return;
}
if (_my_tls.locals.process_logopt & LOG_PID)
{
if (pass.print ("PID %u: ", getpid ()) == -1)
return;
}
if (!wincap.has_eventlog ())
{
/* Add a priority string - not needed for systems with
eventlog capability. */
switch (LOG_PRI (priority))
{
case LOG_EMERG:
pass.print ("%s: ", "LOG_EMERG");
break;
case LOG_ALERT:
pass.print ("%s: ", "LOG_ALERT");
break;
case LOG_CRIT:
pass.print ("%s: ", "LOG_CRIT");
break;
case LOG_ERR:
pass.print ("%s: ", "LOG_ERR");
break;
case LOG_WARNING:
pass.print ("%s: ", "LOG_WARNING");
break;
case LOG_NOTICE:
pass.print ("%s: ", "LOG_NOTICE");
break;
case LOG_INFO:
pass.print ("%s: ", "LOG_INFO");
break;
case LOG_DEBUG:
pass.print ("%s: ", "LOG_DEBUG");
break;
default:
pass.print ("%s: ", "LOG_ERR");
break;
}
}
/* Print out the variable part */
if (pass.print_va (message, ap) == -1)
return;
}
const char *msg_strings[1];
char *total_msg = pass.get_message ();
int len = strlen (total_msg);
if (len != 0 && (total_msg[len - 1] == '\n'))
total_msg[--len] = '\0';
msg_strings[0] = total_msg;
if (_my_tls.locals.process_logopt & LOG_PERROR)
{
write (STDERR_FILENO, total_msg, len);
write (STDERR_FILENO, "\n", 1);
}
int fd;
if ((fd = try_connect_syslogd (priority, total_msg, len + 1)) >= 0)
;
else if (wincap.has_eventlog ())
{
/* For NT, open the event log and send the message */
HANDLE hEventSrc = RegisterEventSourceA (NULL, (_my_tls.locals.process_ident != NULL) ?
_my_tls.locals.process_ident : CYGWIN_LOG_NAME);
if (hEventSrc == NULL)
{
debug_printf ("RegisterEventSourceA failed with %E");
return;
}
if (!ReportEventA (hEventSrc, eventType, 0, 0,
cygheap->user.sid (), 1, 0, msg_strings, NULL))
debug_printf ("ReportEventA failed with %E");
DeregisterEventSource (hEventSrc);
} }
else else
{ *dst++ = *cp2;
/* Under Windows 95, append the message to the log file */
char timestamp[24];
time_t ctime;
FILE *fp = fopen (get_win95_event_log_path (), "a");
if (fp == NULL)
{
debug_printf ("failed to open file %s",
get_win95_event_log_path ());
return;
}
strftime (timestamp, sizeof timestamp, "%Y-%m-%d %H:%M:%S : ",
localtime (&(ctime = time (NULL))));
/* Now to prevent several syslog messages from being *dst = '\0';
interleaved, we must lock the first byte of the file message = newmessage;
This works on Win32 even if we created the file above.
*/ /* Work out the priority type - we ignore the facility for now.. */
HANDLE fHandle = cygheap->fdtab[fileno (fp)]->get_handle (); WORD eventType;
for (int i = 0;; i++) switch (LOG_PRI (priority))
if (LockFile (fHandle, 0, 0, 1, 0) == FALSE) {
if (i == 3) case LOG_EMERG:
{ case LOG_ALERT:
debug_printf ("failed to lock file %s", get_win95_event_log_path ()); case LOG_CRIT:
fclose (fp); case LOG_ERR:
return; eventType = EVENTLOG_ERROR_TYPE;
} break;
else case LOG_WARNING:
usleep (1000); eventType = EVENTLOG_WARNING_TYPE;
else break;
break; case LOG_NOTICE:
fputs (timestamp, fp); case LOG_INFO:
fputs (msg_strings[0], fp); case LOG_DEBUG:
fputc ('\n', fp); eventType = EVENTLOG_INFORMATION_TYPE;
fclose (fp); break;
} default:
eventType = EVENTLOG_ERROR_TYPE;
break;
}
/* We need to know how long the buffer needs to be.
The only legal way I can see of doing this is to
do a vfprintf to /dev/null, and count the bytes
output, then do it again to a malloc'ed string. This
is ugly, slow, but prevents core dumps :-).
*/
pass_handler pass;
for (int pass_number = 0; pass_number < 2; ++pass_number)
{
int n = pass.initialize (pass_number);
if (n == -1)
return;
else if (n > 0)
pass.set_message ((char *) alloca (n));
/* Deal with ident_string */
if (_my_tls.locals.process_ident != NULL)
{
if (pass.print ("%s: ", _my_tls.locals.process_ident) == -1)
return;
}
if (_my_tls.locals.process_logopt & LOG_PID)
{
if (pass.print ("PID %u: ", getpid ()) == -1)
return;
}
/* Print out the variable part */
if (pass.print_va (message, ap) == -1)
return;
}
const char *msg_strings[1];
char *total_msg = pass.get_message ();
int len = strlen (total_msg);
if (len != 0 && (total_msg[len - 1] == '\n'))
total_msg[--len] = '\0';
msg_strings[0] = total_msg;
if (_my_tls.locals.process_logopt & LOG_PERROR)
{
write (STDERR_FILENO, total_msg, len);
write (STDERR_FILENO, "\n", 1);
}
int fd;
if ((fd = try_connect_syslogd (priority, total_msg, len + 1)) < 0)
{
/* If syslogd isn't present, open the event log and send the message */
HANDLE hEventSrc = RegisterEventSourceA (NULL, (_my_tls.locals.process_ident != NULL) ?
_my_tls.locals.process_ident : CYGWIN_LOG_NAME);
if (hEventSrc == NULL)
{
debug_printf ("RegisterEventSourceA failed with %E");
return;
}
if (!ReportEventA (hEventSrc, eventType, 0, 0,
cygheap->user.sid (), 1, 0, msg_strings, NULL))
debug_printf ("ReportEventA failed with %E");
DeregisterEventSource (hEventSrc);
}
} }
extern "C" void extern "C" void

View File

@ -1,7 +1,7 @@
/* times.cc /* times.cc
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
2005 Red Hat, Inc. 2005, 2006, 2007 Red Hat, Inc.
This file is part of Cygwin. This file is part of Cygwin.

View File

@ -19,13 +19,7 @@ static NO_COPY wincaps wincap_unknown = {
is_server:false, is_server:false,
has_security:true, has_security:true,
has_security_descriptor_control:false, has_security_descriptor_control:false,
has_lock_file_ex:true,
has_signal_object_and_wait:true,
has_eventlog:true,
has_ip_helper_lib:false, has_ip_helper_lib:false,
has_set_handle_information:true,
has_set_handle_information_on_console_handles:false,
supports_smp:true,
map_view_of_file_ex_sucks:false, map_view_of_file_ex_sucks:false,
altgr_is_ctrl_alt:true, altgr_is_ctrl_alt:true,
has_physical_mem_access:true, has_physical_mem_access:true,
@ -78,13 +72,7 @@ static NO_COPY wincaps wincap_nt4 = {
is_server:false, is_server:false,
has_security:true, has_security:true,
has_security_descriptor_control:false, has_security_descriptor_control:false,
has_lock_file_ex:true,
has_signal_object_and_wait:true,
has_eventlog:true,
has_ip_helper_lib:false, has_ip_helper_lib:false,
has_set_handle_information:true,
has_set_handle_information_on_console_handles:false,
supports_smp:true,
map_view_of_file_ex_sucks:false, map_view_of_file_ex_sucks:false,
altgr_is_ctrl_alt:true, altgr_is_ctrl_alt:true,
has_physical_mem_access:true, has_physical_mem_access:true,
@ -137,13 +125,7 @@ static NO_COPY wincaps wincap_nt4sp4 = {
is_server:false, is_server:false,
has_security:true, has_security:true,
has_security_descriptor_control:false, has_security_descriptor_control:false,
has_lock_file_ex:true,
has_signal_object_and_wait:true,
has_eventlog:true,
has_ip_helper_lib:true, has_ip_helper_lib:true,
has_set_handle_information:true,
has_set_handle_information_on_console_handles:false,
supports_smp:true,
map_view_of_file_ex_sucks:false, map_view_of_file_ex_sucks:false,
altgr_is_ctrl_alt:true, altgr_is_ctrl_alt:true,
has_physical_mem_access:true, has_physical_mem_access:true,
@ -196,13 +178,7 @@ static NO_COPY wincaps wincap_2000 = {
is_server:false, is_server:false,
has_security:true, has_security:true,
has_security_descriptor_control:true, has_security_descriptor_control:true,
has_lock_file_ex:true,
has_signal_object_and_wait:true,
has_eventlog:true,
has_ip_helper_lib:true, has_ip_helper_lib:true,
has_set_handle_information:true,
has_set_handle_information_on_console_handles:true,
supports_smp:true,
map_view_of_file_ex_sucks:false, map_view_of_file_ex_sucks:false,
altgr_is_ctrl_alt:true, altgr_is_ctrl_alt:true,
has_physical_mem_access:true, has_physical_mem_access:true,
@ -255,13 +231,7 @@ static NO_COPY wincaps wincap_xp = {
is_server:false, is_server:false,
has_security:true, has_security:true,
has_security_descriptor_control:true, has_security_descriptor_control:true,
has_lock_file_ex:true,
has_signal_object_and_wait:true,
has_eventlog:true,
has_ip_helper_lib:true, has_ip_helper_lib:true,
has_set_handle_information:true,
has_set_handle_information_on_console_handles:true,
supports_smp:true,
map_view_of_file_ex_sucks:false, map_view_of_file_ex_sucks:false,
altgr_is_ctrl_alt:true, altgr_is_ctrl_alt:true,
has_physical_mem_access:true, has_physical_mem_access:true,
@ -314,13 +284,7 @@ static NO_COPY wincaps wincap_2003 = {
is_server:true, is_server:true,
has_security:true, has_security:true,
has_security_descriptor_control:true, has_security_descriptor_control:true,
has_lock_file_ex:true,
has_signal_object_and_wait:true,
has_eventlog:true,
has_ip_helper_lib:true, has_ip_helper_lib:true,
has_set_handle_information:true,
has_set_handle_information_on_console_handles:true,
supports_smp:true,
map_view_of_file_ex_sucks:false, map_view_of_file_ex_sucks:false,
altgr_is_ctrl_alt:true, altgr_is_ctrl_alt:true,
has_physical_mem_access:false, has_physical_mem_access:false,
@ -373,13 +337,7 @@ static NO_COPY wincaps wincap_vista = {
is_server:false, is_server:false,
has_security:true, has_security:true,
has_security_descriptor_control:true, has_security_descriptor_control:true,
has_lock_file_ex:true,
has_signal_object_and_wait:true,
has_eventlog:true,
has_ip_helper_lib:true, has_ip_helper_lib:true,
has_set_handle_information:true,
has_set_handle_information_on_console_handles:true,
supports_smp:true,
map_view_of_file_ex_sucks:false, map_view_of_file_ex_sucks:false,
altgr_is_ctrl_alt:true, altgr_is_ctrl_alt:true,
has_physical_mem_access:false, has_physical_mem_access:false,

View File

@ -19,13 +19,7 @@ struct wincaps
unsigned is_server : 1; unsigned is_server : 1;
unsigned has_security : 1; unsigned has_security : 1;
unsigned has_security_descriptor_control : 1; unsigned has_security_descriptor_control : 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_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 map_view_of_file_ex_sucks : 1;
unsigned altgr_is_ctrl_alt : 1; unsigned altgr_is_ctrl_alt : 1;
unsigned has_physical_mem_access : 1; unsigned has_physical_mem_access : 1;
@ -94,13 +88,7 @@ public:
bool IMPLEMENT (is_server) bool IMPLEMENT (is_server)
bool IMPLEMENT (has_security) bool IMPLEMENT (has_security)
bool IMPLEMENT (has_security_descriptor_control) bool IMPLEMENT (has_security_descriptor_control)
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_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 (map_view_of_file_ex_sucks)
bool IMPLEMENT (altgr_is_ctrl_alt) bool IMPLEMENT (altgr_is_ctrl_alt)
bool IMPLEMENT (has_physical_mem_access) bool IMPLEMENT (has_physical_mem_access)