1 /* $Id: mutex.c,v 1.3 2002/09/07 15:12:28 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 *****************************************************************/
15 #define NTOS_USER_MODE
17 #include <kernel32/error.h>
21 #include <kernel32/kernel32.h>
23 /* FUNCTIONS *****************************************************************/
26 CreateMutexA(LPSECURITY_ATTRIBUTES lpMutexAttributes
,
27 WINBOOL bInitialOwner
,
34 RtlInitAnsiString(&Name
,
36 RtlAnsiStringToUnicodeString(&NameU
,
40 Handle
= CreateMutexW(lpMutexAttributes
,
44 RtlFreeUnicodeString(&NameU
);
51 CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes
,
52 WINBOOL bInitialOwner
,
55 OBJECT_ATTRIBUTES ObjectAttributes
;
57 UNICODE_STRING NameString
;
60 RtlInitUnicodeString(&NameString
,
63 ObjectAttributes
.Length
= sizeof(OBJECT_ATTRIBUTES
);
64 ObjectAttributes
.RootDirectory
= hBaseDir
;
65 ObjectAttributes
.ObjectName
= &NameString
;
66 ObjectAttributes
.Attributes
= 0;
67 ObjectAttributes
.SecurityDescriptor
= NULL
;
68 ObjectAttributes
.SecurityQualityOfService
= NULL
;
70 if (lpMutexAttributes
!= NULL
)
72 ObjectAttributes
.SecurityDescriptor
= lpMutexAttributes
->lpSecurityDescriptor
;
73 if (lpMutexAttributes
->bInheritHandle
== TRUE
)
75 ObjectAttributes
.Attributes
|= OBJ_INHERIT
;
79 Status
= NtCreateMutant(&MutantHandle
,
82 (BOOLEAN
)bInitialOwner
);
83 if (!NT_SUCCESS(Status
))
85 SetLastErrorByStatus(Status
);
94 OpenMutexA(DWORD dwDesiredAccess
,
95 WINBOOL bInheritHandle
,
98 OBJECT_ATTRIBUTES ObjectAttributes
;
106 SetLastErrorByStatus(STATUS_INVALID_PARAMETER
);
110 RtlInitAnsiString(&Name
,
112 RtlAnsiStringToUnicodeString(&NameU
,
116 ObjectAttributes
.Length
= sizeof(OBJECT_ATTRIBUTES
);
117 ObjectAttributes
.RootDirectory
= hBaseDir
;
118 ObjectAttributes
.ObjectName
= &NameU
;
119 ObjectAttributes
.Attributes
= 0;
120 ObjectAttributes
.SecurityDescriptor
= NULL
;
121 ObjectAttributes
.SecurityQualityOfService
= NULL
;
122 if (bInheritHandle
== TRUE
)
124 ObjectAttributes
.Attributes
|= OBJ_INHERIT
;
127 Status
= NtOpenMutant(&Handle
,
128 (ACCESS_MASK
)dwDesiredAccess
,
131 RtlFreeUnicodeString(&NameU
);
133 if (!NT_SUCCESS(Status
))
135 SetLastErrorByStatus(Status
);
144 OpenMutexW(DWORD dwDesiredAccess
,
145 WINBOOL bInheritHandle
,
148 OBJECT_ATTRIBUTES ObjectAttributes
;
155 SetLastErrorByStatus(STATUS_INVALID_PARAMETER
);
159 RtlInitUnicodeString(&Name
,
162 ObjectAttributes
.Length
= sizeof(OBJECT_ATTRIBUTES
);
163 ObjectAttributes
.RootDirectory
= hBaseDir
;
164 ObjectAttributes
.ObjectName
= &Name
;
165 ObjectAttributes
.Attributes
= 0;
166 ObjectAttributes
.SecurityDescriptor
= NULL
;
167 ObjectAttributes
.SecurityQualityOfService
= NULL
;
168 if (bInheritHandle
== TRUE
)
170 ObjectAttributes
.Attributes
|= OBJ_INHERIT
;
173 Status
= NtOpenMutant(&Handle
,
174 (ACCESS_MASK
)dwDesiredAccess
,
176 if (!NT_SUCCESS(Status
))
178 SetLastErrorByStatus(Status
);
187 ReleaseMutex(HANDLE hMutex
)
191 Status
= NtReleaseMutant(hMutex
,
193 if (!NT_SUCCESS(Status
))
195 SetLastErrorByStatus(Status
);