Removed the bugged conio.c:ComputeOffsetBuffer()
[reactos.git] / reactos / subsys / csrss / api / wapi.c
1 /* $Id: wapi.c,v 1.13 2001/06/29 19:33:39 ekohl Exp $
2 *
3 * reactos/subsys/csrss/api/wapi.c
4 *
5 * Initialize the CSRSS subsystem server process.
6 *
7 * ReactOS Operating System
8 *
9 */
10
11 /* INCLUDES ******************************************************************/
12
13 #include <ddk/ntddk.h>
14 #include <ntdll/rtl.h>
15 #include <csrss/csrss.h>
16 #include <debug.h>
17
18 #include "api.h"
19
20 /* GLOBALS *******************************************************************/
21
22 HANDLE CsrssApiHeap;
23
24 /* FUNCTIONS *****************************************************************/
25
26 typedef NTSTATUS (*CsrFunc)( PCSRSS_PROCESS_DATA, PCSRSS_API_REQUEST, PCSRSS_API_REPLY );
27
28 static const CsrFunc CsrFuncs[] = {
29 CsrCreateProcess,
30 CsrTerminateProcess,
31 CsrWriteConsole,
32 CsrReadConsole,
33 CsrAllocConsole,
34 CsrFreeConsole,
35 CsrConnectProcess,
36 CsrGetScreenBufferInfo,
37 CsrSetCursor,
38 CsrFillOutputChar,
39 CsrReadInputEvent,
40 CsrWriteConsoleOutputChar,
41 CsrWriteConsoleOutputAttrib,
42 CsrFillOutputAttrib,
43 CsrGetCursorInfo,
44 CsrSetCursorInfo,
45 CsrSetTextAttrib,
46 CsrGetConsoleMode,
47 CsrSetConsoleMode,
48 CsrCreateScreenBuffer,
49 CsrSetScreenBuffer,
50 CsrSetTitle,
51 0 };
52
53 static void Thread_Api2(HANDLE ServerPort)
54 {
55 NTSTATUS Status;
56 LPC_MAX_MESSAGE LpcReply;
57 LPC_MAX_MESSAGE LpcRequest;
58 PCSRSS_API_REQUEST Request;
59 PCSRSS_PROCESS_DATA ProcessData;
60 PCSRSS_API_REPLY Reply;
61
62 Reply = NULL;
63
64 for (;;)
65 {
66 Status = NtReplyWaitReceivePort(ServerPort,
67 0,
68 &Reply->Header,
69 &LpcRequest.Header);
70 if ( !NT_SUCCESS( Status ) )
71 {
72 DisplayString(L"CSR: NtReplyWaitReceivePort failed\n");
73 }
74
75 if ( LpcRequest.Header.MessageType == LPC_PORT_CLOSED )
76
77 {
78 CsrFreeProcessData( (ULONG)LpcRequest.Header.Cid.UniqueProcess );
79 NtClose(ServerPort);
80 NtTerminateThread(NtCurrentThread(), STATUS_SUCCESS);
81 continue;
82 }
83
84 Request = (PCSRSS_API_REQUEST)&LpcRequest;
85 Reply = (PCSRSS_API_REPLY)&LpcReply;
86
87 ProcessData = CsrGetProcessData(
88 (ULONG)LpcRequest.Header.Cid.UniqueProcess);
89
90 // DisplayString(L"CSR: Received request\n");
91 if( Request->Type >= (sizeof( CsrFuncs ) / sizeof( CsrFunc )) - 1 )
92 Reply->Status = STATUS_INVALID_SYSTEM_SERVICE;
93 else CsrFuncs[ Request->Type ]( ProcessData, Request, Reply );
94 }
95 }
96
97 /**********************************************************************
98 * NAME
99 * Thread_Api
100 *
101 * DESCRIPTION
102 * Handle connection requests from clients to the port
103 * "\Windows\ApiPort".
104 */
105 void Thread_Api(PVOID PortHandle)
106 {
107 NTSTATUS Status;
108 LPC_MAX_MESSAGE Request;
109 HANDLE ServerPort;
110 HANDLE ServerThread;
111
112 CsrInitProcessData();
113
114 for (;;)
115 {
116 Status = NtListenPort(PortHandle, &Request.Header);
117 if (!NT_SUCCESS(Status))
118 {
119 DisplayString(L"CSR: NtListenPort() failed\n");
120 NtTerminateThread(NtCurrentThread(), Status);
121 }
122
123 Status = NtAcceptConnectPort(&ServerPort,
124 PortHandle,
125 NULL,
126 1,
127 0,
128 NULL);
129 if (!NT_SUCCESS(Status))
130 {
131 DisplayString(L"CSR: NtAcceptConnectPort() failed\n");
132 NtTerminateThread(NtCurrentThread(), Status);
133 }
134
135 Status = NtCompleteConnectPort(ServerPort);
136 if (!NT_SUCCESS(Status))
137 {
138 DisplayString(L"CSR: NtCompleteConnectPort() failed\n");
139 NtTerminateThread(NtCurrentThread(), Status);
140 }
141
142 Status = RtlCreateUserThread(NtCurrentProcess(),
143 NULL,
144 FALSE,
145 0,
146 NULL,
147 NULL,
148 (PTHREAD_START_ROUTINE)Thread_Api2,
149 ServerPort,
150 &ServerThread,
151 NULL);
152 if (!NT_SUCCESS(Status))
153 {
154 DisplayString(L"CSR: Unable to create server thread\n");
155 NtClose(ServerPort);
156 NtTerminateThread(NtCurrentThread(), Status);
157 }
158 NtClose(ServerThread);
159 }
160 }
161