svn: eol-style + keywords
Modified: trunk/reactos/lib/ntdll/csr/api.c
Modified: trunk/reactos/lib/ntdll/csr/capture.c
Modified: trunk/reactos/lib/ntdll/csr/connect.c
_____
Modified: trunk/reactos/lib/ntdll/csr/api.c
--- trunk/reactos/lib/ntdll/csr/api.c 2005-09-25 13:36:27 UTC (rev
18050)
+++ trunk/reactos/lib/ntdll/csr/api.c 2005-09-25 13:43:33 UTC (rev
18051)
@@ -1,89 +1,90 @@
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: lib/ntdll/csr/api.c
- * PURPOSE: CSR APIs exported through NTDLL
- * PROGRAMMER: Alex Ionescu (alex(a)relsoft.net)
- */
-
-/* INCLUDES
*****************************************************************/
-
-#include <ntdll.h>
-#define NDEBUG
-#include <debug.h>
-
-/* GLOBALS
*******************************************************************/
-extern HANDLE CsrApiPort;
-
-/* FUNCTIONS
*****************************************************************/
-
-/*
- * @implemented
- */
-NTSTATUS
-NTAPI
-CsrNewThread(VOID)
-{
- /* Register the termination port to CSR's */
- return NtRegisterThreadTerminatePort(CsrApiPort);
-}
-
-/*
- * @implemented
- */
-NTSTATUS
-NTAPI
-CsrSetPriorityClass(HANDLE hProcess,
- PULONG PriorityClass)
-{
- NTSTATUS Status;
- CSR_API_MESSAGE2 ApiMessage; /* <- Remove the "2" when CSR is
commited */
- PCSR_SET_PRIORITY_CLASS SetPriorityClass =
&ApiMessage.SetPriorityClass;
-
- /* Set up the data for CSR */
- DbgBreakPoint();
- SetPriorityClass->hProcess = hProcess;
- SetPriorityClass->PriorityClass = *PriorityClass;
-
- /* Call it */
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- NULL,
-
CSR_MAKE_OPCODE(CsrSrvSetPriorityClass,
- CSR_SRV_SERVER),
- sizeof(CSR_SET_PRIORITY_CLASS));
-
- /* Return what we got, if requested */
- if (*PriorityClass) *PriorityClass =
SetPriorityClass->PriorityClass;
-
- /* Return to caller */
- return Status;
-}
-
-/*
- * @implemented
- */
-NTSTATUS
-NTAPI
-CsrIdentifyAlertableThread (VOID)
-{
- NTSTATUS Status;
- CSR_API_MESSAGE2 ApiMessage; /* <- Remove the "2" when CSR is
commited */
- PCSR_IDENTIFY_ALTERTABLE_THREAD IdentifyAlertableThread;
-
- /* Set up the data for CSR */
- DbgBreakPoint();
- IdentifyAlertableThread = &ApiMessage.IdentifyAlertableThread;
- IdentifyAlertableThread->Cid = NtCurrentTeb()->Cid;
-
- /* Call it */
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- NULL,
-
CSR_MAKE_OPCODE(CsrSrvIdentifyAlertableThread,
- CSR_SRV_SERVER),
- sizeof(CSR_SET_PRIORITY_CLASS));
-
- /* Return to caller */
- return Status;
-}
-
-/* EOF */
+/* $Id$
+ *
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS kernel
+ * FILE: lib/ntdll/csr/api.c
+ * PURPOSE: CSR APIs exported through NTDLL
+ * PROGRAMMER: Alex Ionescu (alex(a)relsoft.net)
+ */
+
+/* INCLUDES
*****************************************************************/
+
+#include <ntdll.h>
+#define NDEBUG
+#include <debug.h>
+
+/* GLOBALS
*******************************************************************/
+extern HANDLE CsrApiPort;
+
+/* FUNCTIONS
*****************************************************************/
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+CsrNewThread(VOID)
+{
+ /* Register the termination port to CSR's */
+ return NtRegisterThreadTerminatePort(CsrApiPort);
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+CsrSetPriorityClass(HANDLE hProcess,
+ PULONG PriorityClass)
+{
+ NTSTATUS Status;
+ CSR_API_MESSAGE2 ApiMessage; /* <- Remove the "2" when CSR is
commited */
+ PCSR_SET_PRIORITY_CLASS SetPriorityClass =
&ApiMessage.SetPriorityClass;
+
+ /* Set up the data for CSR */
+ DbgBreakPoint();
+ SetPriorityClass->hProcess = hProcess;
+ SetPriorityClass->PriorityClass = *PriorityClass;
+
+ /* Call it */
+ Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+
CSR_MAKE_OPCODE(CsrSrvSetPriorityClass,
+ CSR_SRV_SERVER),
+ sizeof(CSR_SET_PRIORITY_CLASS));
+
+ /* Return what we got, if requested */
+ if (*PriorityClass) *PriorityClass =
SetPriorityClass->PriorityClass;
+
+ /* Return to caller */
+ return Status;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+CsrIdentifyAlertableThread (VOID)
+{
+ NTSTATUS Status;
+ CSR_API_MESSAGE2 ApiMessage; /* <- Remove the "2" when CSR is
commited */
+ PCSR_IDENTIFY_ALTERTABLE_THREAD IdentifyAlertableThread;
+
+ /* Set up the data for CSR */
+ DbgBreakPoint();
+ IdentifyAlertableThread = &ApiMessage.IdentifyAlertableThread;
+ IdentifyAlertableThread->Cid = NtCurrentTeb()->Cid;
+
+ /* Call it */
+ Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+
CSR_MAKE_OPCODE(CsrSrvIdentifyAlertableThread,
+ CSR_SRV_SERVER),
+ sizeof(CSR_SET_PRIORITY_CLASS));
+
+ /* Return to caller */
+ return Status;
+}
+
+/* EOF */
Property changes on: trunk/reactos/lib/ntdll/csr/api.c
___________________________________________________________________
Name: svn:keywords
+ author date id revision
Name: svn:eol-style
+ native
_____
Modified: trunk/reactos/lib/ntdll/csr/capture.c
--- trunk/reactos/lib/ntdll/csr/capture.c 2005-09-25 13:36:27 UTC
(rev 18050)
+++ trunk/reactos/lib/ntdll/csr/capture.c 2005-09-25 13:43:33 UTC
(rev 18051)
@@ -1,4 +1,5 @@
-/*
+/* $Id$
+ *
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: lib/ntdll/csr/capture.c
_____
Modified: trunk/reactos/lib/ntdll/csr/connect.c
--- trunk/reactos/lib/ntdll/csr/connect.c 2005-09-25 13:36:27 UTC
(rev 18050)
+++ trunk/reactos/lib/ntdll/csr/connect.c 2005-09-25 13:43:33 UTC
(rev 18051)
@@ -1,437 +1,438 @@
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: lib/ntdll/csr/connect.c
- * PURPOSE: Routines for connecting and calling CSR
- * PROGRAMMER: Alex Ionescu (alex(a)relsoft.net)
- */
-
-/* INCLUDES
*****************************************************************/
-
-#include <ntdll.h>
-#define NDEBUG
-#include <debug.h>
-
-/* GLOBALS
*******************************************************************/
-
-HANDLE CsrApiPort;
-HANDLE CsrProcessId;
-HANDLE CsrPortHeap;
-ULONG_PTR CsrPortMemoryDelta;
-BOOLEAN InsideCsrProcess = FALSE;
-BOOLEAN UsingOldCsr = TRUE;
-
-typedef NTSTATUS
-(NTAPI *PCSR_SERVER_API_ROUTINE)(IN PPORT_MESSAGE Request,
- IN PPORT_MESSAGE Reply);
-
-PCSR_SERVER_API_ROUTINE CsrServerApiRoutine;
-
-#define UNICODE_PATH_SEP L"\\"
-#define CSR_PORT_NAME L"ApiPort"
-
-/* FUNCTIONS
*****************************************************************/
-
-/*
- * @implemented
- */
-HANDLE
-NTAPI
-CsrGetProcessId(VOID)
-{
- return CsrProcessId;
-}
-
-/*
- * @implemented
- */
-NTSTATUS
-NTAPI
-CsrClientCallServer(PCSR_API_MESSAGE ApiMessage,
- PCSR_CAPTURE_BUFFER CaptureBuffer OPTIONAL,
- CSR_API_NUMBER ApiNumber,
- ULONG RequestLength)
-{
- NTSTATUS Status;
- ULONG PointerCount;
- PULONG_PTR Pointers;
- ULONG_PTR CurrentPointer;
- DPRINT("CsrClientCallServer\n");
-
- /* Fill out the Port Message Header */
- ApiMessage->Header.u1.s1.DataLength = RequestLength -
sizeof(PORT_MESSAGE);
- ApiMessage->Header.u1.s1.TotalLength = RequestLength;
-
- /* Fill out the CSR Header */
- ApiMessage->Type = ApiNumber;
- //ApiMessage->Opcode = ApiNumber; <- Activate with new CSR
- ApiMessage->CsrCaptureData = NULL;
-
- DPRINT("API: %x, u1.s1.DataLength: %x, u1.s1.TotalLength: %x\n",
- ApiNumber,
- ApiMessage->Header.u1.s1.DataLength,
- ApiMessage->Header.u1.s1.TotalLength);
-
- /* Check if we are already inside a CSR Server */
- if (!InsideCsrProcess)
- {
- /* Check if we got a a Capture Buffer */
- if (CaptureBuffer)
- {
- /* We have to convert from our local view to the remote
view */
- DPRINT1("Converting CaptureBuffer\n");
- ApiMessage->CsrCaptureData =
(PVOID)((ULONG_PTR)CaptureBuffer +
- CsrPortMemoryDelta);
-
- /* Lock the buffer */
- CaptureBuffer->BufferEnd = 0;
-
- /* Get the pointer information */
- PointerCount = CaptureBuffer->PointerCount;
- Pointers = CaptureBuffer->PointerArray;
-
- /* Loop through every pointer and convert it */
- while (PointerCount--)
- {
- /* Get this pointer and check if it's valid */
- if ((CurrentPointer = *Pointers++))
- {
- /* Update it */
- *(PULONG_PTR)CurrentPointer += CsrPortMemoryDelta;
- Pointers[-1] = CurrentPointer -
(ULONG_PTR)ApiMessage;
- }
- }
- }
-
- /* Send the LPC Message */
- Status = NtRequestWaitReplyPort(CsrApiPort,
- &ApiMessage->Header,
- &ApiMessage->Header);
-
- /* Check if we got a a Capture Buffer */
- if (CaptureBuffer)
- {
- /* We have to convert from the remote view to our remote
view */
- DPRINT1("Reconverting CaptureBuffer\n");
- ApiMessage->CsrCaptureData = (PVOID)((ULONG_PTR)
-
ApiMessage->CsrCaptureData -
- CsrPortMemoryDelta);
-
- /* Get the pointer information */
- PointerCount = CaptureBuffer->PointerCount;
- Pointers = CaptureBuffer->PointerArray;
-
- /* Loop through every pointer and convert it */
- while (PointerCount--)
- {
- /* Get this pointer and check if it's valid */
- if ((CurrentPointer = *Pointers++))
- {
- /* Update it */
- CurrentPointer += (ULONG_PTR)ApiMessage;
- Pointers[-1] = CurrentPointer;
- *(PULONG_PTR)CurrentPointer -= CsrPortMemoryDelta;
- }
- }
- }
-
- /* Check for success */
- if (!NT_SUCCESS(Status))
- {
- /* We failed. Overwrite the return value with the failure
*/
- DPRINT1("LPC Failed: %lx\n", Status);
- ApiMessage->Status = Status;
- }
- }
- else
- {
- /* This is a server-to-server call. Save our CID and do a
direct call */
- DbgBreakPoint();
- ApiMessage->Header.ClientId = NtCurrentTeb()->Cid;
- Status = CsrServerApiRoutine(&ApiMessage->Header,
- &ApiMessage->Header);
-
- /* Check for success */
- if (!NT_SUCCESS(Status))
- {
- /* We failed. Overwrite the return value with the failure
*/
- ApiMessage->Status = Status;
- }
- }
-
- /* Return the CSR Result */
- DPRINT("Got back: %x\n", ApiMessage->Status);
- return ApiMessage->Status;
-}
-
-NTSTATUS
-NTAPI
-CsrConnectToServer(IN PWSTR ObjectDirectory)
-{
- ULONG PortNameLength;
- UNICODE_STRING PortName;
- LARGE_INTEGER CsrSectionViewSize;
- NTSTATUS Status;
- HANDLE CsrSectionHandle;
- PORT_VIEW LpcWrite;
- REMOTE_PORT_VIEW LpcRead;
- SECURITY_QUALITY_OF_SERVICE SecurityQos;
- SID_IDENTIFIER_AUTHORITY NtSidAuthority = {SECURITY_NT_AUTHORITY};
- PSID SystemSid = NULL;
- CSR_CONNECTION_INFO ConnectionInfo;
- ULONG ConnectionInfoLength = sizeof(CSR_CONNECTION_INFO);
-
- DPRINT("%s(%S)\n", __FUNCTION__, ObjectDirectory);
-
- /* Binary compatibility with MS KERNEL32 */
- if (NULL == ObjectDirectory)
- {
- ObjectDirectory = L"\\Windows";
- }
-
- /* Calculate the total port name size */
- PortNameLength = ((wcslen(ObjectDirectory) + 1) * sizeof(WCHAR)) +
- sizeof(CSR_PORT_NAME);
-
- /* Set the port name */
- PortName.Length = 0;
- PortName.MaximumLength = PortNameLength;
-
- /* Allocate a buffer for it */
- PortName.Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0,
PortNameLength);
-
- /* Create the name */
- RtlAppendUnicodeToString(&PortName, ObjectDirectory );
- RtlAppendUnicodeToString(&PortName, UNICODE_PATH_SEP);
- RtlAppendUnicodeToString(&PortName, CSR_PORT_NAME);
-
- /* Create a section for the port memory */
- CsrSectionViewSize.QuadPart = CSR_CSRSS_SECTION_SIZE;
- Status = NtCreateSection(&CsrSectionHandle,
- SECTION_ALL_ACCESS,
- NULL,
- &CsrSectionViewSize,
- PAGE_READWRITE,
- SEC_COMMIT,
- NULL);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("Failure allocating CSR Section\n");
- return Status;
- }
-
- /* Set up the port view structures to match them with the section
*/
- LpcWrite.Length = sizeof(PORT_VIEW);
- LpcWrite.SectionHandle = CsrSectionHandle;
- LpcWrite.SectionOffset = 0;
- LpcWrite.ViewSize = CsrSectionViewSize.u.LowPart;
- LpcWrite.ViewBase = 0;
- LpcWrite.ViewRemoteBase = 0;
- LpcRead.Length = sizeof(REMOTE_PORT_VIEW);
- LpcRead.ViewSize = 0;
- LpcRead.ViewBase = 0;
-
- /* Setup the QoS */
- SecurityQos.ImpersonationLevel = SecurityImpersonation;
- SecurityQos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING;
- SecurityQos.EffectiveOnly = TRUE;
-
- /* Setup the connection info */
- ConnectionInfo.Version = 0x10000;
-
- /* Create a SID for us */
- Status = RtlAllocateAndInitializeSid(&NtSidAuthority,
- 1,
- SECURITY_LOCAL_SYSTEM_RID,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- &SystemSid);
-
- /* Connect to the port */
- Status = NtSecureConnectPort(&CsrApiPort,
- &PortName,
- &SecurityQos,
- &LpcWrite,
- SystemSid,
- &LpcRead,
- NULL,
- &ConnectionInfo,
- &ConnectionInfoLength);
- NtClose(CsrSectionHandle);
- if (!NT_SUCCESS(Status))
- {
- /* Failure */
- DPRINT1("Couldn't connect to CSR port\n");
- return Status;
- }
-
- /* Save the delta between the sections, for capture usage later */
- CsrPortMemoryDelta = (ULONG_PTR)LpcWrite.ViewRemoteBase -
- (ULONG_PTR)LpcWrite.ViewBase;
-
- /* Save the Process */
- CsrProcessId = ConnectionInfo.ProcessId;
-
- /* Save CSR Section data */
- NtCurrentPeb()->ReadOnlySharedMemoryBase =
ConnectionInfo.SharedSectionBase;
- NtCurrentPeb()->ReadOnlySharedMemoryHeap =
ConnectionInfo.SharedSectionHeap;
- NtCurrentPeb()->ReadOnlyStaticServerData =
ConnectionInfo.SharedSectionData;
-
- /* Create the port heap */
- CsrPortHeap = RtlCreateHeap(0,
- LpcWrite.ViewBase,
- LpcWrite.ViewSize,
- PAGE_SIZE,
- 0,
- 0);
-
- /* Return success */
- return STATUS_SUCCESS;
-}
-
-/*
- * @implemented
- */
-NTSTATUS
-NTAPI
-CsrClientConnectToServer(PWSTR ObjectDirectory,
- ULONG ServerId,
- PVOID ConnectionInfo,
- PULONG ConnectionInfoSize,
- PBOOLEAN ServerToServerCall)
-{
- NTSTATUS Status;
- PIMAGE_NT_HEADERS NtHeader;
- UNICODE_STRING CsrSrvName;
- HANDLE hCsrSrv;
- ANSI_STRING CsrServerRoutineName;
- PCSR_CAPTURE_BUFFER CaptureBuffer;
- CSR_API_MESSAGE RosApiMessage;
- CSR_API_MESSAGE2 ApiMessage;
- PCSR_CLIENT_CONNECT ClientConnect = &ApiMessage.ClientConnect;
-
- /* Validate the Connection Info */
- DPRINT("CsrClientConnectToServer: %lx %p\n", ServerId,
ConnectionInfo);
- if (ConnectionInfo && (!ConnectionInfoSize ||
!*ConnectionInfoSize))
- {
- DPRINT1("Connection info given, but no length\n");
- return STATUS_INVALID_PARAMETER;
- }
-
- /* Check if we're inside a CSR Process */
- if (InsideCsrProcess)
- {
- /* Tell the client that we're already inside CSR */
- if (ServerToServerCall) *ServerToServerCall = TRUE;
- return STATUS_SUCCESS;
- }
-
- /*
- * We might be in a CSR Process but not know it, if this is the
first call.
- * So let's find out.
- */
- if (!(NtHeader =
RtlImageNtHeader(NtCurrentPeb()->ImageBaseAddress)))
- {
- /* The image isn't valid */
- DPRINT1("Invalid image\n");
- return STATUS_INVALID_IMAGE_FORMAT;
- }
- InsideCsrProcess = (NtHeader->OptionalHeader.Subsystem ==
IMAGE_SUBSYSTEM_NATIVE);
-
- /* Now we can check if we are inside or not */
- if (InsideCsrProcess && !UsingOldCsr)
- {
- /* We're inside, so let's find csrsrv */
- DbgBreakPoint();
- RtlInitUnicodeString(&CsrSrvName, L"csrsrv");
- Status = LdrGetDllHandle(NULL,
- NULL,
- &CsrSrvName,
- &hCsrSrv);
- RtlFreeUnicodeString(&CsrSrvName);
-
- /* Now get the Server to Server routine */
- RtlInitAnsiString(&CsrServerRoutineName,
"CsrCallServerFromServer");
- Status = LdrGetProcedureAddress(hCsrSrv,
- &CsrServerRoutineName,
- 0L,
- (PVOID*)&CsrServerApiRoutine);
-
- /* Use the local heap as port heap */
- CsrPortHeap = RtlGetProcessHeap();
-
- /* Tell the caller we're inside the server */
- *ServerToServerCall = InsideCsrProcess;
- return STATUS_SUCCESS;
- }
-
- /* Now check if connection info is given */
- if (ConnectionInfo)
- {
- /* Well, we're defintely in a client now */
- InsideCsrProcess = FALSE;
-
- /* Do we have a connection to CSR yet? */
- if (!CsrApiPort)
- {
- /* No, set it up now */
- if (!NT_SUCCESS(Status =
CsrConnectToServer(ObjectDirectory)))
- {
- /* Failed */
- DPRINT1("Failure to connect to CSR\n");
- return Status;
- }
- }
-
- /* Setup the connect message header */
- ClientConnect->ServerId = ServerId;
- ClientConnect->ConnectionInfoSize = *ConnectionInfoSize;
-
- /* Setup a buffer for the connection info */
- CaptureBuffer = CsrAllocateCaptureBuffer(1,
-
ClientConnect->ConnectionInfoSize);
-
- /* Allocate a pointer for the connection info*/
- CsrAllocateMessagePointer(CaptureBuffer,
- ClientConnect->ConnectionInfoSize,
- &ClientConnect->ConnectionInfo);
-
- /* Copy the data into the buffer */
- RtlMoveMemory(ClientConnect->ConnectionInfo,
- ConnectionInfo,
- ClientConnect->ConnectionInfoSize);
-
- /* Return the allocated length */
- *ConnectionInfoSize = ClientConnect->ConnectionInfoSize;
-
- /* Call CSR */
-#if 0
- Status = CsrClientCallServer(&ApiMessage,
- CaptureBuffer,
-
CSR_MAKE_OPCODE(CsrSrvClientConnect,
- CSR_SRV_DLL),
- sizeof(CSR_CLIENT_CONNECT));
-#endif
- Status = CsrClientCallServer(&RosApiMessage,
- NULL,
-
MAKE_CSR_API(CONNECT_PROCESS, CSR_NATIVE),
-
sizeof(CSR_API_MESSAGE));
- }
- else
- {
- /* No connection info, just return */
- Status = STATUS_SUCCESS;
- }
-
- /* Let the caller know if this was server to server */
- DPRINT("Status was: %lx. Are we in server: %lx\n", Status,
InsideCsrProcess);
- if (ServerToServerCall) *ServerToServerCall = InsideCsrProcess;
- return Status;
-}
-
-/* EOF */
+/* $Id$
+ *
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS kernel
+ * FILE: lib/ntdll/csr/connect.c
+ * PURPOSE: Routines for connecting and calling CSR
+ * PROGRAMMER: Alex Ionescu (alex(a)relsoft.net)
+ */
+
+/* INCLUDES
*****************************************************************/
+
+#include <ntdll.h>
+#define NDEBUG
+#include <debug.h>
+
+/* GLOBALS
*******************************************************************/
+
+HANDLE CsrApiPort;
+HANDLE CsrProcessId;
+HANDLE CsrPortHeap;
+ULONG_PTR CsrPortMemoryDelta;
+BOOLEAN InsideCsrProcess = FALSE;
+BOOLEAN UsingOldCsr = TRUE;
+
+typedef NTSTATUS
+(NTAPI *PCSR_SERVER_API_ROUTINE)(IN PPORT_MESSAGE Request,
+ IN PPORT_MESSAGE Reply);
+
+PCSR_SERVER_API_ROUTINE CsrServerApiRoutine;
+
+#define UNICODE_PATH_SEP L"\\"
+#define CSR_PORT_NAME L"ApiPort"
+
+/* FUNCTIONS
*****************************************************************/
+
+/*
+ * @implemented
+ */
+HANDLE
+NTAPI
+CsrGetProcessId(VOID)
+{
+ return CsrProcessId;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+CsrClientCallServer(PCSR_API_MESSAGE ApiMessage,
+ PCSR_CAPTURE_BUFFER CaptureBuffer OPTIONAL,
+ CSR_API_NUMBER ApiNumber,
+ ULONG RequestLength)
+{
+ NTSTATUS Status;
+ ULONG PointerCount;
+ PULONG_PTR Pointers;
+ ULONG_PTR CurrentPointer;
+ DPRINT("CsrClientCallServer\n");
+
+ /* Fill out the Port Message Header */
+ ApiMessage->Header.u1.s1.DataLength = RequestLength -
sizeof(PORT_MESSAGE);
+ ApiMessage->Header.u1.s1.TotalLength = RequestLength;
+
+ /* Fill out the CSR Header */
+ ApiMessage->Type = ApiNumber;
+ //ApiMessage->Opcode = ApiNumber; <- Activate with new CSR
+ ApiMessage->CsrCaptureData = NULL;
+
+ DPRINT("API: %x, u1.s1.DataLength: %x, u1.s1.TotalLength: %x\n",
+ ApiNumber,
+ ApiMessage->Header.u1.s1.DataLength,
+ ApiMessage->Header.u1.s1.TotalLength);
+
+ /* Check if we are already inside a CSR Server */
+ if (!InsideCsrProcess)
+ {
+ /* Check if we got a a Capture Buffer */
+ if (CaptureBuffer)
+ {
+ /* We have to convert from our local view to the remote
view */
+ DPRINT1("Converting CaptureBuffer\n");
+ ApiMessage->CsrCaptureData =
(PVOID)((ULONG_PTR)CaptureBuffer +
+ CsrPortMemoryDelta);
+
+ /* Lock the buffer */
+ CaptureBuffer->BufferEnd = 0;
+
+ /* Get the pointer information */
+ PointerCount = CaptureBuffer->PointerCount;
+ Pointers = CaptureBuffer->PointerArray;
+
+ /* Loop through every pointer and convert it */
+ while (PointerCount--)
+ {
+ /* Get this pointer and check if it's valid */
+ if ((CurrentPointer = *Pointers++))
+ {
+ /* Update it */
+ *(PULONG_PTR)CurrentPointer += CsrPortMemoryDelta;
+ Pointers[-1] = CurrentPointer -
(ULONG_PTR)ApiMessage;
+ }
+ }
+ }
+
+ /* Send the LPC Message */
+ Status = NtRequestWaitReplyPort(CsrApiPort,
+ &ApiMessage->Header,
+ &ApiMessage->Header);
+
+ /* Check if we got a a Capture Buffer */
+ if (CaptureBuffer)
+ {
+ /* We have to convert from the remote view to our remote
view */
+ DPRINT1("Reconverting CaptureBuffer\n");
+ ApiMessage->CsrCaptureData = (PVOID)((ULONG_PTR)
+
ApiMessage->CsrCaptureData -
+ CsrPortMemoryDelta);
+
+ /* Get the pointer information */
+ PointerCount = CaptureBuffer->PointerCount;
+ Pointers = CaptureBuffer->PointerArray;
+
+ /* Loop through every pointer and convert it */
+ while (PointerCount--)
+ {
+ /* Get this pointer and check if it's valid */
+ if ((CurrentPointer = *Pointers++))
+ {
+ /* Update it */
+ CurrentPointer += (ULONG_PTR)ApiMessage;
+ Pointers[-1] = CurrentPointer;
+ *(PULONG_PTR)CurrentPointer -= CsrPortMemoryDelta;
+ }
+ }
+ }
+
+ /* Check for success */
+ if (!NT_SUCCESS(Status))
+ {
+ /* We failed. Overwrite the return value with the failure
*/
+ DPRINT1("LPC Failed: %lx\n", Status);
+ ApiMessage->Status = Status;
+ }
+ }
+ else
+ {
+ /* This is a server-to-server call. Save our CID and do a
direct call */
+ DbgBreakPoint();
+ ApiMessage->Header.ClientId = NtCurrentTeb()->Cid;
+ Status = CsrServerApiRoutine(&ApiMessage->Header,
+ &ApiMessage->Header);
+
+ /* Check for success */
+ if (!NT_SUCCESS(Status))
+ {
+ /* We failed. Overwrite the return value with the failure
*/
+ ApiMessage->Status = Status;
+ }
+ }
+
+ /* Return the CSR Result */
+ DPRINT("Got back: %x\n", ApiMessage->Status);
+ return ApiMessage->Status;
+}
+
+NTSTATUS
+NTAPI
+CsrConnectToServer(IN PWSTR ObjectDirectory)
+{
+ ULONG PortNameLength;
+ UNICODE_STRING PortName;
+ LARGE_INTEGER CsrSectionViewSize;
+ NTSTATUS Status;
+ HANDLE CsrSectionHandle;
+ PORT_VIEW LpcWrite;
+ REMOTE_PORT_VIEW LpcRead;
+ SECURITY_QUALITY_OF_SERVICE SecurityQos;
+ SID_IDENTIFIER_AUTHORITY NtSidAuthority = {SECURITY_NT_AUTHORITY};
+ PSID SystemSid = NULL;
+ CSR_CONNECTION_INFO ConnectionInfo;
+ ULONG ConnectionInfoLength = sizeof(CSR_CONNECTION_INFO);
+
+ DPRINT("%s(%S)\n", __FUNCTION__, ObjectDirectory);
+
+ /* Binary compatibility with MS KERNEL32 */
+ if (NULL == ObjectDirectory)
+ {
+ ObjectDirectory = L"\\Windows";
+ }
+
+ /* Calculate the total port name size */
+ PortNameLength = ((wcslen(ObjectDirectory) + 1) * sizeof(WCHAR)) +
+ sizeof(CSR_PORT_NAME);
+
+ /* Set the port name */
+ PortName.Length = 0;
+ PortName.MaximumLength = PortNameLength;
+
+ /* Allocate a buffer for it */
+ PortName.Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0,
PortNameLength);
+
+ /* Create the name */
+ RtlAppendUnicodeToString(&PortName, ObjectDirectory );
+ RtlAppendUnicodeToString(&PortName, UNICODE_PATH_SEP);
+ RtlAppendUnicodeToString(&PortName, CSR_PORT_NAME);
+
+ /* Create a section for the port memory */
+ CsrSectionViewSize.QuadPart = CSR_CSRSS_SECTION_SIZE;
+ Status = NtCreateSection(&CsrSectionHandle,
+ SECTION_ALL_ACCESS,
+ NULL,
+ &CsrSectionViewSize,
+ PAGE_READWRITE,
+ SEC_COMMIT,
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Failure allocating CSR Section\n");
+ return Status;
+ }
+
+ /* Set up the port view structures to match them with the section
*/
+ LpcWrite.Length = sizeof(PORT_VIEW);
+ LpcWrite.SectionHandle = CsrSectionHandle;
+ LpcWrite.SectionOffset = 0;
+ LpcWrite.ViewSize = CsrSectionViewSize.u.LowPart;
+ LpcWrite.ViewBase = 0;
+ LpcWrite.ViewRemoteBase = 0;
+ LpcRead.Length = sizeof(REMOTE_PORT_VIEW);
+ LpcRead.ViewSize = 0;
+ LpcRead.ViewBase = 0;
+
+ /* Setup the QoS */
+ SecurityQos.ImpersonationLevel = SecurityImpersonation;
+ SecurityQos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING;
+ SecurityQos.EffectiveOnly = TRUE;
+
+ /* Setup the connection info */
+ ConnectionInfo.Version = 0x10000;
+
+ /* Create a SID for us */
+ Status = RtlAllocateAndInitializeSid(&NtSidAuthority,
+ 1,
+ SECURITY_LOCAL_SYSTEM_RID,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ &SystemSid);
+
+ /* Connect to the port */
+ Status = NtSecureConnectPort(&CsrApiPort,
+ &PortName,
+ &SecurityQos,
+ &LpcWrite,
+ SystemSid,
+ &LpcRead,
+ NULL,
+ &ConnectionInfo,
+ &ConnectionInfoLength);
+ NtClose(CsrSectionHandle);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Failure */
+ DPRINT1("Couldn't connect to CSR port\n");
+ return Status;
+ }
+
+ /* Save the delta between the sections, for capture usage later */
+ CsrPortMemoryDelta = (ULONG_PTR)LpcWrite.ViewRemoteBase -
+ (ULONG_PTR)LpcWrite.ViewBase;
+
+ /* Save the Process */
+ CsrProcessId = ConnectionInfo.ProcessId;
+
+ /* Save CSR Section data */
+ NtCurrentPeb()->ReadOnlySharedMemoryBase =
ConnectionInfo.SharedSectionBase;
+ NtCurrentPeb()->ReadOnlySharedMemoryHeap =
ConnectionInfo.SharedSectionHeap;
+ NtCurrentPeb()->ReadOnlyStaticServerData =
ConnectionInfo.SharedSectionData;
+
+ /* Create the port heap */
+ CsrPortHeap = RtlCreateHeap(0,
+ LpcWrite.ViewBase,
+ LpcWrite.ViewSize,
+ PAGE_SIZE,
+ 0,
+ 0);
+
+ /* Return success */
+ return STATUS_SUCCESS;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+CsrClientConnectToServer(PWSTR ObjectDirectory,
+ ULONG ServerId,
+ PVOID ConnectionInfo,
+ PULONG ConnectionInfoSize,
+ PBOOLEAN ServerToServerCall)
+{
+ NTSTATUS Status;
+ PIMAGE_NT_HEADERS NtHeader;
+ UNICODE_STRING CsrSrvName;
+ HANDLE hCsrSrv;
+ ANSI_STRING CsrServerRoutineName;
+ PCSR_CAPTURE_BUFFER CaptureBuffer;
+ CSR_API_MESSAGE RosApiMessage;
+ CSR_API_MESSAGE2 ApiMessage;
+ PCSR_CLIENT_CONNECT ClientConnect = &ApiMessage.ClientConnect;
+
+ /* Validate the Connection Info */
+ DPRINT("CsrClientConnectToServer: %lx %p\n", ServerId,
ConnectionInfo);
+ if (ConnectionInfo && (!ConnectionInfoSize ||
!*ConnectionInfoSize))
+ {
+ DPRINT1("Connection info given, but no length\n");
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ /* Check if we're inside a CSR Process */
+ if (InsideCsrProcess)
+ {
+ /* Tell the client that we're already inside CSR */
+ if (ServerToServerCall) *ServerToServerCall = TRUE;
+ return STATUS_SUCCESS;
+ }
+
+ /*
+ * We might be in a CSR Process but not know it, if this is the
first call.
+ * So let's find out.
+ */
+ if (!(NtHeader =
RtlImageNtHeader(NtCurrentPeb()->ImageBaseAddress)))
+ {
+ /* The image isn't valid */
+ DPRINT1("Invalid image\n");
+ return STATUS_INVALID_IMAGE_FORMAT;
+ }
+ InsideCsrProcess = (NtHeader->OptionalHeader.Subsystem ==
IMAGE_SUBSYSTEM_NATIVE);
+
+ /* Now we can check if we are inside or not */
+ if (InsideCsrProcess && !UsingOldCsr)
+ {
+ /* We're inside, so let's find csrsrv */
+ DbgBreakPoint();
+ RtlInitUnicodeString(&CsrSrvName, L"csrsrv");
+ Status = LdrGetDllHandle(NULL,
+ NULL,
+ &CsrSrvName,
+ &hCsrSrv);
+ RtlFreeUnicodeString(&CsrSrvName);
[truncated at 1000 lines; 87 more skipped]