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.
 
 
 
 
 
 

159 lines
4.1 KiB

/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
srvmutex.c
Abstract:
This module implements the OS/2 V2.0 Shared Mutex Semaphore API Calls.
Author:
Steve Wood (stevewo) 07-Feb-1990
Revision History:
--*/
#define INCL_OS2V20_SEMAPHORES
#define INCL_OS2V20_ERRORS
#include "os2srv.h"
BOOLEAN
Os2DosCreateMutexSem(
IN POS2_THREAD t,
IN POS2_API_MSG m
)
{
NTSTATUS Status;
POS2_DOSCREATEMUTEXSEM_MSG a = &m->u.DosCreateMutexSem;
OS2_SEMAPHORE Semaphore;
APIRET rc;
Semaphore.PointerCount = 0;
Semaphore.OpenCount = 1;
Semaphore.Type = Os2MutexSem;
Status = NtDuplicateObject( t->Process->ProcessHandle,
a->NtMutantHandle,
NtCurrentProcess(),
&Semaphore.u.MutantHandle,
MUTANT_ALL_ACCESS,
0,
0
);
if (!NT_SUCCESS( Status )) {
rc = ERROR_NOT_ENOUGH_MEMORY;
}
else {
rc = Os2ProcessSemaphoreName( &a->ObjectName,
&Semaphore,
NULL
);
}
if (rc == NO_ERROR) {
if (!Or2CreateHandle( Os2SharedSemaphoreTable,
&a->HandleIndex,
(PVOID)&Semaphore
)
) {
NtClose( Semaphore.u.MutantHandle );
rc = ERROR_NOT_ENOUGH_MEMORY;
}
}
ReleaseHandleTableLock( Os2SharedSemaphoreTable );
m->ReturnedErrorValue = rc;
return( TRUE );
}
BOOLEAN
Os2DosOpenMutexSem(
IN POS2_THREAD t,
IN POS2_API_MSG m
)
{
NTSTATUS Status;
POS2_DOSOPENMUTEXSEM_MSG a = &m->u.DosOpenMutexSem;
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.MutantHandle,
t->Process->ProcessHandle,
&a->NtMutantHandle,
MUTANT_ALL_ACCESS,
0,
0
);
if (NT_SUCCESS( Status )) {
Semaphore->OpenCount++;
}
}
ReleaseHandleTableLock( Os2SharedSemaphoreTable );
m->ReturnedErrorValue = rc;
return( TRUE );
}
BOOLEAN
Os2DosCloseMutexSem(
IN POS2_THREAD t,
IN POS2_API_MSG m
)
{
POS2_DOSCLOSEMUTEXSEM_MSG a = &m->u.DosCloseMutexSem;
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 );
}