3 * reactos/subsys/csrss/api/handle.c
5 * Console I/O functions
7 * ReactOS Operating System
10 /* INCLUDES ******************************************************************/
12 #include <ddk/ntddk.h>
14 #include <csrss/csrss.h>
16 #include <ntdll/rtl.h>
18 /* FUNCTIONS *****************************************************************/
20 NTSTATUS STDCALL CsrGetObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Handle, Object_t **Object )
22 ULONG h = (((ULONG)Handle) >> 2) - 1;
23 // DbgPrint( "CsrGetObject, Object: %x, %x, %x\n", Object, Handle, ProcessData->HandleTableSize );
24 if( h >= ProcessData->HandleTableSize )
26 DbgPrint( "CsrGetObject returning invalid handle\n" );
27 return STATUS_INVALID_HANDLE;
29 *Object = ProcessData->HandleTable[h];
30 // DbgPrint( "CsrGetObject returning\n" );
31 return *Object ? STATUS_SUCCESS : STATUS_INVALID_HANDLE;
35 NTSTATUS STDCALL CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData,
39 ULONG h = (((ULONG)Handle) >> 2) - 1;
40 if( h >= ProcessData->HandleTableSize || ProcessData->HandleTable[h] == 0 )
41 return STATUS_INVALID_HANDLE;
43 Object = ProcessData->HandleTable[h];
44 if( InterlockedDecrement( &Object->ReferenceCount ) == 0 )
45 switch( Object->Type )
47 case CSRSS_CONSOLE_MAGIC: CsrDeleteConsole( (PCSRSS_CONSOLE) Object );
49 case CSRSS_SCREEN_BUFFER_MAGIC: CsrDeleteScreenBuffer( (PCSRSS_SCREEN_BUFFER) Object );
51 default: DbgPrint( "CSR: Error: releaseing unknown object type" );
53 ProcessData->HandleTable[h] = 0;
54 return STATUS_SUCCESS;
57 NTSTATUS STDCALL CsrInsertObject( PCSRSS_PROCESS_DATA ProcessData, PHANDLE Handle, Object_t *Object )
62 for (i = 0; i < ProcessData->HandleTableSize; i++)
64 if (ProcessData->HandleTable[i] == NULL)
66 ProcessData->HandleTable[i] = Object;
67 *Handle = (HANDLE)(((i + 1) << 2) | 0x3);
68 InterlockedIncrement( &Object->ReferenceCount );
69 return(STATUS_SUCCESS);
72 NewBlock = RtlAllocateHeap(CsrssApiHeap,
74 (ProcessData->HandleTableSize + 64) *
78 return(STATUS_UNSUCCESSFUL);
80 RtlCopyMemory(NewBlock,
81 ProcessData->HandleTable,
82 ProcessData->HandleTableSize * sizeof(HANDLE));
83 RtlFreeHeap( CsrssApiHeap, 0, ProcessData->HandleTable );
84 ProcessData->HandleTable = (Object_t **)NewBlock;
85 ProcessData->HandleTable[i] = Object;
86 *Handle = (HANDLE)(((i + 1) << 2) | 0x3);
87 InterlockedIncrement( &Object->ReferenceCount );
88 ProcessData->HandleTableSize = ProcessData->HandleTableSize + 64;
89 return(STATUS_SUCCESS);