* autoload.cc (WSACloseEvent): Remove.
(WSACreateEvent): Remove.
* cygheap.cc (cygheap_init): Drop initializing shared_prefix.
* cygheap.h (struct init_cygheap): Drop shared_prefix and
shared_prefix_buf members.
* fhandler_socket.cc (sock_shared_name): New static function.
(search_wsa_event_slot): Convert name buffers to WCHAR. Call
NtCreateMutant/NtOpenMutant to create mutexes in session local
namespace.
(fhandler_socket::init_events): Ditto. Fix debug output.
(fhandler_socket::release_events): Close mutexes using NtClose.
(fhandler_socket::dup): Ditto.
* kernel32.cc: New file, implementing Win32 calls in a Cygwin-specific
way.
* mmap.cc (MapView): Make static.
* ntdll.h: Fix status code sorting.
(STATUS_OBJECT_NAME_EXISTS): Define.
(SEMAPHORE_QUERY_STATE): Define.
(CYG_SHARED_DIR_ACCESS): Define.
(CYG_MUTANT_ACCESS): Define.
(CYG_EVENT_ACCESS): Define.
(CYG_SEMAPHORE_ACCESS): Define.
(enum _PROCESSINFOCLASS): Define ProcessSessionInformation.
(struct _PROCESS_SESSION_INFORMATION): Define.
(NtCreateSemaphore): Declare.
(NtOpenSemaphore): Declare.
* flock.cc: Use CYG_xxx_ACCESS access masks where appropriate.
* posix_ipc.cc (ipc_mutex_init): Use native functions to create mutex.
Create in cygwin-shared subdir.
(ipc_cond_init): Ditto for event.
(ipc_mutex_close): Use NtClose.
(ipc_cond_close): Ditto.
(mq_open): Drop "cyg" prefix from mqh_uname.
* shared.cc (CYG_SHARED_DIR_ACCESS): Drop definition here.
(_cygwin_testing): Declare extern on file level.
(get_shared_parent_dir): Change name of shared directory. Add name
to api_fatal output.
(get_session_parent_dir): New function.
(shared_name): Simplify.
(shared_info::initialize): Call get_session_parent_dir.
* shared_info.h (get_session_parent_dir): Declare.
* smallprint.cc (__small_vswprintf): Fix bug in multibyte string
conversion.
* thread.cc (semaphore::semaphore): Align semaphore name to object
names in posix IPC functions.
* include/cygwin/version.h (CYGWIN_VERSION_SHARED_DATA): Bump.
+2008-04-20 Corinna Vinschen <corinna@vinschen.de>
+
+ * Makefile.in (DLL_OFILES): Add kernel32.o.
+ * autoload.cc (WSACloseEvent): Remove.
+ (WSACreateEvent): Remove.
+ * cygheap.cc (cygheap_init): Drop initializing shared_prefix.
+ * cygheap.h (struct init_cygheap): Drop shared_prefix and
+ shared_prefix_buf members.
+ * fhandler_socket.cc (sock_shared_name): New static function.
+ (search_wsa_event_slot): Convert name buffers to WCHAR. Call
+ NtCreateMutant/NtOpenMutant to create mutexes in session local
+ namespace.
+ (fhandler_socket::init_events): Ditto. Fix debug output.
+ (fhandler_socket::release_events): Close mutexes using NtClose.
+ (fhandler_socket::dup): Ditto.
+ * kernel32.cc: New file, implementing Win32 calls in a Cygwin-specific
+ way.
+ * mmap.cc (MapView): Make static.
+ * ntdll.h: Fix status code sorting.
+ (STATUS_OBJECT_NAME_EXISTS): Define.
+ (SEMAPHORE_QUERY_STATE): Define.
+ (CYG_SHARED_DIR_ACCESS): Define.
+ (CYG_MUTANT_ACCESS): Define.
+ (CYG_EVENT_ACCESS): Define.
+ (CYG_SEMAPHORE_ACCESS): Define.
+ (enum _PROCESSINFOCLASS): Define ProcessSessionInformation.
+ (struct _PROCESS_SESSION_INFORMATION): Define.
+ (NtCreateSemaphore): Declare.
+ (NtOpenSemaphore): Declare.
+ * flock.cc: Use CYG_xxx_ACCESS access masks where appropriate.
+ * posix_ipc.cc (ipc_mutex_init): Use native functions to create mutex.
+ Create in cygwin-shared subdir.
+ (ipc_cond_init): Ditto for event.
+ (ipc_mutex_close): Use NtClose.
+ (ipc_cond_close): Ditto.
+ (mq_open): Drop "cyg" prefix from mqh_uname.
+ * shared.cc (CYG_SHARED_DIR_ACCESS): Drop definition here.
+ (_cygwin_testing): Declare extern on file level.
+ (get_shared_parent_dir): Change name of shared directory. Add name
+ to api_fatal output.
+ (get_session_parent_dir): New function.
+ (shared_name): Simplify.
+ (shared_info::initialize): Call get_session_parent_dir.
+ * shared_info.h (get_session_parent_dir): Declare.
+ * smallprint.cc (__small_vswprintf): Fix bug in multibyte string
+ conversion.
+ * thread.cc (semaphore::semaphore): Align semaphore name to object
+ names in posix IPC functions.
+ * include/cygwin/version.h (CYGWIN_VERSION_SHARED_DATA): Bump.
+
2008-04-18 Corinna Vinschen <corinna@vinschen.de>
Revert thinko in previous patch.
fhandler_termios.o fhandler_tty.o fhandler_virtual.o fhandler_windows.o \
fhandler_zero.o flock.o fnmatch.o fork.o fts.o ftw.o getopt.o glob.o \
grp.o heap.o hookapi.o inet_addr.o inet_network.o init.o ioctl.o ipc.o \
- localtime.o lsearch.o malloc_wrapper.o minires-os-if.o minires.o \
- miscfuncs.o mktemp.o mmap.o msg.o mount.o net.o netdb.o nftw.o ntea.o \
- passwd.o path.o pinfo.o pipe.o poll.o posix_ipc.o pthread.o random.o \
- regcomp.o regerror.o regexec.o regfree.o registry.o resource.o rexec.o \
- rcmd.o scandir.o sched.o sec_acl.o sec_auth.o sec_helper.o security.o \
- select.o sem.o shared.o shm.o sigfe.o signal.o sigproc.o smallprint.o \
- spawn.o strace.o strfuncs.o strptime.o strsep.o strsig.o sync.o \
- syscalls.o sysconf.o syslog.o termios.o thread.o timelocal.o timer.o \
- times.o tls_pbuf.o tty.o uinfo.o uname.o v8_regexp.o v8_regerror.o \
- v8_regsub.o wait.o wincap.o window.o winf.o xsique.o \
+ kernel32.o localtime.o lsearch.o malloc_wrapper.o minires-os-if.o \
+ minires.o miscfuncs.o mktemp.o mmap.o msg.o mount.o net.o netdb.o \
+ nftw.o ntea.o passwd.o path.o pinfo.o pipe.o poll.o posix_ipc.o \
+ pthread.o random.o regcomp.o regerror.o regexec.o regfree.o registry.o \
+ resource.o rexec.o rcmd.o scandir.o sched.o sec_acl.o sec_auth.o \
+ sec_helper.o security.o select.o sem.o shared.o shm.o sigfe.o signal.o \
+ sigproc.o smallprint.o spawn.o strace.o strfuncs.o strptime.o strsep.o \
+ strsig.o sync.o syscalls.o sysconf.o syslog.o termios.o thread.o \
+ timelocal.o timer.o times.o tls_pbuf.o tty.o uinfo.o uname.o \
+ v8_regexp.o v8_regerror.o v8_regsub.o wait.o wincap.o window.o winf.o \
+ xsique.o \
$(EXTRA_DLL_OFILES) $(EXTRA_OFILES) $(MALLOC_OFILES) $(MT_SAFE_OBJECTS)
GMON_OFILES:=gmon.o mcount.o profil.o
LoadDLLfunc (shutdown, 8, ws2_32)
LoadDLLfunc (socket, 12, ws2_32)
LoadDLLfunc (WSAAsyncSelect, 16, ws2_32)
-LoadDLLfunc (WSACloseEvent, 4, ws2_32)
-LoadDLLfunc (WSACreateEvent, 0, ws2_32)
LoadDLLfunc (WSAEnumNetworkEvents, 12, ws2_32)
LoadDLLfunc (WSAEventSelect, 12, ws2_32)
LoadDLLfunc (WSAGetLastError, 0, ws2_32)
cygheap->fdtab.init ();
if (!cygheap->sigs)
sigalloc ();
-
- /* Should this ever change, keep in mind that shared_prefix_buf is exactly
- 8 bytes long, just enough to match the size of the "Global\\" string. */
- if (!cygheap->shared_prefix)
- strcpy (cygheap->shared_prefix = cygheap->shared_prefix_buf,
- wincap.has_terminal_services () ? "Global\\" : "");
}
/* Copyright (C) 1997, 2000 DJ Delorie */
HANDLE console_h;
cwdstuff cwd;
dtable fdtab;
- char *shared_prefix;
- char shared_prefix_buf[8];
#ifdef DEBUGGING
cygheap_debug debug;
#endif
static HANDLE wsa_slot_mtx;
+static PWCHAR
+sock_shared_name (PWCHAR buf, LONG num)
+{
+ __small_swprintf (buf, L"socket.%d", num);
+ return buf;
+}
+
static wsa_event *
search_wsa_event_slot (LONG new_serial_number)
{
- char name[MAX_PATH], searchname[MAX_PATH];
+ WCHAR name[32], searchname[32];
+ UNICODE_STRING uname;
+ OBJECT_ATTRIBUTES attr;
+ NTSTATUS status;
if (!wsa_slot_mtx)
{
- wsa_slot_mtx = CreateMutex (&sec_all, FALSE,
- shared_name (name, "sock", 0));
- if (!wsa_slot_mtx)
- api_fatal ("Couldn't create/open shared socket mutex, %E");
+ RtlInitUnicodeString (&uname, sock_shared_name (name, 0));
+ InitializeObjectAttributes (&attr, &uname, OBJ_INHERIT | OBJ_OPENIF,
+ get_session_parent_dir (),
+ everyone_sd (CYG_MUTANT_ACCESS));
+ status = NtCreateMutant (&wsa_slot_mtx, CYG_MUTANT_ACCESS, &attr, FALSE);
+ if (!NT_SUCCESS (status))
+ api_fatal ("Couldn't create/open shared socket mutex %S, %p",
+ &uname, status);
}
switch (WaitForSingleObject (wsa_slot_mtx, INFINITE))
{
unsigned int slot = new_serial_number % NUM_SOCKS;
while (wsa_events[slot].serial_number)
{
- HANDLE searchmtx = OpenMutex (STANDARD_RIGHTS_READ, FALSE,
- shared_name (searchname, "sock", wsa_events[slot].serial_number));
- if (!searchmtx)
+ HANDLE searchmtx;
+ RtlInitUnicodeString (&uname, sock_shared_name (searchname,
+ wsa_events[slot].serial_number));
+ InitializeObjectAttributes (&attr, &uname, 0, get_session_parent_dir (),
+ NULL);
+ status = NtOpenMutant (&searchmtx, READ_CONTROL, &attr);
+ if (!NT_SUCCESS (status))
break;
/* Mutex still exists, attached socket is active, try next slot. */
- CloseHandle (searchmtx);
+ NtClose (searchmtx);
slot = (slot + 1) % NUM_SOCKS;
if (slot == (new_serial_number % NUM_SOCKS))
{
fhandler_socket::init_events ()
{
LONG new_serial_number;
- char name[MAX_PATH];
- DWORD err = 0;
+ WCHAR name[32];
+ UNICODE_STRING uname;
+ OBJECT_ATTRIBUTES attr;
+ NTSTATUS status;
do
{
InterlockedIncrement (&socket_serial_number);
if (!new_serial_number) /* 0 is reserved for global mutex */
InterlockedIncrement (&socket_serial_number);
- wsock_mtx = CreateMutex (&sec_all, FALSE,
- shared_name (name, "sock", new_serial_number));
- if (!wsock_mtx)
+ RtlInitUnicodeString (&uname, sock_shared_name (name, new_serial_number));
+ InitializeObjectAttributes (&attr, &uname, OBJ_INHERIT | OBJ_OPENIF,
+ get_session_parent_dir (),
+ everyone_sd (CYG_MUTANT_ACCESS));
+ status = NtCreateMutant (&wsock_mtx, CYG_MUTANT_ACCESS, &attr, FALSE);
+ if (!NT_SUCCESS (status))
{
- debug_printf ("CreateMutex, %E");
+ debug_printf ("NtCreateMutant(%S), %p", &uname, status);
set_errno (ENOBUFS);
return false;
}
- err = GetLastError ();
- if (err == ERROR_ALREADY_EXISTS)
- CloseHandle (wsock_mtx);
+ if (status == STATUS_OBJECT_NAME_EXISTS)
+ NtClose (wsock_mtx);
}
- while (err == ERROR_ALREADY_EXISTS);
+ while (status == STATUS_OBJECT_NAME_EXISTS);
if ((wsock_evt = CreateEvent (&sec_all, TRUE, FALSE, NULL))
== WSA_INVALID_EVENT)
{
- debug_printf ("WSACreateEvent, %E");
+ debug_printf ("CreateEvent, %E");
set_errno (ENOBUFS);
- CloseHandle (wsock_mtx);
+ NtClose (wsock_mtx);
return false;
}
if (WSAEventSelect (get_socket (), wsock_evt, EVENT_MASK) == SOCKET_ERROR)
{
debug_printf ("WSAEventSelect, %E");
set_winsock_errno ();
- CloseHandle (wsock_evt);
- CloseHandle (wsock_mtx);
+ NtClose (wsock_evt);
+ NtClose (wsock_mtx);
return false;
}
wsock_events = search_wsa_event_slot (new_serial_number);
void
fhandler_socket::release_events ()
{
- CloseHandle (wsock_evt);
- CloseHandle (wsock_mtx);
+ NtClose (wsock_evt);
+ NtClose (wsock_mtx);
}
void
TRUE, DUPLICATE_SAME_ACCESS))
{
__seterrno ();
- CloseHandle (fhs->wsock_mtx);
+ NtClose (fhs->wsock_mtx);
return -1;
}
fhs->wsock_events = wsock_events;
int ret = fhandler_base::dup (child);
if (ret)
{
- CloseHandle (fhs->wsock_evt);
- CloseHandle (fhs->wsock_mtx);
+ NtClose (fhs->wsock_evt);
+ NtClose (fhs->wsock_mtx);
}
return ret;
}
| DIRECTORY_CREATE_OBJECT \
| READ_CONTROL)
-#define FLOCK_MUTANT_ACCESS (MUTANT_QUERY_STATE \
- | SYNCHRONIZE \
- | READ_CONTROL)
-
#define FLOCK_EVENT_ACCESS (EVENT_QUERY_STATE \
| SYNCHRONIZE \
| READ_CONTROL)
access synchronization on the dir and its objects. */
RtlInitUnicodeString (&uname, L"mtx");
InitializeObjectAttributes (&attr, &uname, OBJ_INHERIT | OBJ_OPENIF, i_dir,
- everyone_sd (FLOCK_MUTANT_ACCESS));
- status = NtCreateMutant (&i_mtx, FLOCK_MUTANT_ACCESS, &attr, FALSE);
+ everyone_sd (CYG_MUTANT_ACCESS));
+ status = NtCreateMutant (&i_mtx, CYG_MUTANT_ACCESS, &attr, FALSE);
if (!NT_SUCCESS (status))
api_fatal ("NtCreateMutant(inode): %p", status);
}
LOCK_OBJ_NAME_LEN * sizeof (WCHAR));
InitializeObjectAttributes (&attr, &uname, OBJ_INHERIT, lf_inode->i_dir,
everyone_sd (FLOCK_EVENT_ACCESS));
- status = NtCreateEvent (&lf_obj, EVENT_ALL_ACCESS, &attr,
+ status = NtCreateEvent (&lf_obj, CYG_EVENT_ACCESS, &attr,
NotificationEvent, FALSE);
if (!NT_SUCCESS (status))
api_fatal ("NtCreateEvent(lock): %p", status);
Bump to 4 since this hasn't been rigorously updated in a
while. */
-#define CYGWIN_VERSION_SHARED_DATA 4
+#define CYGWIN_VERSION_SHARED_DATA 5
/* An identifier used in the names used to create shared objects.
The full names include the CYGWIN_VERSION_SHARED_DATA version
--- /dev/null
+/* kernel32.cc: Win32 replacement functions.
+
+ Copyright 2008 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 "shared_info.h"
+#include "ntdll.h"
+
+/* Implement CreateEvent/OpenEvent so that named objects are always created in
+ Cygwin shared object namespace. */
+
+HANDLE WINAPI
+CreateEventW (LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset,
+ BOOL bInitialState, LPCWSTR lpName)
+{
+ HANDLE evt;
+ UNICODE_STRING uname;
+ OBJECT_ATTRIBUTES attr;
+ NTSTATUS status;
+ ULONG flags = 0;
+
+ if (lpEventAttributes && lpEventAttributes->bInheritHandle)
+ flags |= OBJ_INHERIT;
+ if (lpName)
+ {
+ RtlInitUnicodeString (&uname, lpName);
+ flags |= OBJ_OPENIF | OBJ_CASE_INSENSITIVE;
+ }
+ InitializeObjectAttributes (&attr, lpName ? &uname : NULL, flags,
+ lpName ? get_shared_parent_dir () : NULL,
+ lpEventAttributes
+ ? lpEventAttributes->lpSecurityDescriptor : NULL);
+ status = NtCreateEvent (&evt, CYG_EVENT_ACCESS, &attr,
+ bManualReset ? NotificationEvent
+ : SynchronizationEvent,
+ bInitialState);
+ if (!NT_SUCCESS (status))
+ {
+ SetLastError (RtlNtStatusToDosError (status));
+ return NULL;
+ }
+ SetLastError (status == STATUS_OBJECT_NAME_EXISTS
+ ? ERROR_ALREADY_EXISTS : ERROR_SUCCESS);
+ return evt;
+}
+
+HANDLE WINAPI
+CreateEventA (LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset,
+ BOOL bInitialState, LPCSTR lpName)
+{
+ WCHAR name[MAX_PATH];
+
+ if (lpName && !sys_mbstowcs (name, MAX_PATH, lpName))
+ {
+ SetLastError (ERROR_FILENAME_EXCED_RANGE);
+ return NULL;
+ }
+ return CreateEventW (lpEventAttributes, bManualReset, bInitialState,
+ lpName ? name : NULL);
+}
+
+HANDLE WINAPI
+OpenEventW (DWORD dwDesiredAccess, BOOL bInheritHandle, LPCWSTR lpName)
+{
+ HANDLE evt;
+ UNICODE_STRING uname;
+ OBJECT_ATTRIBUTES attr;
+ NTSTATUS status;
+ ULONG flags = 0;
+
+ if (bInheritHandle)
+ flags |= OBJ_INHERIT;
+ if (lpName)
+ {
+ RtlInitUnicodeString (&uname, lpName);
+ flags |= OBJ_CASE_INSENSITIVE;
+ }
+ InitializeObjectAttributes (&attr, lpName ? &uname : NULL, flags,
+ lpName ? get_shared_parent_dir () : NULL,
+ NULL);
+ status = NtOpenEvent (&evt, dwDesiredAccess, &attr);
+ if (!NT_SUCCESS (status))
+ {
+ SetLastError (RtlNtStatusToDosError (status));
+ return NULL;
+ }
+ return evt;
+}
+
+HANDLE WINAPI
+OpenEventA (DWORD dwDesiredAccess, BOOL bInheritHandle, LPCSTR lpName)
+{
+ WCHAR name[MAX_PATH];
+
+ if (lpName && !sys_mbstowcs (name, MAX_PATH, lpName))
+ {
+ SetLastError (ERROR_FILENAME_EXCED_RANGE);
+ return NULL;
+ }
+ return OpenEventW (dwDesiredAccess, bInheritHandle, lpName ? name : NULL);
+}
+
+/* Implement CreateMutex/OpenMutex so that named objects are always created in
+ Cygwin shared object namespace. */
+
+HANDLE WINAPI
+CreateMutexW (LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner,
+ LPCWSTR lpName)
+{
+ HANDLE mtx;
+ UNICODE_STRING uname;
+ OBJECT_ATTRIBUTES attr;
+ NTSTATUS status;
+ ULONG flags = 0;
+
+ if (lpMutexAttributes && lpMutexAttributes->bInheritHandle)
+ flags |= OBJ_INHERIT;
+ if (lpName)
+ {
+ RtlInitUnicodeString (&uname, lpName);
+ flags |= OBJ_OPENIF | OBJ_CASE_INSENSITIVE;
+ }
+ InitializeObjectAttributes (&attr, lpName ? &uname : NULL, flags,
+ lpName ? get_shared_parent_dir () : NULL,
+ lpMutexAttributes
+ ? lpMutexAttributes->lpSecurityDescriptor : NULL);
+ status = NtCreateMutant (&mtx, CYG_EVENT_ACCESS, &attr, bInitialOwner);
+ if (!NT_SUCCESS (status))
+ {
+ SetLastError (RtlNtStatusToDosError (status));
+ return NULL;
+ }
+ SetLastError (status == STATUS_OBJECT_NAME_EXISTS
+ ? ERROR_ALREADY_EXISTS : ERROR_SUCCESS);
+ return mtx;
+}
+
+HANDLE WINAPI
+CreateMutexA (LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner,
+ LPCSTR lpName)
+{
+ WCHAR name[MAX_PATH];
+
+ if (lpName && !sys_mbstowcs (name, MAX_PATH, lpName))
+ {
+ SetLastError (ERROR_FILENAME_EXCED_RANGE);
+ return NULL;
+ }
+ return CreateMutexW (lpMutexAttributes, bInitialOwner, lpName ? name : NULL);
+}
+
+HANDLE WINAPI
+OpenMutexW (DWORD dwDesiredAccess, BOOL bInheritHandle, LPCWSTR lpName)
+{
+ HANDLE mtx;
+ UNICODE_STRING uname;
+ OBJECT_ATTRIBUTES attr;
+ NTSTATUS status;
+ ULONG flags = 0;
+
+ if (bInheritHandle)
+ flags |= OBJ_INHERIT;
+ if (lpName)
+ {
+ RtlInitUnicodeString (&uname, lpName);
+ flags |= OBJ_CASE_INSENSITIVE;
+ }
+ InitializeObjectAttributes (&attr, lpName ? &uname : NULL, flags,
+ lpName ? get_shared_parent_dir () : NULL,
+ NULL);
+ status = NtOpenMutant (&mtx, dwDesiredAccess, &attr);
+ if (!NT_SUCCESS (status))
+ {
+ SetLastError (RtlNtStatusToDosError (status));
+ return NULL;
+ }
+ return mtx;
+}
+
+HANDLE WINAPI
+OpenMutexA (DWORD dwDesiredAccess, BOOL bInheritHandle, LPCSTR lpName)
+{
+ WCHAR name[MAX_PATH];
+
+ if (lpName && !sys_mbstowcs (name, MAX_PATH, lpName))
+ {
+ SetLastError (ERROR_FILENAME_EXCED_RANGE);
+ return NULL;
+ }
+ return OpenMutexW (dwDesiredAccess, bInheritHandle, lpName ? name : NULL);
+}
+
+/* Implement CreateSemaphore/OpenSemaphore so that named objects are always
+ created in Cygwin shared object namespace. */
+
+HANDLE WINAPI
+CreateSemaphoreW (LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
+ LONG lInitialCount, LONG lMaximumCount, LPCWSTR lpName)
+{
+ HANDLE sem;
+ UNICODE_STRING uname;
+ OBJECT_ATTRIBUTES attr;
+ NTSTATUS status;
+ ULONG flags = 0;
+
+ if (lpSemaphoreAttributes && lpSemaphoreAttributes->bInheritHandle)
+ flags |= OBJ_INHERIT;
+ if (lpName)
+ {
+ RtlInitUnicodeString (&uname, lpName);
+ flags |= OBJ_OPENIF | OBJ_CASE_INSENSITIVE;
+ }
+ InitializeObjectAttributes (&attr, lpName ? &uname : NULL, flags,
+ lpName ? get_shared_parent_dir () : NULL,
+ lpSemaphoreAttributes
+ ? lpSemaphoreAttributes->lpSecurityDescriptor
+ : NULL);
+ status = NtCreateSemaphore (&sem, CYG_EVENT_ACCESS, &attr,
+ lInitialCount, lMaximumCount);
+ if (!NT_SUCCESS (status))
+ {
+ SetLastError (RtlNtStatusToDosError (status));
+ return NULL;
+ }
+ SetLastError (status == STATUS_OBJECT_NAME_EXISTS
+ ? ERROR_ALREADY_EXISTS : ERROR_SUCCESS);
+ return sem;
+}
+
+HANDLE WINAPI
+CreateSemaphoreA (LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
+ LONG lInitialCount, LONG lMaximumCount, LPCSTR lpName)
+{
+ WCHAR name[MAX_PATH];
+
+ if (lpName && !sys_mbstowcs (name, MAX_PATH, lpName))
+ {
+ SetLastError (ERROR_FILENAME_EXCED_RANGE);
+ return NULL;
+ }
+ return CreateSemaphoreW (lpSemaphoreAttributes, lInitialCount, lMaximumCount,
+ lpName ? name : NULL);
+}
+
+HANDLE WINAPI
+OpenSemaphoreW (DWORD dwDesiredAccess, BOOL bInheritHandle, LPCWSTR lpName)
+{
+ HANDLE sem;
+ UNICODE_STRING uname;
+ OBJECT_ATTRIBUTES attr;
+ NTSTATUS status;
+ ULONG flags = 0;
+
+ if (bInheritHandle)
+ flags |= OBJ_INHERIT;
+ if (lpName)
+ {
+ RtlInitUnicodeString (&uname, lpName);
+ flags |= OBJ_CASE_INSENSITIVE;
+ }
+ InitializeObjectAttributes (&attr, lpName ? &uname : NULL, flags,
+ lpName ? get_shared_parent_dir () : NULL,
+ NULL);
+ status = NtOpenSemaphore (&sem, dwDesiredAccess, &attr);
+ if (!NT_SUCCESS (status))
+ {
+ SetLastError (RtlNtStatusToDosError (status));
+ return NULL;
+ }
+ return sem;
+}
+
+HANDLE WINAPI
+OpenSemaphoreA (DWORD dwDesiredAccess, BOOL bInheritHandle, LPCSTR lpName)
+{
+ WCHAR name[MAX_PATH];
+
+ if (lpName && !sys_mbstowcs (name, MAX_PATH, lpName))
+ {
+ SetLastError (ERROR_FILENAME_EXCED_RANGE);
+ return NULL;
+ }
+ return OpenSemaphoreW (dwDesiredAccess, bInheritHandle, lpName ? name : NULL);
+}
+
+/* Implement CreateFileMapping/OpenFileMapping so that named objects are always
+ created in Cygwin shared object namespace. */
+
+HANDLE WINAPI
+CreateFileMappingW (HANDLE hFile, LPSECURITY_ATTRIBUTES lpAttributes,
+ DWORD flProtect, DWORD dwMaximumSizeHigh,
+ DWORD dwMaximumSizeLow, LPCWSTR lpName)
+{
+ HANDLE sect;
+ UNICODE_STRING uname;
+ OBJECT_ATTRIBUTES attr;
+ NTSTATUS status;
+ ULONG flags = 0;
+ ACCESS_MASK access = READ_CONTROL | SECTION_QUERY | SECTION_MAP_READ;
+ ULONG prot = flProtect & (PAGE_NOACCESS | PAGE_READONLY | PAGE_READWRITE
+ | PAGE_WRITECOPY | PAGE_EXECUTE
+ | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE
+ | PAGE_EXECUTE_WRITECOPY);
+ ULONG attribs = flProtect & (SEC_BASED | SEC_NO_CHANGE | SEC_IMAGE | SEC_VLM
+ | SEC_RESERVE | SEC_COMMIT | SEC_NOCACHE);
+ LARGE_INTEGER size = {{ LowPart : dwMaximumSizeLow,
+ HighPart : dwMaximumSizeHigh }};
+ PLARGE_INTEGER psize = size.QuadPart ? &size : NULL;
+
+ if (prot & (PAGE_READWRITE | PAGE_WRITECOPY
+ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY))
+ access |= SECTION_MAP_WRITE;
+ if (prot & (PAGE_EXECUTE | PAGE_EXECUTE_READ
+ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY))
+ access |= SECTION_MAP_EXECUTE;
+ if (lpAttributes && lpAttributes->bInheritHandle)
+ flags |= OBJ_INHERIT;
+ if (lpName)
+ {
+ RtlInitUnicodeString (&uname, lpName);
+ flags |= OBJ_OPENIF | OBJ_CASE_INSENSITIVE;
+ }
+ InitializeObjectAttributes (&attr, lpName ? &uname : NULL, flags,
+ lpName ? get_shared_parent_dir () : NULL,
+ lpAttributes
+ ? lpAttributes->lpSecurityDescriptor
+ : NULL);
+ if (!attribs)
+ attribs = SEC_COMMIT;
+ if (hFile == INVALID_HANDLE_VALUE)
+ hFile = NULL;
+ status = NtCreateSection (§, access, &attr, psize, prot, attribs, hFile);
+ if (!NT_SUCCESS (status))
+ {
+ small_printf ("status %p\n", status);
+ SetLastError (RtlNtStatusToDosError (status));
+ return NULL;
+ }
+ SetLastError (status == STATUS_OBJECT_NAME_EXISTS
+ ? ERROR_ALREADY_EXISTS : ERROR_SUCCESS);
+ return sect;
+}
+
+HANDLE WINAPI
+CreateFileMappingA (HANDLE hFile, LPSECURITY_ATTRIBUTES lpAttributes,
+ DWORD flProtect, DWORD dwMaximumSizeHigh,
+ DWORD dwMaximumSizeLow, LPCSTR lpName)
+{
+ WCHAR name[MAX_PATH];
+
+ if (lpName && !sys_mbstowcs (name, MAX_PATH, lpName))
+ {
+ SetLastError (ERROR_FILENAME_EXCED_RANGE);
+ return NULL;
+ }
+ return CreateFileMappingW (hFile, lpAttributes, flProtect, dwMaximumSizeHigh,
+ dwMaximumSizeLow, lpName ? name : NULL);
+}
+
+HANDLE WINAPI
+OpenFileMappingW (DWORD dwDesiredAccess, BOOL bInheritHandle, LPCWSTR lpName)
+{
+ HANDLE sect;
+ UNICODE_STRING uname;
+ OBJECT_ATTRIBUTES attr;
+ NTSTATUS status;
+ ULONG flags = 0;
+
+ if (bInheritHandle)
+ flags |= OBJ_INHERIT;
+ if (lpName)
+ {
+ RtlInitUnicodeString (&uname, lpName);
+ flags |= OBJ_CASE_INSENSITIVE;
+ }
+ InitializeObjectAttributes (&attr, lpName ? &uname : NULL, flags,
+ lpName ? get_shared_parent_dir () : NULL,
+ NULL);
+ status = NtOpenSection (§, dwDesiredAccess, &attr);
+ if (!NT_SUCCESS (status))
+ {
+ SetLastError (RtlNtStatusToDosError (status));
+ return NULL;
+ }
+ return sect;
+}
+
+HANDLE WINAPI
+OpenFileMappingA (DWORD dwDesiredAccess, BOOL bInheritHandle, LPCSTR lpName)
+{
+ WCHAR name[MAX_PATH];
+
+ if (lpName && !sys_mbstowcs (name, MAX_PATH, lpName))
+ {
+ SetLastError (ERROR_FILENAME_EXCED_RANGE);
+ return NULL;
+ }
+ return OpenFileMappingW (dwDesiredAccess, bInheritHandle, lpName ? name : NULL);
+}
return h;
}
-void *
+static void *
MapView (HANDLE h, void *addr, size_t len, DWORD openflags,
int prot, int flags, _off64_t off)
{
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
+#define STATUS_OBJECT_NAME_EXISTS ((NTSTATUS) 0x40000000)
+#define STATUS_BUFFER_OVERFLOW ((NTSTATUS) 0x80000005)
+#define STATUS_NO_MORE_FILES ((NTSTATUS) 0x80000006)
#ifndef STATUS_INVALID_INFO_CLASS
/* Some w32api header file defines this so we need to conditionalize this
define to avoid warnings. */
#define STATUS_DIRECTORY_NOT_EMPTY ((NTSTATUS) 0xc0000101)
#define STATUS_NOT_ALL_ASSIGNED ((NTSTATUS) 0x00000106)
#define STATUS_INVALID_LEVEL ((NTSTATUS) 0xc0000148)
-#define STATUS_BUFFER_OVERFLOW ((NTSTATUS) 0x80000005)
-#define STATUS_NO_MORE_FILES ((NTSTATUS) 0x80000006)
-#define STATUS_DLL_NOT_FOUND ((NTSTATUS) 0xC0000135)
-#define STATUS_ENTRYPOINT_NOT_FOUND ((NTSTATUS) 0xC0000139)
-#define STATUS_BAD_DLL_ENTRYPOINT ((NTSTATUS) 0xC0000251)
-#define STATUS_ILLEGAL_DLL_RELOCATION ((NTSTATUS) 0xC0000269)
-
+#define STATUS_DLL_NOT_FOUND ((NTSTATUS) 0xc0000135)
+#define STATUS_ENTRYPOINT_NOT_FOUND ((NTSTATUS) 0xc0000139)
+#define STATUS_BAD_DLL_ENTRYPOINT ((NTSTATUS) 0xc0000251)
+#define STATUS_ILLEGAL_DLL_RELOCATION ((NTSTATUS) 0xc0000269)
#define PDI_MODULES 0x01
#define PDI_HEAPS 0x04
#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|0x0f)
#define EVENT_QUERY_STATE 1
+#define SEMAPHORE_QUERY_STATE 1
+
+/* Specific ACCESS_MASKSs for objects created in Cygwin. */
+#define CYG_SHARED_DIR_ACCESS (DIRECTORY_QUERY \
+ | DIRECTORY_TRAVERSE \
+ | DIRECTORY_CREATE_SUBDIRECTORY \
+ | DIRECTORY_CREATE_OBJECT \
+ | READ_CONTROL)
+
+#define CYG_MUTANT_ACCESS (MUTANT_QUERY_STATE \
+ | SYNCHRONIZE \
+ | READ_CONTROL)
+
+#define CYG_EVENT_ACCESS (EVENT_QUERY_STATE \
+ | EVENT_MODIFY_STATE \
+ | SYNCHRONIZE \
+ | READ_CONTROL)
+
+#define CYG_SEMAPHORE_ACCESS (SEMAPHORE_QUERY_STATE \
+ | SEMAPHORE_MODIFY_STATE \
+ | SYNCHRONIZE \
+ | READ_CONTROL)
typedef ULONG KAFFINITY;
ProcessBasicInformation = 0,
ProcessQuotaLimits = 1,
ProcessVmCounters = 3,
- ProcessTimes =4,
+ ProcessTimes = 4,
+ ProcessSessionInformation = 24,
} PROCESSINFOCLASS;
typedef struct _DEBUG_BUFFER
ULONG InheritedFromUniqueProcessId;
} PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;
+typedef struct _PROCESS_SESSION_INFORMATION
+{
+ ULONG SessionId;
+} PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;
+
typedef enum _MEMORY_INFORMATION_CLASS
{
MemoryBasicInformation,
BOOLEAN);
NTSTATUS NTAPI NtCreateSection (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
PLARGE_INTEGER, ULONG, ULONG, HANDLE);
+ NTSTATUS NTAPI NtCreateSemaphore (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
+ LONG, LONG);
NTSTATUS NTAPI NtCreateToken (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
TOKEN_TYPE, PLUID, PLARGE_INTEGER, PTOKEN_USER,
PTOKEN_GROUPS, PTOKEN_PRIVILEGES, PTOKEN_OWNER,
PIO_STATUS_BLOCK, ULONG, ULONG);
NTSTATUS NTAPI NtOpenMutant (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES);
NTSTATUS NTAPI NtOpenSection (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES);
+ NTSTATUS NTAPI NtOpenSemaphore (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES);
/* WARNING! Don't rely on the timestamp information returned by
NtQueryAttributesFile. Only the DOS file attribute info is reliable. */
NTSTATUS NTAPI NtQueryAttributesFile (POBJECT_ATTRIBUTES,
#include "dtable.h"
#include "cygheap.h"
#include "sigproc.h"
+#include "ntdll.h"
#include <sys/mman.h>
#include <sys/param.h>
#include <stdlib.h>
ipc_mutex_init (HANDLE *pmtx, const char *name)
{
char buf[MAX_PATH];
- __small_sprintf (buf, "%scyg_pmtx/%s", cygheap->shared_prefix, name);
- *pmtx = CreateMutex (&sec_all, FALSE, buf);
+ SECURITY_ATTRIBUTES sa = sec_none;
+
+ __small_sprintf (buf, "mqueue/mtx_%W", name);
+ sa.lpSecurityDescriptor = everyone_sd (CYG_MUTANT_ACCESS);
+ *pmtx = CreateMutex (&sa, FALSE, buf);
if (!*pmtx)
- debug_printf ("failed: %E\n");
+ debug_printf ("CreateMutex: %E");
return *pmtx ? 0 : geterrno_from_win_error ();
}
ipc_cond_init (HANDLE *pevt, const char *name)
{
char buf[MAX_PATH];
- __small_sprintf (buf, "%scyg_pevt/%s", cygheap->shared_prefix, name);
- *pevt = CreateEvent (&sec_all, TRUE, FALSE, buf);
+ SECURITY_ATTRIBUTES sa = sec_none;
+
+ __small_sprintf (buf, "mqueue/evt_%W", name);
+ sa.lpSecurityDescriptor = everyone_sd (CYG_EVENT_ACCESS);
+ *pevt = CreateEvent (&sa, TRUE, FALSE, buf);
if (!*pevt)
- debug_printf ("failed: %E\n");
+ debug_printf ("CreateEvent: %E");
return *pevt ? 0 : geterrno_from_win_error ();
}
__seterrno ();
goto err;
}
- __small_sprintf (mqhdr->mqh_uname, "cyg%016X%08x%08x",
+ __small_sprintf (mqhdr->mqh_uname, "%016X%08x%08x",
hash_path_name (0,mqname),
luid.HighPart, luid.LowPart);
mqhdr->mqh_head = 0;
/* This function returns a handle to the top-level directory in the global
NT namespace used to implement global objects including shared memory. */
-
-#define CYG_SHARED_DIR_ACCESS (DIRECTORY_QUERY \
- | DIRECTORY_TRAVERSE \
- | DIRECTORY_CREATE_SUBDIRECTORY \
- | DIRECTORY_CREATE_OBJECT \
- | READ_CONTROL)
-
+extern bool _cygwin_testing;
HANDLE
get_shared_parent_dir ()
UNICODE_STRING uname;
OBJECT_ATTRIBUTES attr;
NTSTATUS status;
-
+
if (!dir)
{
- RtlInitUnicodeString (&uname, L"\\BaseNamedObjects\\cygwin-shared");
+ WCHAR bnoname[MAX_PATH];
+ __small_swprintf (bnoname, L"\\BaseNamedObjects\\%s%s",
+ cygwin_version.shared_id,
+ _cygwin_testing ? cygwin_version.dll_build_date : "");
+ RtlInitUnicodeString (&uname, bnoname);
InitializeObjectAttributes (&attr, &uname, OBJ_INHERIT | OBJ_OPENIF,
NULL, everyone_sd (CYG_SHARED_DIR_ACCESS));
status = NtCreateDirectoryObject (&dir, CYG_SHARED_DIR_ACCESS, &attr);
if (!NT_SUCCESS (status))
- api_fatal ("NtCreateDirectoryObject(parent): %p", status);
+ api_fatal ("NtCreateDirectoryObject(%S): %p", &uname, status);
+ }
+ return dir;
+}
+
+HANDLE
+get_session_parent_dir ()
+{
+ static HANDLE dir;
+ UNICODE_STRING uname;
+ OBJECT_ATTRIBUTES attr;
+ NTSTATUS status;
+
+ if (!dir)
+ {
+ PROCESS_SESSION_INFORMATION psi;
+ status = NtQueryInformationProcess (GetCurrentProcess (),
+ ProcessSessionInformation,
+ &psi, sizeof psi, NULL);
+ if (!NT_SUCCESS (status) || psi.SessionId == 0)
+ dir = get_shared_parent_dir ();
+ else
+ {
+ WCHAR bnoname[MAX_PATH];
+ __small_swprintf (bnoname,
+ L"\\Sessions\\BNOLINKS\\%d\\%s%s",
+ psi.SessionId, cygwin_version.shared_id,
+ _cygwin_testing ? cygwin_version.dll_build_date : "");
+ RtlInitUnicodeString (&uname, bnoname);
+ InitializeObjectAttributes (&attr, &uname, OBJ_INHERIT | OBJ_OPENIF,
+ NULL, everyone_sd(CYG_SHARED_DIR_ACCESS));
+ status = NtCreateDirectoryObject (&dir, CYG_SHARED_DIR_ACCESS, &attr);
+ if (!NT_SUCCESS (status))
+ api_fatal ("NtCreateDirectoryObject(%S): %p", &uname, status);
+ }
}
return dir;
}
char * __stdcall
shared_name (char *ret_buf, const char *str, int num)
{
- extern bool _cygwin_testing;
-
- get_shared_parent_dir ();
- __small_sprintf (ret_buf, "%scygwin-shared\\%s.%s.%d",
- cygheap->shared_prefix,
- cygwin_version.shared_id, str, num);
- if (_cygwin_testing)
- strcat (ret_buf, cygwin_version.dll_build_date);
+ __small_sprintf (ret_buf, "%s.%d", str, num);
return ret_buf;
}
cb = sizeof (*this); /* Do last, after all shared memory initialization */
}
- mt.initialize ();
+ mt.initialize (); /* Initialize shared tape information. */
+
+ get_session_parent_dir (); /* Create session dir if first process. */
if (cb != SHARED_INFO_CB)
system_printf ("size of shared memory region changed from %u to %u",
#endif
HANDLE get_shared_parent_dir ();
+HANDLE get_session_parent_dir ();
char *__stdcall shared_name (char *, const char *, int);
void *__stdcall open_shared (const char *name, int n, HANDLE &shared_h, DWORD size,
shared_locations&, PSECURITY_ATTRIBUTES psa = &sec_all,
s = va_arg (ap, char *);
if (s == NULL)
s = "(null)";
- sys_mbstowcs (tmp, NT_MAX_PATH, s, n);
+ sys_mbstowcs (tmp, NT_MAX_PATH, s, n < 0x7fff ? (int) n : -1);
RtlInitUnicodeString (us = &uw, tmp);
goto fillin;
break;
{
char name[MAX_PATH];
- __small_sprintf (name, "%scyg_psem/cyg%016X%08x%08x", cygheap->shared_prefix,
+ __small_sprintf (name, "semaphore/%016X%08x%08x",
hash, luid.HighPart, luid.LowPart);
this->win32_obj_id = ::CreateSemaphore (&sec_all, value, LONG_MAX, name);
if (!this->win32_obj_id)