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,
71 CsrHardwareStateProperty,
74 static void Thread_Api2(HANDLE ServerPort)
77 LPC_MAX_MESSAGE LpcReply;
78 LPC_MAX_MESSAGE LpcRequest;
79 PCSRSS_API_REQUEST Request;
80 PCSRSS_PROCESS_DATA ProcessData;
81 PCSRSS_API_REPLY Reply;
87 Status = NtReplyWaitReceivePort(ServerPort,
91 if ( !NT_SUCCESS( Status ) )
93 DisplayString(L"CSR: NtReplyWaitReceivePort failed\n");
96 if ( LpcRequest.Header.MessageType == LPC_PORT_CLOSED )
99 CsrFreeProcessData( (ULONG)LpcRequest.Header.ClientId.UniqueProcess );
101 NtTerminateThread(NtCurrentThread(), STATUS_SUCCESS);
105 Request = (PCSRSS_API_REQUEST)&LpcRequest;
106 Reply = (PCSRSS_API_REPLY)&LpcReply;
108 ProcessData = CsrGetProcessData(
109 (ULONG)LpcRequest.Header.ClientId.UniqueProcess);
111 // DisplayString(L"CSR: Received request\n");
112 if( Request->Type >= (sizeof( CsrFuncs ) / sizeof( CsrFunc )) - 1 )
113 Reply->Status = STATUS_INVALID_SYSTEM_SERVICE;
114 else CsrFuncs[ Request->Type ]( ProcessData, Request, Reply );
118 /**********************************************************************
123 * Handle connection requests from clients to the port
124 * "\Windows\ApiPort".
126 void Thread_Api(PVOID PortHandle)
129 LPC_MAX_MESSAGE Request;
132 PCSRSS_PROCESS_DATA ProcessData;
134 CsrInitProcessData();
138 LPC_SECTION_READ LpcRead;
140 Status = NtListenPort(PortHandle, &Request.Header);
141 if (!NT_SUCCESS(Status))
143 DisplayString(L"CSR: NtListenPort() failed\n");
144 NtTerminateThread(NtCurrentThread(), Status);
147 Status = NtAcceptConnectPort(&ServerPort,
153 if (!NT_SUCCESS(Status))
155 DisplayString(L"CSR: NtAcceptConnectPort() failed\n");
156 NtTerminateThread(NtCurrentThread(), Status);
159 ProcessData = CsrGetProcessData((ULONG)Request.Header.ClientId.UniqueProcess);
160 ProcessData->CsrSectionViewBase = LpcRead.ViewBase;
161 ProcessData->CsrSectionViewSize = LpcRead.ViewSize;
163 Status = NtCompleteConnectPort(ServerPort);
164 if (!NT_SUCCESS(Status))
166 DisplayString(L"CSR: NtCompleteConnectPort() failed\n");
167 NtTerminateThread(NtCurrentThread(), Status);
170 Status = RtlCreateUserThread(NtCurrentProcess(),
176 (PTHREAD_START_ROUTINE)Thread_Api2,
180 if (!NT_SUCCESS(Status))
182 DisplayString(L"CSR: Unable to create server thread\n");
184 NtTerminateThread(NtCurrentThread(), Status);
186 NtClose(ServerThread);