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