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