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 *****************************************************************/
20 /* GLOBALS *******************************************************************/
22 HANDLE WindowsApiPort
= INVALID_HANDLE_VALUE
;
23 static PVOID CsrSectionMapBase
= NULL
;
24 static PVOID CsrSectionMapServerBase
= NULL
;
25 static HANDLE CsrCommHeap
= NULL
;
27 #define CSR_CONTROL_HEAP_SIZE (65536)
29 /* FUNCTIONS *****************************************************************/
31 /* Possible CsrClientCallServer (the NT one): */
34 CsrCaptureParameterBuffer(PVOID ParameterBuffer
,
35 ULONG ParameterBufferSize
,
41 Block
= RtlAllocateHeap(CsrCommHeap
, 0, ParameterBufferSize
);
44 return(STATUS_NO_MEMORY
);
46 if(ParameterBuffer
!= NULL
)
48 memcpy(Block
, ParameterBuffer
, ParameterBufferSize
);
50 *ClientAddress
= Block
;
51 *ServerAddress
= (PVOID
)((ULONG_PTR
)Block
- (ULONG_PTR
)CsrSectionMapBase
+ (ULONG_PTR
)CsrSectionMapServerBase
);
52 return(STATUS_SUCCESS
);
56 CsrReleaseParameterBuffer(PVOID ClientAddress
)
58 RtlFreeHeap(CsrCommHeap
, 0, ClientAddress
);
59 return(STATUS_SUCCESS
);
67 CsrClientCallServer(PCSR_API_MESSAGE Request
,
68 PVOID CapturedBuffer OPTIONAL
,
69 CSR_API_NUMBER ApiNumber
,
73 DPRINT("CSR: CsrClientCallServer!\n");
75 /* Make sure it's valid */
76 if (INVALID_HANDLE_VALUE
== WindowsApiPort
)
78 DPRINT1("NTDLL.%s: client not connected to CSRSS!\n", __FUNCTION__
);
79 return (STATUS_UNSUCCESSFUL
);
82 /* Fill out the header */
83 Request
->Type
= ApiNumber
;
84 Request
->Header
.u1
.s1
.DataLength
= RequestLength
- LPC_MESSAGE_BASE_SIZE
;
85 Request
->Header
.u1
.s1
.TotalLength
= RequestLength
;
86 DPRINT("CSR: API: %x, u1.s1.DataLength: %x, u1.s1.TotalLength: %x\n",
88 Request
->Header
.u1
.s1
.DataLength
,
89 Request
->Header
.u1
.s1
.TotalLength
);
91 /* Send the LPC Message */
92 Status
= NtRequestWaitReplyPort(WindowsApiPort
,
96 DPRINT("Got back: %x\n", Status
);
105 CsrClientConnectToServer(PWSTR ObjectDirectory
,
110 PBOOLEAN ServerToServerCall
)
113 UNICODE_STRING PortName
= RTL_CONSTANT_STRING(L
"\\Windows\\ApiPort");
114 ULONG ConnectInfoLength
;
115 CSR_API_MESSAGE Request
;
117 HANDLE CsrSectionHandle
;
118 LARGE_INTEGER CsrSectionViewSize
;
120 if (WindowsApiPort
!= INVALID_HANDLE_VALUE
)
122 return STATUS_SUCCESS
;
125 CsrSectionViewSize
.QuadPart
= CSR_CSRSS_SECTION_SIZE
;
126 Status
= NtCreateSection(&CsrSectionHandle
,
133 if (!NT_SUCCESS(Status
))
137 ConnectInfoLength
= 0;
138 LpcWrite
.Length
= sizeof(PORT_VIEW
);
139 LpcWrite
.SectionHandle
= CsrSectionHandle
;
140 LpcWrite
.SectionOffset
= 0;
141 LpcWrite
.ViewSize
= CsrSectionViewSize
.u
.LowPart
;
142 Status
= NtConnectPort(&WindowsApiPort
,
150 if (!NT_SUCCESS(Status
))
152 WindowsApiPort
= INVALID_HANDLE_VALUE
;
156 NtClose(CsrSectionHandle
);
157 CsrSectionMapBase
= LpcWrite
.ViewBase
;
158 CsrSectionMapServerBase
= LpcWrite
.ViewRemoteBase
;
160 /* Create the heap for communication for csrss. */
161 CsrCommHeap
= RtlCreateHeap(0,
163 CsrSectionViewSize
.u
.LowPart
,
164 CsrSectionViewSize
.u
.LowPart
,
167 if (CsrCommHeap
== NULL
)
169 return(STATUS_NO_MEMORY
);
172 Status
= CsrClientCallServer(&Request
,
174 MAKE_CSR_API(CONNECT_PROCESS
, CSR_NATIVE
),
175 sizeof(CSR_API_MESSAGE
));
176 if (!NT_SUCCESS(Status
))
180 if (!NT_SUCCESS(Request
.Status
))
182 return(Request
.Status
);
184 return(STATUS_SUCCESS
);