1 /* $Id: wapi.c,v 1.19 2002/09/08 10:23:45 chorns 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
,
59 static void Thread_Api2(HANDLE ServerPort
)
62 LPC_MAX_MESSAGE LpcReply
;
63 LPC_MAX_MESSAGE LpcRequest
;
64 PCSRSS_API_REQUEST Request
;
65 PCSRSS_PROCESS_DATA ProcessData
;
66 PCSRSS_API_REPLY Reply
;
72 Status
= NtReplyWaitReceivePort(ServerPort
,
76 if ( !NT_SUCCESS( Status
) )
78 DisplayString(L
"CSR: NtReplyWaitReceivePort failed\n");
81 if ( LpcRequest
.Header
.MessageType
== LPC_PORT_CLOSED
)
84 CsrFreeProcessData( (ULONG
)LpcRequest
.Header
.Cid
.UniqueProcess
);
86 NtTerminateThread(NtCurrentThread(), STATUS_SUCCESS
);
90 Request
= (PCSRSS_API_REQUEST
)&LpcRequest
;
91 Reply
= (PCSRSS_API_REPLY
)&LpcReply
;
93 ProcessData
= CsrGetProcessData(
94 (ULONG
)LpcRequest
.Header
.Cid
.UniqueProcess
);
96 // DisplayString(L"CSR: Received request\n");
97 if( Request
->Type
>= (sizeof( CsrFuncs
) / sizeof( CsrFunc
)) - 1 )
98 Reply
->Status
= STATUS_INVALID_SYSTEM_SERVICE
;
99 else CsrFuncs
[ Request
->Type
]( ProcessData
, Request
, Reply
);
103 /**********************************************************************
108 * Handle connection requests from clients to the port
109 * "\Windows\ApiPort".
111 void Thread_Api(PVOID PortHandle
)
114 LPC_MAX_MESSAGE Request
;
117 PCSRSS_PROCESS_DATA ProcessData
;
119 CsrInitProcessData();
123 LPC_SECTION_READ LpcRead
;
125 Status
= NtListenPort(PortHandle
, &Request
.Header
);
126 if (!NT_SUCCESS(Status
))
128 DisplayString(L
"CSR: NtListenPort() failed\n");
129 NtTerminateThread(NtCurrentThread(), Status
);
132 Status
= NtAcceptConnectPort(&ServerPort
,
138 if (!NT_SUCCESS(Status
))
140 DisplayString(L
"CSR: NtAcceptConnectPort() failed\n");
141 NtTerminateThread(NtCurrentThread(), Status
);
144 ProcessData
= CsrGetProcessData(Request
.Header
.Cid
.UniqueProcess
);
145 ProcessData
->CsrSectionViewBase
= LpcRead
.ViewBase
;
146 ProcessData
->CsrSectionViewSize
= LpcRead
.ViewSize
;
148 Status
= NtCompleteConnectPort(ServerPort
);
149 if (!NT_SUCCESS(Status
))
151 DisplayString(L
"CSR: NtCompleteConnectPort() failed\n");
152 NtTerminateThread(NtCurrentThread(), Status
);
155 Status
= RtlCreateUserThread(NtCurrentProcess(),
161 (PTHREAD_START_ROUTINE
)Thread_Api2
,
165 if (!NT_SUCCESS(Status
))
167 DisplayString(L
"CSR: Unable to create server thread\n");
169 NtTerminateThread(NtCurrentThread(), Status
);
171 NtClose(ServerThread
);