3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/nt/ntsem.c
6 * PURPOSE: Synchronization primitives
7 * PROGRAMMER: David Welch (welch@mcmail.com)
12 /* INCLUDES *****************************************************************/
15 #define NTOS_MODE_KERNEL
17 #include <ntos/synch.h>
18 #include <internal/pool.h>
19 #include <internal/ps.h>
22 #include <internal/debug.h>
24 /* GLOBALS ******************************************************************/
26 POBJECT_TYPE ExSemaphoreType;
28 static GENERIC_MAPPING ExSemaphoreMapping = {
29 STANDARD_RIGHTS_READ | SEMAPHORE_QUERY_STATE,
30 STANDARD_RIGHTS_WRITE | SEMAPHORE_MODIFY_STATE,
31 STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE | SEMAPHORE_QUERY_STATE,
32 SEMAPHORE_ALL_ACCESS};
34 /* FUNCTIONS *****************************************************************/
37 NtpCreateSemaphore(PVOID ObjectBody,
40 POBJECT_ATTRIBUTES ObjectAttributes)
42 DPRINT("NtpCreateSemaphore(ObjectBody %x, Parent %x, RemainingPath %S)\n",
43 ObjectBody, Parent, RemainingPath);
45 if (RemainingPath != NULL && wcschr(RemainingPath+1, '\\') != NULL)
47 return(STATUS_UNSUCCESSFUL);
50 return(STATUS_SUCCESS);
53 VOID NtInitializeSemaphoreImplementation(VOID)
55 ExSemaphoreType = ExAllocatePool(NonPagedPool, sizeof(OBJECT_TYPE));
57 RtlCreateUnicodeString(&ExSemaphoreType->TypeName, L"Semaphore");
59 ExSemaphoreType->Tag = TAG('S', 'E', 'M', 'T');
60 ExSemaphoreType->MaxObjects = ULONG_MAX;
61 ExSemaphoreType->MaxHandles = ULONG_MAX;
62 ExSemaphoreType->TotalObjects = 0;
63 ExSemaphoreType->TotalHandles = 0;
64 ExSemaphoreType->PagedPoolCharge = 0;
65 ExSemaphoreType->NonpagedPoolCharge = sizeof(KSEMAPHORE);
66 ExSemaphoreType->Mapping = &ExSemaphoreMapping;
67 ExSemaphoreType->Dump = NULL;
68 ExSemaphoreType->Open = NULL;
69 ExSemaphoreType->Close = NULL;
70 ExSemaphoreType->Delete = NULL;
71 ExSemaphoreType->Parse = NULL;
72 ExSemaphoreType->Security = NULL;
73 ExSemaphoreType->QueryName = NULL;
74 ExSemaphoreType->OkayToClose = NULL;
75 ExSemaphoreType->Create = NtpCreateSemaphore;
76 ExSemaphoreType->DuplicationNotify = NULL;
80 NtCreateSemaphore(OUT PHANDLE SemaphoreHandle,
81 IN ACCESS_MASK DesiredAccess,
82 IN POBJECT_ATTRIBUTES ObjectAttributes,
86 PKSEMAPHORE Semaphore;
89 Status = ObRosCreateObject(SemaphoreHandle,
94 if (!NT_SUCCESS(Status))
98 KeInitializeSemaphore(Semaphore,
101 ObDereferenceObject(Semaphore);
102 return(STATUS_SUCCESS);
107 NtOpenSemaphore(IN HANDLE SemaphoreHandle,
108 IN ACCESS_MASK DesiredAccess,
109 IN POBJECT_ATTRIBUTES ObjectAttributes)
113 Status = ObOpenObjectByName(ObjectAttributes,
126 NtQuerySemaphore(IN HANDLE SemaphoreHandle,
127 IN SEMAPHORE_INFORMATION_CLASS SemaphoreInformationClass,
128 OUT PVOID SemaphoreInformation,
129 IN ULONG SemaphoreInformationLength,
130 OUT PULONG ReturnLength)
132 PSEMAPHORE_BASIC_INFORMATION Info;
133 PKSEMAPHORE Semaphore;
136 Info = (PSEMAPHORE_BASIC_INFORMATION)SemaphoreInformation;
138 if (SemaphoreInformationClass > SemaphoreBasicInformation)
139 return STATUS_INVALID_INFO_CLASS;
141 if (SemaphoreInformationLength < sizeof(SEMAPHORE_BASIC_INFORMATION))
142 return STATUS_INFO_LENGTH_MISMATCH;
144 Status = ObReferenceObjectByHandle(SemaphoreHandle,
145 SEMAPHORE_QUERY_STATE,
150 if (!NT_SUCCESS(Status))
153 Info->CurrentCount = KeReadStateSemaphore(Semaphore);
154 Info->MaximumCount = Semaphore->Limit;
156 *ReturnLength = sizeof(SEMAPHORE_BASIC_INFORMATION);
158 ObDereferenceObject(Semaphore);
160 return STATUS_SUCCESS;
164 NtReleaseSemaphore(IN HANDLE SemaphoreHandle,
165 IN LONG ReleaseCount,
166 OUT PLONG PreviousCount)
168 PKSEMAPHORE Semaphore;
171 Status = ObReferenceObjectByHandle(SemaphoreHandle,
172 SEMAPHORE_MODIFY_STATE,
177 if (!NT_SUCCESS(Status))
181 KeReleaseSemaphore(Semaphore,
185 ObDereferenceObject(Semaphore);
186 return(STATUS_SUCCESS);