1 /* $Id: wapi.c,v 1.25 2002/11/12 00:48:26 mdill 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
,
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
);