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 *****************************************************************/
22 CreateMutexA(LPSECURITY_ATTRIBUTES lpMutexAttributes,
23 WINBOOL bInitialOwner,
30 RtlInitAnsiString(&Name,
32 RtlAnsiStringToUnicodeString(&NameU,
36 Handle = CreateMutexW(lpMutexAttributes,
40 RtlFreeUnicodeString(&NameU);
47 CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes,
48 WINBOOL bInitialOwner,
51 OBJECT_ATTRIBUTES ObjectAttributes;
53 UNICODE_STRING NameString;
56 RtlInitUnicodeString(&NameString,
59 ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
60 ObjectAttributes.RootDirectory = hBaseDir;
61 ObjectAttributes.ObjectName = &NameString;
62 ObjectAttributes.Attributes = 0;
63 ObjectAttributes.SecurityDescriptor = NULL;
64 ObjectAttributes.SecurityQualityOfService = NULL;
66 if (lpMutexAttributes != NULL)
68 ObjectAttributes.SecurityDescriptor = lpMutexAttributes->lpSecurityDescriptor;
69 if (lpMutexAttributes->bInheritHandle == TRUE)
71 ObjectAttributes.Attributes |= OBJ_INHERIT;
75 Status = NtCreateMutant(&MutantHandle,
78 (BOOLEAN)bInitialOwner);
79 if (!NT_SUCCESS(Status))
81 SetLastErrorByStatus(Status);
90 OpenMutexA(DWORD dwDesiredAccess,
91 WINBOOL bInheritHandle,
94 OBJECT_ATTRIBUTES ObjectAttributes;
102 SetLastErrorByStatus(STATUS_INVALID_PARAMETER);
106 RtlInitAnsiString(&Name,
108 RtlAnsiStringToUnicodeString(&NameU,
112 ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
113 ObjectAttributes.RootDirectory = hBaseDir;
114 ObjectAttributes.ObjectName = &NameU;
115 ObjectAttributes.Attributes = 0;
116 ObjectAttributes.SecurityDescriptor = NULL;
117 ObjectAttributes.SecurityQualityOfService = NULL;
118 if (bInheritHandle == TRUE)
120 ObjectAttributes.Attributes |= OBJ_INHERIT;
123 Status = NtOpenMutant(&Handle,
124 (ACCESS_MASK)dwDesiredAccess,
127 RtlFreeUnicodeString(&NameU);
129 if (!NT_SUCCESS(Status))
131 SetLastErrorByStatus(Status);
140 OpenMutexW(DWORD dwDesiredAccess,
141 WINBOOL bInheritHandle,
144 OBJECT_ATTRIBUTES ObjectAttributes;
151 SetLastErrorByStatus(STATUS_INVALID_PARAMETER);
155 RtlInitUnicodeString(&Name,
158 ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
159 ObjectAttributes.RootDirectory = hBaseDir;
160 ObjectAttributes.ObjectName = &Name;
161 ObjectAttributes.Attributes = 0;
162 ObjectAttributes.SecurityDescriptor = NULL;
163 ObjectAttributes.SecurityQualityOfService = NULL;
164 if (bInheritHandle == TRUE)
166 ObjectAttributes.Attributes |= OBJ_INHERIT;
169 Status = NtOpenMutant(&Handle,
170 (ACCESS_MASK)dwDesiredAccess,
172 if (!NT_SUCCESS(Status))
174 SetLastErrorByStatus(Status);
183 ReleaseMutex(HANDLE hMutex)
187 Status = NtReleaseMutant(hMutex,
189 if (!NT_SUCCESS(Status))
191 SetLastErrorByStatus(Status);