3 * reactos/subsys/csrss/api/wapi.c
5 * Initialize the CSRSS subsystem server process.
7 * ReactOS Operating System
11 /* INCLUDES ******************************************************************/
13 #include <ddk/ntddk.h>
15 #include <ntdll/rtl.h>
16 #include <csrss/csrss.h>
21 /* GLOBALS *******************************************************************/
25 /* FUNCTIONS *****************************************************************/
27 typedef NTSTATUS (*CsrFunc)( PCSRSS_PROCESS_DATA, PCSRSS_API_REQUEST, PCSRSS_API_REPLY );
29 static const CsrFunc CsrFuncs[] = {
37 CsrGetScreenBufferInfo,
41 CsrWriteConsoleOutputChar,
42 CsrWriteConsoleOutputAttrib,
49 CsrCreateScreenBuffer,
53 CsrWriteConsoleOutput,
55 CsrScrollConsoleScreenBuffer,
56 CsrReadConsoleOutputChar,
57 CsrReadConsoleOutputAttrib,
58 CsrGetNumberOfConsoleInputEvents,
59 CsrRegisterServicesProcess,
61 CsrGetShutdownParameters,
62 CsrSetShutdownParameters,
68 static void Thread_Api2(HANDLE ServerPort)
71 LPC_MAX_MESSAGE LpcReply;
72 LPC_MAX_MESSAGE LpcRequest;
73 PCSRSS_API_REQUEST Request;
74 PCSRSS_PROCESS_DATA ProcessData;
75 PCSRSS_API_REPLY Reply;
81 Status = NtReplyWaitReceivePort(ServerPort,
85 if ( !NT_SUCCESS( Status ) )
87 DisplayString(L"CSR: NtReplyWaitReceivePort failed\n");
90 if ( LpcRequest.Header.MessageType == LPC_PORT_CLOSED )
93 CsrFreeProcessData( (ULONG)LpcRequest.Header.Cid.UniqueProcess );
95 NtTerminateThread(NtCurrentThread(), STATUS_SUCCESS);
99 Request = (PCSRSS_API_REQUEST)&LpcRequest;
100 Reply = (PCSRSS_API_REPLY)&LpcReply;
102 ProcessData = CsrGetProcessData(
103 (ULONG)LpcRequest.Header.Cid.UniqueProcess);
105 // DisplayString(L"CSR: Received request\n");
106 if( Request->Type >= (sizeof( CsrFuncs ) / sizeof( CsrFunc )) - 1 )
107 Reply->Status = STATUS_INVALID_SYSTEM_SERVICE;
108 else CsrFuncs[ Request->Type ]( ProcessData, Request, Reply );
112 /**********************************************************************
117 * Handle connection requests from clients to the port
118 * "\Windows\ApiPort".
120 void Thread_Api(PVOID PortHandle)
123 LPC_MAX_MESSAGE Request;
126 PCSRSS_PROCESS_DATA ProcessData;
128 CsrInitProcessData();
132 LPC_SECTION_READ LpcRead;
134 Status = NtListenPort(PortHandle, &Request.Header);
135 if (!NT_SUCCESS(Status))
137 DisplayString(L"CSR: NtListenPort() failed\n");
138 NtTerminateThread(NtCurrentThread(), Status);
141 Status = NtAcceptConnectPort(&ServerPort,
147 if (!NT_SUCCESS(Status))
149 DisplayString(L"CSR: NtAcceptConnectPort() failed\n");
150 NtTerminateThread(NtCurrentThread(), Status);
153 ProcessData = CsrGetProcessData((ULONG)Request.Header.Cid.UniqueProcess);
154 ProcessData->CsrSectionViewBase = LpcRead.ViewBase;
155 ProcessData->CsrSectionViewSize = LpcRead.ViewSize;
157 Status = NtCompleteConnectPort(ServerPort);
158 if (!NT_SUCCESS(Status))
160 DisplayString(L"CSR: NtCompleteConnectPort() failed\n");
161 NtTerminateThread(NtCurrentThread(), Status);
164 Status = RtlCreateUserThread(NtCurrentProcess(),
170 (PTHREAD_START_ROUTINE)Thread_Api2,
174 if (!NT_SUCCESS(Status))
176 DisplayString(L"CSR: Unable to create server thread\n");
178 NtTerminateThread(NtCurrentThread(), Status);
180 NtClose(ServerThread);