mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
5.0 KiB
180 lines
5.0 KiB
/*++
|
|
|
|
Copyright (c) 1989 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
srvevent.c
|
|
|
|
Abstract:
|
|
|
|
This module implements the OS/2 V2.0 Shared Event Semaphore API Calls.
|
|
|
|
Author:
|
|
|
|
Steve Wood (stevewo) 07-Feb-1990
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#define INCL_OS2V20_SEMAPHORES
|
|
#define INCL_OS2V20_ERRORS
|
|
#include "os2srv.h"
|
|
|
|
BOOLEAN
|
|
Os2DosCreateEventSem(
|
|
IN POS2_THREAD t,
|
|
IN POS2_API_MSG m
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
POS2_DOSCREATEEVENTSEM_MSG a = &m->u.DosCreateEventSem;
|
|
OS2_SEMAPHORE Semaphore;
|
|
APIRET rc;
|
|
|
|
Semaphore.PointerCount = 0;
|
|
Semaphore.OpenCount = 1;
|
|
Semaphore.Type = Os2EventSem;
|
|
rc = Os2ProcessSemaphoreName( &a->ObjectName,
|
|
&Semaphore,
|
|
NULL
|
|
);
|
|
|
|
if (rc != NO_ERROR) {
|
|
ReleaseHandleTableLock( Os2SharedSemaphoreTable );
|
|
m->ReturnedErrorValue = rc;
|
|
return( TRUE );
|
|
}
|
|
|
|
rc = ERROR_NOT_ENOUGH_MEMORY;
|
|
Status = NtCreateEvent( &Semaphore.u.EventHandle,
|
|
EVENT_ALL_ACCESS,
|
|
NULL,
|
|
NotificationEvent,
|
|
a->InitialState
|
|
);
|
|
if (NT_SUCCESS( Status )) {
|
|
if (Or2CreateHandle( Os2SharedSemaphoreTable,
|
|
&a->HandleIndex,
|
|
(PVOID)&Semaphore
|
|
)
|
|
) {
|
|
Status = NtDuplicateObject( NtCurrentProcess(),
|
|
Semaphore.u.EventHandle,
|
|
t->Process->ProcessHandle,
|
|
&a->NtEventHandle,
|
|
EVENT_ALL_ACCESS,
|
|
0,
|
|
0
|
|
);
|
|
|
|
if (NT_SUCCESS( Status )) {
|
|
rc = NO_ERROR;
|
|
}
|
|
else {
|
|
NtClose( (HANDLE)Os2DestroySemaphore( &Semaphore,
|
|
a->HandleIndex
|
|
)
|
|
);
|
|
}
|
|
}
|
|
else {
|
|
NtClose( Semaphore.u.EventHandle );
|
|
ReleaseHandleTableLock( Os2SharedSemaphoreTable );
|
|
}
|
|
}
|
|
else {
|
|
ReleaseHandleTableLock( Os2SharedSemaphoreTable );
|
|
}
|
|
|
|
m->ReturnedErrorValue = rc;
|
|
return( TRUE );
|
|
}
|
|
|
|
|
|
BOOLEAN
|
|
Os2DosOpenEventSem(
|
|
IN POS2_THREAD t,
|
|
IN POS2_API_MSG m
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
POS2_DOSOPENEVENTSEM_MSG a = &m->u.DosOpenEventSem;
|
|
POS2_SEMAPHORE Semaphore;
|
|
APIRET rc;
|
|
|
|
rc = Os2ProcessSemaphoreName( &a->ObjectName,
|
|
NULL,
|
|
&a->HandleIndex
|
|
);
|
|
|
|
if (rc != NO_ERROR || a->ObjectName.Length != 0) {
|
|
ReleaseHandleTableLock( Os2SharedSemaphoreTable );
|
|
m->ReturnedErrorValue = rc;
|
|
return( TRUE );
|
|
}
|
|
|
|
Semaphore = (POS2_SEMAPHORE)Or2MapHandle( Os2SharedSemaphoreTable,
|
|
a->HandleIndex,
|
|
TRUE
|
|
);
|
|
if (Semaphore == NULL) {
|
|
rc = ERROR_INVALID_HANDLE;
|
|
}
|
|
else {
|
|
Status = NtDuplicateObject( NtCurrentProcess(),
|
|
Semaphore->u.EventHandle,
|
|
t->Process->ProcessHandle,
|
|
&a->NtEventHandle,
|
|
EVENT_ALL_ACCESS,
|
|
0,
|
|
0
|
|
);
|
|
if (NT_SUCCESS( Status )) {
|
|
Semaphore->OpenCount++;
|
|
}
|
|
else {
|
|
rc = Or2MapNtStatusToOs2Error( Status, ERROR_ALREADY_EXISTS );
|
|
}
|
|
}
|
|
|
|
ReleaseHandleTableLock( Os2SharedSemaphoreTable );
|
|
|
|
m->ReturnedErrorValue = rc;
|
|
return( TRUE );
|
|
}
|
|
|
|
|
|
BOOLEAN
|
|
Os2DosCloseEventSem(
|
|
IN POS2_THREAD t,
|
|
IN POS2_API_MSG m
|
|
)
|
|
{
|
|
POS2_DOSCLOSEEVENTSEM_MSG a = &m->u.DosCloseEventSem;
|
|
POS2_SEMAPHORE Semaphore;
|
|
APIRET rc;
|
|
|
|
UNREFERENCED_PARAMETER(t);
|
|
Semaphore = (POS2_SEMAPHORE)Or2MapHandle( Os2SharedSemaphoreTable,
|
|
a->HandleIndex,
|
|
FALSE
|
|
);
|
|
if (Semaphore == NULL) {
|
|
rc = ERROR_INVALID_HANDLE;
|
|
}
|
|
else {
|
|
rc = NO_ERROR;
|
|
|
|
if (--Semaphore->OpenCount == 0) {
|
|
NtClose( (HANDLE)Os2DestroySemaphore( Semaphore, a->HandleIndex ) );
|
|
}
|
|
else {
|
|
ReleaseHandleTableLock( Os2SharedSemaphoreTable );
|
|
}
|
|
}
|
|
|
|
m->ReturnedErrorValue = rc;
|
|
return( TRUE );
|
|
}
|