3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/synch/sem.c
6 * PURPOSE: Semaphore functions
7 * PROGRAMMER: Eric Kohl (ekohl@rz-online.de)
12 /* INCLUDES *****************************************************************/
17 #include "../include/debug.h"
20 /* FUNCTIONS ****************************************************************/
26 CreateSemaphoreA(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes
,
37 RtlInitAnsiString(&Name
,
39 RtlAnsiStringToUnicodeString(&NameU
,
44 Handle
= CreateSemaphoreW(lpSemaphoreAttributes
,
47 (lpName
? NameU
.Buffer
: NULL
));
51 RtlFreeUnicodeString (&NameU
);
62 CreateSemaphoreW(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes
,
67 OBJECT_ATTRIBUTES ObjectAttributes
;
69 UNICODE_STRING UnicodeName
;
70 HANDLE SemaphoreHandle
;
74 RtlInitUnicodeString(&UnicodeName
, lpName
);
77 InitializeObjectAttributes(&ObjectAttributes
,
78 (lpName
? &UnicodeName
: NULL
),
83 if (lpSemaphoreAttributes
!= NULL
)
85 ObjectAttributes
.SecurityDescriptor
= lpSemaphoreAttributes
->lpSecurityDescriptor
;
86 if (lpSemaphoreAttributes
->bInheritHandle
)
88 ObjectAttributes
.Attributes
|= OBJ_INHERIT
;
92 Status
= NtCreateSemaphore(&SemaphoreHandle
,
97 if (!NT_SUCCESS(Status
))
99 SetLastErrorByStatus(Status
);
102 return SemaphoreHandle
;
110 OpenSemaphoreA(DWORD dwDesiredAccess
,
114 OBJECT_ATTRIBUTES ObjectAttributes
;
115 UNICODE_STRING NameU
;
122 SetLastErrorByStatus(STATUS_INVALID_PARAMETER
);
126 RtlInitAnsiString(&Name
,
128 RtlAnsiStringToUnicodeString(&NameU
,
132 InitializeObjectAttributes(&ObjectAttributes
,
134 (bInheritHandle
? OBJ_INHERIT
: 0),
138 Status
= NtOpenSemaphore(&Handle
,
139 (ACCESS_MASK
)dwDesiredAccess
,
142 RtlFreeUnicodeString(&NameU
);
144 if (!NT_SUCCESS(Status
))
146 SetLastErrorByStatus(Status
);
158 OpenSemaphoreW(DWORD dwDesiredAccess
,
162 OBJECT_ATTRIBUTES ObjectAttributes
;
169 SetLastErrorByStatus(STATUS_INVALID_PARAMETER
);
173 RtlInitUnicodeString(&Name
,
176 InitializeObjectAttributes(&ObjectAttributes
,
178 (bInheritHandle
? OBJ_INHERIT
: 0),
182 Status
= NtOpenSemaphore(&Handle
,
183 (ACCESS_MASK
)dwDesiredAccess
,
185 if (!NT_SUCCESS(Status
))
187 SetLastErrorByStatus(Status
);
199 ReleaseSemaphore(HANDLE hSemaphore
,
201 LPLONG lpPreviousCount
)
205 Status
= NtReleaseSemaphore(hSemaphore
,
208 if (!NT_SUCCESS(Status
))
210 SetLastErrorByStatus(Status
);