1 /* $Id: wapi.c,v 1.10 2001/01/18 15:00:09 dwelch 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>
19 /* GLOBALS *******************************************************************/
23 /* FUNCTIONS *****************************************************************/
25 typedef NTSTATUS (*CsrFunc
)( PCSRSS_PROCESS_DATA
, PCSRSS_API_REQUEST
, PCSRSS_API_REPLY
);
27 static const CsrFunc CsrFuncs
[] = {
35 CsrGetScreenBufferInfo
,
39 CsrWriteConsoleOutputChar
,
40 CsrWriteConsoleOutputAttrib
,
49 static void Thread_Api2(HANDLE ServerPort
)
52 LPC_MAX_MESSAGE LpcReply
;
53 LPC_MAX_MESSAGE LpcRequest
;
54 PCSRSS_API_REQUEST Request
;
55 PCSRSS_PROCESS_DATA ProcessData
;
56 PCSRSS_API_REPLY Reply
;
62 Status
= NtReplyWaitReceivePort(ServerPort
,
66 if (!NT_SUCCESS(Status
) &&
67 Status
!= STATUS_PORT_DISCONNECTED
)
69 DisplayString(L
"CSR: NtReplyWaitReceivePort failed\n");
72 if (LpcRequest
.Header
.MessageType
== LPC_PORT_CLOSED
||
73 Status
== STATUS_PORT_DISCONNECTED
)
75 CsrFreeProcessData( LpcRequest
.Header
.Cid
.UniqueProcess
);
77 NtTerminateThread(NtCurrentThread(), STATUS_SUCCESS
);
80 Request
= (PCSRSS_API_REQUEST
)&LpcRequest
;
81 Reply
= (PCSRSS_API_REPLY
)&LpcReply
;
83 ProcessData
= CsrGetProcessData(
84 (ULONG
)LpcRequest
.Header
.Cid
.UniqueProcess
);
86 // DisplayString(L"CSR: Received request\n");
87 if( Request
->Type
>= (sizeof( CsrFuncs
) / sizeof( CsrFunc
)) - 1 )
88 Reply
->Status
= STATUS_INVALID_SYSTEM_SERVICE
;
89 else CsrFuncs
[ Request
->Type
]( ProcessData
, Request
, Reply
);
93 /**********************************************************************
98 * Handle connection requests from clients to the port
101 void Thread_Api(PVOID PortHandle
)
104 LPC_MAX_MESSAGE Request
;
108 CsrInitProcessData();
112 Status
= NtListenPort(PortHandle
, &Request
.Header
);
113 if (!NT_SUCCESS(Status
))
115 DisplayString(L
"CSR: NtListenPort() failed\n");
116 NtTerminateThread(NtCurrentThread(), Status
);
119 Status
= NtAcceptConnectPort(&ServerPort
,
125 if (!NT_SUCCESS(Status
))
127 DisplayString(L
"CSR: NtAcceptConnectPort() failed\n");
128 NtTerminateThread(NtCurrentThread(), Status
);
131 Status
= NtCompleteConnectPort(ServerPort
);
132 if (!NT_SUCCESS(Status
))
134 DisplayString(L
"CSR: NtCompleteConnectPort() failed\n");
135 NtTerminateThread(NtCurrentThread(), Status
);
138 Status
= RtlCreateUserThread(NtCurrentProcess(),
144 (PTHREAD_START_ROUTINE
)Thread_Api2
,
148 if (!NT_SUCCESS(Status
))
150 DisplayString(L
"CSR: Unable to create server thread\n");
152 NtTerminateThread(NtCurrentThread(), Status
);
154 NtClose(ServerThread
);