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,
73 static void Thread_Api2(HANDLE ServerPort)
76 LPC_MAX_MESSAGE LpcReply;
77 LPC_MAX_MESSAGE LpcRequest;
78 PCSRSS_API_REQUEST Request;
79 PCSRSS_PROCESS_DATA ProcessData;
80 PCSRSS_API_REPLY Reply;
86 Status = NtReplyWaitReceivePort(ServerPort,
90 if ( !NT_SUCCESS( Status ) )
92 DisplayString(L"CSR: NtReplyWaitReceivePort failed\n");
95 if ( LpcRequest.Header.MessageType == LPC_PORT_CLOSED )
98 CsrFreeProcessData( (ULONG)LpcRequest.Header.Cid.UniqueProcess );
100 NtTerminateThread(NtCurrentThread(), STATUS_SUCCESS);
104 Request = (PCSRSS_API_REQUEST)&LpcRequest;
105 Reply = (PCSRSS_API_REPLY)&LpcReply;
107 ProcessData = CsrGetProcessData(
108 (ULONG)LpcRequest.Header.Cid.UniqueProcess);
110 // DisplayString(L"CSR: Received request\n");
111 if( Request->Type >= (sizeof( CsrFuncs ) / sizeof( CsrFunc )) - 1 )
112 Reply->Status = STATUS_INVALID_SYSTEM_SERVICE;
113 else CsrFuncs[ Request->Type ]( ProcessData, Request, Reply );
117 /**********************************************************************
122 * Handle connection requests from clients to the port
123 * "\Windows\ApiPort".
125 void Thread_Api(PVOID PortHandle)
128 LPC_MAX_MESSAGE Request;
131 PCSRSS_PROCESS_DATA ProcessData;
133 CsrInitProcessData();
137 LPC_SECTION_READ LpcRead;
139 Status = NtListenPort(PortHandle, &Request.Header);
140 if (!NT_SUCCESS(Status))
142 DisplayString(L"CSR: NtListenPort() failed\n");
143 NtTerminateThread(NtCurrentThread(), Status);
146 Status = NtAcceptConnectPort(&ServerPort,
152 if (!NT_SUCCESS(Status))
154 DisplayString(L"CSR: NtAcceptConnectPort() failed\n");
155 NtTerminateThread(NtCurrentThread(), Status);
158 ProcessData = CsrGetProcessData((ULONG)Request.Header.Cid.UniqueProcess);
159 ProcessData->CsrSectionViewBase = LpcRead.ViewBase;
160 ProcessData->CsrSectionViewSize = LpcRead.ViewSize;
162 Status = NtCompleteConnectPort(ServerPort);
163 if (!NT_SUCCESS(Status))
165 DisplayString(L"CSR: NtCompleteConnectPort() failed\n");
166 NtTerminateThread(NtCurrentThread(), Status);
169 Status = RtlCreateUserThread(NtCurrentProcess(),
175 (PTHREAD_START_ROUTINE)Thread_Api2,
179 if (!NT_SUCCESS(Status))
181 DisplayString(L"CSR: Unable to create server thread\n");
183 NtTerminateThread(NtCurrentThread(), Status);
185 NtClose(ServerThread);