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 *****************************************************************/
14 #include <ddk/ntddk.h>
15 #include <kernel32/error.h>
19 #include <kernel32/kernel32.h>
21 /* FUNCTIONS *****************************************************************/
24 CreateMutexA(LPSECURITY_ATTRIBUTES lpMutexAttributes,
25 WINBOOL bInitialOwner,
32 RtlInitAnsiString(&Name,
34 RtlAnsiStringToUnicodeString(&NameU,
38 Handle = CreateMutexW(lpMutexAttributes,
42 RtlFreeUnicodeString(&NameU);
49 CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes,
50 WINBOOL bInitialOwner,
53 OBJECT_ATTRIBUTES ObjectAttributes;
55 UNICODE_STRING NameString;
58 RtlInitUnicodeString(&NameString,
61 ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
62 ObjectAttributes.RootDirectory = hBaseDir;
63 ObjectAttributes.ObjectName = &NameString;
64 ObjectAttributes.Attributes = 0;
65 ObjectAttributes.SecurityDescriptor = NULL;
66 ObjectAttributes.SecurityQualityOfService = NULL;
68 if (lpMutexAttributes != NULL)
70 ObjectAttributes.SecurityDescriptor = lpMutexAttributes->lpSecurityDescriptor;
71 if (lpMutexAttributes->bInheritHandle == TRUE)
73 ObjectAttributes.Attributes |= OBJ_INHERIT;
77 Status = NtCreateMutant(&MutantHandle,
80 (BOOLEAN)bInitialOwner);
81 if (!NT_SUCCESS(Status))
83 SetLastErrorByStatus(Status);
92 OpenMutexA(DWORD dwDesiredAccess,
93 WINBOOL bInheritHandle,
96 OBJECT_ATTRIBUTES ObjectAttributes;
104 SetLastErrorByStatus(STATUS_INVALID_PARAMETER);
108 RtlInitAnsiString(&Name,
110 RtlAnsiStringToUnicodeString(&NameU,
114 ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
115 ObjectAttributes.RootDirectory = hBaseDir;
116 ObjectAttributes.ObjectName = &NameU;
117 ObjectAttributes.Attributes = 0;
118 ObjectAttributes.SecurityDescriptor = NULL;
119 ObjectAttributes.SecurityQualityOfService = NULL;
120 if (bInheritHandle == TRUE)
122 ObjectAttributes.Attributes |= OBJ_INHERIT;
125 Status = NtOpenMutant(&Handle,
126 (ACCESS_MASK)dwDesiredAccess,
129 RtlFreeUnicodeString(&NameU);
131 if (!NT_SUCCESS(Status))
133 SetLastErrorByStatus(Status);
142 OpenMutexW(DWORD dwDesiredAccess,
143 WINBOOL bInheritHandle,
146 OBJECT_ATTRIBUTES ObjectAttributes;
153 SetLastErrorByStatus(STATUS_INVALID_PARAMETER);
157 RtlInitUnicodeString(&Name,
160 ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
161 ObjectAttributes.RootDirectory = hBaseDir;
162 ObjectAttributes.ObjectName = &Name;
163 ObjectAttributes.Attributes = 0;
164 ObjectAttributes.SecurityDescriptor = NULL;
165 ObjectAttributes.SecurityQualityOfService = NULL;
166 if (bInheritHandle == TRUE)
168 ObjectAttributes.Attributes |= OBJ_INHERIT;
171 Status = NtOpenMutant(&Handle,
172 (ACCESS_MASK)dwDesiredAccess,
174 if (!NT_SUCCESS(Status))
176 SetLastErrorByStatus(Status);
185 ReleaseMutex(HANDLE hMutex)
189 Status = NtReleaseMutant(hMutex,
191 if (!NT_SUCCESS(Status))
193 SetLastErrorByStatus(Status);