2 * Process synchronisation
9 #include "debugtools.h"
12 #include "wine/unicode.h"
15 #include "ntdll_misc.h"
17 DEFAULT_DEBUG_CHANNEL(ntdll
);
24 /******************************************************************************
27 NTSTATUS WINAPI
NtCreateSemaphore( OUT PHANDLE SemaphoreHandle
,
28 IN ACCESS_MASK access
,
29 IN
const OBJECT_ATTRIBUTES
*attr OPTIONAL
,
30 IN ULONG InitialCount
,
31 IN ULONG MaximumCount
)
33 DWORD len
= attr
&& attr
->ObjectName
? attr
->ObjectName
->Length
: 0;
36 if ((MaximumCount
<= 0) || (InitialCount
< 0) || (InitialCount
> MaximumCount
))
37 return STATUS_INVALID_PARAMETER
;
39 SERVER_START_VAR_REQ( create_semaphore
, len
)
41 req
->initial
= InitialCount
;
42 req
->max
= MaximumCount
;
43 req
->inherit
= attr
&& (attr
->Attributes
& OBJ_INHERIT
);
44 if (len
) memcpy( server_data_ptr(req
), attr
->ObjectName
->Buffer
, len
);
46 *SemaphoreHandle
= req
->handle
;
52 /******************************************************************************
55 NTSTATUS WINAPI
NtOpenSemaphore( OUT PHANDLE SemaphoreHandle
,
56 IN ACCESS_MASK access
,
57 IN
const OBJECT_ATTRIBUTES
*attr
)
59 DWORD len
= attr
&& attr
->ObjectName
? attr
->ObjectName
->Length
: 0;
62 SERVER_START_VAR_REQ( open_semaphore
, len
)
65 req
->inherit
= attr
&& (attr
->Attributes
& OBJ_INHERIT
);
66 if (len
) memcpy( server_data_ptr(req
), attr
->ObjectName
->Buffer
, len
);
68 *SemaphoreHandle
= req
->handle
;
74 /******************************************************************************
77 NTSTATUS WINAPI
NtQuerySemaphore(
78 HANDLE SemaphoreHandle
,
79 PVOID SemaphoreInformationClass
,
80 OUT PVOID SemaphoreInformation
,
84 FIXME("(0x%08x,%p,%p,0x%08lx,%p) stub!\n",
85 SemaphoreHandle
, SemaphoreInformationClass
, SemaphoreInformation
, Length
, ReturnLength
);
86 return STATUS_SUCCESS
;
89 /******************************************************************************
92 NTSTATUS WINAPI
NtReleaseSemaphore( HANDLE handle
, ULONG count
, PULONG previous
)
95 SERVER_START_REQ( release_semaphore
)
99 if (!(ret
= SERVER_CALL()))
101 if (previous
) *previous
= req
->prev_count
;
112 /**************************************************************************
115 NTSTATUS WINAPI
NtCreateEvent(
116 OUT PHANDLE EventHandle
,
117 IN ACCESS_MASK DesiredAccess
,
118 IN
const OBJECT_ATTRIBUTES
*attr
,
119 IN BOOLEAN ManualReset
,
120 IN BOOLEAN InitialState
)
122 DWORD len
= attr
&& attr
->ObjectName
? attr
->ObjectName
->Length
: 0;
125 SERVER_START_VAR_REQ( create_event
, len
)
127 req
->manual_reset
= ManualReset
;
128 req
->initial_state
= InitialState
;
129 req
->inherit
= attr
&& (attr
->Attributes
& OBJ_INHERIT
);
130 if (len
) memcpy( server_data_ptr(req
), attr
->ObjectName
->Buffer
, len
);
132 *EventHandle
= req
->handle
;
138 /******************************************************************************
141 NTSTATUS WINAPI
NtOpenEvent(
142 OUT PHANDLE EventHandle
,
143 IN ACCESS_MASK DesiredAccess
,
144 IN
const OBJECT_ATTRIBUTES
*attr
)
146 DWORD len
= attr
&& attr
->ObjectName
? attr
->ObjectName
->Length
: 0;
149 SERVER_START_VAR_REQ( open_event
, len
)
151 req
->access
= DesiredAccess
;
152 req
->inherit
= attr
&& (attr
->Attributes
& OBJ_INHERIT
);
153 if (len
) memcpy( server_data_ptr(req
), attr
->ObjectName
->Buffer
, len
);
155 *EventHandle
= req
->handle
;
162 /******************************************************************************
165 NTSTATUS WINAPI
NtSetEvent( HANDLE handle
, PULONG NumberOfThreadsReleased
)
169 /* FIXME: set NumberOfThreadsReleased */
171 SERVER_START_REQ( event_op
)
173 req
->handle
= handle
;
181 /******************************************************************************
184 NTSTATUS WINAPI
NtResetEvent( HANDLE handle
, PULONG NumberOfThreadsReleased
)
188 /* resetting an event can't release any thread... */
189 if (NumberOfThreadsReleased
) *NumberOfThreadsReleased
= 0;
191 SERVER_START_REQ( event_op
)
193 req
->handle
= handle
;
194 req
->op
= RESET_EVENT
;
201 /******************************************************************************
205 * same as NtResetEvent ???
207 NTSTATUS WINAPI
NtClearEvent ( HANDLE handle
)
209 return NtResetEvent( handle
, NULL
);
212 /******************************************************************************
218 NTSTATUS WINAPI
NtPulseEvent( HANDLE handle
, PULONG PulseCount
)
221 FIXME("(0x%08x,%p)\n", handle
, PulseCount
);
222 SERVER_START_REQ( event_op
)
224 req
->handle
= handle
;
225 req
->op
= PULSE_EVENT
;
232 /******************************************************************************
235 NTSTATUS WINAPI
NtQueryEvent (
236 IN HANDLE EventHandle
,
237 IN UINT EventInformationClass
,
238 OUT PVOID EventInformation
,
239 IN ULONG EventInformationLength
,
240 OUT PULONG ReturnLength
)
242 FIXME("(0x%08x)\n", EventHandle
);
243 return STATUS_SUCCESS
;