2003-03-09 21:41:00 +00:00
|
|
|
/* $Id: handle.c,v 1.14 2003/03/09 21:41:00 hbirr Exp $
|
1999-12-26 15:50:53 +00:00
|
|
|
*
|
|
|
|
* reactos/subsys/csrss/api/handle.c
|
|
|
|
*
|
|
|
|
* Console I/O functions
|
|
|
|
*
|
|
|
|
* ReactOS Operating System
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* INCLUDES ******************************************************************/
|
|
|
|
|
2002-09-08 10:23:54 +00:00
|
|
|
#include <ddk/ntddk.h>
|
1999-12-26 15:50:53 +00:00
|
|
|
|
2000-03-22 18:36:00 +00:00
|
|
|
#include <csrss/csrss.h>
|
1999-12-26 15:50:53 +00:00
|
|
|
#include "api.h"
|
2002-09-08 10:23:54 +00:00
|
|
|
#include <ntdll/rtl.h>
|
1999-12-26 15:50:53 +00:00
|
|
|
|
2003-03-09 21:41:00 +00:00
|
|
|
#define NDEBUG
|
|
|
|
#include <debug.h>
|
|
|
|
|
1999-12-26 15:50:53 +00:00
|
|
|
/* FUNCTIONS *****************************************************************/
|
|
|
|
|
2001-08-14 12:57:16 +00:00
|
|
|
NTSTATUS STDCALL CsrGetObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Handle, Object_t **Object )
|
1999-12-30 01:51:42 +00:00
|
|
|
{
|
2002-05-07 22:45:40 +00:00
|
|
|
ULONG h = (((ULONG)Handle) >> 2) - 1;
|
2003-03-09 21:41:00 +00:00
|
|
|
DPRINT("CsrGetObject, Object: %x, %x, %x\n", Object, Handle, ProcessData ? ProcessData->HandleTableSize : 0);
|
|
|
|
|
|
|
|
if (ProcessData == NULL)
|
|
|
|
{
|
|
|
|
return STATUS_INVALID_PARAMETER;
|
|
|
|
}
|
2002-05-07 22:45:40 +00:00
|
|
|
if( h >= ProcessData->HandleTableSize )
|
2000-04-23 17:44:53 +00:00
|
|
|
{
|
2003-03-09 21:41:00 +00:00
|
|
|
DPRINT("CsrGetObject returning invalid handle\n");
|
2000-04-23 17:44:53 +00:00
|
|
|
return STATUS_INVALID_HANDLE;
|
|
|
|
}
|
2002-05-07 22:45:40 +00:00
|
|
|
*Object = ProcessData->HandleTable[h];
|
2000-04-23 17:44:53 +00:00
|
|
|
// DbgPrint( "CsrGetObject returning\n" );
|
|
|
|
return *Object ? STATUS_SUCCESS : STATUS_INVALID_HANDLE;
|
|
|
|
}
|
|
|
|
|
1999-12-30 01:51:42 +00:00
|
|
|
|
2001-08-14 12:57:16 +00:00
|
|
|
NTSTATUS STDCALL CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData,
|
2000-04-23 17:44:53 +00:00
|
|
|
HANDLE Handle)
|
1999-12-30 01:51:42 +00:00
|
|
|
{
|
2000-04-23 17:44:53 +00:00
|
|
|
Object_t *Object;
|
2002-05-07 22:45:40 +00:00
|
|
|
ULONG h = (((ULONG)Handle) >> 2) - 1;
|
2003-03-09 21:41:00 +00:00
|
|
|
if (ProcessData == NULL)
|
|
|
|
{
|
|
|
|
return STATUS_INVALID_PARAMETER;
|
|
|
|
}
|
2002-05-07 22:45:40 +00:00
|
|
|
if( h >= ProcessData->HandleTableSize || ProcessData->HandleTable[h] == 0 )
|
2000-04-23 17:44:53 +00:00
|
|
|
return STATUS_INVALID_HANDLE;
|
|
|
|
/* dec ref count */
|
2002-05-07 22:45:40 +00:00
|
|
|
Object = ProcessData->HandleTable[h];
|
2001-01-21 00:11:54 +00:00
|
|
|
if( InterlockedDecrement( &Object->ReferenceCount ) == 0 )
|
2000-04-23 17:44:53 +00:00
|
|
|
switch( Object->Type )
|
|
|
|
{
|
2001-01-21 00:11:54 +00:00
|
|
|
case CSRSS_CONSOLE_MAGIC: CsrDeleteConsole( (PCSRSS_CONSOLE) Object );
|
|
|
|
break;
|
|
|
|
case CSRSS_SCREEN_BUFFER_MAGIC: CsrDeleteScreenBuffer( (PCSRSS_SCREEN_BUFFER) Object );
|
2000-04-23 17:44:53 +00:00
|
|
|
break;
|
|
|
|
default: DbgPrint( "CSR: Error: releaseing unknown object type" );
|
|
|
|
}
|
2002-05-07 22:45:40 +00:00
|
|
|
ProcessData->HandleTable[h] = 0;
|
2000-04-23 17:44:53 +00:00
|
|
|
return STATUS_SUCCESS;
|
1999-12-30 01:51:42 +00:00
|
|
|
}
|
|
|
|
|
2001-08-14 12:57:16 +00:00
|
|
|
NTSTATUS STDCALL CsrInsertObject( PCSRSS_PROCESS_DATA ProcessData, PHANDLE Handle, Object_t *Object )
|
1999-12-30 01:51:42 +00:00
|
|
|
{
|
|
|
|
ULONG i;
|
|
|
|
PVOID* NewBlock;
|
2000-04-23 17:44:53 +00:00
|
|
|
|
2003-03-09 21:41:00 +00:00
|
|
|
if (ProcessData == NULL)
|
|
|
|
{
|
|
|
|
return STATUS_INVALID_PARAMETER;
|
|
|
|
}
|
|
|
|
|
1999-12-30 01:51:42 +00:00
|
|
|
for (i = 0; i < ProcessData->HandleTableSize; i++)
|
|
|
|
{
|
|
|
|
if (ProcessData->HandleTable[i] == NULL)
|
|
|
|
{
|
|
|
|
ProcessData->HandleTable[i] = Object;
|
2000-03-26 22:00:10 +00:00
|
|
|
*Handle = (HANDLE)(((i + 1) << 2) | 0x3);
|
2001-01-21 00:11:54 +00:00
|
|
|
InterlockedIncrement( &Object->ReferenceCount );
|
1999-12-30 01:51:42 +00:00
|
|
|
return(STATUS_SUCCESS);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
NewBlock = RtlAllocateHeap(CsrssApiHeap,
|
|
|
|
HEAP_ZERO_MEMORY,
|
|
|
|
(ProcessData->HandleTableSize + 64) *
|
|
|
|
sizeof(HANDLE));
|
|
|
|
if (NewBlock == NULL)
|
|
|
|
{
|
2000-03-22 18:36:00 +00:00
|
|
|
return(STATUS_UNSUCCESSFUL);
|
1999-12-30 01:51:42 +00:00
|
|
|
}
|
|
|
|
RtlCopyMemory(NewBlock,
|
|
|
|
ProcessData->HandleTable,
|
|
|
|
ProcessData->HandleTableSize * sizeof(HANDLE));
|
2000-04-23 17:44:53 +00:00
|
|
|
RtlFreeHeap( CsrssApiHeap, 0, ProcessData->HandleTable );
|
|
|
|
ProcessData->HandleTable = (Object_t **)NewBlock;
|
1999-12-30 01:51:42 +00:00
|
|
|
ProcessData->HandleTable[i] = Object;
|
2000-03-26 22:00:10 +00:00
|
|
|
*Handle = (HANDLE)(((i + 1) << 2) | 0x3);
|
2001-01-21 00:11:54 +00:00
|
|
|
InterlockedIncrement( &Object->ReferenceCount );
|
1999-12-30 01:51:42 +00:00
|
|
|
ProcessData->HandleTableSize = ProcessData->HandleTableSize + 64;
|
|
|
|
return(STATUS_SUCCESS);
|
|
|
|
}
|
2000-04-23 17:44:53 +00:00
|
|
|
|
2003-03-05 22:51:48 +00:00
|
|
|
NTSTATUS STDCALL CsrVerifyObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Handle )
|
|
|
|
{
|
|
|
|
ULONG h = (((ULONG)Handle) >> 2) - 1;
|
|
|
|
|
2003-03-09 21:41:00 +00:00
|
|
|
if (ProcessData == NULL)
|
|
|
|
{
|
|
|
|
return STATUS_INVALID_PARAMETER;
|
|
|
|
}
|
2003-03-05 22:51:48 +00:00
|
|
|
if (h >= ProcessData->HandleTableSize)
|
|
|
|
{
|
|
|
|
return STATUS_INVALID_HANDLE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ProcessData->HandleTable[h] ? STATUS_SUCCESS : STATUS_INVALID_HANDLE;
|
|
|
|
}
|
2000-04-23 17:44:53 +00:00
|
|
|
|
2001-08-14 12:57:16 +00:00
|
|
|
/* EOF */
|