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 <kernel32/kernel32.h>
19 /* FUNCTIONS *****************************************************************/
25 CreateMutexA(LPSECURITY_ATTRIBUTES lpMutexAttributes,
26 WINBOOL bInitialOwner,
33 RtlInitAnsiString(&Name,
35 RtlAnsiStringToUnicodeString(&NameU,
39 Handle = CreateMutexW(lpMutexAttributes,
43 RtlFreeUnicodeString(&NameU);
53 CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes,
54 WINBOOL bInitialOwner,
57 OBJECT_ATTRIBUTES ObjectAttributes;
59 UNICODE_STRING NameString;
62 RtlInitUnicodeString(&NameString,
65 ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
66 ObjectAttributes.RootDirectory = hBaseDir;
67 ObjectAttributes.ObjectName = &NameString;
68 ObjectAttributes.Attributes = 0;
69 ObjectAttributes.SecurityDescriptor = NULL;
70 ObjectAttributes.SecurityQualityOfService = NULL;
72 if (lpMutexAttributes != NULL)
74 ObjectAttributes.SecurityDescriptor = lpMutexAttributes->lpSecurityDescriptor;
75 if (lpMutexAttributes->bInheritHandle == TRUE)
77 ObjectAttributes.Attributes |= OBJ_INHERIT;
81 Status = NtCreateMutant(&MutantHandle,
84 (BOOLEAN)bInitialOwner);
85 if (!NT_SUCCESS(Status))
87 SetLastErrorByStatus(Status);
99 OpenMutexA(DWORD dwDesiredAccess,
100 WINBOOL bInheritHandle,
103 OBJECT_ATTRIBUTES ObjectAttributes;
104 UNICODE_STRING NameU;
111 SetLastErrorByStatus(STATUS_INVALID_PARAMETER);
115 RtlInitAnsiString(&Name,
117 RtlAnsiStringToUnicodeString(&NameU,
121 ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
122 ObjectAttributes.RootDirectory = hBaseDir;
123 ObjectAttributes.ObjectName = &NameU;
124 ObjectAttributes.Attributes = 0;
125 ObjectAttributes.SecurityDescriptor = NULL;
126 ObjectAttributes.SecurityQualityOfService = NULL;
127 if (bInheritHandle == TRUE)
129 ObjectAttributes.Attributes |= OBJ_INHERIT;
132 Status = NtOpenMutant(&Handle,
133 (ACCESS_MASK)dwDesiredAccess,
136 RtlFreeUnicodeString(&NameU);
138 if (!NT_SUCCESS(Status))
140 SetLastErrorByStatus(Status);
152 OpenMutexW(DWORD dwDesiredAccess,
153 WINBOOL bInheritHandle,
156 OBJECT_ATTRIBUTES ObjectAttributes;
163 SetLastErrorByStatus(STATUS_INVALID_PARAMETER);
167 RtlInitUnicodeString(&Name,
170 ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
171 ObjectAttributes.RootDirectory = hBaseDir;
172 ObjectAttributes.ObjectName = &Name;
173 ObjectAttributes.Attributes = 0;
174 ObjectAttributes.SecurityDescriptor = NULL;
175 ObjectAttributes.SecurityQualityOfService = NULL;
176 if (bInheritHandle == TRUE)
178 ObjectAttributes.Attributes |= OBJ_INHERIT;
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);