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,
66 static void Thread_Api2(HANDLE ServerPort)
69 LPC_MAX_MESSAGE LpcReply;
70 LPC_MAX_MESSAGE LpcRequest;
71 PCSRSS_API_REQUEST Request;
72 PCSRSS_PROCESS_DATA ProcessData;
73 PCSRSS_API_REPLY Reply;
79 Status = NtReplyWaitReceivePort(ServerPort,
83 if ( !NT_SUCCESS( Status ) )
85 DisplayString(L"CSR: NtReplyWaitReceivePort failed\n");
88 if ( LpcRequest.Header.MessageType == LPC_PORT_CLOSED )
91 CsrFreeProcessData( (ULONG)LpcRequest.Header.Cid.UniqueProcess );
93 NtTerminateThread(NtCurrentThread(), STATUS_SUCCESS);
97 Request = (PCSRSS_API_REQUEST)&LpcRequest;
98 Reply = (PCSRSS_API_REPLY)&LpcReply;
100 ProcessData = CsrGetProcessData(
101 (ULONG)LpcRequest.Header.Cid.UniqueProcess);
103 // DisplayString(L"CSR: Received request\n");
104 if( Request->Type >= (sizeof( CsrFuncs ) / sizeof( CsrFunc )) - 1 )
105 Reply->Status = STATUS_INVALID_SYSTEM_SERVICE;
106 else CsrFuncs[ Request->Type ]( ProcessData, Request, Reply );
110 /**********************************************************************
115 * Handle connection requests from clients to the port
116 * "\Windows\ApiPort".
118 void Thread_Api(PVOID PortHandle)
121 LPC_MAX_MESSAGE Request;
124 PCSRSS_PROCESS_DATA ProcessData;
126 CsrInitProcessData();
130 LPC_SECTION_READ LpcRead;
132 Status = NtListenPort(PortHandle, &Request.Header);
133 if (!NT_SUCCESS(Status))
135 DisplayString(L"CSR: NtListenPort() failed\n");
136 NtTerminateThread(NtCurrentThread(), Status);
139 Status = NtAcceptConnectPort(&ServerPort,
145 if (!NT_SUCCESS(Status))
147 DisplayString(L"CSR: NtAcceptConnectPort() failed\n");
148 NtTerminateThread(NtCurrentThread(), Status);
151 ProcessData = CsrGetProcessData((ULONG)Request.Header.Cid.UniqueProcess);
152 ProcessData->CsrSectionViewBase = LpcRead.ViewBase;
153 ProcessData->CsrSectionViewSize = LpcRead.ViewSize;
155 Status = NtCompleteConnectPort(ServerPort);
156 if (!NT_SUCCESS(Status))
158 DisplayString(L"CSR: NtCompleteConnectPort() failed\n");
159 NtTerminateThread(NtCurrentThread(), Status);
162 Status = RtlCreateUserThread(NtCurrentProcess(),
168 (PTHREAD_START_ROUTINE)Thread_Api2,
172 if (!NT_SUCCESS(Status))
174 DisplayString(L"CSR: Unable to create server thread\n");
176 NtTerminateThread(NtCurrentThread(), Status);
178 NtClose(ServerThread);