1 /* $Id: lpc.c,v 1.3 2001/11/25 15:21:09 dwelch Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: lib/ntdll/csr/lpc.c
6 * PURPOSE: CSRSS Client/Server LPC API
10 * File api.c renamed lpc.c. Process/thread code moved
11 * in thread.c. Check added on the LPC port.
14 /* INCLUDES *****************************************************************/
16 #include <ddk/ntddk.h>
17 #include <ntdll/csr.h>
20 #include <csrss/csrss.h>
23 #include <ntdll/ntdll.h>
25 /* GLOBALS *******************************************************************/
27 HANDLE WindowsApiPort
= INVALID_HANDLE_VALUE
;
29 /* FUNCTIONS *****************************************************************/
31 /* Possible CsrClientCallServer (the NT one):
33 #define CSR_CCS_NATIVE 0x0000
34 #define CSR_CCS_CSR 0x0001
35 #define CSR_CCS_GUI 0x0002
37 typedef union _CSR_CCS_API
39 WORD Index; // CSRSS API number
40 WORD Subsystem; // 0=NTDLL;1=KERNEL32;2=KERNEL32
42 } CSR_CCS_API, * PCSR_CCS_API;
45 CsrClientCallServer(PVOID Request,
46 PVOID Unknown OPTIONAL,
50 Request is the family of PCSRSS_XXX_REQUEST objects.
51 XXX_REQUEST depend on the CsrApiNumber.Index.
55 CsrClientCallServer(PCSRSS_API_REQUEST Request
,
56 PCSRSS_API_REPLY Reply OPTIONAL
,
62 if (INVALID_HANDLE_VALUE
== WindowsApiPort
)
64 DbgPrint ("NTDLL.%s: client not connected to CSRSS!\n", __FUNCTION__
);
65 return (STATUS_UNSUCCESSFUL
);
68 Request
->Header
.DataSize
= Length
- sizeof(LPC_MESSAGE_HEADER
);
69 Request
->Header
.MessageSize
= Length
;
71 Status
= NtRequestWaitReplyPort(WindowsApiPort
,
73 (Reply
?&Reply
->Header
:&Request
->Header
));
79 CsrClientConnectToServer(VOID
)
82 UNICODE_STRING PortName
;
83 ULONG ConnectInfoLength
;
84 CSRSS_API_REQUEST Request
;
85 CSRSS_API_REPLY Reply
;
87 RtlInitUnicodeString(&PortName
, L
"\\Windows\\ApiPort");
88 ConnectInfoLength
= 0;
89 Status
= NtConnectPort(&WindowsApiPort
,
97 if (!NT_SUCCESS(Status
))
102 Request
.Type
= CSRSS_CONNECT_PROCESS
;
103 Status
= CsrClientCallServer(&Request
,
105 sizeof(CSRSS_API_REQUEST
),
106 sizeof(CSRSS_API_REPLY
));
107 if (!NT_SUCCESS(Status
))
111 if (!NT_SUCCESS(Reply
.Status
))
113 return(Reply
.Status
);
115 return(STATUS_SUCCESS
);