Windows NT 4.0 source code leak
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

/*++
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 );
}