1999-03-09 18:47:51 +01:00
|
|
|
/*
|
|
|
|
* Process synchronisation
|
2002-03-10 00:29:33 +01:00
|
|
|
*
|
2003-03-31 03:37:04 +02:00
|
|
|
* Copyright 1997 Alexandre Julliard
|
2002-03-10 00:29:33 +01:00
|
|
|
* Copyright 1999, 2000 Juergen Schmied
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
1999-03-09 18:47:51 +01:00
|
|
|
*/
|
|
|
|
|
2003-03-31 03:37:04 +02:00
|
|
|
#include "config.h"
|
|
|
|
|
|
|
|
#include <assert.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <signal.h>
|
|
|
|
#ifdef HAVE_SYS_TIME_H
|
|
|
|
# include <sys/time.h>
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_SYS_POLL_H
|
|
|
|
# include <sys/poll.h>
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_UNISTD_H
|
|
|
|
# include <unistd.h>
|
|
|
|
#endif
|
|
|
|
#include <string.h>
|
1999-06-12 16:55:11 +02:00
|
|
|
#include <stdio.h>
|
1999-03-09 18:47:51 +01:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <time.h>
|
|
|
|
|
2003-03-31 21:32:20 +02:00
|
|
|
#define NONAMELESSUNION
|
|
|
|
#define NONAMELESSSTRUCT
|
|
|
|
|
2002-09-13 00:07:02 +02:00
|
|
|
#include "winternl.h"
|
2003-03-31 03:37:04 +02:00
|
|
|
#include "async.h"
|
|
|
|
#include "thread.h"
|
|
|
|
#include "wine/server.h"
|
|
|
|
#include "wine/unicode.h"
|
|
|
|
#include "wine/debug.h"
|
- implementation of RtlReg* (read access), RtlEvent*, RtlSemaphore*,
NtAllocateLocallyUniqueId
- implementation or stubs for NtAccessCheck, NtSetSecurityObject,
RtlClearBits, RtlEqualPrefixSid, RtlFindClearBits,
RtlFormatCurrentUserKeyPath, RtlGetControlSecurityDescriptor,
RtlIdentifierAuthoritySid, RtlImpersonateSelf, RtlInitializeBitMap,
RtlInitializeGenericTable, RtlMakeSelfRelativeSD,
RtlPrefixUnicodeString, RtlSetBits, RtlUnicodeToMultiByteN,
RtlUpcaseUnicodeStringToOemString, RtlUpcaseUnicodeToOemN,
RtlValidSid, RtlxUnicodeStringToOemSize
- corrected most RtlString* functions, added documentation
- more fixes and partial implementations
2000-01-23 23:35:33 +01:00
|
|
|
#include "ntdll_misc.h"
|
1999-03-09 18:47:51 +01:00
|
|
|
|
2002-03-10 00:29:33 +01:00
|
|
|
WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
|
- implementation of RtlReg* (read access), RtlEvent*, RtlSemaphore*,
NtAllocateLocallyUniqueId
- implementation or stubs for NtAccessCheck, NtSetSecurityObject,
RtlClearBits, RtlEqualPrefixSid, RtlFindClearBits,
RtlFormatCurrentUserKeyPath, RtlGetControlSecurityDescriptor,
RtlIdentifierAuthoritySid, RtlImpersonateSelf, RtlInitializeBitMap,
RtlInitializeGenericTable, RtlMakeSelfRelativeSD,
RtlPrefixUnicodeString, RtlSetBits, RtlUnicodeToMultiByteN,
RtlUpcaseUnicodeStringToOemString, RtlUpcaseUnicodeToOemN,
RtlValidSid, RtlxUnicodeStringToOemSize
- corrected most RtlString* functions, added documentation
- more fixes and partial implementations
2000-01-23 23:35:33 +01:00
|
|
|
|
|
|
|
|
1999-03-09 18:47:51 +01:00
|
|
|
/*
|
- implementation of RtlReg* (read access), RtlEvent*, RtlSemaphore*,
NtAllocateLocallyUniqueId
- implementation or stubs for NtAccessCheck, NtSetSecurityObject,
RtlClearBits, RtlEqualPrefixSid, RtlFindClearBits,
RtlFormatCurrentUserKeyPath, RtlGetControlSecurityDescriptor,
RtlIdentifierAuthoritySid, RtlImpersonateSelf, RtlInitializeBitMap,
RtlInitializeGenericTable, RtlMakeSelfRelativeSD,
RtlPrefixUnicodeString, RtlSetBits, RtlUnicodeToMultiByteN,
RtlUpcaseUnicodeStringToOemString, RtlUpcaseUnicodeToOemN,
RtlValidSid, RtlxUnicodeStringToOemSize
- corrected most RtlString* functions, added documentation
- more fixes and partial implementations
2000-01-23 23:35:33 +01:00
|
|
|
* Semaphores
|
1999-03-09 18:47:51 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
/******************************************************************************
|
2001-06-19 20:20:47 +02:00
|
|
|
* NtCreateSemaphore (NTDLL.@)
|
1999-03-09 18:47:51 +01:00
|
|
|
*/
|
2000-08-30 02:00:48 +02:00
|
|
|
NTSTATUS WINAPI NtCreateSemaphore( OUT PHANDLE SemaphoreHandle,
|
|
|
|
IN ACCESS_MASK access,
|
|
|
|
IN const OBJECT_ATTRIBUTES *attr OPTIONAL,
|
|
|
|
IN ULONG InitialCount,
|
|
|
|
IN ULONG MaximumCount )
|
1999-03-09 18:47:51 +01:00
|
|
|
{
|
2000-08-30 02:00:48 +02:00
|
|
|
DWORD len = attr && attr->ObjectName ? attr->ObjectName->Length : 0;
|
2000-01-26 02:39:51 +01:00
|
|
|
NTSTATUS ret;
|
|
|
|
|
2001-08-11 00:49:35 +02:00
|
|
|
if ((MaximumCount <= 0) || (InitialCount > MaximumCount))
|
2000-01-26 02:39:51 +01:00
|
|
|
return STATUS_INVALID_PARAMETER;
|
|
|
|
|
2001-11-30 19:46:42 +01:00
|
|
|
SERVER_START_REQ( create_semaphore )
|
2000-08-30 02:00:48 +02:00
|
|
|
{
|
|
|
|
req->initial = InitialCount;
|
|
|
|
req->max = MaximumCount;
|
|
|
|
req->inherit = attr && (attr->Attributes & OBJ_INHERIT);
|
2001-11-30 19:46:42 +01:00
|
|
|
if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len );
|
|
|
|
ret = wine_server_call( req );
|
|
|
|
*SemaphoreHandle = reply->handle;
|
2000-08-30 02:00:48 +02:00
|
|
|
}
|
2001-11-30 19:46:42 +01:00
|
|
|
SERVER_END_REQ;
|
2000-01-26 02:39:51 +01:00
|
|
|
return ret;
|
1999-03-09 18:47:51 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/******************************************************************************
|
2001-06-19 20:20:47 +02:00
|
|
|
* NtOpenSemaphore (NTDLL.@)
|
1999-03-09 18:47:51 +01:00
|
|
|
*/
|
2000-08-30 02:00:48 +02:00
|
|
|
NTSTATUS WINAPI NtOpenSemaphore( OUT PHANDLE SemaphoreHandle,
|
|
|
|
IN ACCESS_MASK access,
|
|
|
|
IN const OBJECT_ATTRIBUTES *attr )
|
1999-03-09 18:47:51 +01:00
|
|
|
{
|
2000-08-30 02:00:48 +02:00
|
|
|
DWORD len = attr && attr->ObjectName ? attr->ObjectName->Length : 0;
|
2000-01-26 02:39:51 +01:00
|
|
|
NTSTATUS ret;
|
|
|
|
|
2001-11-30 19:46:42 +01:00
|
|
|
SERVER_START_REQ( open_semaphore )
|
2000-08-30 02:00:48 +02:00
|
|
|
{
|
|
|
|
req->access = access;
|
|
|
|
req->inherit = attr && (attr->Attributes & OBJ_INHERIT);
|
2001-11-30 19:46:42 +01:00
|
|
|
if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len );
|
|
|
|
ret = wine_server_call( req );
|
|
|
|
*SemaphoreHandle = reply->handle;
|
2000-08-30 02:00:48 +02:00
|
|
|
}
|
2001-11-30 19:46:42 +01:00
|
|
|
SERVER_END_REQ;
|
2000-01-26 02:39:51 +01:00
|
|
|
return ret;
|
1999-03-09 18:47:51 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/******************************************************************************
|
2001-06-19 20:20:47 +02:00
|
|
|
* NtQuerySemaphore (NTDLL.@)
|
1999-03-09 18:47:51 +01:00
|
|
|
*/
|
|
|
|
NTSTATUS WINAPI NtQuerySemaphore(
|
|
|
|
HANDLE SemaphoreHandle,
|
|
|
|
PVOID SemaphoreInformationClass,
|
|
|
|
OUT PVOID SemaphoreInformation,
|
|
|
|
ULONG Length,
|
2002-06-01 01:06:46 +02:00
|
|
|
PULONG ReturnLength)
|
1999-03-09 18:47:51 +01:00
|
|
|
{
|
2002-12-05 20:56:15 +01:00
|
|
|
FIXME("(%p,%p,%p,0x%08lx,%p) stub!\n",
|
1999-03-09 18:47:51 +01:00
|
|
|
SemaphoreHandle, SemaphoreInformationClass, SemaphoreInformation, Length, ReturnLength);
|
- implementation of RtlReg* (read access), RtlEvent*, RtlSemaphore*,
NtAllocateLocallyUniqueId
- implementation or stubs for NtAccessCheck, NtSetSecurityObject,
RtlClearBits, RtlEqualPrefixSid, RtlFindClearBits,
RtlFormatCurrentUserKeyPath, RtlGetControlSecurityDescriptor,
RtlIdentifierAuthoritySid, RtlImpersonateSelf, RtlInitializeBitMap,
RtlInitializeGenericTable, RtlMakeSelfRelativeSD,
RtlPrefixUnicodeString, RtlSetBits, RtlUnicodeToMultiByteN,
RtlUpcaseUnicodeStringToOemString, RtlUpcaseUnicodeToOemN,
RtlValidSid, RtlxUnicodeStringToOemSize
- corrected most RtlString* functions, added documentation
- more fixes and partial implementations
2000-01-23 23:35:33 +01:00
|
|
|
return STATUS_SUCCESS;
|
1999-03-09 18:47:51 +01:00
|
|
|
}
|
2000-08-30 02:00:48 +02:00
|
|
|
|
1999-03-09 18:47:51 +01:00
|
|
|
/******************************************************************************
|
2001-06-19 20:20:47 +02:00
|
|
|
* NtReleaseSemaphore (NTDLL.@)
|
1999-03-09 18:47:51 +01:00
|
|
|
*/
|
2000-08-30 02:00:48 +02:00
|
|
|
NTSTATUS WINAPI NtReleaseSemaphore( HANDLE handle, ULONG count, PULONG previous )
|
1999-03-09 18:47:51 +01:00
|
|
|
{
|
2000-01-26 02:39:51 +01:00
|
|
|
NTSTATUS ret;
|
2001-02-27 03:09:16 +01:00
|
|
|
SERVER_START_REQ( release_semaphore )
|
2000-01-26 02:39:51 +01:00
|
|
|
{
|
2000-08-30 02:00:48 +02:00
|
|
|
req->handle = handle;
|
|
|
|
req->count = count;
|
2001-11-30 19:46:42 +01:00
|
|
|
if (!(ret = wine_server_call( req )))
|
2000-08-30 02:00:48 +02:00
|
|
|
{
|
2001-11-30 19:46:42 +01:00
|
|
|
if (previous) *previous = reply->prev_count;
|
2000-08-30 02:00:48 +02:00
|
|
|
}
|
2000-01-26 02:39:51 +01:00
|
|
|
}
|
2000-08-30 02:00:48 +02:00
|
|
|
SERVER_END_REQ;
|
2000-01-26 02:39:51 +01:00
|
|
|
return ret;
|
1999-03-09 18:47:51 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
- implementation of RtlReg* (read access), RtlEvent*, RtlSemaphore*,
NtAllocateLocallyUniqueId
- implementation or stubs for NtAccessCheck, NtSetSecurityObject,
RtlClearBits, RtlEqualPrefixSid, RtlFindClearBits,
RtlFormatCurrentUserKeyPath, RtlGetControlSecurityDescriptor,
RtlIdentifierAuthoritySid, RtlImpersonateSelf, RtlInitializeBitMap,
RtlInitializeGenericTable, RtlMakeSelfRelativeSD,
RtlPrefixUnicodeString, RtlSetBits, RtlUnicodeToMultiByteN,
RtlUpcaseUnicodeStringToOemString, RtlUpcaseUnicodeToOemN,
RtlValidSid, RtlxUnicodeStringToOemSize
- corrected most RtlString* functions, added documentation
- more fixes and partial implementations
2000-01-23 23:35:33 +01:00
|
|
|
* Events
|
1999-03-09 18:47:51 +01:00
|
|
|
*/
|
2002-06-01 01:06:46 +02:00
|
|
|
|
1999-03-09 18:47:51 +01:00
|
|
|
/**************************************************************************
|
2001-06-19 20:20:47 +02:00
|
|
|
* NtCreateEvent (NTDLL.@)
|
2001-07-11 20:56:41 +02:00
|
|
|
* ZwCreateEvent (NTDLL.@)
|
1999-03-09 18:47:51 +01:00
|
|
|
*/
|
|
|
|
NTSTATUS WINAPI NtCreateEvent(
|
|
|
|
OUT PHANDLE EventHandle,
|
|
|
|
IN ACCESS_MASK DesiredAccess,
|
2000-08-30 02:00:48 +02:00
|
|
|
IN const OBJECT_ATTRIBUTES *attr,
|
1999-03-09 18:47:51 +01:00
|
|
|
IN BOOLEAN ManualReset,
|
|
|
|
IN BOOLEAN InitialState)
|
|
|
|
{
|
2000-08-30 02:00:48 +02:00
|
|
|
DWORD len = attr && attr->ObjectName ? attr->ObjectName->Length : 0;
|
2000-01-26 02:39:51 +01:00
|
|
|
NTSTATUS ret;
|
|
|
|
|
2001-11-30 19:46:42 +01:00
|
|
|
SERVER_START_REQ( create_event )
|
2000-08-30 02:00:48 +02:00
|
|
|
{
|
|
|
|
req->manual_reset = ManualReset;
|
|
|
|
req->initial_state = InitialState;
|
|
|
|
req->inherit = attr && (attr->Attributes & OBJ_INHERIT);
|
2001-11-30 19:46:42 +01:00
|
|
|
if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len );
|
|
|
|
ret = wine_server_call( req );
|
|
|
|
*EventHandle = reply->handle;
|
2000-08-30 02:00:48 +02:00
|
|
|
}
|
2001-11-30 19:46:42 +01:00
|
|
|
SERVER_END_REQ;
|
2000-01-26 02:39:51 +01:00
|
|
|
return ret;
|
1999-03-09 18:47:51 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/******************************************************************************
|
2001-06-19 20:20:47 +02:00
|
|
|
* NtOpenEvent (NTDLL.@)
|
2001-07-11 20:56:41 +02:00
|
|
|
* ZwOpenEvent (NTDLL.@)
|
1999-03-09 18:47:51 +01:00
|
|
|
*/
|
|
|
|
NTSTATUS WINAPI NtOpenEvent(
|
|
|
|
OUT PHANDLE EventHandle,
|
|
|
|
IN ACCESS_MASK DesiredAccess,
|
2000-08-30 02:00:48 +02:00
|
|
|
IN const OBJECT_ATTRIBUTES *attr )
|
1999-03-09 18:47:51 +01:00
|
|
|
{
|
2000-08-30 02:00:48 +02:00
|
|
|
DWORD len = attr && attr->ObjectName ? attr->ObjectName->Length : 0;
|
2000-01-26 02:39:51 +01:00
|
|
|
NTSTATUS ret;
|
|
|
|
|
2001-11-30 19:46:42 +01:00
|
|
|
SERVER_START_REQ( open_event )
|
2000-08-30 02:00:48 +02:00
|
|
|
{
|
|
|
|
req->access = DesiredAccess;
|
|
|
|
req->inherit = attr && (attr->Attributes & OBJ_INHERIT);
|
2001-11-30 19:46:42 +01:00
|
|
|
if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len );
|
|
|
|
ret = wine_server_call( req );
|
|
|
|
*EventHandle = reply->handle;
|
2000-08-30 02:00:48 +02:00
|
|
|
}
|
2001-11-30 19:46:42 +01:00
|
|
|
SERVER_END_REQ;
|
2000-01-26 02:39:51 +01:00
|
|
|
return ret;
|
- implementation of RtlReg* (read access), RtlEvent*, RtlSemaphore*,
NtAllocateLocallyUniqueId
- implementation or stubs for NtAccessCheck, NtSetSecurityObject,
RtlClearBits, RtlEqualPrefixSid, RtlFindClearBits,
RtlFormatCurrentUserKeyPath, RtlGetControlSecurityDescriptor,
RtlIdentifierAuthoritySid, RtlImpersonateSelf, RtlInitializeBitMap,
RtlInitializeGenericTable, RtlMakeSelfRelativeSD,
RtlPrefixUnicodeString, RtlSetBits, RtlUnicodeToMultiByteN,
RtlUpcaseUnicodeStringToOemString, RtlUpcaseUnicodeToOemN,
RtlValidSid, RtlxUnicodeStringToOemSize
- corrected most RtlString* functions, added documentation
- more fixes and partial implementations
2000-01-23 23:35:33 +01:00
|
|
|
}
|
|
|
|
|
1999-03-09 18:47:51 +01:00
|
|
|
|
|
|
|
/******************************************************************************
|
2001-06-19 20:20:47 +02:00
|
|
|
* NtSetEvent (NTDLL.@)
|
2001-07-11 20:56:41 +02:00
|
|
|
* ZwSetEvent (NTDLL.@)
|
1999-03-09 18:47:51 +01:00
|
|
|
*/
|
2000-08-30 02:00:48 +02:00
|
|
|
NTSTATUS WINAPI NtSetEvent( HANDLE handle, PULONG NumberOfThreadsReleased )
|
1999-03-09 18:47:51 +01:00
|
|
|
{
|
2000-08-30 02:00:48 +02:00
|
|
|
NTSTATUS ret;
|
2000-09-29 22:48:04 +02:00
|
|
|
|
|
|
|
/* FIXME: set NumberOfThreadsReleased */
|
|
|
|
|
2001-02-27 03:09:16 +01:00
|
|
|
SERVER_START_REQ( event_op )
|
2000-08-30 02:00:48 +02:00
|
|
|
{
|
|
|
|
req->handle = handle;
|
|
|
|
req->op = SET_EVENT;
|
2001-11-30 19:46:42 +01:00
|
|
|
ret = wine_server_call( req );
|
2000-08-30 02:00:48 +02:00
|
|
|
}
|
|
|
|
SERVER_END_REQ;
|
|
|
|
return ret;
|
1999-03-09 18:47:51 +01:00
|
|
|
}
|
|
|
|
|
- implementation of RtlReg* (read access), RtlEvent*, RtlSemaphore*,
NtAllocateLocallyUniqueId
- implementation or stubs for NtAccessCheck, NtSetSecurityObject,
RtlClearBits, RtlEqualPrefixSid, RtlFindClearBits,
RtlFormatCurrentUserKeyPath, RtlGetControlSecurityDescriptor,
RtlIdentifierAuthoritySid, RtlImpersonateSelf, RtlInitializeBitMap,
RtlInitializeGenericTable, RtlMakeSelfRelativeSD,
RtlPrefixUnicodeString, RtlSetBits, RtlUnicodeToMultiByteN,
RtlUpcaseUnicodeStringToOemString, RtlUpcaseUnicodeToOemN,
RtlValidSid, RtlxUnicodeStringToOemSize
- corrected most RtlString* functions, added documentation
- more fixes and partial implementations
2000-01-23 23:35:33 +01:00
|
|
|
/******************************************************************************
|
2001-06-19 20:20:47 +02:00
|
|
|
* NtResetEvent (NTDLL.@)
|
- implementation of RtlReg* (read access), RtlEvent*, RtlSemaphore*,
NtAllocateLocallyUniqueId
- implementation or stubs for NtAccessCheck, NtSetSecurityObject,
RtlClearBits, RtlEqualPrefixSid, RtlFindClearBits,
RtlFormatCurrentUserKeyPath, RtlGetControlSecurityDescriptor,
RtlIdentifierAuthoritySid, RtlImpersonateSelf, RtlInitializeBitMap,
RtlInitializeGenericTable, RtlMakeSelfRelativeSD,
RtlPrefixUnicodeString, RtlSetBits, RtlUnicodeToMultiByteN,
RtlUpcaseUnicodeStringToOemString, RtlUpcaseUnicodeToOemN,
RtlValidSid, RtlxUnicodeStringToOemSize
- corrected most RtlString* functions, added documentation
- more fixes and partial implementations
2000-01-23 23:35:33 +01:00
|
|
|
*/
|
2000-08-30 02:00:48 +02:00
|
|
|
NTSTATUS WINAPI NtResetEvent( HANDLE handle, PULONG NumberOfThreadsReleased )
|
- implementation of RtlReg* (read access), RtlEvent*, RtlSemaphore*,
NtAllocateLocallyUniqueId
- implementation or stubs for NtAccessCheck, NtSetSecurityObject,
RtlClearBits, RtlEqualPrefixSid, RtlFindClearBits,
RtlFormatCurrentUserKeyPath, RtlGetControlSecurityDescriptor,
RtlIdentifierAuthoritySid, RtlImpersonateSelf, RtlInitializeBitMap,
RtlInitializeGenericTable, RtlMakeSelfRelativeSD,
RtlPrefixUnicodeString, RtlSetBits, RtlUnicodeToMultiByteN,
RtlUpcaseUnicodeStringToOemString, RtlUpcaseUnicodeToOemN,
RtlValidSid, RtlxUnicodeStringToOemSize
- corrected most RtlString* functions, added documentation
- more fixes and partial implementations
2000-01-23 23:35:33 +01:00
|
|
|
{
|
2000-08-30 02:00:48 +02:00
|
|
|
NTSTATUS ret;
|
|
|
|
|
|
|
|
/* resetting an event can't release any thread... */
|
|
|
|
if (NumberOfThreadsReleased) *NumberOfThreadsReleased = 0;
|
|
|
|
|
2001-02-27 03:09:16 +01:00
|
|
|
SERVER_START_REQ( event_op )
|
2000-08-30 02:00:48 +02:00
|
|
|
{
|
|
|
|
req->handle = handle;
|
|
|
|
req->op = RESET_EVENT;
|
2001-11-30 19:46:42 +01:00
|
|
|
ret = wine_server_call( req );
|
2000-08-30 02:00:48 +02:00
|
|
|
}
|
|
|
|
SERVER_END_REQ;
|
|
|
|
return ret;
|
- implementation of RtlReg* (read access), RtlEvent*, RtlSemaphore*,
NtAllocateLocallyUniqueId
- implementation or stubs for NtAccessCheck, NtSetSecurityObject,
RtlClearBits, RtlEqualPrefixSid, RtlFindClearBits,
RtlFormatCurrentUserKeyPath, RtlGetControlSecurityDescriptor,
RtlIdentifierAuthoritySid, RtlImpersonateSelf, RtlInitializeBitMap,
RtlInitializeGenericTable, RtlMakeSelfRelativeSD,
RtlPrefixUnicodeString, RtlSetBits, RtlUnicodeToMultiByteN,
RtlUpcaseUnicodeStringToOemString, RtlUpcaseUnicodeToOemN,
RtlValidSid, RtlxUnicodeStringToOemSize
- corrected most RtlString* functions, added documentation
- more fixes and partial implementations
2000-01-23 23:35:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/******************************************************************************
|
2001-06-19 20:20:47 +02:00
|
|
|
* NtClearEvent (NTDLL.@)
|
- implementation of RtlReg* (read access), RtlEvent*, RtlSemaphore*,
NtAllocateLocallyUniqueId
- implementation or stubs for NtAccessCheck, NtSetSecurityObject,
RtlClearBits, RtlEqualPrefixSid, RtlFindClearBits,
RtlFormatCurrentUserKeyPath, RtlGetControlSecurityDescriptor,
RtlIdentifierAuthoritySid, RtlImpersonateSelf, RtlInitializeBitMap,
RtlInitializeGenericTable, RtlMakeSelfRelativeSD,
RtlPrefixUnicodeString, RtlSetBits, RtlUnicodeToMultiByteN,
RtlUpcaseUnicodeStringToOemString, RtlUpcaseUnicodeToOemN,
RtlValidSid, RtlxUnicodeStringToOemSize
- corrected most RtlString* functions, added documentation
- more fixes and partial implementations
2000-01-23 23:35:33 +01:00
|
|
|
*
|
|
|
|
* FIXME
|
|
|
|
* same as NtResetEvent ???
|
|
|
|
*/
|
2000-08-30 02:00:48 +02:00
|
|
|
NTSTATUS WINAPI NtClearEvent ( HANDLE handle )
|
- implementation of RtlReg* (read access), RtlEvent*, RtlSemaphore*,
NtAllocateLocallyUniqueId
- implementation or stubs for NtAccessCheck, NtSetSecurityObject,
RtlClearBits, RtlEqualPrefixSid, RtlFindClearBits,
RtlFormatCurrentUserKeyPath, RtlGetControlSecurityDescriptor,
RtlIdentifierAuthoritySid, RtlImpersonateSelf, RtlInitializeBitMap,
RtlInitializeGenericTable, RtlMakeSelfRelativeSD,
RtlPrefixUnicodeString, RtlSetBits, RtlUnicodeToMultiByteN,
RtlUpcaseUnicodeStringToOemString, RtlUpcaseUnicodeToOemN,
RtlValidSid, RtlxUnicodeStringToOemSize
- corrected most RtlString* functions, added documentation
- more fixes and partial implementations
2000-01-23 23:35:33 +01:00
|
|
|
{
|
2000-08-30 02:00:48 +02:00
|
|
|
return NtResetEvent( handle, NULL );
|
- implementation of RtlReg* (read access), RtlEvent*, RtlSemaphore*,
NtAllocateLocallyUniqueId
- implementation or stubs for NtAccessCheck, NtSetSecurityObject,
RtlClearBits, RtlEqualPrefixSid, RtlFindClearBits,
RtlFormatCurrentUserKeyPath, RtlGetControlSecurityDescriptor,
RtlIdentifierAuthoritySid, RtlImpersonateSelf, RtlInitializeBitMap,
RtlInitializeGenericTable, RtlMakeSelfRelativeSD,
RtlPrefixUnicodeString, RtlSetBits, RtlUnicodeToMultiByteN,
RtlUpcaseUnicodeStringToOemString, RtlUpcaseUnicodeToOemN,
RtlValidSid, RtlxUnicodeStringToOemSize
- corrected most RtlString* functions, added documentation
- more fixes and partial implementations
2000-01-23 23:35:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/******************************************************************************
|
2001-06-19 20:20:47 +02:00
|
|
|
* NtPulseEvent (NTDLL.@)
|
- implementation of RtlReg* (read access), RtlEvent*, RtlSemaphore*,
NtAllocateLocallyUniqueId
- implementation or stubs for NtAccessCheck, NtSetSecurityObject,
RtlClearBits, RtlEqualPrefixSid, RtlFindClearBits,
RtlFormatCurrentUserKeyPath, RtlGetControlSecurityDescriptor,
RtlIdentifierAuthoritySid, RtlImpersonateSelf, RtlInitializeBitMap,
RtlInitializeGenericTable, RtlMakeSelfRelativeSD,
RtlPrefixUnicodeString, RtlSetBits, RtlUnicodeToMultiByteN,
RtlUpcaseUnicodeStringToOemString, RtlUpcaseUnicodeToOemN,
RtlValidSid, RtlxUnicodeStringToOemSize
- corrected most RtlString* functions, added documentation
- more fixes and partial implementations
2000-01-23 23:35:33 +01:00
|
|
|
*
|
|
|
|
* FIXME
|
|
|
|
* PulseCount
|
|
|
|
*/
|
2000-08-30 02:00:48 +02:00
|
|
|
NTSTATUS WINAPI NtPulseEvent( HANDLE handle, PULONG PulseCount )
|
- implementation of RtlReg* (read access), RtlEvent*, RtlSemaphore*,
NtAllocateLocallyUniqueId
- implementation or stubs for NtAccessCheck, NtSetSecurityObject,
RtlClearBits, RtlEqualPrefixSid, RtlFindClearBits,
RtlFormatCurrentUserKeyPath, RtlGetControlSecurityDescriptor,
RtlIdentifierAuthoritySid, RtlImpersonateSelf, RtlInitializeBitMap,
RtlInitializeGenericTable, RtlMakeSelfRelativeSD,
RtlPrefixUnicodeString, RtlSetBits, RtlUnicodeToMultiByteN,
RtlUpcaseUnicodeStringToOemString, RtlUpcaseUnicodeToOemN,
RtlValidSid, RtlxUnicodeStringToOemSize
- corrected most RtlString* functions, added documentation
- more fixes and partial implementations
2000-01-23 23:35:33 +01:00
|
|
|
{
|
2000-08-30 02:00:48 +02:00
|
|
|
NTSTATUS ret;
|
2002-12-05 20:56:15 +01:00
|
|
|
FIXME("(%p,%p)\n", handle, PulseCount);
|
2001-02-27 03:09:16 +01:00
|
|
|
SERVER_START_REQ( event_op )
|
2000-08-30 02:00:48 +02:00
|
|
|
{
|
|
|
|
req->handle = handle;
|
|
|
|
req->op = PULSE_EVENT;
|
2001-11-30 19:46:42 +01:00
|
|
|
ret = wine_server_call( req );
|
2000-08-30 02:00:48 +02:00
|
|
|
}
|
|
|
|
SERVER_END_REQ;
|
|
|
|
return ret;
|
- implementation of RtlReg* (read access), RtlEvent*, RtlSemaphore*,
NtAllocateLocallyUniqueId
- implementation or stubs for NtAccessCheck, NtSetSecurityObject,
RtlClearBits, RtlEqualPrefixSid, RtlFindClearBits,
RtlFormatCurrentUserKeyPath, RtlGetControlSecurityDescriptor,
RtlIdentifierAuthoritySid, RtlImpersonateSelf, RtlInitializeBitMap,
RtlInitializeGenericTable, RtlMakeSelfRelativeSD,
RtlPrefixUnicodeString, RtlSetBits, RtlUnicodeToMultiByteN,
RtlUpcaseUnicodeStringToOemString, RtlUpcaseUnicodeToOemN,
RtlValidSid, RtlxUnicodeStringToOemSize
- corrected most RtlString* functions, added documentation
- more fixes and partial implementations
2000-01-23 23:35:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/******************************************************************************
|
2001-06-19 20:20:47 +02:00
|
|
|
* NtQueryEvent (NTDLL.@)
|
- implementation of RtlReg* (read access), RtlEvent*, RtlSemaphore*,
NtAllocateLocallyUniqueId
- implementation or stubs for NtAccessCheck, NtSetSecurityObject,
RtlClearBits, RtlEqualPrefixSid, RtlFindClearBits,
RtlFormatCurrentUserKeyPath, RtlGetControlSecurityDescriptor,
RtlIdentifierAuthoritySid, RtlImpersonateSelf, RtlInitializeBitMap,
RtlInitializeGenericTable, RtlMakeSelfRelativeSD,
RtlPrefixUnicodeString, RtlSetBits, RtlUnicodeToMultiByteN,
RtlUpcaseUnicodeStringToOemString, RtlUpcaseUnicodeToOemN,
RtlValidSid, RtlxUnicodeStringToOemSize
- corrected most RtlString* functions, added documentation
- more fixes and partial implementations
2000-01-23 23:35:33 +01:00
|
|
|
*/
|
|
|
|
NTSTATUS WINAPI NtQueryEvent (
|
|
|
|
IN HANDLE EventHandle,
|
|
|
|
IN UINT EventInformationClass,
|
|
|
|
OUT PVOID EventInformation,
|
|
|
|
IN ULONG EventInformationLength,
|
|
|
|
OUT PULONG ReturnLength)
|
|
|
|
{
|
2002-12-05 20:56:15 +01:00
|
|
|
FIXME("(%p)\n", EventHandle);
|
- implementation of RtlReg* (read access), RtlEvent*, RtlSemaphore*,
NtAllocateLocallyUniqueId
- implementation or stubs for NtAccessCheck, NtSetSecurityObject,
RtlClearBits, RtlEqualPrefixSid, RtlFindClearBits,
RtlFormatCurrentUserKeyPath, RtlGetControlSecurityDescriptor,
RtlIdentifierAuthoritySid, RtlImpersonateSelf, RtlInitializeBitMap,
RtlInitializeGenericTable, RtlMakeSelfRelativeSD,
RtlPrefixUnicodeString, RtlSetBits, RtlUnicodeToMultiByteN,
RtlUpcaseUnicodeStringToOemString, RtlUpcaseUnicodeToOemN,
RtlValidSid, RtlxUnicodeStringToOemSize
- corrected most RtlString* functions, added documentation
- more fixes and partial implementations
2000-01-23 23:35:33 +01:00
|
|
|
return STATUS_SUCCESS;
|
|
|
|
}
|
2003-03-31 03:37:04 +02:00
|
|
|
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* check_async_list
|
|
|
|
*
|
|
|
|
* Process a status event from the server.
|
|
|
|
*/
|
|
|
|
static void WINAPI check_async_list(async_private *asp, DWORD status)
|
|
|
|
{
|
|
|
|
async_private *ovp;
|
|
|
|
DWORD ovp_status;
|
|
|
|
|
|
|
|
for( ovp = NtCurrentTeb()->pending_list; ovp && ovp != asp; ovp = ovp->next );
|
|
|
|
|
|
|
|
if(!ovp)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if( status != STATUS_ALERTED )
|
|
|
|
{
|
|
|
|
ovp_status = status;
|
|
|
|
ovp->ops->set_status (ovp, status);
|
|
|
|
}
|
|
|
|
else ovp_status = ovp->ops->get_status (ovp);
|
|
|
|
|
|
|
|
if( ovp_status == STATUS_PENDING ) ovp->func( ovp );
|
|
|
|
|
|
|
|
/* This will destroy all but PENDING requests */
|
|
|
|
register_old_async( ovp );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* wait_reply
|
|
|
|
*
|
|
|
|
* Wait for a reply on the waiting pipe of the current thread.
|
|
|
|
*/
|
|
|
|
static int wait_reply( void *cookie )
|
|
|
|
{
|
|
|
|
int signaled;
|
|
|
|
struct wake_up_reply reply;
|
|
|
|
for (;;)
|
|
|
|
{
|
|
|
|
int ret;
|
|
|
|
ret = read( NtCurrentTeb()->wait_fd[0], &reply, sizeof(reply) );
|
|
|
|
if (ret == sizeof(reply))
|
|
|
|
{
|
|
|
|
if (!reply.cookie) break; /* thread got killed */
|
|
|
|
if (reply.cookie == cookie) return reply.signaled;
|
|
|
|
/* we stole another reply, wait for the real one */
|
|
|
|
signaled = wait_reply( cookie );
|
|
|
|
/* and now put the wrong one back in the pipe */
|
|
|
|
for (;;)
|
|
|
|
{
|
|
|
|
ret = write( NtCurrentTeb()->wait_fd[1], &reply, sizeof(reply) );
|
|
|
|
if (ret == sizeof(reply)) break;
|
|
|
|
if (ret >= 0) server_protocol_error( "partial wakeup write %d\n", ret );
|
|
|
|
if (errno == EINTR) continue;
|
|
|
|
server_protocol_perror("wakeup write");
|
|
|
|
}
|
|
|
|
return signaled;
|
|
|
|
}
|
|
|
|
if (ret >= 0) server_protocol_error( "partial wakeup read %d\n", ret );
|
|
|
|
if (errno == EINTR) continue;
|
|
|
|
server_protocol_perror("wakeup read");
|
|
|
|
}
|
|
|
|
/* the server closed the connection; time to die... */
|
|
|
|
SYSDEPS_AbortThread(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* call_apcs
|
|
|
|
*
|
|
|
|
* Call outstanding APCs.
|
|
|
|
*/
|
|
|
|
static void call_apcs( BOOL alertable )
|
|
|
|
{
|
2003-04-05 00:26:34 +02:00
|
|
|
FARPROC proc;
|
2003-03-31 03:37:04 +02:00
|
|
|
LARGE_INTEGER time;
|
2003-04-05 00:26:34 +02:00
|
|
|
void *arg1, *arg2, *arg3;
|
2003-03-31 03:37:04 +02:00
|
|
|
|
|
|
|
for (;;)
|
|
|
|
{
|
|
|
|
int type = APC_NONE;
|
|
|
|
SERVER_START_REQ( get_apc )
|
|
|
|
{
|
|
|
|
req->alertable = alertable;
|
2003-04-05 00:26:34 +02:00
|
|
|
if (!wine_server_call( req )) type = reply->type;
|
|
|
|
proc = reply->func;
|
|
|
|
arg1 = reply->arg1;
|
|
|
|
arg2 = reply->arg2;
|
|
|
|
arg3 = reply->arg3;
|
2003-03-31 03:37:04 +02:00
|
|
|
}
|
|
|
|
SERVER_END_REQ;
|
|
|
|
|
|
|
|
switch(type)
|
|
|
|
{
|
|
|
|
case APC_NONE:
|
|
|
|
return; /* no more APCs */
|
|
|
|
case APC_ASYNC:
|
2003-04-05 00:26:34 +02:00
|
|
|
proc( arg1, arg2 );
|
2003-03-31 03:37:04 +02:00
|
|
|
break;
|
|
|
|
case APC_USER:
|
2003-04-05 00:26:34 +02:00
|
|
|
proc( arg1, arg2, arg3 );
|
2003-03-31 03:37:04 +02:00
|
|
|
break;
|
|
|
|
case APC_TIMER:
|
|
|
|
/* convert sec/usec to NT time */
|
2003-04-05 00:26:34 +02:00
|
|
|
RtlSecondsSince1970ToTime( (time_t)arg1, &time );
|
|
|
|
time.QuadPart += (DWORD)arg2 * 10;
|
|
|
|
proc( arg3, time.s.LowPart, time.s.HighPart );
|
2003-03-31 03:37:04 +02:00
|
|
|
break;
|
|
|
|
case APC_ASYNC_IO:
|
2003-04-05 00:26:34 +02:00
|
|
|
check_async_list( arg1, (DWORD) arg2 );
|
2003-03-31 03:37:04 +02:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
server_protocol_error( "get_apc_request: bad type %d\n", type );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* wait operations */
|
|
|
|
|
|
|
|
/******************************************************************
|
|
|
|
* NtWaitForMultipleObjects (NTDLL.@)
|
|
|
|
*/
|
|
|
|
NTSTATUS WINAPI NtWaitForMultipleObjects( DWORD count, const HANDLE *handles,
|
|
|
|
BOOLEAN wait_all, BOOLEAN alertable,
|
|
|
|
PLARGE_INTEGER timeout )
|
|
|
|
{
|
|
|
|
int ret, cookie;
|
|
|
|
|
|
|
|
if (count > MAXIMUM_WAIT_OBJECTS) return STATUS_INVALID_PARAMETER_1;
|
|
|
|
|
|
|
|
for (;;)
|
|
|
|
{
|
|
|
|
SERVER_START_REQ( select )
|
|
|
|
{
|
|
|
|
req->flags = SELECT_INTERRUPTIBLE;
|
|
|
|
req->cookie = &cookie;
|
2003-04-03 00:48:59 +02:00
|
|
|
NTDLL_get_server_timeout( &req->timeout, timeout );
|
2003-03-31 03:37:04 +02:00
|
|
|
wine_server_add_data( req, handles, count * sizeof(HANDLE) );
|
|
|
|
|
|
|
|
if (wait_all) req->flags |= SELECT_ALL;
|
|
|
|
if (alertable) req->flags |= SELECT_ALERTABLE;
|
|
|
|
if (timeout) req->flags |= SELECT_TIMEOUT;
|
|
|
|
|
|
|
|
ret = wine_server_call( req );
|
|
|
|
}
|
|
|
|
SERVER_END_REQ;
|
|
|
|
if (ret == STATUS_PENDING) ret = wait_reply( &cookie );
|
|
|
|
if (ret != STATUS_USER_APC) break;
|
|
|
|
call_apcs( alertable );
|
|
|
|
if (alertable) break;
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************
|
|
|
|
* NtWaitForSingleObject (NTDLL.@)
|
|
|
|
*/
|
|
|
|
NTSTATUS WINAPI NtWaitForSingleObject(HANDLE handle, BOOLEAN alertable, PLARGE_INTEGER timeout )
|
|
|
|
{
|
|
|
|
return NtWaitForMultipleObjects( 1, &handle, FALSE, alertable, timeout );
|
|
|
|
}
|