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>
21 /* FUNCTIONS *****************************************************************/
23 NTSTATUS STDCALL CsrGetObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Handle, Object_t **Object )
25 ULONG h = (((ULONG)Handle) >> 2) - 1;
26 DPRINT("CsrGetObject, Object: %x, %x, %x\n", Object, Handle, ProcessData ? ProcessData->HandleTableSize : 0);
28 if (ProcessData == NULL)
30 return STATUS_INVALID_PARAMETER;
32 if( h >= ProcessData->HandleTableSize )
34 DPRINT("CsrGetObject returning invalid handle\n");
35 return STATUS_INVALID_HANDLE;
37 *Object = ProcessData->HandleTable[h];
38 // DbgPrint( "CsrGetObject returning\n" );
39 return *Object ? STATUS_SUCCESS : STATUS_INVALID_HANDLE;
43 NTSTATUS STDCALL CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData,
47 ULONG h = (((ULONG)Handle) >> 2) - 1;
48 if (ProcessData == NULL)
50 return STATUS_INVALID_PARAMETER;
52 if( h >= ProcessData->HandleTableSize || ProcessData->HandleTable[h] == 0 )
53 return STATUS_INVALID_HANDLE;
55 Object = ProcessData->HandleTable[h];
56 if( InterlockedDecrement( &Object->ReferenceCount ) == 0 )
57 switch( Object->Type )
59 case CSRSS_CONSOLE_MAGIC: CsrDeleteConsole( (PCSRSS_CONSOLE) Object );
61 case CSRSS_SCREEN_BUFFER_MAGIC: CsrDeleteScreenBuffer( (PCSRSS_SCREEN_BUFFER) Object );
63 default: DbgPrint( "CSR: Error: releaseing unknown object type" );
65 ProcessData->HandleTable[h] = 0;
66 return STATUS_SUCCESS;
69 NTSTATUS STDCALL CsrInsertObject( PCSRSS_PROCESS_DATA ProcessData, PHANDLE Handle, Object_t *Object )
74 if (ProcessData == NULL)
76 return STATUS_INVALID_PARAMETER;
79 for (i = 0; i < ProcessData->HandleTableSize; i++)
81 if (ProcessData->HandleTable[i] == NULL)
83 ProcessData->HandleTable[i] = Object;
84 *Handle = (HANDLE)(((i + 1) << 2) | 0x3);
85 InterlockedIncrement( &Object->ReferenceCount );
86 return(STATUS_SUCCESS);
89 NewBlock = RtlAllocateHeap(CsrssApiHeap,
91 (ProcessData->HandleTableSize + 64) *
95 return(STATUS_UNSUCCESSFUL);
97 RtlCopyMemory(NewBlock,
98 ProcessData->HandleTable,
99 ProcessData->HandleTableSize * sizeof(HANDLE));
100 RtlFreeHeap( CsrssApiHeap, 0, ProcessData->HandleTable );
101 ProcessData->HandleTable = (Object_t **)NewBlock;
102 ProcessData->HandleTable[i] = Object;
103 *Handle = (HANDLE)(((i + 1) << 2) | 0x3);
104 InterlockedIncrement( &Object->ReferenceCount );
105 ProcessData->HandleTableSize = ProcessData->HandleTableSize + 64;
106 return(STATUS_SUCCESS);
109 NTSTATUS STDCALL CsrVerifyObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Handle )
111 ULONG h = (((ULONG)Handle) >> 2) - 1;
113 if (ProcessData == NULL)
115 return STATUS_INVALID_PARAMETER;
117 if (h >= ProcessData->HandleTableSize)
119 return STATUS_INVALID_HANDLE;
122 return ProcessData->HandleTable[h] ? STATUS_SUCCESS : STATUS_INVALID_HANDLE;