Removed the bugged conio.c:ComputeOffsetBuffer()
[reactos.git] / reactos / subsys / csrss / api / handle.c
1 /* $Id: handle.c,v 1.8 2001/01/21 00:11:54 phreak Exp $
2 *
3 * reactos/subsys/csrss/api/handle.c
4 *
5 * Console I/O functions
6 *
7 * ReactOS Operating System
8 */
9
10 /* INCLUDES ******************************************************************/
11
12 #include <ddk/ntddk.h>
13
14 #include <csrss/csrss.h>
15 #include "api.h"
16 #include <ntdll/rtl.h>
17
18 /* FUNCTIONS *****************************************************************/
19
20 NTSTATUS CsrGetObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Handle, Object_t **Object )
21 {
22 // DbgPrint( "CsrGetObject, Object: %x, %x, %x\n", Object, Handle, ProcessData->HandleTableSize );
23 if( (((ULONG)Handle) >> 2) - 1 > ProcessData->HandleTableSize )
24 {
25 DbgPrint( "CsrGetObject returning invalid handle\n" );
26 return STATUS_INVALID_HANDLE;
27 }
28 *Object = ProcessData->HandleTable[(((ULONG)Handle) >> 2) - 1];
29 // DbgPrint( "CsrGetObject returning\n" );
30 return *Object ? STATUS_SUCCESS : STATUS_INVALID_HANDLE;
31 }
32
33
34 NTSTATUS CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData,
35 HANDLE Handle)
36 {
37 Object_t *Object;
38 if( (((ULONG)Handle) >> 2) - 1 > ProcessData->HandleTableSize || ProcessData->HandleTable[(((ULONG)Handle) >> 2) - 1] == 0 )
39 return STATUS_INVALID_HANDLE;
40 /* dec ref count */
41 Object = ProcessData->HandleTable[(((ULONG)Handle) >> 2) - 1];
42 if( InterlockedDecrement( &Object->ReferenceCount ) == 0 )
43 switch( Object->Type )
44 {
45 case CSRSS_CONSOLE_MAGIC: CsrDeleteConsole( (PCSRSS_CONSOLE) Object );
46 break;
47 case CSRSS_SCREEN_BUFFER_MAGIC: CsrDeleteScreenBuffer( (PCSRSS_SCREEN_BUFFER) Object );
48 break;
49 default: DbgPrint( "CSR: Error: releaseing unknown object type" );
50 }
51 ProcessData->HandleTable[(((ULONG)Handle) >> 2) - 1] = 0;
52 return STATUS_SUCCESS;
53 }
54
55 NTSTATUS CsrInsertObject( PCSRSS_PROCESS_DATA ProcessData, PHANDLE Handle, Object_t *Object )
56 {
57 ULONG i;
58 PVOID* NewBlock;
59
60 for (i = 0; i < ProcessData->HandleTableSize; i++)
61 {
62 if (ProcessData->HandleTable[i] == NULL)
63 {
64 ProcessData->HandleTable[i] = Object;
65 *Handle = (HANDLE)(((i + 1) << 2) | 0x3);
66 InterlockedIncrement( &Object->ReferenceCount );
67 return(STATUS_SUCCESS);
68 }
69 }
70 NewBlock = RtlAllocateHeap(CsrssApiHeap,
71 HEAP_ZERO_MEMORY,
72 (ProcessData->HandleTableSize + 64) *
73 sizeof(HANDLE));
74 if (NewBlock == NULL)
75 {
76 return(STATUS_UNSUCCESSFUL);
77 }
78 RtlCopyMemory(NewBlock,
79 ProcessData->HandleTable,
80 ProcessData->HandleTableSize * sizeof(HANDLE));
81 RtlFreeHeap( CsrssApiHeap, 0, ProcessData->HandleTable );
82 ProcessData->HandleTable = (Object_t **)NewBlock;
83 ProcessData->HandleTable[i] = Object;
84 *Handle = (HANDLE)(((i + 1) << 2) | 0x3);
85 InterlockedIncrement( &Object->ReferenceCount );
86 ProcessData->HandleTableSize = ProcessData->HandleTableSize + 64;
87 return(STATUS_SUCCESS);
88 }
89
90
91