1 /* $Id: wapi.c,v 1.34 2004/04/09 20:03:15 navaraf Exp $
3 * reactos/subsys/csrss/api/wapi.c
5 * Initialize the CSRSS subsystem server process.
7 * ReactOS Operating System
11 /* INCLUDES ******************************************************************/
13 #include <csrss/csrss.h>
14 #include <ddk/ntddk.h>
15 #include <ntdll/rtl.h>
20 /* GLOBALS *******************************************************************/
24 static unsigned ApiDefinitionsCount
= 0;
25 static PCSRSS_API_DEFINITION ApiDefinitions
= NULL
;
27 /* FUNCTIONS *****************************************************************/
30 CsrApiRegisterDefinitions(PCSRSS_API_DEFINITION NewDefinitions
)
33 PCSRSS_API_DEFINITION Scan
;
34 PCSRSS_API_DEFINITION New
;
37 for (Scan
= NewDefinitions
; 0 != Scan
->Handler
; Scan
++)
42 New
= RtlAllocateHeap(CsrssApiHeap
, 0,
43 (ApiDefinitionsCount
+ NewCount
)
44 * sizeof(CSRSS_API_DEFINITION
));
47 DPRINT1("Unable to allocate memory\n");
48 return STATUS_NO_MEMORY
;
50 if (0 != ApiDefinitionsCount
)
52 RtlCopyMemory(New
, ApiDefinitions
,
53 ApiDefinitionsCount
* sizeof(CSRSS_API_DEFINITION
));
54 RtlFreeHeap(CsrssApiHeap
, 0, ApiDefinitions
);
56 RtlCopyMemory(New
+ ApiDefinitionsCount
, NewDefinitions
,
57 NewCount
* sizeof(CSRSS_API_DEFINITION
));
59 ApiDefinitionsCount
+= NewCount
;
61 return STATUS_SUCCESS
;
65 CsrApiCallHandler(PCSRSS_PROCESS_DATA ProcessData
,
66 PCSRSS_API_REQUEST Request
,
67 PCSRSS_API_REPLY Reply
)
73 for (DefIndex
= 0; ! Found
&& DefIndex
< ApiDefinitionsCount
; DefIndex
++)
75 if (ApiDefinitions
[DefIndex
].Type
== Request
->Type
)
77 if (Request
->Header
.DataSize
< ApiDefinitions
[DefIndex
].MinRequestSize
)
79 DPRINT1("Request type %d min request size %d actual %d\n",
80 Request
->Type
, ApiDefinitions
[DefIndex
].MinRequestSize
,
81 Request
->Header
.DataSize
);
82 Reply
->Status
= STATUS_INVALID_PARAMETER
;
86 (ApiDefinitions
[DefIndex
].Handler
)(ProcessData
, Request
, Reply
);
93 DPRINT1("CSR: Unknown request type 0x%x\n", Request
->Type
);
94 Reply
->Header
.MessageSize
= sizeof(CSRSS_API_REPLY
);
95 Reply
->Header
.DataSize
= sizeof(CSRSS_API_REPLY
) - LPC_MESSAGE_BASE_SIZE
;
96 Reply
->Status
= STATUS_INVALID_SYSTEM_SERVICE
;
101 Thread_Api2(HANDLE ServerPort
)
104 LPC_MAX_MESSAGE LpcReply
;
105 LPC_MAX_MESSAGE LpcRequest
;
106 PCSRSS_API_REQUEST Request
;
107 PCSRSS_PROCESS_DATA ProcessData
;
108 PCSRSS_API_REPLY Reply
;
114 Status
= NtReplyWaitReceivePort(ServerPort
,
118 if (! NT_SUCCESS(Status
))
120 DPRINT1("CSR: NtReplyWaitReceivePort failed\n");
122 RtlRosExitUserThread(Status
);
126 if (LpcRequest
.Header
.MessageType
== LPC_PORT_CLOSED
)
128 CsrFreeProcessData( (ULONG
)LpcRequest
.Header
.ClientId
.UniqueProcess
);
130 RtlRosExitUserThread(STATUS_SUCCESS
);
134 Request
= (PCSRSS_API_REQUEST
)&LpcRequest
;
135 Reply
= (PCSRSS_API_REPLY
)&LpcReply
;
137 ProcessData
= CsrGetProcessData((ULONG
)LpcRequest
.Header
.ClientId
.UniqueProcess
);
139 CsrApiCallHandler(ProcessData
, Request
, Reply
);
143 /**********************************************************************
148 * Handle connection requests from clients to the port
149 * "\Windows\ApiPort".
151 void Thread_Api(PVOID PortHandle
)
154 LPC_MAX_MESSAGE Request
;
157 PCSRSS_PROCESS_DATA ProcessData
;
159 CsrInitProcessData();
163 LPC_SECTION_READ LpcRead
;
165 Status
= NtListenPort(PortHandle
, &Request
.Header
);
166 if (!NT_SUCCESS(Status
))
168 DPRINT1("CSR: NtListenPort() failed\n");
169 NtTerminateThread(NtCurrentThread(), Status
);
172 Status
= NtAcceptConnectPort(&ServerPort
,
178 if (!NT_SUCCESS(Status
))
180 DPRINT1("CSR: NtAcceptConnectPort() failed\n");
181 NtTerminateThread(NtCurrentThread(), Status
);
184 ProcessData
= CsrGetProcessData((ULONG
)Request
.Header
.ClientId
.UniqueProcess
);
185 ProcessData
->CsrSectionViewBase
= LpcRead
.ViewBase
;
186 ProcessData
->CsrSectionViewSize
= LpcRead
.ViewSize
;
188 Status
= NtCompleteConnectPort(ServerPort
);
189 if (!NT_SUCCESS(Status
))
191 DPRINT1("CSR: NtCompleteConnectPort() failed\n");
192 NtTerminateThread(NtCurrentThread(), Status
);
195 Status
= RtlCreateUserThread(NtCurrentProcess(),
201 (PTHREAD_START_ROUTINE
)Thread_Api2
,
205 if (!NT_SUCCESS(Status
))
207 DPRINT1("CSR: Unable to create server thread\n");
209 NtTerminateThread(NtCurrentThread(), Status
);
211 NtClose(ServerThread
);