1 /* $Id: mutex.c,v 1.4 2002/09/08 10:22:45 chorns Exp $
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
);