Skip to content
Snippets Groups Projects
Commit fee65e46 authored by Alexandre Julliard's avatar Alexandre Julliard
Browse files

Don't crash when ObjectAttributes is NULL.

parent eafa3910
No related branches found
No related tags found
No related merge requests found
......@@ -17,15 +17,15 @@
DEFAULT_DEBUG_CHANNEL(ntdll);
/* copy a key name into the request buffer */
static inline NTSTATUS copy_nameU( LPWSTR Dest, PUNICODE_STRING Name )
static inline NTSTATUS copy_nameU( LPWSTR Dest, const OBJECT_ATTRIBUTES *attr )
{
if (Name->Buffer)
{
if ((Name->Length) > MAX_PATH) return STATUS_BUFFER_OVERFLOW;
lstrcpyW( Dest, Name->Buffer );
}
else Dest[0] = 0;
return STATUS_SUCCESS;
if (attr && attr->ObjectName && attr->ObjectName->Buffer)
{
if ((attr->ObjectName->Length) > MAX_PATH) return STATUS_BUFFER_OVERFLOW;
lstrcpyW( Dest, attr->ObjectName->Buffer );
}
else Dest[0] = 0;
return STATUS_SUCCESS;
}
/*
......@@ -42,48 +42,38 @@ NTSTATUS WINAPI NtCreateSemaphore(
IN ULONG InitialCount,
IN ULONG MaximumCount)
{
struct create_semaphore_request *req = get_req_buffer();
HRESULT ret;
FIXME("(%p,0x%08lx,%p,0x%08lx,0x%08lx) stub!\n",
SemaphoreHandle, DesiredAccess, ObjectAttributes, InitialCount, MaximumCount);
dump_ObjectAttributes(ObjectAttributes);
if ((MaximumCount <= 0) || (InitialCount < 0) || (InitialCount > MaximumCount))
return STATUS_INVALID_PARAMETER;
*SemaphoreHandle = 0;
req->initial = InitialCount;
req->max = MaximumCount;
req->inherit = ObjectAttributes->Attributes & OBJ_INHERIT;
copy_nameU( req->name, ObjectAttributes->ObjectName );
if (!(ret = server_call_noerr( REQ_CREATE_SEMAPHORE )))
*SemaphoreHandle = req->handle;
return ret;
struct create_semaphore_request *req = get_req_buffer();
NTSTATUS ret;
if ((MaximumCount <= 0) || (InitialCount < 0) || (InitialCount > MaximumCount))
return STATUS_INVALID_PARAMETER;
*SemaphoreHandle = 0;
req->initial = InitialCount;
req->max = MaximumCount;
req->inherit = ObjectAttributes && (ObjectAttributes->Attributes & OBJ_INHERIT);
if (!(ret = copy_nameU( req->name, ObjectAttributes )) &&
!(ret = server_call_noerr( REQ_CREATE_SEMAPHORE ))) *SemaphoreHandle = req->handle;
return ret;
}
/******************************************************************************
* NtOpenSemaphore
*
* FIXME
*/
NTSTATUS WINAPI NtOpenSemaphore(
IN HANDLE SemaphoreHandle,
OUT PHANDLE SemaphoreHandle,
IN ACCESS_MASK DesiredAcces,
IN POBJECT_ATTRIBUTES ObjectAttributes)
{
struct open_semaphore_request *req = get_req_buffer();
HRESULT ret;
FIXME("(0x%08x,0x%08lx,%p) stub!\n",
SemaphoreHandle, DesiredAcces, ObjectAttributes);
dump_ObjectAttributes(ObjectAttributes);
req->access = DesiredAcces;
req->inherit = ObjectAttributes->Attributes & OBJ_INHERIT;
copy_nameU( req->name, ObjectAttributes->ObjectName );
if ((ret = server_call_noerr( REQ_OPEN_SEMAPHORE )) != STATUS_SUCCESS) return -1;
return req->handle;
struct open_semaphore_request *req = get_req_buffer();
NTSTATUS ret;
*SemaphoreHandle = 0;
req->access = DesiredAcces;
req->inherit = ObjectAttributes && (ObjectAttributes->Attributes & OBJ_INHERIT);
if (!(ret = copy_nameU( req->name, ObjectAttributes )) &&
!(ret = server_call_noerr( REQ_OPEN_SEMAPHORE ))) *SemaphoreHandle = req->handle;
return ret;
}
/******************************************************************************
......@@ -108,21 +98,18 @@ NTSTATUS WINAPI NtReleaseSemaphore(
IN ULONG ReleaseCount,
IN PULONG PreviousCount)
{
struct release_semaphore_request *req = get_req_buffer();
HRESULT ret;
FIXME("(0x%08x,0x%08lx,%p,) stub!\n",
SemaphoreHandle, ReleaseCount, PreviousCount);
if (ReleaseCount < 0) return STATUS_INVALID_PARAMETER;
req->handle = SemaphoreHandle;
req->count = ReleaseCount;
if (!(ret = server_call_noerr( REQ_RELEASE_SEMAPHORE )))
{
if (PreviousCount) *PreviousCount = req->prev_count;
}
return ret;
struct release_semaphore_request *req = get_req_buffer();
NTSTATUS ret;
if (ReleaseCount < 0) return STATUS_INVALID_PARAMETER;
req->handle = SemaphoreHandle;
req->count = ReleaseCount;
if (!(ret = server_call_noerr( REQ_RELEASE_SEMAPHORE )))
{
if (PreviousCount) *PreviousCount = req->prev_count;
}
return ret;
}
/*
......@@ -139,20 +126,16 @@ NTSTATUS WINAPI NtCreateEvent(
IN BOOLEAN ManualReset,
IN BOOLEAN InitialState)
{
struct create_event_request *req = get_req_buffer();
HRESULT ret;
FIXME("(%p,0x%08lx,%p,%08x,%08x): empty stub\n",
EventHandle,DesiredAccess,ObjectAttributes,ManualReset,InitialState);
dump_ObjectAttributes(ObjectAttributes);
*EventHandle = 0;
req->manual_reset = ManualReset;
req->initial_state = InitialState;
req->inherit = ObjectAttributes->Attributes & OBJ_INHERIT;
copy_nameU( req->name, ObjectAttributes->ObjectName );
if (!(ret = server_call_noerr( REQ_CREATE_EVENT ))) *EventHandle = req->handle;
return ret;
struct create_event_request *req = get_req_buffer();
NTSTATUS ret;
*EventHandle = 0;
req->manual_reset = ManualReset;
req->initial_state = InitialState;
req->inherit = ObjectAttributes && (ObjectAttributes->Attributes & OBJ_INHERIT);
if (!(ret = copy_nameU( req->name, ObjectAttributes )) &&
!(ret = server_call_noerr( REQ_CREATE_EVENT ))) *EventHandle = req->handle;
return ret;
}
/******************************************************************************
......@@ -163,36 +146,17 @@ NTSTATUS WINAPI NtOpenEvent(
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes)
{
struct open_event_request *req = get_req_buffer();
HRESULT ret;
FIXME("(%p,0x%08lx,%p),stub!\n",
EventHandle,DesiredAccess,ObjectAttributes);
dump_ObjectAttributes(ObjectAttributes);
*EventHandle = 0;
req->access = DesiredAccess;
req->inherit = ObjectAttributes->Attributes & OBJ_INHERIT;
copy_nameU( req->name, ObjectAttributes->ObjectName );
if (!(ret = server_call_noerr( REQ_OPEN_EVENT ))) *EventHandle = req->handle;
return ret;
struct open_event_request *req = get_req_buffer();
NTSTATUS ret;
*EventHandle = 0;
req->access = DesiredAccess;
req->inherit = ObjectAttributes && (ObjectAttributes->Attributes & OBJ_INHERIT);
if (!(ret = copy_nameU( req->name, ObjectAttributes )) &&
!(ret = server_call_noerr( REQ_OPEN_EVENT ))) *EventHandle = req->handle;
return ret;
}
/***********************************************************************
* EVENT_Operation
*
* Execute an event operation (set,reset,pulse).
*/
static NTSTATUS EVENT_Operation(
HANDLE handle,
PULONG NumberOfThreadsReleased,
enum event_op op )
{
struct event_op_request *req = get_req_buffer();
req->handle = handle;
req->op = op;
return server_call_noerr( REQ_EVENT_OP );
}
/******************************************************************************
* NtSetEvent
......@@ -201,9 +165,11 @@ NTSTATUS WINAPI NtSetEvent(
IN HANDLE EventHandle,
PULONG NumberOfThreadsReleased)
{
FIXME("(0x%08x,%p)\n", EventHandle, NumberOfThreadsReleased);
return EVENT_Operation(EventHandle, NumberOfThreadsReleased, SET_EVENT);
struct event_op_request *req = get_req_buffer();
FIXME("(0x%08x,%p)\n", EventHandle, NumberOfThreadsReleased);
req->handle = EventHandle;
req->op = SET_EVENT;
return server_call_noerr( REQ_EVENT_OP );
}
/******************************************************************************
......@@ -213,9 +179,11 @@ NTSTATUS WINAPI NtResetEvent(
IN HANDLE EventHandle,
PULONG NumberOfThreadsReleased)
{
FIXME("(0x%08x,%p)\n", EventHandle, NumberOfThreadsReleased);
return EVENT_Operation(EventHandle, NumberOfThreadsReleased, RESET_EVENT);
struct event_op_request *req = get_req_buffer();
FIXME("(0x%08x,%p)\n", EventHandle, NumberOfThreadsReleased);
req->handle = EventHandle;
req->op = RESET_EVENT;
return server_call_noerr( REQ_EVENT_OP );
}
/******************************************************************************
......@@ -227,8 +195,7 @@ NTSTATUS WINAPI NtResetEvent(
NTSTATUS WINAPI NtClearEvent (
IN HANDLE EventHandle)
{
FIXME("(0x%08x)\n", EventHandle);
return EVENT_Operation(EventHandle, NULL, RESET_EVENT);
return NtResetEvent( EventHandle, NULL );
}
/******************************************************************************
......@@ -241,9 +208,11 @@ NTSTATUS WINAPI NtPulseEvent(
IN HANDLE EventHandle,
IN PULONG PulseCount)
{
FIXME("(0x%08x,%p)\n", EventHandle, PulseCount);
return EVENT_Operation(EventHandle, NULL, PULSE_EVENT);
struct event_op_request *req = get_req_buffer();
FIXME("(0x%08x,%p)\n", EventHandle, PulseCount);
req->handle = EventHandle;
req->op = PULSE_EVENT;
return server_call_noerr( REQ_EVENT_OP );
}
/******************************************************************************
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment