1 /* $Id: wapi.c,v 1.13 2001/06/29 19:33:39 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>
14 #include <ntdll/rtl.h>
15 #include <csrss/csrss.h>
20 /* GLOBALS *******************************************************************/
24 /* FUNCTIONS *****************************************************************/
26 typedef NTSTATUS (*CsrFunc
)( PCSRSS_PROCESS_DATA
, PCSRSS_API_REQUEST
, PCSRSS_API_REPLY
);
28 static const CsrFunc CsrFuncs
[] = {
36 CsrGetScreenBufferInfo
,
40 CsrWriteConsoleOutputChar
,
41 CsrWriteConsoleOutputAttrib
,
48 CsrCreateScreenBuffer
,
53 static void Thread_Api2(HANDLE ServerPort
)
56 LPC_MAX_MESSAGE LpcReply
;
57 LPC_MAX_MESSAGE LpcRequest
;
58 PCSRSS_API_REQUEST Request
;
59 PCSRSS_PROCESS_DATA ProcessData
;
60 PCSRSS_API_REPLY Reply
;
66 Status
= NtReplyWaitReceivePort(ServerPort
,
70 if ( !NT_SUCCESS( Status
) )
72 DisplayString(L
"CSR: NtReplyWaitReceivePort failed\n");
75 if ( LpcRequest
.Header
.MessageType
== LPC_PORT_CLOSED
)
78 CsrFreeProcessData( (ULONG
)LpcRequest
.Header
.Cid
.UniqueProcess
);
80 NtTerminateThread(NtCurrentThread(), STATUS_SUCCESS
);
84 Request
= (PCSRSS_API_REQUEST
)&LpcRequest
;
85 Reply
= (PCSRSS_API_REPLY
)&LpcReply
;
87 ProcessData
= CsrGetProcessData(
88 (ULONG
)LpcRequest
.Header
.Cid
.UniqueProcess
);
90 // DisplayString(L"CSR: Received request\n");
91 if( Request
->Type
>= (sizeof( CsrFuncs
) / sizeof( CsrFunc
)) - 1 )
92 Reply
->Status
= STATUS_INVALID_SYSTEM_SERVICE
;
93 else CsrFuncs
[ Request
->Type
]( ProcessData
, Request
, Reply
);
97 /**********************************************************************
102 * Handle connection requests from clients to the port
103 * "\Windows\ApiPort".
105 void Thread_Api(PVOID PortHandle
)
108 LPC_MAX_MESSAGE Request
;
112 CsrInitProcessData();
116 Status
= NtListenPort(PortHandle
, &Request
.Header
);
117 if (!NT_SUCCESS(Status
))
119 DisplayString(L
"CSR: NtListenPort() failed\n");
120 NtTerminateThread(NtCurrentThread(), Status
);
123 Status
= NtAcceptConnectPort(&ServerPort
,
129 if (!NT_SUCCESS(Status
))
131 DisplayString(L
"CSR: NtAcceptConnectPort() failed\n");
132 NtTerminateThread(NtCurrentThread(), Status
);
135 Status
= NtCompleteConnectPort(ServerPort
);
136 if (!NT_SUCCESS(Status
))
138 DisplayString(L
"CSR: NtCompleteConnectPort() failed\n");
139 NtTerminateThread(NtCurrentThread(), Status
);
142 Status
= RtlCreateUserThread(NtCurrentProcess(),
148 (PTHREAD_START_ROUTINE
)Thread_Api2
,
152 if (!NT_SUCCESS(Status
))
154 DisplayString(L
"CSR: Unable to create server thread\n");
156 NtTerminateThread(NtCurrentThread(), Status
);
158 NtClose(ServerThread
);