Added some additional csrss work
[reactos.git] / reactos / subsys / csrss / api / wapi.c
1 /* $Id: wapi.c,v 1.2 1999/12/30 01:51:42 dwelch Exp $
2 *
3 * reactos/subsys/csrss/init.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
17 #include "api.h"
18
19 /* GLOBALS *******************************************************************/
20
21 HANDLE CsrssApiHeap;
22
23 /* FUNCTIONS *****************************************************************/
24
25 static void Thread_Api2(HANDLE ServerPort)
26 {
27 NTSTATUS Status;
28 PLPCMESSAGE LpcReply;
29 LPCMESSAGE LpcRequest;
30 PCSRSS_API_REQUEST Request;
31 CSRSS_API_REPLY Reply;
32 PCSRSS_PROCESS_DATA ProcessData;
33
34 LpcReply = NULL;
35
36 for (;;)
37 {
38 Status = NtReplyWaitReceivePort(ServerPort,
39 0,
40 LpcReply,
41 &LpcRequest);
42 if (!NT_SUCCESS(Status))
43 {
44 DisplayString(L"NtReplyWaitReceivePort failed\n");
45 }
46
47 Request = (PCSRSS_API_REQUEST)LpcRequest.MessageData;
48
49 ProcessData = CsrGetProcessData(LpcRequest.ClientProcessId);
50
51 DisplayString(L"Received request\n");
52
53 switch (Request->Type)
54 {
55 case CSRSS_CREATE_PROCESS:
56 Reply.Status = CsrCreateProcess(ProcessData,
57 Request);
58 break;
59
60 case CSRSS_TERMINATE_PROCESS:
61 Reply.Status = CsrTerminateProcess(ProcessData,
62 Request);
63 break;
64
65 case CSRSS_WRITE_CONSOLE:
66 Reply.Status = CsrWriteConsole(ProcessData,
67 Request,
68 &Reply.Count);
69 break;
70
71 case CSRSS_READ_CONSOLE:
72 Reply.Status = CsrReadConsole(ProcessData,
73 Request,
74 &Reply.Count);
75 break;
76
77 case CSRSS_ALLOC_CONSOLE:
78 Reply.Status = CsrAllocConsole(ProcessData,
79 Request,
80 &Reply.Handle);
81 break;
82
83 case CSRSS_FREE_CONSOLE:
84 Reply.Status = CsrFreeConsole(ProcessData,
85 Request);
86 break;
87
88 case CSRSS_CONNECT_PROCESS:
89 Reply.Status = CsrConnectProcess(ProcessData,
90 Request);
91
92 default:
93 Reply.Status = STATUS_NOT_IMPLEMENTED;
94 }
95
96 LpcReply = &LpcRequest;
97 RtlCopyMemory(LpcReply->MessageData, &Reply, sizeof(Reply));
98 }
99 }
100
101 /**********************************************************************
102 * NAME
103 * Thread_Api
104 *
105 * DESCRIPTION
106 * Handle connection requests from clients to the port
107 * "\Windows\ApiPort".
108 */
109 void Thread_Api(PVOID PortHandle)
110 {
111 NTSTATUS Status;
112 LPCMESSAGE Request;
113 HANDLE ServerPort;
114
115 CsrssApiHeap = RtlCreateHeap(HEAP_GROWABLE,
116 NULL,
117 65536,
118 65536,
119 NULL,
120 NULL);
121 if (CsrssApiHeap == NULL)
122 {
123 PrintString("Failed to create private heap, aborting\n");
124 return;
125 }
126
127 for (;;)
128 {
129 Status = NtListenPort(PortHandle, &Request);
130 if (!NT_SUCCESS(Status))
131 {
132 DisplayString(L"NtListenPort() failed\n");
133 NtTerminateThread(NtCurrentThread(), Status);
134 }
135
136 Status = NtAcceptConnectPort(&ServerPort,
137 PortHandle,
138 NULL,
139 1,
140 0,
141 NULL);
142 if (!NT_SUCCESS(Status))
143 {
144 DisplayString(L"NtAcceptConnectPort() failed\n");
145 NtTerminateThread(NtCurrentThread(), Status);
146 }
147
148 Status = NtCompleteConnectPort(ServerPort);
149 if (!NT_SUCCESS(Status))
150 {
151 DisplayString(L"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 NULL,
164 NULL);
165 if (!NT_SUCCESS(Status))
166 {
167 DisplayString(L"Unable to create server thread\n");
168 NtClose(ServerPort);
169 NtTerminateThread(NtCurrentThread(), Status);
170 }
171 }
172 }
173