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
),
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 (!NT_SUCCESS(Status
))
97 SetLastErrorByStatus(Status
);
109 OpenMutexA(DWORD dwDesiredAccess
,
113 OBJECT_ATTRIBUTES ObjectAttributes
;
114 UNICODE_STRING NameU
;
121 SetLastErrorByStatus(STATUS_INVALID_PARAMETER
);
125 RtlInitAnsiString(&Name
,
127 RtlAnsiStringToUnicodeString(&NameU
,
131 InitializeObjectAttributes(&ObjectAttributes
,
133 (bInheritHandle
? OBJ_INHERIT
: 0),
137 Status
= NtOpenMutant(&Handle
,
138 (ACCESS_MASK
)dwDesiredAccess
,
141 RtlFreeUnicodeString(&NameU
);
143 if (!NT_SUCCESS(Status
))
145 SetLastErrorByStatus(Status
);
157 OpenMutexW(DWORD dwDesiredAccess
,
161 OBJECT_ATTRIBUTES ObjectAttributes
;
168 SetLastErrorByStatus(STATUS_INVALID_PARAMETER
);
172 RtlInitUnicodeString(&Name
,
175 InitializeObjectAttributes(&ObjectAttributes
,
177 (bInheritHandle
? OBJ_INHERIT
: 0),
181 Status
= NtOpenMutant(&Handle
,
182 (ACCESS_MASK
)dwDesiredAccess
,
184 if (!NT_SUCCESS(Status
))
186 SetLastErrorByStatus(Status
);
198 ReleaseMutex(HANDLE hMutex
)
202 Status
= NtReleaseMutant(hMutex
,
204 if (!NT_SUCCESS(Status
))
206 SetLastErrorByStatus(Status
);