3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/synch/mutex.c
6 * PURPOSE: Mutex functions
7 * PROGRAMMER: Eric Kohl (ekohl@rz-online.de)
12 /* INCLUDES *****************************************************************/
17 #include "../include/debug.h"
20 /* FUNCTIONS *****************************************************************/
26 CreateMutexA(LPSECURITY_ATTRIBUTES lpMutexAttributes
,
36 RtlInitAnsiString(&Name
,
39 RtlAnsiStringToUnicodeString(&NameU
,
44 Handle
= CreateMutexW(lpMutexAttributes
,
46 (lpName
? NameU
.Buffer
: NULL
));
50 RtlFreeUnicodeString(&NameU
);
61 CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes
,
65 OBJECT_ATTRIBUTES ObjectAttributes
;
67 UNICODE_STRING UnicodeName
;
72 RtlInitUnicodeString(&UnicodeName
,
76 InitializeObjectAttributes(&ObjectAttributes
,
77 (lpName
? &UnicodeName
: NULL
),
79 (lpName
? hBaseDir
: NULL
),
82 if (lpMutexAttributes
!= NULL
)
84 ObjectAttributes
.SecurityDescriptor
= lpMutexAttributes
->lpSecurityDescriptor
;
85 if (lpMutexAttributes
->bInheritHandle
)
87 ObjectAttributes
.Attributes
|= OBJ_INHERIT
;
91 Status
= NtCreateMutant(&MutantHandle
,
94 (BOOLEAN
)bInitialOwner
);
95 if (Status
== STATUS_OBJECT_NAME_COLLISION
)
97 Status
= NtOpenMutant(&MutantHandle
,
100 if (NT_SUCCESS(Status
))
102 SetLastError(ERROR_ALREADY_EXISTS
);
105 else if (NT_SUCCESS(Status
))
107 SetLastError(ERROR_SUCCESS
);
109 if (!NT_SUCCESS(Status
))
111 SetLastErrorByStatus(Status
);
123 OpenMutexA(DWORD dwDesiredAccess
,
127 OBJECT_ATTRIBUTES ObjectAttributes
;
128 UNICODE_STRING NameU
;
135 SetLastErrorByStatus(STATUS_INVALID_PARAMETER
);
139 RtlInitAnsiString(&Name
,
141 RtlAnsiStringToUnicodeString(&NameU
,
145 InitializeObjectAttributes(&ObjectAttributes
,
147 (bInheritHandle
? OBJ_INHERIT
: 0),
151 Status
= NtOpenMutant(&Handle
,
152 (ACCESS_MASK
)dwDesiredAccess
,
155 RtlFreeUnicodeString(&NameU
);
157 if (!NT_SUCCESS(Status
))
159 SetLastErrorByStatus(Status
);
171 OpenMutexW(DWORD dwDesiredAccess
,
175 OBJECT_ATTRIBUTES ObjectAttributes
;
182 SetLastErrorByStatus(STATUS_INVALID_PARAMETER
);
186 RtlInitUnicodeString(&Name
,
189 InitializeObjectAttributes(&ObjectAttributes
,
191 (bInheritHandle
? OBJ_INHERIT
: 0),
195 Status
= NtOpenMutant(&Handle
,
196 (ACCESS_MASK
)dwDesiredAccess
,
198 if (!NT_SUCCESS(Status
))
200 SetLastErrorByStatus(Status
);
212 ReleaseMutex(HANDLE hMutex
)
216 Status
= NtReleaseMutant(hMutex
,
218 if (!NT_SUCCESS(Status
))
220 SetLastErrorByStatus(Status
);