1 /* $Id: wapi.c,v 1.24 2002/10/31 01:50:00 ekohl Exp $
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
);