[NTDLL/KERNEL32/CSRSRV/WIN32K/USER32/WIN32CSR]

- Use the new messaging structures and the new macros, plus the new CSR_API function's signature (--> and rename some variables).
- Code cleaning & formatting.

[CSRSS/NDK]
- Reorganize all the header files in logical units (server.h for server-side of CSR, client.h for client-side, and msg.h for messaging), removing duplicated definitions.
- Code cleaning & formatting.

The next step would be to activate the code of server-dll loading inside csrsrv, then moving all the console-related APIs from win32csr to winsrv, the latter built with the same structure as csrsrv's.

svn path=/branches/ros-csrss/; revision=57570
This commit is contained in:
Hermès Bélusca-Maïto 2012-10-17 23:10:40 +00:00
parent 9616bdb4f0
commit 61d07a5b47
45 changed files with 1714 additions and 1754 deletions

View file

@ -37,8 +37,8 @@ CsrSetPriorityClass(HANDLE hProcess,
PULONG PriorityClass) PULONG PriorityClass)
{ {
NTSTATUS Status; NTSTATUS Status;
CSR_API_MESSAGE2 ApiMessage; /* <- Remove the "2" when CSR is commited */ CSR_API_MESSAGE ApiMessage;
PCSR_SET_PRIORITY_CLASS SetPriorityClass = &ApiMessage.SetPriorityClass; PCSR_SET_PRIORITY_CLASS SetPriorityClass = &ApiMessage.Data.SetPriorityClass;
/* Set up the data for CSR */ /* Set up the data for CSR */
DbgBreakPoint(); DbgBreakPoint();
@ -46,10 +46,9 @@ CsrSetPriorityClass(HANDLE hProcess,
SetPriorityClass->PriorityClass = *PriorityClass; SetPriorityClass->PriorityClass = *PriorityClass;
/* Call it */ /* Call it */
Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, Status = CsrClientCallServer(&ApiMessage,
NULL, NULL,
CSR_MAKE_OPCODE(CsrpSetPriorityClass, CSR_CREATE_API_NUMBER(CSR_SRV_SERVER, CsrpSetPriorityClass),
CSR_SRV_SERVER),
sizeof(CSR_SET_PRIORITY_CLASS)); sizeof(CSR_SET_PRIORITY_CLASS));
/* Return what we got, if requested */ /* Return what we got, if requested */
@ -67,19 +66,18 @@ NTAPI
CsrIdentifyAlertableThread (VOID) CsrIdentifyAlertableThread (VOID)
{ {
NTSTATUS Status; NTSTATUS Status;
CSR_API_MESSAGE2 ApiMessage; /* <- Remove the "2" when CSR is commited */ CSR_API_MESSAGE ApiMessage;
PCSR_IDENTIFY_ALTERTABLE_THREAD IdentifyAlertableThread; PCSR_IDENTIFY_ALTERTABLE_THREAD IdentifyAlertableThread;
/* Set up the data for CSR */ /* Set up the data for CSR */
DbgBreakPoint(); DbgBreakPoint();
IdentifyAlertableThread = &ApiMessage.IdentifyAlertableThread; IdentifyAlertableThread = &ApiMessage.Data.IdentifyAlertableThread;
IdentifyAlertableThread->Cid = NtCurrentTeb()->ClientId; IdentifyAlertableThread->Cid = NtCurrentTeb()->ClientId;
/* Call it */ /* Call it */
Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, Status = CsrClientCallServer(&ApiMessage,
NULL, NULL,
CSR_MAKE_OPCODE(CsrpIdentifyAlertable, CSR_CREATE_API_NUMBER(CSR_SRV_SERVER, CsrpIdentifyAlertable),
CSR_SRV_SERVER),
sizeof(CSR_SET_PRIORITY_CLASS)); sizeof(CSR_SET_PRIORITY_CLASS));
/* Return to caller */ /* Return to caller */

View file

@ -27,7 +27,6 @@ typedef NTSTATUS
PCSR_SERVER_API_ROUTINE CsrServerApiRoutine; PCSR_SERVER_API_ROUTINE CsrServerApiRoutine;
#define UNICODE_PATH_SEP L"\\" #define UNICODE_PATH_SEP L"\\"
#define CSR_PORT_NAME L"ApiPort"
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
@ -63,8 +62,7 @@ CsrClientCallServer(PCSR_API_MESSAGE ApiMessage,
ApiMessage->Header.u1.s1.TotalLength = RequestLength; ApiMessage->Header.u1.s1.TotalLength = RequestLength;
/* Fill out the CSR Header */ /* Fill out the CSR Header */
ApiMessage->Type = ApiNumber; ApiMessage->ApiNumber = ApiNumber;
//ApiMessage->Opcode = ApiNumber; <- Activate with new CSR
ApiMessage->CsrCaptureData = NULL; ApiMessage->CsrCaptureData = NULL;
DPRINT("API: %lx, u1.s1.DataLength: %x, u1.s1.TotalLength: %x\n", DPRINT("API: %lx, u1.s1.DataLength: %x, u1.s1.TotalLength: %x\n",
@ -332,9 +330,8 @@ CsrClientConnectToServer(PWSTR ObjectDirectory,
HANDLE hCsrSrv; HANDLE hCsrSrv;
ANSI_STRING CsrServerRoutineName; ANSI_STRING CsrServerRoutineName;
PCSR_CAPTURE_BUFFER CaptureBuffer; PCSR_CAPTURE_BUFFER CaptureBuffer;
CSR_API_MESSAGE RosApiMessage; CSR_API_MESSAGE ApiMessage;
CSR_API_MESSAGE2 ApiMessage; PCSR_CLIENT_CONNECT ClientConnect = &ApiMessage.Data.CsrClientConnect;
PCSR_CLIENT_CONNECT ClientConnect = &ApiMessage.ClientConnect;
/* Validate the Connection Info */ /* Validate the Connection Info */
DPRINT("CsrClientConnectToServer: %lx %p\n", ServerId, ConnectionInfo); DPRINT("CsrClientConnectToServer: %lx %p\n", ServerId, ConnectionInfo);
@ -437,14 +434,14 @@ CsrClientConnectToServer(PWSTR ObjectDirectory,
#if 0 #if 0
Status = CsrClientCallServer(&ApiMessage, Status = CsrClientCallServer(&ApiMessage,
CaptureBuffer, CaptureBuffer,
CSR_MAKE_OPCODE(CsrpClientConnect, CSR_CREATE_API_NUMBER(CSR_SRV_DLL, CsrpClientConnect),
CSR_SRV_DLL),
sizeof(CSR_CLIENT_CONNECT)); sizeof(CSR_CLIENT_CONNECT));
#endif #else
Status = CsrClientCallServer(&RosApiMessage, Status = CsrClientCallServer(&ApiMessage,
NULL, CaptureBuffer,
MAKE_CSR_API(CONNECT_PROCESS, CSR_NATIVE), CSR_CREATE_API_NUMBER(CSR_NATIVE, CONNECT_PROCESS),
sizeof(CSR_API_MESSAGE)); sizeof(CSR_API_MESSAGE));
#endif
} }
else else
{ {

View file

@ -42,7 +42,8 @@
#include "ntdllp.h" #include "ntdllp.h"
/* CSRSS Header */ /* CSRSS Header */
#include <csrss/csrss.h> #include <csrss/client.h>
#include <csrss/csrss.h> // FIXME: data header.
/* PSEH */ /* PSEH */
#include <pseh/pseh2.h> #include <pseh/pseh2.h>

View file

@ -143,11 +143,11 @@ LdrpFreeUnicodeString(PUNICODE_STRING String);
/* FIXME: Cleanup this mess */ /* FIXME: Cleanup this mess */
typedef NTSTATUS (NTAPI *PEPFUNC)(PPEB); typedef NTSTATUS (NTAPI *PEPFUNC)(PPEB);
NTSTATUS LdrMapSections(HANDLE ProcessHandle, NTSTATUS LdrMapSections(HANDLE ProcessHandle,
PVOID ImageBase, PVOID ImageBase,
HANDLE SectionHandle, HANDLE SectionHandle,
PIMAGE_NT_HEADERS NTHeaders); PIMAGE_NT_HEADERS NTHeaders);
NTSTATUS LdrMapNTDllForProcess(HANDLE ProcessHandle, NTSTATUS LdrMapNTDllForProcess(HANDLE ProcessHandle,
PHANDLE NTDllSectionHandle); PHANDLE NTDllSectionHandle);
ULONG ULONG
LdrpGetResidentSize(PIMAGE_NT_HEADERS NTHeaders); LdrpGetResidentSize(PIMAGE_NT_HEADERS NTHeaders);

View file

@ -8,34 +8,34 @@ set_rc_compiler()
spec2def(kernel32.dll kernel32.spec ADD_IMPORTLIB) spec2def(kernel32.dll kernel32.spec ADD_IMPORTLIB)
list(APPEND SOURCE list(APPEND SOURCE
client/appcache.c client/appcache.c
client/atom.c client/atom.c
client/compname.c client/compname.c
client/debugger.c client/debugger.c
client/dosdev.c client/dosdev.c
client/dllmain.c client/dllmain.c
client/environ.c client/environ.c
client/except.c client/except.c
client/fiber.c client/fiber.c
client/handle.c client/handle.c
client/heapmem.c client/heapmem.c
client/job.c client/job.c
client/loader.c client/loader.c
client/path.c client/path.c
client/perfcnt.c client/perfcnt.c
client/power.c client/power.c
client/proc.c client/proc.c
client/resntfy.c client/resntfy.c
client/session.c client/session.c
client/synch.c client/synch.c
client/sysinfo.c client/sysinfo.c
client/time.c client/time.c
client/timerqueue.c client/timerqueue.c
client/toolhelp.c client/toolhelp.c
client/utils.c client/utils.c
client/thread.c client/thread.c
client/vdm.c client/vdm.c
client/version.c client/version.c
client/virtmem.c client/virtmem.c
client/vista.c client/vista.c
client/file/backup.c client/file/backup.c

View file

@ -62,7 +62,6 @@ WINAPI
BasepInitConsole(VOID) BasepInitConsole(VOID)
{ {
CSR_API_MESSAGE Request; CSR_API_MESSAGE Request;
ULONG CsrRequest;
NTSTATUS Status; NTSTATUS Status;
BOOLEAN NotConsole = FALSE; BOOLEAN NotConsole = FALSE;
PRTL_USER_PROCESS_PARAMETERS Parameters = NtCurrentPeb()->ProcessParameters; PRTL_USER_PROCESS_PARAMETERS Parameters = NtCurrentPeb()->ProcessParameters;
@ -178,11 +177,10 @@ BasepInitConsole(VOID)
* console message to the Base Server. When we finally have a Console * console message to the Base Server. When we finally have a Console
* Server, this code should be changed to send connection data instead. * Server, this code should be changed to send connection data instead.
*/ */
CsrRequest = MAKE_CSR_API(ALLOC_CONSOLE, CSR_CONSOLE);
Request.Data.AllocConsoleRequest.CtrlDispatcher = ConsoleControlDispatcher; Request.Data.AllocConsoleRequest.CtrlDispatcher = ConsoleControlDispatcher;
Status = CsrClientCallServer(&Request, Status = CsrClientCallServer(&Request,
NULL, NULL,
CsrRequest, CSR_CREATE_API_NUMBER(CSR_CONSOLE, ALLOC_CONSOLE),
sizeof(CSR_API_MESSAGE)); sizeof(CSR_API_MESSAGE));
if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status)) if(!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
{ {

View file

@ -183,7 +183,7 @@ DefineDosDeviceW(
Status = CsrClientCallServer(&Request, Status = CsrClientCallServer(&Request,
CaptureBuffer, CaptureBuffer,
MAKE_CSR_API(DEFINE_DOS_DEVICE, CSR_CONSOLE), CSR_CREATE_API_NUMBER(CSR_CONSOLE, DEFINE_DOS_DEVICE),
sizeof(CSR_API_MESSAGE)); sizeof(CSR_API_MESSAGE));
CsrFreeCaptureBuffer(CaptureBuffer); CsrFreeCaptureBuffer(CaptureBuffer);

File diff suppressed because it is too large Load diff

View file

@ -31,7 +31,7 @@ NotifySoundSentry(VOID)
{ {
CsrClientCallServer(&ApiMessage, CsrClientCallServer(&ApiMessage,
NULL, NULL,
MAKE_CSR_API(SOUND_SENTRY, CSR_NATIVE), CSR_CREATE_API_NUMBER(CSR_NATIVE, SOUND_SENTRY),
sizeof(CSR_API_MESSAGE)); sizeof(CSR_API_MESSAGE));
} }
} }

View file

@ -158,7 +158,10 @@ GetTempFileNameW(IN LPCWSTR lpPathName,
/* If user didn't gave any ID, ask Csrss to give one */ /* If user didn't gave any ID, ask Csrss to give one */
if (!uUnique) if (!uUnique)
{ {
CsrClientCallServer(&ApiMessage, NULL, MAKE_CSR_API(GET_TEMP_FILE, CSR_NATIVE), sizeof(CSR_API_MESSAGE)); CsrClientCallServer(&ApiMessage,
NULL,
CSR_CREATE_API_NUMBER(CSR_NATIVE, GET_TEMP_FILE),
sizeof(CSR_API_MESSAGE));
if (ApiMessage.Data.GetTempFile.UniqueID == 0) if (ApiMessage.Data.GetTempFile.UniqueID == 0)
{ {
Num++; Num++;

View file

@ -508,7 +508,7 @@ BasepNotifyCsrOfThread(IN HANDLE ThreadHandle,
/* Call CSR */ /* Call CSR */
Status = CsrClientCallServer(&CsrRequest, Status = CsrClientCallServer(&CsrRequest,
NULL, NULL,
MAKE_CSR_API(Request, CSR_NATIVE), CSR_CREATE_API_NUMBER(CSR_NATIVE, Request),
sizeof(CSR_API_MESSAGE)); sizeof(CSR_API_MESSAGE));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrRequest.Status)) if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrRequest.Status))
{ {
@ -584,7 +584,7 @@ BasepCreateFirstThread(HANDLE ProcessHandle,
/* Call CSR */ /* Call CSR */
Status = CsrClientCallServer(&CsrRequest, Status = CsrClientCallServer(&CsrRequest,
NULL, NULL,
MAKE_CSR_API(Request, CSR_NATIVE), CSR_CREATE_API_NUMBER(CSR_NATIVE, Request),
sizeof(CSR_API_MESSAGE)); sizeof(CSR_API_MESSAGE));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrRequest.Status)) if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrRequest.Status))
{ {
@ -1182,7 +1182,7 @@ GetProcessShutdownParameters(OUT LPDWORD lpdwLevel,
/* Ask CSRSS for shutdown information */ /* Ask CSRSS for shutdown information */
Status = CsrClientCallServer(&CsrRequest, Status = CsrClientCallServer(&CsrRequest,
NULL, NULL,
MAKE_CSR_API(GET_SHUTDOWN_PARAMETERS, CSR_NATIVE), CSR_CREATE_API_NUMBER(CSR_NATIVE, GET_SHUTDOWN_PARAMETERS),
sizeof(CSR_API_MESSAGE)); sizeof(CSR_API_MESSAGE));
if (!(NT_SUCCESS(Status)) || !(NT_SUCCESS(CsrRequest.Status))) if (!(NT_SUCCESS(Status)) || !(NT_SUCCESS(CsrRequest.Status)))
{ {
@ -1213,7 +1213,7 @@ SetProcessShutdownParameters(IN DWORD dwLevel,
CsrRequest.Data.SetShutdownParametersRequest.Flags = dwFlags; CsrRequest.Data.SetShutdownParametersRequest.Flags = dwFlags;
Status = CsrClientCallServer(&CsrRequest, Status = CsrClientCallServer(&CsrRequest,
NULL, NULL,
MAKE_CSR_API(SET_SHUTDOWN_PARAMETERS, CSR_NATIVE), CSR_CREATE_API_NUMBER(CSR_NATIVE, SET_SHUTDOWN_PARAMETERS),
sizeof(CSR_API_MESSAGE)); sizeof(CSR_API_MESSAGE));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrRequest.Status)) if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrRequest.Status))
{ {
@ -1760,7 +1760,7 @@ ExitProcess(IN UINT uExitCode)
CsrRequest.Data.TerminateProcessRequest.uExitCode = uExitCode; CsrRequest.Data.TerminateProcessRequest.uExitCode = uExitCode;
CsrClientCallServer(&CsrRequest, CsrClientCallServer(&CsrRequest,
NULL, NULL,
MAKE_CSR_API(TERMINATE_PROCESS, CSR_NATIVE), CSR_CREATE_API_NUMBER(CSR_NATIVE, TERMINATE_PROCESS),
sizeof(CSR_API_MESSAGE)); sizeof(CSR_API_MESSAGE));
/* Now do it again */ /* Now do it again */

View file

@ -89,7 +89,6 @@ BaseUpdateVDMEntry(IN ULONG UpdateIndex,
{ {
NTSTATUS Status; NTSTATUS Status;
CSR_API_MESSAGE Msg; CSR_API_MESSAGE Msg;
ULONG CsrRequest = MAKE_CSR_API(UPDATE_VDM_ENTRY, CSR_CONSOLE);
/* Check what update is being sent */ /* Check what update is being sent */
switch (UpdateIndex) switch (UpdateIndex)
@ -133,7 +132,10 @@ BaseUpdateVDMEntry(IN ULONG UpdateIndex,
Msg.Data.UpdateVdmEntry.BinaryType = BinaryType; Msg.Data.UpdateVdmEntry.BinaryType = BinaryType;
/* Send the message to CSRSS */ /* Send the message to CSRSS */
Status = CsrClientCallServer(&Msg, NULL, CsrRequest, sizeof(Msg)); Status = CsrClientCallServer(&Msg,
NULL,
CSR_CREATE_API_NUMBER(CSR_CONSOLE, UPDATE_VDM_ENTRY),
sizeof(Msg));
if (!(NT_SUCCESS(Status)) || !(NT_SUCCESS(Msg.Status))) if (!(NT_SUCCESS(Status)) || !(NT_SUCCESS(Msg.Status)))
{ {
/* Handle failure */ /* Handle failure */
@ -160,7 +162,6 @@ BaseCheckForVDM(IN HANDLE ProcessHandle,
NTSTATUS Status; NTSTATUS Status;
EVENT_BASIC_INFORMATION EventBasicInfo; EVENT_BASIC_INFORMATION EventBasicInfo;
CSR_API_MESSAGE Msg; CSR_API_MESSAGE Msg;
ULONG CsrRequest = MAKE_CSR_API(GET_VDM_EXIT_CODE, CSR_CONSOLE);
/* It's VDM if the process is actually a wait handle (an event) */ /* It's VDM if the process is actually a wait handle (an event) */
Status = NtQueryEvent(ProcessHandle, Status = NtQueryEvent(ProcessHandle,
@ -175,7 +176,10 @@ BaseCheckForVDM(IN HANDLE ProcessHandle,
Msg.Data.GetVdmExitCode.hParent = ProcessHandle; Msg.Data.GetVdmExitCode.hParent = ProcessHandle;
/* Call CSRSS */ /* Call CSRSS */
Status = CsrClientCallServer(&Msg, NULL, CsrRequest, sizeof(Msg)); Status = CsrClientCallServer(&Msg,
NULL,
CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_VDM_EXIT_CODE),
sizeof(Msg));
if (!NT_SUCCESS(Status)) return FALSE; if (!NT_SUCCESS(Status)) return FALSE;
/* Get the exit code from the reply */ /* Get the exit code from the reply */

View file

@ -319,22 +319,28 @@ WINAPI
GetConsoleHistoryInfo(PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo) GetConsoleHistoryInfo(PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo)
{ {
CSR_API_MESSAGE Request; CSR_API_MESSAGE Request;
ULONG CsrRequest = MAKE_CSR_API(GET_HISTORY_INFO, CSR_CONSOLE);
NTSTATUS Status; NTSTATUS Status;
if (lpConsoleHistoryInfo->cbSize != sizeof(CONSOLE_HISTORY_INFO)) if (lpConsoleHistoryInfo->cbSize != sizeof(CONSOLE_HISTORY_INFO))
{ {
SetLastError(ERROR_INVALID_PARAMETER); SetLastError(ERROR_INVALID_PARAMETER);
return FALSE; return FALSE;
} }
Status = CsrClientCallServer(&Request, NULL, CsrRequest, sizeof(CSR_API_MESSAGE));
Status = CsrClientCallServer(&Request,
NULL,
CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_HISTORY_INFO),
sizeof(CSR_API_MESSAGE));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status)) if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
{ {
BaseSetLastNTError(Status); BaseSetLastNTError(Status);
return FALSE; return FALSE;
} }
lpConsoleHistoryInfo->HistoryBufferSize = Request.Data.GetHistoryInfo.HistoryBufferSize; lpConsoleHistoryInfo->HistoryBufferSize = Request.Data.GetHistoryInfo.HistoryBufferSize;
lpConsoleHistoryInfo->NumberOfHistoryBuffers = Request.Data.GetHistoryInfo.NumberOfHistoryBuffers; lpConsoleHistoryInfo->NumberOfHistoryBuffers = Request.Data.GetHistoryInfo.NumberOfHistoryBuffers;
lpConsoleHistoryInfo->dwFlags = Request.Data.GetHistoryInfo.dwFlags; lpConsoleHistoryInfo->dwFlags = Request.Data.GetHistoryInfo.dwFlags;
return TRUE; return TRUE;
} }
@ -349,22 +355,28 @@ WINAPI
SetConsoleHistoryInfo(IN PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo) SetConsoleHistoryInfo(IN PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo)
{ {
CSR_API_MESSAGE Request; CSR_API_MESSAGE Request;
ULONG CsrRequest = MAKE_CSR_API(GET_HISTORY_INFO, CSR_CONSOLE);
NTSTATUS Status; NTSTATUS Status;
if (lpConsoleHistoryInfo->cbSize != sizeof(CONSOLE_HISTORY_INFO)) if (lpConsoleHistoryInfo->cbSize != sizeof(CONSOLE_HISTORY_INFO))
{ {
SetLastError(ERROR_INVALID_PARAMETER); SetLastError(ERROR_INVALID_PARAMETER);
return FALSE; return FALSE;
} }
Request.Data.SetHistoryInfo.HistoryBufferSize = lpConsoleHistoryInfo->HistoryBufferSize; Request.Data.SetHistoryInfo.HistoryBufferSize = lpConsoleHistoryInfo->HistoryBufferSize;
Request.Data.SetHistoryInfo.NumberOfHistoryBuffers = lpConsoleHistoryInfo->NumberOfHistoryBuffers; Request.Data.SetHistoryInfo.NumberOfHistoryBuffers = lpConsoleHistoryInfo->NumberOfHistoryBuffers;
Request.Data.SetHistoryInfo.dwFlags = lpConsoleHistoryInfo->dwFlags; Request.Data.SetHistoryInfo.dwFlags = lpConsoleHistoryInfo->dwFlags;
Status = CsrClientCallServer(&Request, NULL, CsrRequest, sizeof(CSR_API_MESSAGE));
Status = CsrClientCallServer(&Request,
NULL,
CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_HISTORY_INFO),
sizeof(CSR_API_MESSAGE));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status)) if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
{ {
BaseSetLastNTError(Status); BaseSetLastNTError(Status);
return FALSE; return FALSE;
} }
return TRUE; return TRUE;
} }

View file

@ -36,7 +36,8 @@
#include <ndk/umfuncs.h> #include <ndk/umfuncs.h>
/* CSRSS Header */ /* CSRSS Header */
#include <csrss/csrss.h> #include <csrss/client.h>
#include <csrss/csrss.h> // FIXME: data header.
/* C Headers */ /* C Headers */
#include <ctype.h> #include <ctype.h>

View file

@ -25,103 +25,6 @@ Author:
#include <umtypes.h> #include <umtypes.h>
#include <dbgktypes.h> #include <dbgktypes.h>
//
// Don't force inclusion of csrss header, leave this opaque.
//
struct _CSR_API_MESSAGE;
struct _CSR_CAPTURE_BUFFER;
//
// CSR Functions
//
PVOID
NTAPI
CsrAllocateCaptureBuffer(
ULONG ArgumentCount,
ULONG BufferSize
);
ULONG
NTAPI
CsrAllocateMessagePointer(
struct _CSR_CAPTURE_BUFFER *CaptureBuffer,
ULONG MessageLength,
PVOID *CaptureData
);
VOID
NTAPI
CsrCaptureMessageBuffer(
struct _CSR_CAPTURE_BUFFER *CaptureBuffer,
PVOID MessageString,
ULONG StringLength,
PVOID *CapturedData
);
NTSTATUS
NTAPI
CsrClientConnectToServer(
PWSTR ObjectDirectory,
ULONG ServerId,
PVOID ConnectionInfo,
PULONG ConnectionInfoSize,
PBOOLEAN ServerToServerCall
);
NTSTATUS
NTAPI
CsrClientCallServer(
struct _CSR_API_MESSAGE *Request,
struct _CSR_CAPTURE_BUFFER *CaptureBuffer OPTIONAL,
ULONG ApiNumber,
ULONG RequestLength
);
NTSTATUS
NTAPI
CsrIdentifyAlertableThread(
VOID
);
VOID
NTAPI
CsrFreeCaptureBuffer(
struct _CSR_CAPTURE_BUFFER *CaptureBuffer
);
HANDLE
NTAPI
CsrGetProcessId(
VOID
);
NTSTATUS
NTAPI
CsrNewThread(VOID);
NTSTATUS
NTAPI
CsrSetPriorityClass(
HANDLE Process,
PULONG PriorityClass
);
VOID
NTAPI
CsrProbeForRead(
IN PVOID Address,
IN ULONG Length,
IN ULONG Alignment
);
VOID
NTAPI
CsrProbeForWrite(
IN PVOID Address,
IN ULONG Length,
IN ULONG Alignment
);
// //
// Debug Functions // Debug Functions
// //

View file

@ -105,13 +105,6 @@ Author:
#define MAXUSHORT 0xffff #define MAXUSHORT 0xffff
#define MAXULONG 0xffffffff #define MAXULONG 0xffffffff
//
// CSR Macros
//
#define CSR_MAKE_OPCODE(s,m) ((s) << 16) | (m)
#define CSR_API_ID_FROM_OPCODE(n) ((ULONG)((USHORT)(n)))
#define CSR_SERVER_ID_FROM_OPCODE(n) (ULONG)((n) >> 16)
// //
// Basic Types that aren't defined in User-Mode Headers // Basic Types that aren't defined in User-Mode Headers
// //

View file

@ -0,0 +1,100 @@
/*
* PROJECT: ReactOS Native Headers
* FILE: include/subsys/csrss/client.h
* PURPOSE: Public Definitions for CSR Clients
* PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
* Hermes Belusca-Maito (hermes.belusca@sfr.fr)
*/
#ifndef _CSRCLIENT_H
#define _CSRCLIENT_H
#include "msg.h"
/*
BOOLEAN
NTAPI
CsrCaptureArguments(IN PCSR_THREAD CsrThread,
IN PCSR_API_MESSAGE ApiMessage);
VOID
NTAPI
CsrReleaseCapturedArguments(IN PCSR_API_MESSAGE ApiMessage);
*/
NTSTATUS
NTAPI
CsrClientConnectToServer(IN PWSTR ObjectDirectory,
IN ULONG ServerId,
IN PVOID ConnectionInfo,
IN OUT PULONG ConnectionInfoSize,
OUT PBOOLEAN ServerToServerCall);
NTSTATUS
NTAPI
CsrClientCallServer(IN OUT PCSR_API_MESSAGE Request,
IN OUT PCSR_CAPTURE_BUFFER CaptureBuffer OPTIONAL,
IN ULONG ApiNumber,
IN ULONG RequestLength);
PVOID
NTAPI
CsrAllocateCaptureBuffer(IN ULONG ArgumentCount,
IN ULONG BufferSize);
VOID
NTAPI
CsrFreeCaptureBuffer(IN PCSR_CAPTURE_BUFFER CaptureBuffer);
ULONG
NTAPI
CsrAllocateMessagePointer(IN OUT PCSR_CAPTURE_BUFFER CaptureBuffer,
IN ULONG MessageLength,
OUT PVOID* CaptureData);
VOID
NTAPI
CsrCaptureMessageBuffer(IN OUT PCSR_CAPTURE_BUFFER CaptureBuffer,
IN PVOID MessageString,
IN ULONG StringLength,
OUT PVOID* CapturedData);
BOOLEAN
NTAPI
CsrValidateMessageBuffer(IN PCSR_API_MESSAGE ApiMessage,
IN PVOID* Buffer,
IN ULONG ArgumentSize,
IN ULONG ArgumentCount);
VOID
NTAPI
CsrProbeForRead(IN PVOID Address,
IN ULONG Length,
IN ULONG Alignment);
VOID
NTAPI
CsrProbeForWrite(IN PVOID Address,
IN ULONG Length,
IN ULONG Alignment);
NTSTATUS
NTAPI
CsrIdentifyAlertableThread(VOID);
HANDLE
NTAPI
CsrGetProcessId(VOID);
NTSTATUS
NTAPI
CsrNewThread(VOID);
NTSTATUS
NTAPI
CsrSetPriorityClass(IN HANDLE Process,
IN OUT PULONG PriorityClass);
#endif // _CSRCLIENT_H
/* EOF */

View file

@ -0,0 +1,392 @@
/*
* CSRSS Console management structures.
*/
#ifndef __CSRCONS_H__
#define __CSRCONS_H__
#include <drivers/blue/ntddblue.h>
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
ULONG NrCharactersToWrite;
ULONG NrCharactersWritten;
HANDLE UnpauseEvent;
BYTE Buffer[0];
} CSRSS_WRITE_CONSOLE, *PCSRSS_WRITE_CONSOLE;
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
WORD NrCharactersToRead;
WORD NrCharactersRead;
HANDLE EventHandle;
PVOID Buffer;
UNICODE_STRING ExeName;
DWORD CtrlWakeupMask;
DWORD ControlKeyState;
} CSRSS_READ_CONSOLE, *PCSRSS_READ_CONSOLE;
typedef struct
{
PCONTROLDISPATCHER CtrlDispatcher;
BOOLEAN ConsoleNeeded;
INT ShowCmd;
HANDLE Console;
HANDLE InputHandle;
HANDLE OutputHandle;
} CSRSS_ALLOC_CONSOLE, *PCSRSS_ALLOC_CONSOLE;
typedef struct
{
ULONG Dummy;
} CSRSS_FREE_CONSOLE, *PCSRSS_FREE_CONSOLE;
typedef struct
{
HANDLE ConsoleHandle;
CONSOLE_SCREEN_BUFFER_INFO Info;
} CSRSS_SCREEN_BUFFER_INFO, *PCSRSS_SCREEN_BUFFER_INFO;
typedef struct
{
HANDLE ConsoleHandle;
COORD Position;
} CSRSS_SET_CURSOR, *PCSRSS_SET_CURSOR;
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
union
{
CHAR AsciiChar;
WCHAR UnicodeChar;
} Char;
COORD Position;
WORD Length;
ULONG NrCharactersWritten;
} CSRSS_FILL_OUTPUT, *PCSRSS_FILL_OUTPUT;
typedef struct
{
HANDLE ConsoleHandle;
CHAR Attribute;
COORD Coord;
WORD Length;
} CSRSS_FILL_OUTPUT_ATTRIB, *PCSRSS_FILL_OUTPUT_ATTRIB;
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
INPUT_RECORD Input;
BOOL MoreEvents;
HANDLE Event;
} CSRSS_READ_INPUT, *PCSRSS_READ_INPUT;
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
WORD Length;
COORD Coord;
COORD EndCoord;
ULONG NrCharactersWritten;
CHAR String[0];
} CSRSS_WRITE_CONSOLE_OUTPUT_CHAR, *PCSRSS_WRITE_CONSOLE_OUTPUT_CHAR;
typedef struct
{
HANDLE ConsoleHandle;
WORD Length;
COORD Coord;
COORD EndCoord;
WORD Attribute[0];
} CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB, *PCSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB;
typedef struct
{
HANDLE ConsoleHandle;
CONSOLE_CURSOR_INFO Info;
} CSRSS_GET_CURSOR_INFO, *PCSRSS_GET_CURSOR_INFO;
typedef struct
{
HANDLE ConsoleHandle;
CONSOLE_CURSOR_INFO Info;
} CSRSS_SET_CURSOR_INFO, *PCSRSS_SET_CURSOR_INFO;
typedef struct
{
HANDLE ConsoleHandle;
WORD Attrib;
} CSRSS_SET_ATTRIB, *PCSRSS_SET_ATTRIB;
typedef struct
{
HANDLE ConsoleHandle;
DWORD Mode;
} CSRSS_SET_CONSOLE_MODE, *PCSRSS_SET_CONSOLE_MODE;
typedef struct
{
HANDLE ConsoleHandle;
DWORD ConsoleMode;
} CSRSS_GET_CONSOLE_MODE, *PCSRSS_GET_CONSOLE_MODE;
typedef struct
{
DWORD Access;
DWORD ShareMode;
BOOL Inheritable;
HANDLE OutputHandle; /* handle to newly created screen buffer */
} CSRSS_CREATE_SCREEN_BUFFER, *PCSRSS_CREATE_SCREEN_BUFFER;
typedef struct
{
HANDLE OutputHandle; /* handle to screen buffer to switch to */
} CSRSS_SET_SCREEN_BUFFER, *PCSRSS_SET_SCREEN_BUFFER;
typedef struct
{
DWORD Length;
PWCHAR Title;
} CSRSS_SET_TITLE, *PCSRSS_SET_TITLE;
typedef struct
{
DWORD Length;
PWCHAR Title;
} CSRSS_GET_TITLE, *PCSRSS_GET_TITLE;
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
COORD BufferSize;
COORD BufferCoord;
SMALL_RECT WriteRegion;
CHAR_INFO* CharInfo;
} CSRSS_WRITE_CONSOLE_OUTPUT, *PCSRSS_WRITE_CONSOLE_OUTPUT;
typedef struct
{
HANDLE ConsoleInput;
} CSRSS_FLUSH_INPUT_BUFFER, *PCSRSS_FLUSH_INPUT_BUFFER;
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
SMALL_RECT ScrollRectangle;
BOOLEAN UseClipRectangle;
SMALL_RECT ClipRectangle;
COORD DestinationOrigin;
CHAR_INFO Fill;
} CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER, *PCSRSS_SCROLL_CONSOLE_SCREEN_BUFFER;
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
DWORD NumCharsToRead;
COORD ReadCoord;
COORD EndCoord;
DWORD CharsRead;
CHAR String[0];
} CSRSS_READ_CONSOLE_OUTPUT_CHAR, *PCSRSS_READ_CONSOLE_OUTPUT_CHAR;
typedef struct
{
HANDLE ConsoleHandle;
DWORD NumAttrsToRead;
COORD ReadCoord;
COORD EndCoord;
WORD Attribute[0];
} CSRSS_READ_CONSOLE_OUTPUT_ATTRIB, *PCSRSS_READ_CONSOLE_OUTPUT_ATTRIB;
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
DWORD Length;
INPUT_RECORD* InputRecord;
} CSRSS_PEEK_CONSOLE_INPUT, *PCSRSS_PEEK_CONSOLE_INPUT;
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
COORD BufferSize;
COORD BufferCoord;
SMALL_RECT ReadRegion;
CHAR_INFO* CharInfo;
} CSRSS_READ_CONSOLE_OUTPUT, *PCSRSS_READ_CONSOLE_OUTPUT;
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
DWORD Length;
INPUT_RECORD* InputRecord;
} CSRSS_WRITE_CONSOLE_INPUT, *PCSRSS_WRITE_CONSOLE_INPUT;
typedef struct
{
DWORD Access;
BOOL Inheritable;
HANDLE Handle;
DWORD ShareMode;
} CSRSS_GET_INPUT_HANDLE, *PCSRSS_GET_INPUT_HANDLE,
CSRSS_GET_OUTPUT_HANDLE, *PCSRSS_GET_OUTPUT_HANDLE;
#define CONSOLE_HARDWARE_STATE_GET 0
#define CONSOLE_HARDWARE_STATE_SET 1
#define CONSOLE_HARDWARE_STATE_GDI_MANAGED 0
#define CONSOLE_HARDWARE_STATE_DIRECT 1
typedef struct
{
HANDLE ConsoleHandle;
DWORD SetGet; /* 0=get; 1=set */
DWORD State;
} CSRSS_SETGET_CONSOLE_HW_STATE, *PCSRSS_SETGET_CONSOLE_HW_STATE;
typedef struct
{
HWND WindowHandle;
} CSRSS_GET_CONSOLE_WINDOW, *PCSRSS_GET_CONSOLE_WINDOW;
typedef struct
{
HICON WindowIcon;
} CSRSS_SET_CONSOLE_ICON, *PCSRSS_SET_CONSOLE_ICON;
typedef struct
{
ULONG SourceLength;
ULONG ExeLength;
ULONG TargetLength;
} CSRSS_ADD_CONSOLE_ALIAS, *PCSRSS_ADD_CONSOLE_ALIAS;
typedef struct
{
ULONG SourceLength;
ULONG ExeLength;
ULONG BytesWritten;
ULONG TargetBufferLength;
PVOID TargetBuffer;
} CSRSS_GET_CONSOLE_ALIAS, *PCSRSS_GET_CONSOLE_ALIAS;
typedef struct
{
LPWSTR lpExeName;
DWORD BytesWritten;
DWORD AliasBufferLength;
LPWSTR AliasBuffer;
} CSRSS_GET_ALL_CONSOLE_ALIASES, *PCSRSS_GET_ALL_CONSOLE_ALIAS;
typedef struct
{
LPWSTR lpExeName;
DWORD Length;
} CSRSS_GET_ALL_CONSOLE_ALIASES_LENGTH, *PCSRSS_GET_ALL_CONSOLE_ALIASES_LENGTH;
typedef struct
{
DWORD BytesWritten;
DWORD Length;
LPWSTR ExeNames;
} CSRSS_GET_CONSOLE_ALIASES_EXES, *PCSRSS_GET_CONSOLE_ALIASES_EXES;
typedef struct
{
DWORD Length;
} CSRSS_GET_CONSOLE_ALIASES_EXES_LENGTH, *PCSRSS_GET_CONSOLE_ALIASES_EXES_LENGTH;
typedef struct
{
DWORD Event;
DWORD ProcessGroup;
} CSRSS_GENERATE_CTRL_EVENT, *PCSRSS_GENERATE_CTRL_EVENT;
typedef struct
{
HANDLE ConsoleHandle;
DWORD NumInputEvents;
} CSRSS_GET_NUM_INPUT_EVENTS, *PCSRSS_GET_NUM_INPUT_EVENTS;
typedef struct
{
HANDLE OutputHandle;
COORD Size;
} CSRSS_SET_SCREEN_BUFFER_SIZE, *PCSRSS_SET_SCREEN_BUFFER_SIZE;
typedef struct
{
CONSOLE_SELECTION_INFO Info;
} CSRSS_GET_CONSOLE_SELECTION_INFO, *PCSRSS_GET_CONSOLE_SELECTION_INFO;
typedef struct
{
UNICODE_STRING ExeName;
DWORD Length;
} CSRSS_GET_COMMAND_HISTORY_LENGTH, *PCSRSS_GET_COMMAND_HISTORY_LENGTH;
typedef struct
{
UNICODE_STRING ExeName;
PWCHAR History;
DWORD Length;
} CSRSS_GET_COMMAND_HISTORY, *PCSRSS_GET_COMMAND_HISTORY;
typedef struct
{
UNICODE_STRING ExeName;
} CSRSS_EXPUNGE_COMMAND_HISTORY, *PCSRSS_EXPUNGE_COMMAND_HISTORY;
typedef struct
{
UNICODE_STRING ExeName;
DWORD NumCommands;
} CSRSS_SET_HISTORY_NUMBER_COMMANDS, *PCSRSS_SET_HISTORY_NUMBER_COMMANDS;
typedef struct
{
DWORD HistoryBufferSize;
DWORD NumberOfHistoryBuffers;
DWORD dwFlags;
} CSRSS_GET_HISTORY_INFO, *PCSRSS_GET_HISTORY_INFO,
CSRSS_SET_HISTORY_INFO, *PCSRSS_SET_HISTORY_INFO;;
typedef struct
{
UINT CodePage;
} CSRSS_GET_CONSOLE_CP, *PCSRSS_GET_CONSOLE_CP;
typedef struct
{
UINT CodePage;
} CSRSS_SET_CONSOLE_CP, *PCSRSS_SET_CONSOLE_CP;
typedef struct
{
UINT CodePage;
} CSRSS_GET_CONSOLE_OUTPUT_CP, *PCSRSS_GET_CONSOLE_OUTPUT_CP;
typedef struct
{
UINT CodePage;
} CSRSS_SET_CONSOLE_OUTPUT_CP, *PCSRSS_SET_CONSOLE_OUTPUT_CP;
#endif // __CSRCONS_H__
/* EOF */

View file

@ -1,26 +1,14 @@
/***************************** CSRSS Data ***********************************/
#ifndef __INCLUDE_CSRSS_CSRSS_H #ifndef __INCLUDE_CSRSS_CSRSS_H
#define __INCLUDE_CSRSS_CSRSS_H #define __INCLUDE_CSRSS_CSRSS_H
#include <drivers/blue/ntddblue.h>
#define CSR_NATIVE 0x0000 #define CSR_NATIVE 0x0000
#define CSR_CONSOLE 0x0001 #define CSR_CONSOLE 0x0001
#define CSR_GUI 0x0002 #define CSR_GUI 0x0002
#define CONSOLE_INPUT_MODE_VALID (0x0f) #define CONSOLE_INPUT_MODE_VALID (0x0f)
#define CONSOLE_OUTPUT_MODE_VALID (0x03) #define CONSOLE_OUTPUT_MODE_VALID (0x03)
/*
typedef union _CSR_API_NUMBER
{
WORD Index; // CSRSS API number
WORD Subsystem; // 0=NTDLL;1=KERNEL32;2=KERNEL32
} CSR_API_NUMBER, *PCSR_API_NUMBER;
*/
typedef ULONG CSR_API_NUMBER;
#define MAKE_CSR_API(Number, Server) \
((Server) << 16) + Number
#define CSR_CSRSS_SECTION_SIZE (65536) #define CSR_CSRSS_SECTION_SIZE (65536)
@ -90,149 +78,7 @@ typedef struct
ULONG nProcessIdsTotal; ULONG nProcessIdsTotal;
} CSRSS_GET_PROCESS_LIST, *PCSRSS_GET_PROCESS_LIST; } CSRSS_GET_PROCESS_LIST, *PCSRSS_GET_PROCESS_LIST;
typedef struct #include "csrcons.h"
{
HANDLE ConsoleHandle;
BOOL Unicode;
ULONG NrCharactersToWrite;
ULONG NrCharactersWritten;
HANDLE UnpauseEvent;
BYTE Buffer[0];
} CSRSS_WRITE_CONSOLE, *PCSRSS_WRITE_CONSOLE;
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
WORD NrCharactersToRead;
WORD NrCharactersRead;
HANDLE EventHandle;
PVOID Buffer;
UNICODE_STRING ExeName;
DWORD CtrlWakeupMask;
DWORD ControlKeyState;
} CSRSS_READ_CONSOLE, *PCSRSS_READ_CONSOLE;
typedef struct
{
PCONTROLDISPATCHER CtrlDispatcher;
BOOLEAN ConsoleNeeded;
INT ShowCmd;
HANDLE Console;
HANDLE InputHandle;
HANDLE OutputHandle;
} CSRSS_ALLOC_CONSOLE, *PCSRSS_ALLOC_CONSOLE;
typedef struct
{
ULONG Dummy;
} CSRSS_FREE_CONSOLE, *PCSRSS_FREE_CONSOLE;
typedef struct
{
HANDLE ConsoleHandle;
CONSOLE_SCREEN_BUFFER_INFO Info;
} CSRSS_SCREEN_BUFFER_INFO, *PCSRSS_SCREEN_BUFFER_INFO;
typedef struct
{
HANDLE ConsoleHandle;
COORD Position;
} CSRSS_SET_CURSOR, *PCSRSS_SET_CURSOR;
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
union
{
CHAR AsciiChar;
WCHAR UnicodeChar;
} Char;
COORD Position;
WORD Length;
ULONG NrCharactersWritten;
} CSRSS_FILL_OUTPUT, *PCSRSS_FILL_OUTPUT;
typedef struct
{
HANDLE ConsoleHandle;
CHAR Attribute;
COORD Coord;
WORD Length;
} CSRSS_FILL_OUTPUT_ATTRIB, *PCSRSS_FILL_OUTPUT_ATTRIB;
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
INPUT_RECORD Input;
BOOL MoreEvents;
HANDLE Event;
} CSRSS_READ_INPUT, *PCSRSS_READ_INPUT;
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
WORD Length;
COORD Coord;
COORD EndCoord;
ULONG NrCharactersWritten;
CHAR String[0];
} CSRSS_WRITE_CONSOLE_OUTPUT_CHAR, *PCSRSS_WRITE_CONSOLE_OUTPUT_CHAR;
typedef struct
{
HANDLE ConsoleHandle;
WORD Length;
COORD Coord;
COORD EndCoord;
WORD Attribute[0];
} CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB, *PCSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB;
typedef struct
{
HANDLE ConsoleHandle;
CONSOLE_CURSOR_INFO Info;
} CSRSS_GET_CURSOR_INFO, *PCSRSS_GET_CURSOR_INFO;
typedef struct
{
HANDLE ConsoleHandle;
CONSOLE_CURSOR_INFO Info;
} CSRSS_SET_CURSOR_INFO, *PCSRSS_SET_CURSOR_INFO;
typedef struct
{
HANDLE ConsoleHandle;
WORD Attrib;
} CSRSS_SET_ATTRIB, *PCSRSS_SET_ATTRIB;
typedef struct
{
HANDLE ConsoleHandle;
DWORD Mode;
} CSRSS_SET_CONSOLE_MODE, *PCSRSS_SET_CONSOLE_MODE;
typedef struct
{
HANDLE ConsoleHandle;
DWORD ConsoleMode;
} CSRSS_GET_CONSOLE_MODE, *PCSRSS_GET_CONSOLE_MODE;
typedef struct
{
DWORD Access;
DWORD ShareMode;
BOOL Inheritable;
HANDLE OutputHandle; /* handle to newly created screen buffer */
} CSRSS_CREATE_SCREEN_BUFFER, *PCSRSS_CREATE_SCREEN_BUFFER;
typedef struct
{
HANDLE OutputHandle; /* handle to screen buffer to switch to */
} CSRSS_SET_SCREEN_BUFFER, *PCSRSS_SET_SCREEN_BUFFER;
typedef struct typedef struct
{ {
@ -240,70 +86,6 @@ typedef struct
CLIENT_ID Cid; CLIENT_ID Cid;
} CSRSS_IDENTIFY_ALERTABLE_THREAD, *PCSRSS_IDENTIFY_ALERTABLE_THREAD; } CSRSS_IDENTIFY_ALERTABLE_THREAD, *PCSRSS_IDENTIFY_ALERTABLE_THREAD;
typedef struct
{
DWORD Length;
PWCHAR Title;
} CSRSS_SET_TITLE, *PCSRSS_SET_TITLE;
typedef struct
{
DWORD Length;
PWCHAR Title;
} CSRSS_GET_TITLE, *PCSRSS_GET_TITLE;
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
COORD BufferSize;
COORD BufferCoord;
SMALL_RECT WriteRegion;
CHAR_INFO* CharInfo;
} CSRSS_WRITE_CONSOLE_OUTPUT, *PCSRSS_WRITE_CONSOLE_OUTPUT;
typedef struct
{
HANDLE ConsoleInput;
} CSRSS_FLUSH_INPUT_BUFFER, *PCSRSS_FLUSH_INPUT_BUFFER;
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
SMALL_RECT ScrollRectangle;
BOOLEAN UseClipRectangle;
SMALL_RECT ClipRectangle;
COORD DestinationOrigin;
CHAR_INFO Fill;
} CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER, *PCSRSS_SCROLL_CONSOLE_SCREEN_BUFFER;
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
DWORD NumCharsToRead;
COORD ReadCoord;
COORD EndCoord;
DWORD CharsRead;
CHAR String[0];
} CSRSS_READ_CONSOLE_OUTPUT_CHAR, *PCSRSS_READ_CONSOLE_OUTPUT_CHAR;
typedef struct
{
HANDLE ConsoleHandle;
DWORD NumAttrsToRead;
COORD ReadCoord;
COORD EndCoord;
WORD Attribute[0];
} CSRSS_READ_CONSOLE_OUTPUT_ATTRIB, *PCSRSS_READ_CONSOLE_OUTPUT_ATTRIB;
typedef struct
{
HANDLE ConsoleHandle;
DWORD NumInputEvents;
} CSRSS_GET_NUM_INPUT_EVENTS, *PCSRSS_GET_NUM_INPUT_EVENTS;
typedef struct typedef struct
{ {
HANDLE ProcessId; HANDLE ProcessId;
@ -327,41 +109,6 @@ typedef struct
DWORD Flags; DWORD Flags;
} CSRSS_GET_SHUTDOWN_PARAMETERS, *PCSRSS_GET_SHUTDOWN_PARAMETERS; } CSRSS_GET_SHUTDOWN_PARAMETERS, *PCSRSS_GET_SHUTDOWN_PARAMETERS;
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
DWORD Length;
INPUT_RECORD* InputRecord;
} CSRSS_PEEK_CONSOLE_INPUT, *PCSRSS_PEEK_CONSOLE_INPUT;
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
COORD BufferSize;
COORD BufferCoord;
SMALL_RECT ReadRegion;
CHAR_INFO* CharInfo;
} CSRSS_READ_CONSOLE_OUTPUT, *PCSRSS_READ_CONSOLE_OUTPUT;
typedef struct
{
HANDLE ConsoleHandle;
BOOL Unicode;
DWORD Length;
INPUT_RECORD* InputRecord;
} CSRSS_WRITE_CONSOLE_INPUT, *PCSRSS_WRITE_CONSOLE_INPUT;
typedef struct
{
DWORD Access;
BOOL Inheritable;
HANDLE Handle;
DWORD ShareMode;
} CSRSS_GET_INPUT_HANDLE, *PCSRSS_GET_INPUT_HANDLE,
CSRSS_GET_OUTPUT_HANDLE, *PCSRSS_GET_OUTPUT_HANDLE;
typedef struct typedef struct
{ {
HANDLE Handle; HANDLE Handle;
@ -380,29 +127,6 @@ typedef struct
DWORD Options; DWORD Options;
} CSRSS_DUPLICATE_HANDLE, *PCSRSS_DUPLICATE_HANDLE; } CSRSS_DUPLICATE_HANDLE, *PCSRSS_DUPLICATE_HANDLE;
#define CONSOLE_HARDWARE_STATE_GET 0
#define CONSOLE_HARDWARE_STATE_SET 1
#define CONSOLE_HARDWARE_STATE_GDI_MANAGED 0
#define CONSOLE_HARDWARE_STATE_DIRECT 1
typedef struct
{
HANDLE ConsoleHandle;
DWORD SetGet; /* 0=get; 1=set */
DWORD State;
} CSRSS_SETGET_CONSOLE_HW_STATE, *PCSRSS_SETGET_CONSOLE_HW_STATE;
typedef struct
{
HWND WindowHandle;
} CSRSS_GET_CONSOLE_WINDOW, *PCSRSS_GET_CONSOLE_WINDOW;
typedef struct
{
HICON WindowIcon;
} CSRSS_SET_CONSOLE_ICON, *PCSRSS_SET_CONSOLE_ICON;
typedef struct typedef struct
{ {
HDESK DesktopHandle; HDESK DesktopHandle;
@ -431,122 +155,11 @@ typedef struct
BOOL Register; BOOL Register;
} CSRSS_REGISTER_LOGON_PROCESS, *PCSRSS_REGISTER_LOGON_PROCESS; } CSRSS_REGISTER_LOGON_PROCESS, *PCSRSS_REGISTER_LOGON_PROCESS;
typedef struct
{
UINT CodePage;
} CSRSS_GET_CONSOLE_CP, *PCSRSS_GET_CONSOLE_CP;
typedef struct
{
UINT CodePage;
} CSRSS_SET_CONSOLE_CP, *PCSRSS_SET_CONSOLE_CP;
typedef struct
{
UINT CodePage;
} CSRSS_GET_CONSOLE_OUTPUT_CP, *PCSRSS_GET_CONSOLE_OUTPUT_CP;
typedef struct
{
UINT CodePage;
} CSRSS_SET_CONSOLE_OUTPUT_CP, *PCSRSS_SET_CONSOLE_OUTPUT_CP;
typedef struct typedef struct
{ {
HANDLE InputWaitHandle; HANDLE InputWaitHandle;
} CSRSS_GET_INPUT_WAIT_HANDLE, *PCSRSS_GET_INPUT_WAIT_HANDLE; } CSRSS_GET_INPUT_WAIT_HANDLE, *PCSRSS_GET_INPUT_WAIT_HANDLE;
typedef struct
{
ULONG SourceLength;
ULONG ExeLength;
ULONG TargetLength;
} CSRSS_ADD_CONSOLE_ALIAS, *PCSRSS_ADD_CONSOLE_ALIAS;
typedef struct
{
ULONG SourceLength;
ULONG ExeLength;
ULONG BytesWritten;
ULONG TargetBufferLength;
PVOID TargetBuffer;
} CSRSS_GET_CONSOLE_ALIAS, *PCSRSS_GET_CONSOLE_ALIAS;
typedef struct
{
LPWSTR lpExeName;
DWORD BytesWritten;
DWORD AliasBufferLength;
LPWSTR AliasBuffer;
} CSRSS_GET_ALL_CONSOLE_ALIASES, *PCSRSS_GET_ALL_CONSOLE_ALIAS;
typedef struct
{
LPWSTR lpExeName;
DWORD Length;
} CSRSS_GET_ALL_CONSOLE_ALIASES_LENGTH, *PCSRSS_GET_ALL_CONSOLE_ALIASES_LENGTH;
typedef struct
{
DWORD BytesWritten;
DWORD Length;
LPWSTR ExeNames;
} CSRSS_GET_CONSOLE_ALIASES_EXES, *PCSRSS_GET_CONSOLE_ALIASES_EXES;
typedef struct
{
DWORD Length;
} CSRSS_GET_CONSOLE_ALIASES_EXES_LENGTH, *PCSRSS_GET_CONSOLE_ALIASES_EXES_LENGTH;
typedef struct
{
DWORD Event;
DWORD ProcessGroup;
} CSRSS_GENERATE_CTRL_EVENT, *PCSRSS_GENERATE_CTRL_EVENT;
typedef struct
{
HANDLE OutputHandle;
COORD Size;
} CSRSS_SET_SCREEN_BUFFER_SIZE, *PCSRSS_SET_SCREEN_BUFFER_SIZE;
typedef struct
{
CONSOLE_SELECTION_INFO Info;
} CSRSS_GET_CONSOLE_SELECTION_INFO, *PCSRSS_GET_CONSOLE_SELECTION_INFO;
typedef struct
{
UNICODE_STRING ExeName;
DWORD Length;
} CSRSS_GET_COMMAND_HISTORY_LENGTH, *PCSRSS_GET_COMMAND_HISTORY_LENGTH;
typedef struct
{
UNICODE_STRING ExeName;
PWCHAR History;
DWORD Length;
} CSRSS_GET_COMMAND_HISTORY, *PCSRSS_GET_COMMAND_HISTORY;
typedef struct
{
UNICODE_STRING ExeName;
} CSRSS_EXPUNGE_COMMAND_HISTORY, *PCSRSS_EXPUNGE_COMMAND_HISTORY;
typedef struct
{
UNICODE_STRING ExeName;
DWORD NumCommands;
} CSRSS_SET_HISTORY_NUMBER_COMMANDS, *PCSRSS_SET_HISTORY_NUMBER_COMMANDS;
typedef struct
{
DWORD HistoryBufferSize;
DWORD NumberOfHistoryBuffers;
DWORD dwFlags;
} CSRSS_GET_HISTORY_INFO, *PCSRSS_GET_HISTORY_INFO,
CSRSS_SET_HISTORY_INFO, *PCSRSS_SET_HISTORY_INFO;;
typedef struct typedef struct
{ {
UINT UniqueID; UINT UniqueID;
@ -621,174 +234,85 @@ typedef struct
#define CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR)) #define CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR))
#define CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB)) #define CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB))
#define CREATE_PROCESS (0x0) #define CREATE_PROCESS (0x0)
#define TERMINATE_PROCESS (0x1) #define TERMINATE_PROCESS (0x1)
#define WRITE_CONSOLE (0x2) #define WRITE_CONSOLE (0x2)
#define READ_CONSOLE (0x3) #define READ_CONSOLE (0x3)
#define ALLOC_CONSOLE (0x4) #define ALLOC_CONSOLE (0x4)
#define FREE_CONSOLE (0x5) #define FREE_CONSOLE (0x5)
#define CONNECT_PROCESS (0x6) #define CONNECT_PROCESS (0x6)
#define SCREEN_BUFFER_INFO (0x7) #define SCREEN_BUFFER_INFO (0x7)
#define SET_CURSOR (0x8) #define SET_CURSOR (0x8)
#define FILL_OUTPUT (0x9) #define FILL_OUTPUT (0x9)
#define READ_INPUT (0xA) #define READ_INPUT (0xA)
#define WRITE_CONSOLE_OUTPUT_CHAR (0xB) #define WRITE_CONSOLE_OUTPUT_CHAR (0xB)
#define WRITE_CONSOLE_OUTPUT_ATTRIB (0xC) #define WRITE_CONSOLE_OUTPUT_ATTRIB (0xC)
#define FILL_OUTPUT_ATTRIB (0xD) #define FILL_OUTPUT_ATTRIB (0xD)
#define GET_CURSOR_INFO (0xE) #define GET_CURSOR_INFO (0xE)
#define SET_CURSOR_INFO (0xF) #define SET_CURSOR_INFO (0xF)
#define SET_ATTRIB (0x10) #define SET_ATTRIB (0x10)
#define GET_CONSOLE_MODE (0x11) #define GET_CONSOLE_MODE (0x11)
#define SET_CONSOLE_MODE (0x12) #define SET_CONSOLE_MODE (0x12)
#define CREATE_SCREEN_BUFFER (0x13) #define CREATE_SCREEN_BUFFER (0x13)
#define SET_SCREEN_BUFFER (0x14) #define SET_SCREEN_BUFFER (0x14)
#define SET_TITLE (0x15) #define SET_TITLE (0x15)
#define GET_TITLE (0x16) #define GET_TITLE (0x16)
#define WRITE_CONSOLE_OUTPUT (0x17) #define WRITE_CONSOLE_OUTPUT (0x17)
#define FLUSH_INPUT_BUFFER (0x18) #define FLUSH_INPUT_BUFFER (0x18)
#define SCROLL_CONSOLE_SCREEN_BUFFER (0x19) #define SCROLL_CONSOLE_SCREEN_BUFFER (0x19)
#define READ_CONSOLE_OUTPUT_CHAR (0x1A) #define READ_CONSOLE_OUTPUT_CHAR (0x1A)
#define READ_CONSOLE_OUTPUT_ATTRIB (0x1B) #define READ_CONSOLE_OUTPUT_ATTRIB (0x1B)
#define GET_NUM_INPUT_EVENTS (0x1C) #define GET_NUM_INPUT_EVENTS (0x1C)
#define REGISTER_SERVICES_PROCESS (0x1D) #define REGISTER_SERVICES_PROCESS (0x1D)
#define EXIT_REACTOS (0x1E) #define EXIT_REACTOS (0x1E)
#define GET_SHUTDOWN_PARAMETERS (0x1F) #define GET_SHUTDOWN_PARAMETERS (0x1F)
#define SET_SHUTDOWN_PARAMETERS (0x20) #define SET_SHUTDOWN_PARAMETERS (0x20)
#define PEEK_CONSOLE_INPUT (0x21) #define PEEK_CONSOLE_INPUT (0x21)
#define READ_CONSOLE_OUTPUT (0x22) #define READ_CONSOLE_OUTPUT (0x22)
#define WRITE_CONSOLE_INPUT (0x23) #define WRITE_CONSOLE_INPUT (0x23)
#define GET_INPUT_HANDLE (0x24) #define GET_INPUT_HANDLE (0x24)
#define GET_OUTPUT_HANDLE (0x25) #define GET_OUTPUT_HANDLE (0x25)
#define CLOSE_HANDLE (0x26) #define CLOSE_HANDLE (0x26)
#define VERIFY_HANDLE (0x27) #define VERIFY_HANDLE (0x27)
#define DUPLICATE_HANDLE (0x28) #define DUPLICATE_HANDLE (0x28)
#define SETGET_CONSOLE_HW_STATE (0x29) #define SETGET_CONSOLE_HW_STATE (0x29)
#define GET_CONSOLE_WINDOW (0x2A) #define GET_CONSOLE_WINDOW (0x2A)
#define CREATE_DESKTOP (0x2B) #define CREATE_DESKTOP (0x2B)
#define SHOW_DESKTOP (0x2C) #define SHOW_DESKTOP (0x2C)
#define HIDE_DESKTOP (0x2D) #define HIDE_DESKTOP (0x2D)
#define SET_CONSOLE_ICON (0x2E) #define SET_CONSOLE_ICON (0x2E)
#define SET_LOGON_NOTIFY_WINDOW (0x2F) #define SET_LOGON_NOTIFY_WINDOW (0x2F)
#define REGISTER_LOGON_PROCESS (0x30) #define REGISTER_LOGON_PROCESS (0x30)
#define GET_CONSOLE_CP (0x31) #define GET_CONSOLE_CP (0x31)
#define SET_CONSOLE_CP (0x32) #define SET_CONSOLE_CP (0x32)
#define GET_CONSOLE_OUTPUT_CP (0x33) #define GET_CONSOLE_OUTPUT_CP (0x33)
#define SET_CONSOLE_OUTPUT_CP (0x34) #define SET_CONSOLE_OUTPUT_CP (0x34)
#define GET_INPUT_WAIT_HANDLE (0x35) #define GET_INPUT_WAIT_HANDLE (0x35)
#define GET_PROCESS_LIST (0x36) #define GET_PROCESS_LIST (0x36)
#define START_SCREEN_SAVER (0x37) #define START_SCREEN_SAVER (0x37)
#define ADD_CONSOLE_ALIAS (0x38) #define ADD_CONSOLE_ALIAS (0x38)
#define GET_CONSOLE_ALIAS (0x39) #define GET_CONSOLE_ALIAS (0x39)
#define GET_ALL_CONSOLE_ALIASES (0x3A) #define GET_ALL_CONSOLE_ALIASES (0x3A)
#define GET_ALL_CONSOLE_ALIASES_LENGTH (0x3B) #define GET_ALL_CONSOLE_ALIASES_LENGTH (0x3B)
#define GET_CONSOLE_ALIASES_EXES (0x3C) #define GET_CONSOLE_ALIASES_EXES (0x3C)
#define GET_CONSOLE_ALIASES_EXES_LENGTH (0x3D) #define GET_CONSOLE_ALIASES_EXES_LENGTH (0x3D)
#define GENERATE_CTRL_EVENT (0x3E) #define GENERATE_CTRL_EVENT (0x3E)
#define CREATE_THREAD (0x3F) #define CREATE_THREAD (0x3F)
#define SET_SCREEN_BUFFER_SIZE (0x40) #define SET_SCREEN_BUFFER_SIZE (0x40)
#define GET_CONSOLE_SELECTION_INFO (0x41) #define GET_CONSOLE_SELECTION_INFO (0x41)
#define GET_COMMAND_HISTORY_LENGTH (0x42) #define GET_COMMAND_HISTORY_LENGTH (0x42)
#define GET_COMMAND_HISTORY (0x43) #define GET_COMMAND_HISTORY (0x43)
#define EXPUNGE_COMMAND_HISTORY (0x44) #define EXPUNGE_COMMAND_HISTORY (0x44)
#define SET_HISTORY_NUMBER_COMMANDS (0x45) #define SET_HISTORY_NUMBER_COMMANDS (0x45)
#define GET_HISTORY_INFO (0x46) #define GET_HISTORY_INFO (0x46)
#define SET_HISTORY_INFO (0x47) #define SET_HISTORY_INFO (0x47)
#define GET_TEMP_FILE (0x48) #define GET_TEMP_FILE (0x48)
#define DEFINE_DOS_DEVICE (0X49) #define DEFINE_DOS_DEVICE (0x49)
#define SOUND_SENTRY (0x50) #define SOUND_SENTRY (0x50)
#define UPDATE_VDM_ENTRY (0x51) #define UPDATE_VDM_ENTRY (0x51)
#define GET_VDM_EXIT_CODE (0x52) #define GET_VDM_EXIT_CODE (0x52)
#define CHECK_VDM (0x53) #define CHECK_VDM (0x53)
/* Keep in sync with definition below. */
#define CSRSS_HEADER_SIZE (sizeof(PORT_MESSAGE) + sizeof(ULONG) + sizeof(NTSTATUS))
typedef struct _CSR_API_MESSAGE
{
PORT_MESSAGE Header;
PVOID CsrCaptureData;
ULONG Type;
NTSTATUS Status;
union
{
CSRSS_CREATE_PROCESS CreateProcessRequest;
CSRSS_CREATE_THREAD CreateThreadRequest;
CSRSS_TERMINATE_PROCESS TerminateProcessRequest;
CSRSS_CONNECT_PROCESS ConnectRequest;
CSRSS_WRITE_CONSOLE WriteConsoleRequest;
CSRSS_READ_CONSOLE ReadConsoleRequest;
CSRSS_ALLOC_CONSOLE AllocConsoleRequest;
CSRSS_SCREEN_BUFFER_INFO ScreenBufferInfoRequest;
CSRSS_SET_CURSOR SetCursorRequest;
CSRSS_FILL_OUTPUT FillOutputRequest;
CSRSS_READ_INPUT ReadInputRequest;
CSRSS_WRITE_CONSOLE_OUTPUT_CHAR WriteConsoleOutputCharRequest;
CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB WriteConsoleOutputAttribRequest;
CSRSS_FILL_OUTPUT_ATTRIB FillOutputAttribRequest;
CSRSS_SET_CURSOR_INFO SetCursorInfoRequest;
CSRSS_GET_CURSOR_INFO GetCursorInfoRequest;
CSRSS_SET_ATTRIB SetAttribRequest;
CSRSS_SET_CONSOLE_MODE SetConsoleModeRequest;
CSRSS_GET_CONSOLE_MODE GetConsoleModeRequest;
CSRSS_CREATE_SCREEN_BUFFER CreateScreenBufferRequest;
CSRSS_SET_SCREEN_BUFFER SetScreenBufferRequest;
CSRSS_SET_TITLE SetTitleRequest;
CSRSS_GET_TITLE GetTitleRequest;
CSRSS_WRITE_CONSOLE_OUTPUT WriteConsoleOutputRequest;
CSRSS_FLUSH_INPUT_BUFFER FlushInputBufferRequest;
CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER ScrollConsoleScreenBufferRequest;
CSRSS_READ_CONSOLE_OUTPUT_CHAR ReadConsoleOutputCharRequest;
CSRSS_READ_CONSOLE_OUTPUT_ATTRIB ReadConsoleOutputAttribRequest;
CSRSS_GET_NUM_INPUT_EVENTS GetNumInputEventsRequest;
CSRSS_REGISTER_SERVICES_PROCESS RegisterServicesProcessRequest;
CSRSS_EXIT_REACTOS ExitReactosRequest;
CSRSS_SET_SHUTDOWN_PARAMETERS SetShutdownParametersRequest;
CSRSS_GET_SHUTDOWN_PARAMETERS GetShutdownParametersRequest;
CSRSS_PEEK_CONSOLE_INPUT PeekConsoleInputRequest;
CSRSS_READ_CONSOLE_OUTPUT ReadConsoleOutputRequest;
CSRSS_WRITE_CONSOLE_INPUT WriteConsoleInputRequest;
CSRSS_GET_INPUT_HANDLE GetInputHandleRequest;
CSRSS_GET_OUTPUT_HANDLE GetOutputHandleRequest;
CSRSS_CLOSE_HANDLE CloseHandleRequest;
CSRSS_VERIFY_HANDLE VerifyHandleRequest;
CSRSS_DUPLICATE_HANDLE DuplicateHandleRequest;
CSRSS_SETGET_CONSOLE_HW_STATE ConsoleHardwareStateRequest;
CSRSS_GET_CONSOLE_WINDOW GetConsoleWindowRequest;
CSRSS_CREATE_DESKTOP CreateDesktopRequest;
CSRSS_SHOW_DESKTOP ShowDesktopRequest;
CSRSS_HIDE_DESKTOP HideDesktopRequest;
CSRSS_SET_CONSOLE_ICON SetConsoleIconRequest;
CSRSS_SET_LOGON_NOTIFY_WINDOW SetLogonNotifyWindowRequest;
CSRSS_REGISTER_LOGON_PROCESS RegisterLogonProcessRequest;
CSRSS_GET_CONSOLE_CP GetConsoleCodePage;
CSRSS_SET_CONSOLE_CP SetConsoleCodePage;
CSRSS_GET_CONSOLE_OUTPUT_CP GetConsoleOutputCodePage;
CSRSS_SET_CONSOLE_OUTPUT_CP SetConsoleOutputCodePage;
CSRSS_GET_INPUT_WAIT_HANDLE GetConsoleInputWaitHandle;
CSRSS_GET_PROCESS_LIST GetProcessListRequest;
CSRSS_ADD_CONSOLE_ALIAS AddConsoleAlias;
CSRSS_GET_CONSOLE_ALIAS GetConsoleAlias;
CSRSS_GET_ALL_CONSOLE_ALIASES GetAllConsoleAlias;
CSRSS_GET_ALL_CONSOLE_ALIASES_LENGTH GetAllConsoleAliasesLength;
CSRSS_GET_CONSOLE_ALIASES_EXES GetConsoleAliasesExes;
CSRSS_GET_CONSOLE_ALIASES_EXES_LENGTH GetConsoleAliasesExesLength;
CSRSS_GENERATE_CTRL_EVENT GenerateCtrlEvent;
CSRSS_SET_SCREEN_BUFFER_SIZE SetScreenBufferSize;
CSRSS_GET_CONSOLE_SELECTION_INFO GetConsoleSelectionInfo;
CSRSS_GET_COMMAND_HISTORY_LENGTH GetCommandHistoryLength;
CSRSS_GET_COMMAND_HISTORY GetCommandHistory;
CSRSS_EXPUNGE_COMMAND_HISTORY ExpungeCommandHistory;
CSRSS_SET_HISTORY_NUMBER_COMMANDS SetHistoryNumberCommands;
CSRSS_GET_HISTORY_INFO GetHistoryInfo;
CSRSS_SET_HISTORY_INFO SetHistoryInfo;
CSRSS_GET_TEMP_FILE GetTempFile;
CSRSS_DEFINE_DOS_DEVICE DefineDosDeviceRequest;
CSRSS_SOUND_SENTRY SoundSentryRequest;
CSRSS_UPDATE_VDM_ENTRY UpdateVdmEntry;
CSRSS_GET_VDM_EXIT_CODE GetVdmExitCode;
CSRSS_CHECK_VDM CheckVdm;
} Data;
} CSR_API_MESSAGE, *PCSR_API_MESSAGE;
typedef struct _NLS_USER_INFO typedef struct _NLS_USER_INFO
{ {
@ -827,7 +351,7 @@ typedef struct _NLS_USER_INFO
WCHAR sLocaleName[85]; WCHAR sLocaleName[85];
LCID UserLocaleId; LCID UserLocaleId;
LUID InteractiveUserLuid; LUID InteractiveUserLuid;
CHAR InteractiveUserSid[68]; // SECURITY_MAX_SID_SIZE to make ros happy CHAR InteractiveUserSid[68]; // SECURITY_MAX_SID_SIZE to make ROS happy
ULONG ulCacheUpdateCount; ULONG ulCacheUpdateCount;
} NLS_USER_INFO, *PNLS_USER_INFO; } NLS_USER_INFO, *PNLS_USER_INFO;
@ -860,8 +384,7 @@ typedef struct _BASE_STATIC_SERVER_DATA
/* Types used in the new CSR. Temporarly here for proper compile of NTDLL */ /* Types used in the new CSR. Temporarly here for proper compile of NTDLL */
#define CSR_SRV_SERVER 0 // Not used at the moment...
typedef enum _CSR_SRV_API_NUMBER typedef enum _CSR_SRV_API_NUMBER
{ {
CsrpClientConnect, CsrpClientConnect,
@ -872,68 +395,4 @@ typedef enum _CSR_SRV_API_NUMBER
CsrpMaxApiNumber CsrpMaxApiNumber
} CSR_SRV_API_NUMBER, *PCSR_SRV_API_NUMBER; } CSR_SRV_API_NUMBER, *PCSR_SRV_API_NUMBER;
#define CSR_MAKE_OPCODE(s,m) ((s) << 16) | (m)
typedef struct _CSR_CONNECTION_INFO
{
ULONG Version;
ULONG Unknown;
HANDLE ObjectDirectory;
PVOID SharedSectionBase;
PVOID SharedSectionHeap;
PVOID SharedSectionData;
ULONG DebugFlags;
ULONG Unknown2[3];
HANDLE ProcessId;
} CSR_CONNECTION_INFO, *PCSR_CONNECTION_INFO;
typedef struct _CSR_CLIENT_CONNECT
{
ULONG ServerId;
PVOID ConnectionInfo;
ULONG ConnectionInfoSize;
} CSR_CLIENT_CONNECT, *PCSR_CLIENT_CONNECT;
typedef struct _CSR_IDENTIFY_ALTERTABLE_THREAD
{
CLIENT_ID Cid;
} CSR_IDENTIFY_ALTERTABLE_THREAD, *PCSR_IDENTIFY_ALTERTABLE_THREAD;
typedef struct _CSR_SET_PRIORITY_CLASS
{
HANDLE hProcess;
ULONG PriorityClass;
} CSR_SET_PRIORITY_CLASS, *PCSR_SET_PRIORITY_CLASS;
typedef struct _CSR_API_MESSAGE2
{
PORT_MESSAGE Header;
union
{
CSR_CONNECTION_INFO ConnectionInfo;
struct
{
PVOID CsrCaptureData;
CSR_API_NUMBER Opcode;
ULONG Status;
ULONG Reserved;
union
{
CSR_CLIENT_CONNECT ClientConnect;
CSR_SET_PRIORITY_CLASS SetPriorityClass;
CSR_IDENTIFY_ALTERTABLE_THREAD IdentifyAlertableThread;
};
};
};
} CSR_API_MESSAGE2, *PCSR_API_MESSAGE2;
typedef struct _CSR_CAPTURE_BUFFER
{
ULONG Size;
struct _CSR_CAPTURE_BUFFER *PreviousCaptureBuffer;
ULONG PointerCount;
ULONG_PTR BufferEnd;
ULONG_PTR PointerArray[1];
} CSR_CAPTURE_BUFFER, *PCSR_CAPTURE_BUFFER;
#endif /* __INCLUDE_CSRSS_CSRSS_H */ #endif /* __INCLUDE_CSRSS_CSRSS_H */

View file

@ -0,0 +1,219 @@
/*
* PROJECT: ReactOS Native Headers
* FILE: include/subsys/csrss/msg.h
* PURPOSE: Public Definitions for communication
* between CSR Clients and Servers.
* PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
* Hermes Belusca-Maito (hermes.belusca@sfr.fr)
*/
#ifndef _CSRMSG_H
#define _CSRMSG_H
typedef struct _CSR_CONNECTION_INFO
{
ULONG Version;
ULONG Unknown;
HANDLE ObjectDirectory;
PVOID SharedSectionBase;
PVOID SharedSectionHeap;
PVOID SharedSectionData;
ULONG DebugFlags;
ULONG Unknown2[3];
HANDLE ProcessId;
} CSR_CONNECTION_INFO, *PCSR_CONNECTION_INFO;
typedef struct _CSR_IDENTIFY_ALTERTABLE_THREAD
{
CLIENT_ID Cid;
} CSR_IDENTIFY_ALTERTABLE_THREAD, *PCSR_IDENTIFY_ALTERTABLE_THREAD;
typedef struct _CSR_SET_PRIORITY_CLASS
{
HANDLE hProcess;
ULONG PriorityClass;
} CSR_SET_PRIORITY_CLASS, *PCSR_SET_PRIORITY_CLASS;
typedef struct _CSR_CLIENT_CONNECT
{
ULONG ServerId;
PVOID ConnectionInfo;
ULONG ConnectionInfoSize;
} CSR_CLIENT_CONNECT, *PCSR_CLIENT_CONNECT;
typedef struct _CSR_CAPTURE_BUFFER
{
ULONG Size;
struct _CSR_CAPTURE_BUFFER *PreviousCaptureBuffer;
ULONG PointerCount;
ULONG_PTR BufferEnd;
ULONG_PTR PointerArray[1];
} CSR_CAPTURE_BUFFER, *PCSR_CAPTURE_BUFFER;
/*
typedef union _CSR_API_NUMBER
{
WORD Index;
WORD Subsystem;
} CSR_API_NUMBER, *PCSR_API_NUMBER;
*/
typedef ULONG CSR_API_NUMBER;
#include "csrss.h" // remove it when the data structures are not used anymore.
/* Keep in sync with definition below. */
// #define CSRSS_HEADER_SIZE (sizeof(PORT_MESSAGE) + sizeof(ULONG) + sizeof(NTSTATUS))
typedef struct _CSR_API_MESSAGE
{
PORT_MESSAGE Header;
union
{
CSR_CONNECTION_INFO ConnectionInfo;
struct
{
PCSR_CAPTURE_BUFFER CsrCaptureData;
CSR_API_NUMBER ApiNumber;
ULONG Status;
ULONG Reserved;
union
{
CSR_CLIENT_CONNECT CsrClientConnect;
CSR_SET_PRIORITY_CLASS SetPriorityClass;
CSR_IDENTIFY_ALTERTABLE_THREAD IdentifyAlertableThread;
/*** Temporary ***/
#if 1
CSRSS_CREATE_PROCESS CreateProcessRequest;
CSRSS_CREATE_THREAD CreateThreadRequest;
CSRSS_TERMINATE_PROCESS TerminateProcessRequest;
CSRSS_CONNECT_PROCESS ConnectRequest;
CSRSS_WRITE_CONSOLE WriteConsoleRequest;
CSRSS_READ_CONSOLE ReadConsoleRequest;
CSRSS_ALLOC_CONSOLE AllocConsoleRequest;
CSRSS_SCREEN_BUFFER_INFO ScreenBufferInfoRequest;
CSRSS_SET_CURSOR SetCursorRequest;
CSRSS_FILL_OUTPUT FillOutputRequest;
CSRSS_READ_INPUT ReadInputRequest;
CSRSS_WRITE_CONSOLE_OUTPUT_CHAR WriteConsoleOutputCharRequest;
CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB WriteConsoleOutputAttribRequest;
CSRSS_FILL_OUTPUT_ATTRIB FillOutputAttribRequest;
CSRSS_SET_CURSOR_INFO SetCursorInfoRequest;
CSRSS_GET_CURSOR_INFO GetCursorInfoRequest;
CSRSS_SET_ATTRIB SetAttribRequest;
CSRSS_SET_CONSOLE_MODE SetConsoleModeRequest;
CSRSS_GET_CONSOLE_MODE GetConsoleModeRequest;
CSRSS_CREATE_SCREEN_BUFFER CreateScreenBufferRequest;
CSRSS_SET_SCREEN_BUFFER SetScreenBufferRequest;
CSRSS_SET_TITLE SetTitleRequest;
CSRSS_GET_TITLE GetTitleRequest;
CSRSS_WRITE_CONSOLE_OUTPUT WriteConsoleOutputRequest;
CSRSS_FLUSH_INPUT_BUFFER FlushInputBufferRequest;
CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER ScrollConsoleScreenBufferRequest;
CSRSS_READ_CONSOLE_OUTPUT_CHAR ReadConsoleOutputCharRequest;
CSRSS_READ_CONSOLE_OUTPUT_ATTRIB ReadConsoleOutputAttribRequest;
CSRSS_GET_NUM_INPUT_EVENTS GetNumInputEventsRequest;
CSRSS_REGISTER_SERVICES_PROCESS RegisterServicesProcessRequest;
CSRSS_EXIT_REACTOS ExitReactosRequest;
CSRSS_SET_SHUTDOWN_PARAMETERS SetShutdownParametersRequest;
CSRSS_GET_SHUTDOWN_PARAMETERS GetShutdownParametersRequest;
CSRSS_PEEK_CONSOLE_INPUT PeekConsoleInputRequest;
CSRSS_READ_CONSOLE_OUTPUT ReadConsoleOutputRequest;
CSRSS_WRITE_CONSOLE_INPUT WriteConsoleInputRequest;
CSRSS_GET_INPUT_HANDLE GetInputHandleRequest;
CSRSS_GET_OUTPUT_HANDLE GetOutputHandleRequest;
CSRSS_CLOSE_HANDLE CloseHandleRequest;
CSRSS_VERIFY_HANDLE VerifyHandleRequest;
CSRSS_DUPLICATE_HANDLE DuplicateHandleRequest;
CSRSS_SETGET_CONSOLE_HW_STATE ConsoleHardwareStateRequest;
CSRSS_GET_CONSOLE_WINDOW GetConsoleWindowRequest;
CSRSS_CREATE_DESKTOP CreateDesktopRequest;
CSRSS_SHOW_DESKTOP ShowDesktopRequest;
CSRSS_HIDE_DESKTOP HideDesktopRequest;
CSRSS_SET_CONSOLE_ICON SetConsoleIconRequest;
CSRSS_SET_LOGON_NOTIFY_WINDOW SetLogonNotifyWindowRequest;
CSRSS_REGISTER_LOGON_PROCESS RegisterLogonProcessRequest;
CSRSS_GET_CONSOLE_CP GetConsoleCodePage;
CSRSS_SET_CONSOLE_CP SetConsoleCodePage;
CSRSS_GET_CONSOLE_OUTPUT_CP GetConsoleOutputCodePage;
CSRSS_SET_CONSOLE_OUTPUT_CP SetConsoleOutputCodePage;
CSRSS_GET_INPUT_WAIT_HANDLE GetConsoleInputWaitHandle;
CSRSS_GET_PROCESS_LIST GetProcessListRequest;
CSRSS_ADD_CONSOLE_ALIAS AddConsoleAlias;
CSRSS_GET_CONSOLE_ALIAS GetConsoleAlias;
CSRSS_GET_ALL_CONSOLE_ALIASES GetAllConsoleAlias;
CSRSS_GET_ALL_CONSOLE_ALIASES_LENGTH GetAllConsoleAliasesLength;
CSRSS_GET_CONSOLE_ALIASES_EXES GetConsoleAliasesExes;
CSRSS_GET_CONSOLE_ALIASES_EXES_LENGTH GetConsoleAliasesExesLength;
CSRSS_GENERATE_CTRL_EVENT GenerateCtrlEvent;
CSRSS_SET_SCREEN_BUFFER_SIZE SetScreenBufferSize;
CSRSS_GET_CONSOLE_SELECTION_INFO GetConsoleSelectionInfo;
CSRSS_GET_COMMAND_HISTORY_LENGTH GetCommandHistoryLength;
CSRSS_GET_COMMAND_HISTORY GetCommandHistory;
CSRSS_EXPUNGE_COMMAND_HISTORY ExpungeCommandHistory;
CSRSS_SET_HISTORY_NUMBER_COMMANDS SetHistoryNumberCommands;
CSRSS_GET_HISTORY_INFO GetHistoryInfo;
CSRSS_SET_HISTORY_INFO SetHistoryInfo;
CSRSS_GET_TEMP_FILE GetTempFile;
CSRSS_DEFINE_DOS_DEVICE DefineDosDeviceRequest;
CSRSS_SOUND_SENTRY SoundSentryRequest;
CSRSS_UPDATE_VDM_ENTRY UpdateVdmEntry;
CSRSS_GET_VDM_EXIT_CODE GetVdmExitCode;
CSRSS_CHECK_VDM CheckVdm;
#endif
/*****************/
} Data;
};
};
} CSR_API_MESSAGE, *PCSR_API_MESSAGE;
/*** old ***
typedef struct _CSR_API_MESSAGE
{
PORT_MESSAGE Header;
PVOID CsrCaptureData;
ULONG Type;
NTSTATUS Status;
union
{
CSRSS_CREATE_PROCESS CreateProcessRequest;
CSRSS_CREATE_THREAD CreateThreadRequest;
CSRSS_TERMINATE_PROCESS TerminateProcessRequest;
CSRSS_CONNECT_PROCESS ConnectRequest;
. . . . . . . . . . . . . . .
CSRSS_GET_VDM_EXIT_CODE GetVdmExitCode;
CSRSS_CHECK_VDM CheckVdm;
} Data;
} CSR_API_MESSAGE, *PCSR_API_MESSAGE;
***/
#define CSR_PORT_NAME L"ApiPort"
/**** move these defines elsewhere ****/
#define CSR_SRV_SERVER 0
#define CSR_SERVER_DLL_MAX 4
/**************************************/
#define CSR_CREATE_API_NUMBER(ServerId, ApiId) \
(CSR_API_NUMBER)(((ServerId) << 16) | (ApiId))
#define CSR_API_NUMBER_TO_SERVER_ID(ApiNumber) \
(ULONG)((ULONG)(ApiNumber) >> 16)
#define CSR_API_NUMBER_TO_API_ID(ApiNumber) \
(ULONG)((ULONG)(ApiNumber) & 0xFFFF)
#endif // _CSRMSG_H
/* EOF */

View file

@ -1,9 +1,11 @@
/* /*
* PROJECT: ReactOS Native Headers * PROJECT: ReactOS Native Headers
* FILE: include/subsys/csr/server.h * FILE: include/subsys/csrss/server.h
* PURPOSE: Public Definitions for CSR Servers * PURPOSE: Public Definitions for CSR Servers
* PROGRAMMER: Alex Ionescu (alex@relsoft.net) * PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
* Hermes Belusca-Maito (hermes.belusca@sfr.fr)
*/ */
#ifndef _CSRSERVER_H #ifndef _CSRSERVER_H
#define _CSRSERVER_H #define _CSRSERVER_H
@ -12,9 +14,10 @@
#pragma warning (disable:4201) #pragma warning (disable:4201)
#endif #endif
/* DEPENDENCIES **************************************************************/ #include "msg.h"
/* TYPES **********************************************************************/ /* TYPES **********************************************************************/
typedef struct _CSR_NT_SESSION typedef struct _CSR_NT_SESSION
{ {
ULONG ReferenceCount; ULONG ReferenceCount;
@ -22,6 +25,20 @@ typedef struct _CSR_NT_SESSION
ULONG SessionId; ULONG SessionId;
} CSR_NT_SESSION, *PCSR_NT_SESSION; } CSR_NT_SESSION, *PCSR_NT_SESSION;
/*** old thingie, remove it later... (put it in winsrv -- console) ***/
typedef struct _CSRSS_CON_PROCESS_DATA
{
HANDLE ConsoleEvent;
struct tagCSRSS_CONSOLE *Console;
struct tagCSRSS_CONSOLE *ParentConsole;
BOOL bInheritHandles;
RTL_CRITICAL_SECTION HandleTableLock;
ULONG HandleTableSize;
struct _CSRSS_HANDLE *HandleTable;
PCONTROLDISPATCHER CtrlDispatcher;
LIST_ENTRY ConsoleLink;
} CSRSS_CON_PROCESS_DATA, *PCSRSS_CON_PROCESS_DATA;
/*********************************************************************/
typedef struct _CSR_PROCESS typedef struct _CSR_PROCESS
{ {
CLIENT_ID ClientId; CLIENT_ID ClientId;
@ -47,7 +64,8 @@ typedef struct _CSR_PROCESS
ULONG Reserved; ULONG Reserved;
ULONG ShutdownLevel; ULONG ShutdownLevel;
ULONG ShutdownFlags; ULONG ShutdownFlags;
PVOID ServerData[ANYSIZE_ARRAY]; // PVOID ServerData[ANYSIZE_ARRAY];
CSRSS_CON_PROCESS_DATA; //// FIXME: Remove it after we activate the previous member.
} CSR_PROCESS, *PCSR_PROCESS; } CSR_PROCESS, *PCSR_PROCESS;
typedef struct _CSR_THREAD typedef struct _CSR_THREAD
@ -64,33 +82,36 @@ typedef struct _CSR_THREAD
ULONG ImpersonationCount; ULONG ImpersonationCount;
} CSR_THREAD, *PCSR_THREAD; } CSR_THREAD, *PCSR_THREAD;
/* ENUMERATIONS **************************************************************/ #define CsrGetClientThread() \
#define CSR_SRV_SERVER 0 ((PCSR_THREAD)(NtCurrentTeb()->CsrClientThread))
/* ENUMERATIONS ***************************************************************/
typedef enum _CSR_PROCESS_FLAGS typedef enum _CSR_PROCESS_FLAGS
{ {
CsrProcessTerminating = 0x1, CsrProcessTerminating = 0x1,
CsrProcessSkipShutdown = 0x2, CsrProcessSkipShutdown = 0x2,
CsrProcessNormalPriority = 0x10, CsrProcessNormalPriority = 0x10,
CsrProcessIdlePriority = 0x20, CsrProcessIdlePriority = 0x20,
CsrProcessHighPriority = 0x40, CsrProcessHighPriority = 0x40,
CsrProcessRealtimePriority = 0x80, CsrProcessRealtimePriority = 0x80,
CsrProcessCreateNewGroup = 0x100, CsrProcessCreateNewGroup = 0x100,
CsrProcessTerminated = 0x200, CsrProcessTerminated = 0x200,
CsrProcessLastThreadTerminated = 0x400, CsrProcessLastThreadTerminated = 0x400,
CsrProcessIsConsoleApp = 0x800 CsrProcessIsConsoleApp = 0x800
} CSR_PROCESS_FLAGS, *PCSR_PROCESS_FLAGS; } CSR_PROCESS_FLAGS, *PCSR_PROCESS_FLAGS;
#define CsrProcessPriorityFlags (CsrProcessNormalPriority | \ #define CsrProcessPriorityFlags (CsrProcessNormalPriority | \
CsrProcessIdlePriority | \ CsrProcessIdlePriority | \
CsrProcessHighPriority | \ CsrProcessHighPriority | \
CsrProcessRealtimePriority) CsrProcessRealtimePriority)
typedef enum _CSR_THREAD_FLAGS typedef enum _CSR_THREAD_FLAGS
{ {
CsrThreadAltertable = 0x1, CsrThreadAltertable = 0x1,
CsrThreadInTermination = 0x2, CsrThreadInTermination = 0x2,
CsrThreadTerminated = 0x4, CsrThreadTerminated = 0x4,
CsrThreadIsServerThread = 0x10 CsrThreadIsServerThread = 0x10
} CSR_THREAD_FLAGS, *PCSR_THREAD_FLAGS; } CSR_THREAD_FLAGS, *PCSR_THREAD_FLAGS;
@ -104,7 +125,7 @@ typedef enum _SHUTDOWN_RESULT
typedef enum _CSR_SHUTDOWN_FLAGS typedef enum _CSR_SHUTDOWN_FLAGS
{ {
CsrShutdownSystem = 4, CsrShutdownSystem = 4,
CsrShutdownOther = 8 CsrShutdownOther = 8
} CSR_SHUTDOWN_FLAGS, *PCSR_SHUTDOWN_FLAGS; } CSR_SHUTDOWN_FLAGS, *PCSR_SHUTDOWN_FLAGS;
typedef enum _CSR_DEBUG_FLAGS typedef enum _CSR_DEBUG_FLAGS
@ -113,7 +134,48 @@ typedef enum _CSR_DEBUG_FLAGS
CsrDebugProcessChildren = 2 CsrDebugProcessChildren = 2
} CSR_PROCESS_DEBUG_FLAGS, *PCSR_PROCESS_DEBUG_FLAGS; } CSR_PROCESS_DEBUG_FLAGS, *PCSR_PROCESS_DEBUG_FLAGS;
/* FUNCTION TYPES ************************************************************/
/*
* Wait block
*/
typedef
BOOLEAN
(*CSR_WAIT_FUNCTION)(
IN PLIST_ENTRY WaitList,
IN PCSR_THREAD WaitThread,
IN PCSR_API_MESSAGE WaitApiMessage,
IN PVOID WaitContext,
IN PVOID WaitArgument1,
IN PVOID WaitArgument2,
IN ULONG WaitFlags
);
typedef struct _CSR_WAIT_BLOCK
{
ULONG Size;
LIST_ENTRY WaitList;
LIST_ENTRY UserWaitList;
PVOID WaitContext;
PCSR_THREAD WaitThread;
CSR_WAIT_FUNCTION WaitFunction;
CSR_API_MESSAGE WaitApiMessage;
} CSR_WAIT_BLOCK, *PCSR_WAIT_BLOCK;
/*
* Server DLL structure
*/
typedef
NTSTATUS
(NTAPI *PCSR_API_ROUTINE)(
IN OUT PCSR_API_MESSAGE ApiMessage,
OUT PULONG Reply
);
#define CSR_API(n) NTSTATUS NTAPI n ( \
IN OUT PCSR_API_MESSAGE ApiMessage, \
OUT PULONG Reply)
typedef typedef
NTSTATUS NTSTATUS
(NTAPI *PCSR_CONNECT_CALLBACK)( (NTAPI *PCSR_CONNECT_CALLBACK)(
@ -148,69 +210,6 @@ ULONG
IN BOOLEAN FirstPhase IN BOOLEAN FirstPhase
); );
/* FIXME: Put into public NDK Header */
typedef ULONG CSR_API_NUMBER;
#define CSR_MAKE_OPCODE(s,m) ((s) << 16) | (m)
#define CSR_API_ID_FROM_OPCODE(n) ((ULONG)((USHORT)(n)))
#define CSR_SERVER_ID_FROM_OPCODE(n) (ULONG)((n) >> 16)
typedef struct _CSR_CONNECTION_INFO
{
ULONG Unknown[2];
HANDLE ObjectDirectory;
PVOID SharedSectionBase;
PVOID SharedSectionHeap;
PVOID SharedSectionData;
ULONG DebugFlags;
ULONG Unknown2[3];
HANDLE ProcessId;
} CSR_CONNECTION_INFO, *PCSR_CONNECTION_INFO;
typedef struct _CSR_CLIENT_CONNECT
{
ULONG ServerId;
PVOID ConnectionInfo;
ULONG ConnectionInfoSize;
} CSR_CLIENT_CONNECT, *PCSR_CLIENT_CONNECT;
typedef struct _CSR_API_MESSAGE
{
PORT_MESSAGE Header;
union
{
CSR_CONNECTION_INFO ConnectionInfo;
struct
{
PVOID CsrCaptureData;
CSR_API_NUMBER Opcode;
ULONG Status;
ULONG Reserved;
union
{
CSR_CLIENT_CONNECT CsrClientConnect;
};
};
};
} CSR_API_MESSAGE, *PCSR_API_MESSAGE;
typedef struct _CSR_CAPTURE_BUFFER
{
ULONG Size;
struct _CSR_CAPTURE_BUFFER *PreviousCaptureBuffer;
ULONG PointerCount;
ULONG_PTR BufferEnd;
} CSR_CAPTURE_BUFFER, *PCSR_CAPTURE_BUFFER;
/* Private data resumes here */
typedef
NTSTATUS
(NTAPI *PCSR_API_ROUTINE)(
IN OUT PCSR_API_MESSAGE ApiMessage,
IN OUT PULONG Reply
);
typedef struct _CSR_SERVER_DLL typedef struct _CSR_SERVER_DLL
{ {
ULONG Length; ULONG Length;
@ -234,44 +233,78 @@ typedef struct _CSR_SERVER_DLL
ULONG Unknown2[3]; ULONG Unknown2[3];
} CSR_SERVER_DLL, *PCSR_SERVER_DLL; } CSR_SERVER_DLL, *PCSR_SERVER_DLL;
/* FUNCTION TYPES *************************************************************/
typedef typedef
NTSTATUS NTSTATUS
(NTAPI *PCSR_SERVER_DLL_INIT_CALLBACK)(IN PCSR_SERVER_DLL ServerDll); (NTAPI *PCSR_SERVER_DLL_INIT_CALLBACK)(IN PCSR_SERVER_DLL LoadedServerDll);
typedef /*
BOOLEAN NTSTATUS
(*CSR_WAIT_FUNCTION)( NTAPI
IN PLIST_ENTRY WaitList, CsrServerDllInitialization(IN PCSR_SERVER_DLL LoadedServerDll);
IN PCSR_THREAD WaitThread, */
IN PCSR_API_MESSAGE WaitApiMessage,
IN PVOID WaitContext,
IN PVOID WaitArgument1,
IN PVOID WaitArgument2,
IN ULONG WaitFlags
);
typedef struct _CSR_WAIT_BLOCK
{
ULONG Size;
LIST_ENTRY WaitList;
LIST_ENTRY UserWaitList;
PVOID WaitContext;
PCSR_THREAD WaitThread;
CSR_WAIT_FUNCTION WaitFunction;
CSR_API_MESSAGE WaitApiMessage;
} CSR_WAIT_BLOCK, *PCSR_WAIT_BLOCK;
/* PROTOTYPES ****************************************************************/ /* PROTOTYPES ****************************************************************/
NTSTATUS NTSTATUS
NTAPI NTAPI
CsrServerInitialization( CsrServerInitialization(
ULONG ArgumentCount, IN ULONG ArgumentCount,
PCHAR Arguments[] IN PCHAR Arguments[]
); );
///////////
BOOLEAN
NTAPI
CsrCaptureArguments(
IN PCSR_THREAD CsrThread,
IN PCSR_API_MESSAGE ApiMessage
);
VOID
NTAPI
CsrReleaseCapturedArguments(IN PCSR_API_MESSAGE ApiMessage);
//////////
PCSR_THREAD
NTAPI
CsrAddStaticServerThread(
IN HANDLE hThread,
IN PCLIENT_ID ClientId,
IN ULONG ThreadFlags
);
PCSR_THREAD
NTAPI
CsrConnectToUser(VOID);
BOOLEAN
NTAPI
CsrImpersonateClient(IN PCSR_THREAD CsrThread);
BOOLEAN
NTAPI
CsrRevertToSelf(VOID);
VOID
NTAPI
CsrSetBackgroundPriority(IN PCSR_PROCESS CsrProcess);
LONG
NTAPI
CsrUnhandledExceptionFilter(
IN PEXCEPTION_POINTERS ExceptionInfo
);
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning(pop) #pragma warning(pop)
#endif #endif
#endif #endif // _CSRSERVER_H
/* EOF */

View file

@ -28,20 +28,22 @@ CSR_API(CsrSrvCreateProcess)
NTSTATUS Status; NTSTATUS Status;
HANDLE ProcessHandle, ThreadHandle; HANDLE ProcessHandle, ThreadHandle;
PCSR_THREAD CsrThread; PCSR_THREAD CsrThread;
PCSR_PROCESS NewProcessData; PCSR_PROCESS Process, NewProcess;
ULONG Flags, VdmPower = 0, DebugFlags = 0; ULONG Flags, VdmPower = 0, DebugFlags = 0;
/* Get the current client thread */ /* Get the current client thread */
CsrThread = NtCurrentTeb()->CsrClientThread; CsrThread = CsrGetClientThread();
ASSERT(CsrThread != NULL); ASSERT(CsrThread != NULL);
Process = CsrThread->Process;
/* Extract the flags out of the process handle */ /* Extract the flags out of the process handle */
Flags = (ULONG_PTR)Request->Data.CreateProcessRequest.ProcessHandle & 3; Flags = (ULONG_PTR)ApiMessage->Data.CreateProcessRequest.ProcessHandle & 3;
Request->Data.CreateProcessRequest.ProcessHandle = (HANDLE)((ULONG_PTR)Request->Data.CreateProcessRequest.ProcessHandle & ~3); ApiMessage->Data.CreateProcessRequest.ProcessHandle = (HANDLE)((ULONG_PTR)ApiMessage->Data.CreateProcessRequest.ProcessHandle & ~3);
/* Duplicate the process handle */ /* Duplicate the process handle */
Status = NtDuplicateObject(CsrThread->Process->ProcessHandle, Status = NtDuplicateObject(Process->ProcessHandle,
Request->Data.CreateProcessRequest.ProcessHandle, ApiMessage->Data.CreateProcessRequest.ProcessHandle,
NtCurrentProcess(), NtCurrentProcess(),
&ProcessHandle, &ProcessHandle,
0, 0,
@ -54,8 +56,8 @@ CSR_API(CsrSrvCreateProcess)
} }
/* Duplicate the thread handle */ /* Duplicate the thread handle */
Status = NtDuplicateObject(CsrThread->Process->ProcessHandle, Status = NtDuplicateObject(Process->ProcessHandle,
Request->Data.CreateProcessRequest.ThreadHandle, ApiMessage->Data.CreateProcessRequest.ThreadHandle,
NtCurrentProcess(), NtCurrentProcess(),
&ThreadHandle, &ThreadHandle,
0, 0,
@ -86,7 +88,7 @@ CSR_API(CsrSrvCreateProcess)
} }
/* Convert some flags. FIXME: More need conversion */ /* Convert some flags. FIXME: More need conversion */
if (Request->Data.CreateProcessRequest.CreationFlags & CREATE_NEW_PROCESS_GROUP) if (ApiMessage->Data.CreateProcessRequest.CreationFlags & CREATE_NEW_PROCESS_GROUP)
{ {
DebugFlags |= CsrProcessCreateNewGroup; DebugFlags |= CsrProcessCreateNewGroup;
} }
@ -96,8 +98,8 @@ CSR_API(CsrSrvCreateProcess)
/* Call CSRSRV to create the CSR_PROCESS structure and the first CSR_THREAD */ /* Call CSRSRV to create the CSR_PROCESS structure and the first CSR_THREAD */
Status = CsrCreateProcess(ProcessHandle, Status = CsrCreateProcess(ProcessHandle,
ThreadHandle, ThreadHandle,
&Request->Data.CreateProcessRequest.ClientId, &ApiMessage->Data.CreateProcessRequest.ClientId,
CsrThread->Process->NtSession, Process->NtSession,
DebugFlags, DebugFlags,
NULL); NULL);
if (Status == STATUS_THREAD_IS_TERMINATING) if (Status == STATUS_THREAD_IS_TERMINATING)
@ -118,16 +120,16 @@ CSR_API(CsrSrvCreateProcess)
/* FIXME: VDM vodoo */ /* FIXME: VDM vodoo */
/* ReactOS Compatibility */ /* ReactOS Compatibility */
Status = CsrLockProcessByClientId(Request->Data.CreateProcessRequest.ClientId.UniqueProcess, &NewProcessData); Status = CsrLockProcessByClientId(ApiMessage->Data.CreateProcessRequest.ClientId.UniqueProcess, &NewProcess);
ASSERT(Status == STATUS_SUCCESS); ASSERT(Status == STATUS_SUCCESS);
if (!(Request->Data.CreateProcessRequest.CreationFlags & (CREATE_NEW_CONSOLE | DETACHED_PROCESS))) if (!(ApiMessage->Data.CreateProcessRequest.CreationFlags & (CREATE_NEW_CONSOLE | DETACHED_PROCESS)))
{ {
NewProcessData->ParentConsole = ProcessData->Console; NewProcess->ParentConsole = Process->Console;
NewProcessData->bInheritHandles = Request->Data.CreateProcessRequest.bInheritHandles; NewProcess->bInheritHandles = ApiMessage->Data.CreateProcessRequest.bInheritHandles;
} }
RtlInitializeCriticalSection(&NewProcessData->HandleTableLock); RtlInitializeCriticalSection(&NewProcess->HandleTableLock);
CallProcessCreated(ProcessData, NewProcessData); CallProcessCreated(Process, NewProcess);
CsrUnlockProcess(NewProcessData); CsrUnlockProcess(NewProcess);
/* Return the result of this operation */ /* Return the result of this operation */
return Status; return Status;
@ -141,36 +143,36 @@ CSR_API(CsrSrvCreateThread)
PCSR_PROCESS CsrProcess; PCSR_PROCESS CsrProcess;
/* Get the current CSR thread */ /* Get the current CSR thread */
CurrentThread = NtCurrentTeb()->CsrClientThread; CurrentThread = CsrGetClientThread();
if (!CurrentThread) if (!CurrentThread)
{ {
DPRINT1("Server Thread TID: [%lx.%lx]\n", DPRINT1("Server Thread TID: [%lx.%lx]\n",
Request->Data.CreateThreadRequest.ClientId.UniqueProcess, ApiMessage->Data.CreateThreadRequest.ClientId.UniqueProcess,
Request->Data.CreateThreadRequest.ClientId.UniqueThread); ApiMessage->Data.CreateThreadRequest.ClientId.UniqueThread);
return STATUS_SUCCESS; // server-to-server return STATUS_SUCCESS; // server-to-server
} }
/* Get the CSR Process for this request */ /* Get the CSR Process for this request */
CsrProcess = CurrentThread->Process; CsrProcess = CurrentThread->Process;
if (CsrProcess->ClientId.UniqueProcess != if (CsrProcess->ClientId.UniqueProcess !=
Request->Data.CreateThreadRequest.ClientId.UniqueProcess) ApiMessage->Data.CreateThreadRequest.ClientId.UniqueProcess)
{ {
/* This is a remote thread request -- is it within the server itself? */ /* This is a remote thread request -- is it within the server itself? */
if (Request->Data.CreateThreadRequest.ClientId.UniqueProcess == NtCurrentTeb()->ClientId.UniqueProcess) if (ApiMessage->Data.CreateThreadRequest.ClientId.UniqueProcess == NtCurrentTeb()->ClientId.UniqueProcess)
{ {
/* Accept this without any further work */ /* Accept this without any further work */
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
/* Get the real CSR Process for the remote thread's process */ /* Get the real CSR Process for the remote thread's process */
Status = CsrLockProcessByClientId(Request->Data.CreateThreadRequest.ClientId.UniqueProcess, Status = CsrLockProcessByClientId(ApiMessage->Data.CreateThreadRequest.ClientId.UniqueProcess,
&CsrProcess); &CsrProcess);
if (!NT_SUCCESS(Status)) return Status; if (!NT_SUCCESS(Status)) return Status;
} }
/* Duplicate the thread handle so we can own it */ /* Duplicate the thread handle so we can own it */
Status = NtDuplicateObject(CurrentThread->Process->ProcessHandle, Status = NtDuplicateObject(CurrentThread->Process->ProcessHandle,
Request->Data.CreateThreadRequest.ThreadHandle, ApiMessage->Data.CreateThreadRequest.ThreadHandle,
NtCurrentProcess(), NtCurrentProcess(),
&ThreadHandle, &ThreadHandle,
0, 0,
@ -181,7 +183,7 @@ CSR_API(CsrSrvCreateThread)
/* Call CSRSRV to tell it about the new thread */ /* Call CSRSRV to tell it about the new thread */
Status = CsrCreateThread(CsrProcess, Status = CsrCreateThread(CsrProcess,
ThreadHandle, ThreadHandle,
&Request->Data.CreateThreadRequest.ClientId); &ApiMessage->Data.CreateThreadRequest.ClientId);
} }
/* Unlock the process and return */ /* Unlock the process and return */
@ -191,39 +193,42 @@ CSR_API(CsrSrvCreateThread)
CSR_API(CsrTerminateProcess) CSR_API(CsrTerminateProcess)
{ {
PCSR_THREAD CsrThread = NtCurrentTeb()->CsrClientThread; PCSR_THREAD CsrThread = CsrGetClientThread();
ASSERT(CsrThread != NULL); ASSERT(CsrThread != NULL);
/* Set magic flag so we don't reply this message back */ /* Set magic flag so we don't reply this message back */
Request->Type = 0xBABE; ApiMessage->ApiNumber = 0xBABE;
/* Remove the CSR_THREADs and CSR_PROCESS */ /* Remove the CSR_THREADs and CSR_PROCESS */
return CsrDestroyProcess(&CsrThread->ClientId, return CsrDestroyProcess(&CsrThread->ClientId,
(NTSTATUS)Request->Data.TerminateProcessRequest.uExitCode); (NTSTATUS)ApiMessage->Data.TerminateProcessRequest.uExitCode);
} }
CSR_API(CsrConnectProcess) CSR_API(CsrConnectProcess)
{ {
return STATUS_SUCCESS;
return(STATUS_SUCCESS);
} }
CSR_API(CsrGetShutdownParameters) CSR_API(CsrGetShutdownParameters)
{ {
PCSR_THREAD CsrThread = CsrGetClientThread();
ASSERT(CsrThread);
Request->Data.GetShutdownParametersRequest.Level = ProcessData->ShutdownLevel; ApiMessage->Data.GetShutdownParametersRequest.Level = CsrThread->Process->ShutdownLevel;
Request->Data.GetShutdownParametersRequest.Flags = ProcessData->ShutdownFlags; ApiMessage->Data.GetShutdownParametersRequest.Flags = CsrThread->Process->ShutdownFlags;
return(STATUS_SUCCESS); return STATUS_SUCCESS;
} }
CSR_API(CsrSetShutdownParameters) CSR_API(CsrSetShutdownParameters)
{ {
PCSR_THREAD CsrThread = CsrGetClientThread();
ASSERT(CsrThread);
ProcessData->ShutdownLevel = Request->Data.SetShutdownParametersRequest.Level; CsrThread->Process->ShutdownLevel = ApiMessage->Data.SetShutdownParametersRequest.Level;
ProcessData->ShutdownFlags = Request->Data.SetShutdownParametersRequest.Flags; CsrThread->Process->ShutdownFlags = ApiMessage->Data.SetShutdownParametersRequest.Flags;
return(STATUS_SUCCESS); return STATUS_SUCCESS;
} }
/* EOF */ /* EOF */

View file

@ -32,7 +32,7 @@ CSR_API(CsrRegisterServicesProcess)
} }
else else
{ {
ServicesProcessId = (ULONG_PTR)Request->Data.RegisterServicesProcessRequest.ProcessId; ServicesProcessId = (ULONG_PTR)ApiMessage->Data.RegisterServicesProcessRequest.ProcessId;
ServicesProcessIdValid = TRUE; ServicesProcessIdValid = TRUE;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }

View file

@ -62,39 +62,47 @@ CsrApiRegisterDefinitions(PCSRSS_API_DEFINITION NewDefinitions)
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
/*
VOID VOID
FASTCALL FASTCALL
CsrApiCallHandler(PCSR_PROCESS ProcessData, CsrApiCallHandler(PCSR_PROCESS ProcessData,
PCSR_API_MESSAGE Request) PCSR_API_MESSAGE Request)
*/
VOID
FASTCALL
CsrApiCallHandler(
IN OUT PCSR_API_MESSAGE ApiMessage,
OUT PULONG Reply
)
{ {
unsigned DefIndex; unsigned DefIndex;
ULONG Type; ULONG ApiId;
DPRINT("CSR: Calling handler for type: %x.\n", Request->Type); DPRINT("CSR: Calling handler for ApiNumber: %x.\n", ApiMessage->ApiNumber);
Type = Request->Type & 0xFFFF; /* FIXME: USE MACRO */ ApiId = CSR_API_NUMBER_TO_API_ID(ApiMessage->ApiNumber);
DPRINT("CSR: API Number: %x ServerID: %x\n",Type, Request->Type >> 16); DPRINT("CSR: ApiID: %x ServerID: %x\n", ApiId, CSR_API_NUMBER_TO_SERVER_ID(ApiMessage->ApiNumber));
/* FIXME: Extract DefIndex instead of looping */ /* FIXME: Extract DefIndex instead of looping */
for (DefIndex = 0; DefIndex < ApiDefinitionsCount; DefIndex++) for (DefIndex = 0; DefIndex < ApiDefinitionsCount; DefIndex++)
{ {
if (ApiDefinitions[DefIndex].Type == Type) if (ApiDefinitions[DefIndex].ApiID == ApiId)
{ {
if (Request->Header.u1.s1.DataLength < ApiDefinitions[DefIndex].MinRequestSize) if (ApiMessage->Header.u1.s1.DataLength < ApiDefinitions[DefIndex].MinRequestSize)
{ {
DPRINT1("Request type %d min request size %d actual %d\n", DPRINT1("Request ApiID %d min request size %d actual %d\n",
Type, ApiDefinitions[DefIndex].MinRequestSize, ApiId, ApiDefinitions[DefIndex].MinRequestSize,
Request->Header.u1.s1.DataLength); ApiMessage->Header.u1.s1.DataLength);
Request->Status = STATUS_INVALID_PARAMETER; ApiMessage->Status = STATUS_INVALID_PARAMETER;
} }
else else
{ {
Request->Status = (ApiDefinitions[DefIndex].Handler)(ProcessData, Request); ApiMessage->Status = (ApiDefinitions[DefIndex].Handler)(ApiMessage, Reply);
} }
return; return;
} }
} }
DPRINT1("CSR: Unknown request type 0x%x\n", Request->Type); DPRINT1("CSR: Unknown request ApiNumber 0x%x\n", ApiMessage->ApiNumber);
Request->Status = STATUS_INVALID_SYSTEM_SERVICE; ApiMessage->Status = STATUS_INVALID_SYSTEM_SERVICE;
} }
VOID VOID
@ -127,7 +135,7 @@ CsrHandleHardError(IN PCSR_THREAD ThreadData,
* Pointer to the CSR API Message to receive from the server. * Pointer to the CSR API Message to receive from the server.
* *
* @return STATUS_SUCCESS in case of success, STATUS_ILLEGAL_FUNCTION * @return STATUS_SUCCESS in case of success, STATUS_ILLEGAL_FUNCTION
* if the opcode is invalid, or STATUS_ACCESS_VIOLATION if there * if the ApiNumber is invalid, or STATUS_ACCESS_VIOLATION if there
* was a problem executing the API. * was a problem executing the API.
* *
* @remarks None. * @remarks None.
@ -146,7 +154,7 @@ CsrCallServerFromServer(PCSR_API_MESSAGE ReceiveMsg,
NTSTATUS Status; NTSTATUS Status;
/* Get the Server ID */ /* Get the Server ID */
ServerId = CSR_SERVER_ID_FROM_OPCODE(ReceiveMsg->Opcode); ServerId = CSR_SERVER_ID_FROM_OPCODE(ReceiveMsg->ApiNumber);
/* Make sure that the ID is within limits, and the Server DLL loaded */ /* Make sure that the ID is within limits, and the Server DLL loaded */
if ((ServerId >= CSR_SERVER_DLL_MAX) || if ((ServerId >= CSR_SERVER_DLL_MAX) ||
@ -160,7 +168,7 @@ CsrCallServerFromServer(PCSR_API_MESSAGE ReceiveMsg,
else else
{ {
/* Get the API ID */ /* Get the API ID */
ApiId = CSR_API_ID_FROM_OPCODE(ReceiveMsg->Opcode); ApiId = CSR_API_NUMBER_TO_API_ID(ReceiveMsg->ApiNumber);
/* Normalize it with our Base ID */ /* Normalize it with our Base ID */
ApiId -= ServerDll->ApiBase; ApiId -= ServerDll->ApiBase;
@ -209,6 +217,7 @@ CsrCallServerFromServer(PCSR_API_MESSAGE ReceiveMsg,
#else // Hacky reactos code #else // Hacky reactos code
PCSR_PROCESS ProcessData; PCSR_PROCESS ProcessData;
ULONG ReplyCode;
/* Get the Process Data */ /* Get the Process Data */
CsrLockProcessByClientId(&ReceiveMsg->Header.ClientId.UniqueProcess, &ProcessData); CsrLockProcessByClientId(&ReceiveMsg->Header.ClientId.UniqueProcess, &ProcessData);
@ -223,7 +232,7 @@ CsrCallServerFromServer(PCSR_API_MESSAGE ReceiveMsg,
_SEH2_TRY _SEH2_TRY
{ {
/* Call the API and get the result */ /* Call the API and get the result */
CsrApiCallHandler(ProcessData, ReplyMsg); CsrApiCallHandler(ReplyMsg, /*ProcessData*/ &ReplyCode);
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
@ -1163,7 +1172,7 @@ HandleHardError:
{ {
/* This is an API Message coming from a non-CSR Thread */ /* This is an API Message coming from a non-CSR Thread */
DPRINT1("No thread found for request %lx and clientID %lx.%lx\n", DPRINT1("No thread found for request %lx and clientID %lx.%lx\n",
Request->Type & 0xFFFF, Request->ApiNumber & 0xFFFF,
Request->Header.ClientId.UniqueProcess, Request->Header.ClientId.UniqueProcess,
Request->Header.ClientId.UniqueThread); Request->Header.ClientId.UniqueThread);
Reply = Request; Reply = Request;
@ -1276,12 +1285,14 @@ HandleHardError:
ReplyPort = CsrThread->Process->ClientPort; ReplyPort = CsrThread->Process->ClientPort;
DPRINT("CSR: Got CSR API: %x [Message Origin: %x]\n", DPRINT("CSR: Got CSR API: %x [Message Origin: %x]\n",
Request->Type, Request->ApiNumber,
Request->Header.ClientId.UniqueThread); Request->Header.ClientId.UniqueThread);
/* Validation complete, start SEH */ /* Validation complete, start SEH */
_SEH2_TRY _SEH2_TRY
{ {
ULONG ReplyCode;
/* Make sure we have enough threads */ /* Make sure we have enough threads */
CsrpCheckRequestThreads(); CsrpCheckRequestThreads();
@ -1289,7 +1300,7 @@ HandleHardError:
NtCurrentTeb()->CsrClientThread = CsrThread; NtCurrentTeb()->CsrClientThread = CsrThread;
/* Call the Handler */ /* Call the Handler */
CsrApiCallHandler(CsrThread->Process, Request); CsrApiCallHandler(Request, &ReplyCode);
/* Increase the static thread count */ /* Increase the static thread count */
_InterlockedIncrement(&CsrpStaticThreadCount); _InterlockedIncrement(&CsrpStaticThreadCount);
@ -1298,7 +1309,7 @@ HandleHardError:
NtCurrentTeb()->CsrClientThread = ServerThread; NtCurrentTeb()->CsrClientThread = ServerThread;
/* Check if this is a dead client now */ /* Check if this is a dead client now */
if (Request->Type == 0xBABE) if (Request->ApiNumber == 0xBABE)
{ {
/* Reply to the death message */ /* Reply to the death message */
NtReplyPort(ReplyPort, &Reply->Header); NtReplyPort(ReplyPort, &Reply->Header);

View file

@ -187,7 +187,7 @@ NTAPI
CsrImpersonateClient(IN PCSR_THREAD CsrThread) CsrImpersonateClient(IN PCSR_THREAD CsrThread)
{ {
NTSTATUS Status; NTSTATUS Status;
PCSR_THREAD CurrentThread = NtCurrentTeb()->CsrClientThread; PCSR_THREAD CurrentThread = CsrGetClientThread();
/* Use the current thread if none given */ /* Use the current thread if none given */
if (!CsrThread) CsrThread = CurrentThread; if (!CsrThread) CsrThread = CurrentThread;
@ -241,7 +241,7 @@ NTAPI
CsrRevertToSelf(VOID) CsrRevertToSelf(VOID)
{ {
NTSTATUS Status; NTSTATUS Status;
PCSR_THREAD CurrentThread = NtCurrentTeb()->CsrClientThread; PCSR_THREAD CurrentThread = CsrGetClientThread();
HANDLE ImpersonationToken = NULL; HANDLE ImpersonationToken = NULL;
/* Check if we have a Current Thread */ /* Check if we have a Current Thread */
@ -699,7 +699,7 @@ CsrCreateProcess(IN HANDLE hProcess,
IN ULONG Flags, IN ULONG Flags,
IN PCLIENT_ID DebugCid) IN PCLIENT_ID DebugCid)
{ {
PCSR_THREAD CurrentThread = NtCurrentTeb()->CsrClientThread; PCSR_THREAD CurrentThread = CsrGetClientThread();
CLIENT_ID CurrentCid; CLIENT_ID CurrentCid;
PCSR_PROCESS CurrentProcess; PCSR_PROCESS CurrentProcess;
// PVOID ProcessData; // PVOID ProcessData;

View file

@ -281,7 +281,7 @@ CsrSrvClientConnect(IN OUT PCSR_API_MESSAGE ApiMessage,
NTSTATUS Status; NTSTATUS Status;
PCSR_CLIENT_CONNECT ClientConnect; PCSR_CLIENT_CONNECT ClientConnect;
PCSR_SERVER_DLL ServerDll; PCSR_SERVER_DLL ServerDll;
PCSR_PROCESS CurrentProcess = ((PCSR_THREAD)NtCurrentTeb()->CsrClientThread)->Process; PCSR_PROCESS CurrentProcess = CsrGetClientThread()->Process;
/* Load the Message, set default reply */ /* Load the Message, set default reply */
ClientConnect = (PCSR_CLIENT_CONNECT)&ApiMessage->CsrClientConnect; ClientConnect = (PCSR_CLIENT_CONNECT)&ApiMessage->CsrClientConnect;
@ -525,7 +525,7 @@ NTAPI
CsrSrvIdentifyAlertableThread(IN OUT PCSR_API_MESSAGE ApiMessage, CsrSrvIdentifyAlertableThread(IN OUT PCSR_API_MESSAGE ApiMessage,
IN OUT PULONG Reply) IN OUT PULONG Reply)
{ {
PCSR_THREAD CsrThread = NtCurrentTeb()->CsrClientThread; PCSR_THREAD CsrThread = CsrGetClientThread();
/* Set the alertable flag */ /* Set the alertable flag */
CsrThread->Flags |= CsrThreadAltertable; CsrThread->Flags |= CsrThreadAltertable;

View file

@ -668,7 +668,7 @@ CsrCreateThread(IN PCSR_PROCESS CsrProcess,
{ {
PCSR_THREAD CsrThread; PCSR_THREAD CsrThread;
PCSR_PROCESS CurrentProcess; PCSR_PROCESS CurrentProcess;
PCSR_THREAD CurrentThread = NtCurrentTeb()->CsrClientThread; PCSR_THREAD CurrentThread = CsrGetClientThread();
CLIENT_ID CurrentCid; CLIENT_ID CurrentCid;
KERNEL_USER_TIMES KernelTimes; KERNEL_USER_TIMES KernelTimes;

View file

@ -11,14 +11,15 @@
#include <ndk/psfuncs.h> #include <ndk/psfuncs.h>
#include <ndk/rtlfuncs.h> #include <ndk/rtlfuncs.h>
#include <csrss/csrss.h> #include <csrss/server.h>
#define CsrAcquireProcessLock() \
RtlEnterCriticalSection(&ProcessDataLock); // CsrProcessLock
#define CsrReleaseProcessLock() \
RtlLeaveCriticalSection(&ProcessDataLock);
#define CSR_SRV_SERVER 0
#define CSR_SERVER_DLL_MAX 4
#define LOCK RtlEnterCriticalSection(&ProcessDataLock)
#define UNLOCK RtlLeaveCriticalSection(&ProcessDataLock)
#define CsrAcquireProcessLock() LOCK
#define CsrReleaseProcessLock() UNLOCK
#define ProcessStructureListLocked() \ #define ProcessStructureListLocked() \
(ProcessDataLock.OwningThread == NtCurrentTeb()->ClientId.UniqueThread) (ProcessDataLock.OwningThread == NtCurrentTeb()->ClientId.UniqueThread)
@ -34,230 +35,35 @@
#define CsrReleaseNtSessionLock() \ #define CsrReleaseNtSessionLock() \
RtlLeaveCriticalSection(&CsrNtSessionLock); RtlLeaveCriticalSection(&CsrNtSessionLock);
typedef enum _CSR_THREAD_FLAGS
{
CsrThreadAltertable = 0x1,
CsrThreadInTermination = 0x2,
CsrThreadTerminated = 0x4,
CsrThreadIsServerThread = 0x10
} CSR_THREAD_FLAGS, *PCSR_THREAD_FLAGS;
typedef enum _SHUTDOWN_RESULT
{
CsrShutdownCsrProcess = 1,
CsrShutdownNonCsrProcess,
CsrShutdownCancelled
} SHUTDOWN_RESULT, *PSHUTDOWN_RESULT;
typedef enum _CSR_SHUTDOWN_FLAGS
{
CsrShutdownSystem = 4,
CsrShutdownOther = 8
} CSR_SHUTDOWN_FLAGS, *PCSR_SHUTDOWN_FLAGS;
typedef enum _CSR_DEBUG_FLAGS
{
CsrDebugOnlyThisProcess = 1,
CsrDebugProcessChildren = 2
} CSR_PROCESS_DEBUG_FLAGS, *PCSR_PROCESS_DEBUG_FLAGS;
typedef enum _CSR_PROCESS_FLAGS
{
CsrProcessTerminating = 0x1,
CsrProcessSkipShutdown = 0x2,
CsrProcessNormalPriority = 0x10,
CsrProcessIdlePriority = 0x20,
CsrProcessHighPriority = 0x40,
CsrProcessRealtimePriority = 0x80,
CsrProcessCreateNewGroup = 0x100,
CsrProcessTerminated = 0x200,
CsrProcessLastThreadTerminated = 0x400,
CsrProcessIsConsoleApp = 0x800
} CSR_PROCESS_FLAGS, *PCSR_PROCESS_FLAGS;
#define CsrProcessPriorityFlags (CsrProcessNormalPriority | \
CsrProcessIdlePriority | \
CsrProcessHighPriority | \
CsrProcessRealtimePriority)
typedef struct _CSRSS_CON_PROCESS_DATA
{
HANDLE ConsoleEvent;
struct tagCSRSS_CONSOLE *Console;
struct tagCSRSS_CONSOLE *ParentConsole;
BOOL bInheritHandles;
RTL_CRITICAL_SECTION HandleTableLock;
ULONG HandleTableSize;
struct _CSRSS_HANDLE *HandleTable;
PCONTROLDISPATCHER CtrlDispatcher;
LIST_ENTRY ConsoleLink;
} CSRSS_CON_PROCESS_DATA, *PCSRSS_CON_PROCESS_DATA;
typedef struct _CSR_NT_SESSION
{
ULONG ReferenceCount;
LIST_ENTRY SessionLink;
ULONG SessionId;
} CSR_NT_SESSION, *PCSR_NT_SESSION;
typedef struct _CSR_PROCESS
{
CLIENT_ID ClientId;
LIST_ENTRY ListLink;
LIST_ENTRY ThreadList;
struct _CSR_PROCESS *Parent;
PCSR_NT_SESSION NtSession;
ULONG ExpectedVersion;
HANDLE ClientPort;
ULONG_PTR ClientViewBase;
ULONG_PTR ClientViewBounds;
HANDLE ProcessHandle;
ULONG SequenceNumber;
ULONG Flags;
ULONG DebugFlags;
CLIENT_ID DebugCid;
ULONG ReferenceCount;
ULONG ProcessGroupId;
ULONG ProcessGroupSequence;
ULONG fVDM;
ULONG ThreadCount;
ULONG PriorityClass;
ULONG Reserved;
ULONG ShutdownLevel;
ULONG ShutdownFlags;
// PVOID ServerData[ANYSIZE_ARRAY];
CSRSS_CON_PROCESS_DATA;
} CSR_PROCESS, *PCSR_PROCESS;
typedef struct _CSR_THREAD
{
LARGE_INTEGER CreateTime;
LIST_ENTRY Link;
LIST_ENTRY HashLinks;
CLIENT_ID ClientId;
PCSR_PROCESS Process;
struct _CSR_WAIT_BLOCK *WaitBlock;
HANDLE ThreadHandle;
ULONG Flags;
ULONG ReferenceCount;
ULONG ImpersonationCount;
} CSR_THREAD, *PCSR_THREAD;
typedef
BOOLEAN
(*CSR_WAIT_FUNCTION)(
IN PLIST_ENTRY WaitList,
IN PCSR_THREAD WaitThread,
IN PCSR_API_MESSAGE WaitApiMessage,
IN PVOID WaitContext,
IN PVOID WaitArgument1,
IN PVOID WaitArgument2,
IN ULONG WaitFlags
);
typedef struct _CSR_WAIT_BLOCK
{
ULONG Size;
LIST_ENTRY WaitList;
LIST_ENTRY UserWaitList;
PVOID WaitContext;
PCSR_THREAD WaitThread;
CSR_WAIT_FUNCTION WaitFunction;
CSR_API_MESSAGE WaitApiMessage;
} CSR_WAIT_BLOCK, *PCSR_WAIT_BLOCK;
typedef
NTSTATUS
(NTAPI *PCSR_CONNECT_CALLBACK)(
IN PCSR_PROCESS CsrProcess,
IN OUT PVOID ConnectionInfo,
IN OUT PULONG ConnectionInfoLength
);
typedef
VOID
(NTAPI *PCSR_DISCONNECT_CALLBACK)(IN PCSR_PROCESS CsrProcess);
typedef
NTSTATUS
(NTAPI *PCSR_NEWPROCESS_CALLBACK)(
IN PCSR_PROCESS Parent,
IN PCSR_PROCESS CsrProcess
);
typedef
VOID
(NTAPI *PCSR_HARDERROR_CALLBACK)(
IN PCSR_THREAD CsrThread,
IN PHARDERROR_MSG HardErrorMessage
);
typedef
ULONG
(NTAPI *PCSR_SHUTDOWNPROCESS_CALLBACK)(
IN PCSR_PROCESS CsrProcess,
IN ULONG Flags,
IN BOOLEAN FirstPhase
);
typedef
NTSTATUS
(NTAPI *PCSR_API_ROUTINE)(
IN OUT PCSR_API_MESSAGE ApiMessage,
IN OUT PULONG Reply
);
typedef struct _CSR_SERVER_DLL
{
ULONG Length;
HANDLE Event;
ANSI_STRING Name;
HANDLE ServerHandle;
ULONG ServerId;
ULONG Unknown;
ULONG ApiBase;
ULONG HighestApiSupported;
PCSR_API_ROUTINE *DispatchTable;
PBOOLEAN ValidTable;
PCHAR *NameTable;
ULONG SizeOfProcessData;
PCSR_CONNECT_CALLBACK ConnectCallback;
PCSR_DISCONNECT_CALLBACK DisconnectCallback;
PCSR_HARDERROR_CALLBACK HardErrorCallback;
PVOID SharedSection;
PCSR_NEWPROCESS_CALLBACK NewProcessCallback;
PCSR_SHUTDOWNPROCESS_CALLBACK ShutdownProcessCallback;
ULONG Unknown2[3];
} CSR_SERVER_DLL, *PCSR_SERVER_DLL;
typedef
NTSTATUS
(NTAPI *PCSR_SERVER_DLL_INIT_CALLBACK)(IN PCSR_SERVER_DLL ServerDll);
typedef NTSTATUS (WINAPI *CSRSS_API_PROC)(PCSR_PROCESS ProcessData,
PCSR_API_MESSAGE Request);
typedef struct _CSRSS_API_DEFINITION typedef struct _CSRSS_API_DEFINITION
{ {
ULONG Type; ULONG ApiID;
ULONG MinRequestSize; ULONG MinRequestSize;
CSRSS_API_PROC Handler; PCSR_API_ROUTINE Handler;
} CSRSS_API_DEFINITION, *PCSRSS_API_DEFINITION; } CSRSS_API_DEFINITION, *PCSRSS_API_DEFINITION;
#define CSRSS_DEFINE_API(Func, Handler) \ #define CSRSS_DEFINE_API(Func, Handler) \
{ Func, sizeof(CSRSS_##Func), Handler } { Func, sizeof(CSRSS_##Func), Handler }
typedef struct _CSRSS_LISTEN_DATA typedef struct _CSRSS_LISTEN_DATA
{ {
HANDLE ApiPortHandle; HANDLE ApiPortHandle;
ULONG ApiDefinitionsCount; ULONG ApiDefinitionsCount;
PCSRSS_API_DEFINITION *ApiDefinitions; PCSRSS_API_DEFINITION *ApiDefinitions;
} CSRSS_LISTEN_DATA, *PCSRSS_LISTEN_DATA; } CSRSS_LISTEN_DATA, *PCSRSS_LISTEN_DATA;
#define CSR_API(n) NTSTATUS WINAPI n ( \
PCSR_PROCESS ProcessData, \
PCSR_API_MESSAGE Request)
/******************************************************************************
******************************************************************************
******************************************************************************/
/* init.c */ /* init.c */
extern HANDLE hBootstrapOk; extern HANDLE hBootstrapOk;
@ -304,15 +110,10 @@ CsrInsertProcess(IN PCSR_PROCESS Parent OPTIONAL,
/* api/wapi.c */ /* api/wapi.c */
NTSTATUS FASTCALL CsrApiRegisterDefinitions(PCSRSS_API_DEFINITION NewDefinitions); NTSTATUS FASTCALL CsrApiRegisterDefinitions(PCSRSS_API_DEFINITION NewDefinitions);
VOID FASTCALL CsrApiCallHandler(PCSR_PROCESS ProcessData, VOID FASTCALL CsrApiCallHandler(IN OUT PCSR_API_MESSAGE ApiMessage, OUT PULONG Reply);
PCSR_API_MESSAGE Request);
VOID WINAPI CsrSbApiRequestThread (PVOID PortHandle); VOID WINAPI CsrSbApiRequestThread (PVOID PortHandle);
VOID NTAPI ClientConnectionThread(HANDLE ServerPort); VOID NTAPI ClientConnectionThread(HANDLE ServerPort);
VOID
NTAPI
CsrReleaseCapturedArguments(IN PCSR_API_MESSAGE ApiMessage);
extern HANDLE CsrApiPort; extern HANDLE CsrApiPort;
extern HANDLE CsrSmApiPort; extern HANDLE CsrSmApiPort;
extern HANDLE CsrSbApiPort; extern HANDLE CsrSbApiPort;
@ -357,7 +158,7 @@ CsrLockedReferenceThread(IN PCSR_THREAD CsrThread);
/* api/process.c */ /* api/process.c */
typedef NTSTATUS (WINAPI *CSRSS_ENUM_PROCESS_PROC)(PCSR_PROCESS ProcessData, typedef NTSTATUS (WINAPI *CSRSS_ENUM_PROCESS_PROC)(PCSR_PROCESS ProcessData,
PVOID Context); PVOID Context);
NTSTATUS WINAPI CsrInitializeProcessStructure(VOID); NTSTATUS WINAPI CsrInitializeProcessStructure(VOID);
NTSTATUS WINAPI CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc, PVOID Context); NTSTATUS WINAPI CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc, PVOID Context);

View file

@ -70,8 +70,9 @@ typedef struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
/* SEH support with PSEH */ /* SEH support with PSEH */
#include <pseh/pseh2.h> #include <pseh/pseh2.h>
/* CSRSS header */ /* CSRSS Header */
#include <csrss/csrss.h> #include <csrss/client.h>
#include <csrss/csrss.h> // FIXME: data header.
/* Public Win32K headers */ /* Public Win32K headers */
#include <include/callback.h> #include <include/callback.h>

View file

@ -34,7 +34,7 @@ CsrInit(void)
NULL, NULL,
NULL, NULL,
&ConnectInfoLength); &ConnectInfoLength);
if (! NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
return Status; return Status;
} }

View file

@ -1208,7 +1208,7 @@ NtUserCreateDesktop(
/* /*
* Create a handle for CSRSS and notify CSRSS for Creating Desktop Background Windows and Threads. * Create a handle for CSRSS and notify CSRSS for Creating Desktop Background Windows and Threads.
*/ */
Request.Type = MAKE_CSR_API(CREATE_DESKTOP, CSR_GUI); Request.ApiNumber = CSR_CREATE_API_NUMBER(CSR_GUI, CREATE_DESKTOP);
Status = CsrInsertObject(Desktop, Status = CsrInsertObject(Desktop,
GENERIC_ALL, GENERIC_ALL,
(HANDLE*)&Request.Data.CreateDesktopRequest.DesktopHandle); (HANDLE*)&Request.Data.CreateDesktopRequest.DesktopHandle);

View file

@ -52,7 +52,7 @@ co_IntRegisterLogonProcess(HANDLE ProcessId, BOOL Register)
ObDereferenceObject(Process); ObDereferenceObject(Process);
Request.Type = MAKE_CSR_API(REGISTER_LOGON_PROCESS, CSR_GUI); Request.ApiNumber = CSR_CREATE_API_NUMBER(CSR_GUI, REGISTER_LOGON_PROCESS);
Request.Data.RegisterLogonProcessRequest.ProcessId = ProcessId; Request.Data.RegisterLogonProcessRequest.ProcessId = ProcessId;
Request.Data.RegisterLogonProcessRequest.Register = Register; Request.Data.RegisterLogonProcessRequest.Register = Register;

View file

@ -29,8 +29,9 @@
#include <ndk/rtlfuncs.h> #include <ndk/rtlfuncs.h>
#include <ndk/umfuncs.h> #include <ndk/umfuncs.h>
/* CSRSS Headers */ /* CSRSS Header */
#include <csrss/csrss.h> #include <csrss/client.h>
#include <csrss/csrss.h> // FIXME: data header.
/* Public Win32K Headers */ /* Public Win32K Headers */
#include <ntusrtyp.h> #include <ntusrtyp.h>

View file

@ -109,4 +109,3 @@ static __inline void LoadUserApiHook()
#define HOOKID_TO_FLAG(HookId) (1 << ((HookId) + 1)) #define HOOKID_TO_FLAG(HookId) (1 << ((HookId) + 1))
#define ISITHOOKED(HookId) (GetWin32ClientInfo()->fsHooks & HOOKID_TO_FLAG(HookId) ||\ #define ISITHOOKED(HookId) (GetWin32ClientInfo()->fsHooks & HOOKID_TO_FLAG(HookId) ||\
(GetWin32ClientInfo()->pDeskInfo && GetWin32ClientInfo()->pDeskInfo->fsHooks & HOOKID_TO_FLAG(HookId))) (GetWin32ClientInfo()->pDeskInfo && GetWin32ClientInfo()->pDeskInfo->fsHooks & HOOKID_TO_FLAG(HookId)))

View file

@ -65,27 +65,25 @@
*/ */
BOOL WINAPI BOOL WINAPI
ExitWindowsEx(UINT uFlags, ExitWindowsEx(UINT uFlags,
DWORD dwReserved) DWORD dwReserved)
{ {
CSR_API_MESSAGE Request; CSR_API_MESSAGE Request;
ULONG CsrRequest; NTSTATUS Status;
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(EXIT_REACTOS, CSR_GUI); Request.Data.ExitReactosRequest.Flags = uFlags;
Request.Data.ExitReactosRequest.Flags = uFlags; Request.Data.ExitReactosRequest.Reserved = dwReserved;
Request.Data.ExitReactosRequest.Reserved = dwReserved;
Status = CsrClientCallServer(&Request, Status = CsrClientCallServer(&Request,
NULL, NULL,
CsrRequest, CSR_CREATE_API_NUMBER(CSR_GUI, EXIT_REACTOS),
sizeof(CSR_API_MESSAGE)); sizeof(CSR_API_MESSAGE));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status)) if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
{ {
SetLastError(RtlNtStatusToDosError(Status)); SetLastError(RtlNtStatusToDosError(Status));
return(FALSE); return FALSE;
} }
return(TRUE); return TRUE;
} }
@ -95,24 +93,22 @@ ExitWindowsEx(UINT uFlags,
BOOL WINAPI BOOL WINAPI
RegisterServicesProcess(DWORD ServicesProcessId) RegisterServicesProcess(DWORD ServicesProcessId)
{ {
CSR_API_MESSAGE Request; CSR_API_MESSAGE Request;
ULONG CsrRequest; NTSTATUS Status;
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(REGISTER_SERVICES_PROCESS, CSR_GUI); Request.Data.RegisterServicesProcessRequest.ProcessId = UlongToHandle(ServicesProcessId);
Request.Data.RegisterServicesProcessRequest.ProcessId = UlongToHandle(ServicesProcessId);
Status = CsrClientCallServer(&Request, Status = CsrClientCallServer(&Request,
NULL, NULL,
CsrRequest, CSR_CREATE_API_NUMBER(CSR_GUI, REGISTER_SERVICES_PROCESS),
sizeof(CSR_API_MESSAGE)); sizeof(CSR_API_MESSAGE));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status)) if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
{ {
SetLastError(RtlNtStatusToDosError(Status)); SetLastError(RtlNtStatusToDosError(Status));
return(FALSE); return FALSE;
} }
return(TRUE); return TRUE;
} }
/* EOF */ /* EOF */

View file

@ -52,25 +52,23 @@ BOOL
WINAPI WINAPI
SetLogonNotifyWindow (HWND Wnd, HWINSTA WinSta) SetLogonNotifyWindow (HWND Wnd, HWINSTA WinSta)
{ {
/* Maybe we should call NtUserSetLogonNotifyWindow and let that one inform CSRSS??? */ /* Maybe we should call NtUserSetLogonNotifyWindow and let that one inform CSRSS??? */
CSR_API_MESSAGE Request; CSR_API_MESSAGE Request;
ULONG CsrRequest; NTSTATUS Status;
NTSTATUS Status;
CsrRequest = MAKE_CSR_API(SET_LOGON_NOTIFY_WINDOW, CSR_GUI); Request.Data.SetLogonNotifyWindowRequest.LogonNotifyWindow = Wnd;
Request.Data.SetLogonNotifyWindowRequest.LogonNotifyWindow = Wnd;
Status = CsrClientCallServer(&Request, Status = CsrClientCallServer(&Request,
NULL, NULL,
CsrRequest, CSR_CREATE_API_NUMBER(CSR_GUI, SET_LOGON_NOTIFY_WINDOW),
sizeof(CSR_API_MESSAGE)); sizeof(CSR_API_MESSAGE));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status)) if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
{ {
SetLastError(RtlNtStatusToDosError(Status)); SetLastError(RtlNtStatusToDosError(Status));
return(FALSE); return FALSE;
} }
return NtUserSetLogonNotifyWindow(Wnd); return NtUserSetLogonNotifyWindow(Wnd);
} }
/* /*

View file

@ -288,24 +288,24 @@ CSR_API(CsrAddConsoleAlias)
//ULONG TotalLength; //ULONG TotalLength;
//WCHAR * Ptr; //WCHAR * Ptr;
//TotalLength = Request->Data.AddConsoleAlias.SourceLength + Request->Data.AddConsoleAlias.ExeLength + Request->Data.AddConsoleAlias.TargetLength; //TotalLength = ApiMessage->Data.AddConsoleAlias.SourceLength + ApiMessage->Data.AddConsoleAlias.ExeLength + ApiMessage->Data.AddConsoleAlias.TargetLength;
//Ptr = (WCHAR*)((ULONG_PTR)Request + sizeof(CSR_API_MESSAGE)); //Ptr = (WCHAR*)((ULONG_PTR)ApiMessage + sizeof(CSR_API_MESSAGE));
lpSource = (WCHAR*)((ULONG_PTR)Request + sizeof(CSR_API_MESSAGE)); lpSource = (WCHAR*)((ULONG_PTR)ApiMessage + sizeof(CSR_API_MESSAGE));
lpExeName = (WCHAR*)((ULONG_PTR)Request + sizeof(CSR_API_MESSAGE) + Request->Data.AddConsoleAlias.SourceLength * sizeof(WCHAR)); lpExeName = (WCHAR*)((ULONG_PTR)ApiMessage + sizeof(CSR_API_MESSAGE) + ApiMessage->Data.AddConsoleAlias.SourceLength * sizeof(WCHAR));
lpTarget = (Request->Data.AddConsoleAlias.TargetLength != 0 ? lpExeName + Request->Data.AddConsoleAlias.ExeLength : NULL); lpTarget = (ApiMessage->Data.AddConsoleAlias.TargetLength != 0 ? lpExeName + ApiMessage->Data.AddConsoleAlias.ExeLength : NULL);
DPRINT("CsrAddConsoleAlias entered Request %p lpSource %p lpExeName %p lpTarget %p\n", Request, lpSource, lpExeName, lpTarget); DPRINT("CsrAddConsoleAlias entered ApiMessage %p lpSource %p lpExeName %p lpTarget %p\n", ApiMessage, lpSource, lpExeName, lpTarget);
if (lpExeName == NULL || lpSource == NULL) if (lpExeName == NULL || lpSource == NULL)
{ {
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
} }
Request->Status = ConioConsoleFromProcessData(ProcessData, &Console); ApiMessage->Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
if (!NT_SUCCESS(Request->Status)) if (!NT_SUCCESS(ApiMessage->Status))
{ {
return Request->Status; return ApiMessage->Status;
} }
Header = IntFindAliasHeader(Console->Aliases, lpExeName); Header = IntFindAliasHeader(Console->Aliases, lpExeName);
@ -326,14 +326,14 @@ CSR_API(CsrAddConsoleAlias)
if (Entry) if (Entry)
{ {
IntDeleteAliasEntry(Header, Entry); IntDeleteAliasEntry(Header, Entry);
Request->Status = STATUS_SUCCESS; ApiMessage->Status = STATUS_SUCCESS;
} }
else else
{ {
Request->Status = STATUS_INVALID_PARAMETER; ApiMessage->Status = STATUS_INVALID_PARAMETER;
} }
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return Request->Status; return ApiMessage->Status;
} }
Entry = IntCreateAliasEntry(lpSource, lpTarget); Entry = IntCreateAliasEntry(lpSource, lpTarget);
@ -359,24 +359,24 @@ CSR_API(CsrGetConsoleAlias)
WCHAR * lpSource; WCHAR * lpSource;
WCHAR * lpTarget; WCHAR * lpTarget;
lpSource = (LPWSTR)((ULONG_PTR)Request + sizeof(CSR_API_MESSAGE)); lpSource = (LPWSTR)((ULONG_PTR)ApiMessage + sizeof(CSR_API_MESSAGE));
lpExeName = lpSource + Request->Data.GetConsoleAlias.SourceLength; lpExeName = lpSource + ApiMessage->Data.GetConsoleAlias.SourceLength;
lpTarget = Request->Data.GetConsoleAlias.TargetBuffer; lpTarget = ApiMessage->Data.GetConsoleAlias.TargetBuffer;
DPRINT("CsrGetConsoleAlias entered lpExeName %p lpSource %p TargetBuffer %p TargetBufferLength %u\n", DPRINT("CsrGetConsoleAlias entered lpExeName %p lpSource %p TargetBuffer %p TargetBufferLength %u\n",
lpExeName, lpSource, lpTarget, Request->Data.GetConsoleAlias.TargetBufferLength); lpExeName, lpSource, lpTarget, ApiMessage->Data.GetConsoleAlias.TargetBufferLength);
if (Request->Data.GetConsoleAlias.ExeLength == 0 || lpTarget == NULL || if (ApiMessage->Data.GetConsoleAlias.ExeLength == 0 || lpTarget == NULL ||
Request->Data.GetConsoleAlias.TargetBufferLength == 0 || Request->Data.GetConsoleAlias.SourceLength == 0) ApiMessage->Data.GetConsoleAlias.TargetBufferLength == 0 || ApiMessage->Data.GetConsoleAlias.SourceLength == 0)
{ {
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
} }
Request->Status = ConioConsoleFromProcessData(ProcessData, &Console); ApiMessage->Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
if (!NT_SUCCESS(Request->Status)) if (!NT_SUCCESS(ApiMessage->Status))
{ {
return Request->Status; return ApiMessage->Status;
} }
Header = IntFindAliasHeader(Console->Aliases, lpExeName); Header = IntFindAliasHeader(Console->Aliases, lpExeName);
@ -394,21 +394,21 @@ CSR_API(CsrGetConsoleAlias)
} }
Length = (wcslen(Entry->lpTarget)+1) * sizeof(WCHAR); Length = (wcslen(Entry->lpTarget)+1) * sizeof(WCHAR);
if (Length > Request->Data.GetConsoleAlias.TargetBufferLength) if (Length > ApiMessage->Data.GetConsoleAlias.TargetBufferLength)
{ {
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return STATUS_BUFFER_TOO_SMALL; return STATUS_BUFFER_TOO_SMALL;
} }
if (!Win32CsrValidateBuffer(ProcessData, lpTarget, if (!Win32CsrValidateBuffer(CsrGetClientThread()->Process, lpTarget,
Request->Data.GetConsoleAlias.TargetBufferLength, 1)) ApiMessage->Data.GetConsoleAlias.TargetBufferLength, 1))
{ {
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return STATUS_ACCESS_VIOLATION; return STATUS_ACCESS_VIOLATION;
} }
wcscpy(lpTarget, Entry->lpTarget); wcscpy(lpTarget, Entry->lpTarget);
Request->Data.GetConsoleAlias.BytesWritten = Length; ApiMessage->Data.GetConsoleAlias.BytesWritten = Length;
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -419,33 +419,33 @@ CSR_API(CsrGetAllConsoleAliases)
ULONG BytesWritten; ULONG BytesWritten;
PALIAS_HEADER Header; PALIAS_HEADER Header;
if (Request->Data.GetAllConsoleAlias.lpExeName == NULL) if (ApiMessage->Data.GetAllConsoleAlias.lpExeName == NULL)
{ {
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
} }
Request->Status = ConioConsoleFromProcessData(ProcessData, &Console); ApiMessage->Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
if (!NT_SUCCESS(Request->Status)) if (!NT_SUCCESS(ApiMessage->Status))
{ {
return Request->Status; return ApiMessage->Status;
} }
Header = IntFindAliasHeader(Console->Aliases, Request->Data.GetAllConsoleAlias.lpExeName); Header = IntFindAliasHeader(Console->Aliases, ApiMessage->Data.GetAllConsoleAlias.lpExeName);
if (!Header) if (!Header)
{ {
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
} }
if (IntGetAllConsoleAliasesLength(Header) > Request->Data.GetAllConsoleAlias.AliasBufferLength) if (IntGetAllConsoleAliasesLength(Header) > ApiMessage->Data.GetAllConsoleAlias.AliasBufferLength)
{ {
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return STATUS_BUFFER_OVERFLOW; return STATUS_BUFFER_OVERFLOW;
} }
if (!Win32CsrValidateBuffer(ProcessData, if (!Win32CsrValidateBuffer(CsrGetClientThread()->Process,
Request->Data.GetAllConsoleAlias.AliasBuffer, ApiMessage->Data.GetAllConsoleAlias.AliasBuffer,
Request->Data.GetAllConsoleAlias.AliasBufferLength, ApiMessage->Data.GetAllConsoleAlias.AliasBufferLength,
1)) 1))
{ {
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
@ -453,10 +453,10 @@ CSR_API(CsrGetAllConsoleAliases)
} }
BytesWritten = IntGetAllConsoleAliases(Header, BytesWritten = IntGetAllConsoleAliases(Header,
Request->Data.GetAllConsoleAlias.AliasBuffer, ApiMessage->Data.GetAllConsoleAlias.AliasBuffer,
Request->Data.GetAllConsoleAlias.AliasBufferLength); ApiMessage->Data.GetAllConsoleAlias.AliasBufferLength);
Request->Data.GetAllConsoleAlias.BytesWritten = BytesWritten; ApiMessage->Data.GetAllConsoleAlias.BytesWritten = BytesWritten;
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -467,18 +467,18 @@ CSR_API(CsrGetAllConsoleAliasesLength)
PALIAS_HEADER Header; PALIAS_HEADER Header;
UINT Length; UINT Length;
if (Request->Data.GetAllConsoleAliasesLength.lpExeName == NULL) if (ApiMessage->Data.GetAllConsoleAliasesLength.lpExeName == NULL)
{ {
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
} }
Request->Status = ConioConsoleFromProcessData(ProcessData, &Console); ApiMessage->Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
if (!NT_SUCCESS(Request->Status)) if (!NT_SUCCESS(ApiMessage->Status))
{ {
return Request->Status; return ApiMessage->Status;
} }
Header = IntFindAliasHeader(Console->Aliases, Request->Data.GetAllConsoleAliasesLength.lpExeName); Header = IntFindAliasHeader(Console->Aliases, ApiMessage->Data.GetAllConsoleAliasesLength.lpExeName);
if (!Header) if (!Header)
{ {
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
@ -486,7 +486,7 @@ CSR_API(CsrGetAllConsoleAliasesLength)
} }
Length = IntGetAllConsoleAliasesLength(Header); Length = IntGetAllConsoleAliasesLength(Header);
Request->Data.GetAllConsoleAliasesLength.Length = Length; ApiMessage->Data.GetAllConsoleAliasesLength.Length = Length;
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -499,29 +499,29 @@ CSR_API(CsrGetConsoleAliasesExes)
DPRINT("CsrGetConsoleAliasesExes entered\n"); DPRINT("CsrGetConsoleAliasesExes entered\n");
Request->Status = ConioConsoleFromProcessData(ProcessData, &Console); ApiMessage->Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
if (!NT_SUCCESS(Request->Status)) if (!NT_SUCCESS(ApiMessage->Status))
{ {
return Request->Status; return ApiMessage->Status;
} }
ExesLength = IntGetConsoleAliasesExesLength(Console->Aliases); ExesLength = IntGetConsoleAliasesExesLength(Console->Aliases);
if (ExesLength > Request->Data.GetConsoleAliasesExes.Length) if (ExesLength > ApiMessage->Data.GetConsoleAliasesExes.Length)
{ {
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return STATUS_BUFFER_OVERFLOW; return STATUS_BUFFER_OVERFLOW;
} }
if (Request->Data.GetConsoleAliasesExes.ExeNames == NULL) if (ApiMessage->Data.GetConsoleAliasesExes.ExeNames == NULL)
{ {
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
} }
if (!Win32CsrValidateBuffer(ProcessData, if (!Win32CsrValidateBuffer(CsrGetClientThread()->Process,
Request->Data.GetConsoleAliasesExes.ExeNames, ApiMessage->Data.GetConsoleAliasesExes.ExeNames,
Request->Data.GetConsoleAliasesExes.Length, ApiMessage->Data.GetConsoleAliasesExes.Length,
1)) 1))
{ {
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
@ -529,10 +529,10 @@ CSR_API(CsrGetConsoleAliasesExes)
} }
BytesWritten = IntGetConsoleAliasesExes(Console->Aliases, BytesWritten = IntGetConsoleAliasesExes(Console->Aliases,
Request->Data.GetConsoleAliasesExes.ExeNames, ApiMessage->Data.GetConsoleAliasesExes.ExeNames,
Request->Data.GetConsoleAliasesExes.Length); ApiMessage->Data.GetConsoleAliasesExes.Length);
Request->Data.GetConsoleAliasesExes.BytesWritten = BytesWritten; ApiMessage->Data.GetConsoleAliasesExes.BytesWritten = BytesWritten;
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -542,11 +542,11 @@ CSR_API(CsrGetConsoleAliasesExesLength)
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
DPRINT("CsrGetConsoleAliasesExesLength entered\n"); DPRINT("CsrGetConsoleAliasesExesLength entered\n");
Request->Status = ConioConsoleFromProcessData(ProcessData, &Console); ApiMessage->Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
if (NT_SUCCESS(Request->Status)) if (NT_SUCCESS(ApiMessage->Status))
{ {
Request->Data.GetConsoleAliasesExesLength.Length = IntGetConsoleAliasesExesLength(Console->Aliases); ApiMessage->Data.GetConsoleAliasesExesLength.Length = IntGetConsoleAliasesExesLength(Console->Aliases);
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
} }
return Request->Status; return ApiMessage->Status;
} }

View file

@ -30,30 +30,31 @@ CSR_API(CsrReadConsole)
PWCHAR UnicodeBuffer; PWCHAR UnicodeBuffer;
ULONG i = 0; ULONG i = 0;
ULONG nNumberOfCharsToRead, CharSize; ULONG nNumberOfCharsToRead, CharSize;
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
NTSTATUS Status; NTSTATUS Status;
DPRINT("CsrReadConsole\n"); DPRINT("CsrReadConsole\n");
CharSize = (Request->Data.ReadConsoleRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR)); CharSize = (ApiMessage->Data.ReadConsoleRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR));
nNumberOfCharsToRead = Request->Data.ReadConsoleRequest.NrCharactersToRead; nNumberOfCharsToRead = ApiMessage->Data.ReadConsoleRequest.NrCharactersToRead;
Buffer = (PCHAR)Request->Data.ReadConsoleRequest.Buffer; Buffer = (PCHAR)ApiMessage->Data.ReadConsoleRequest.Buffer;
UnicodeBuffer = (PWCHAR)Buffer; UnicodeBuffer = (PWCHAR)Buffer;
if (!Win32CsrValidateBuffer(ProcessData, Buffer, nNumberOfCharsToRead, CharSize)) if (!Win32CsrValidateBuffer(ProcessData, Buffer, nNumberOfCharsToRead, CharSize))
return STATUS_ACCESS_VIOLATION; return STATUS_ACCESS_VIOLATION;
if (Request->Data.ReadConsoleRequest.NrCharactersRead * sizeof(WCHAR) > nNumberOfCharsToRead * CharSize) if (ApiMessage->Data.ReadConsoleRequest.NrCharactersRead * sizeof(WCHAR) > nNumberOfCharsToRead * CharSize)
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
Status = ConioLockConsole(ProcessData, Request->Data.ReadConsoleRequest.ConsoleHandle, Status = ConioLockConsole(ProcessData, ApiMessage->Data.ReadConsoleRequest.ConsoleHandle,
&Console, GENERIC_READ); &Console, GENERIC_READ);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
Request->Data.ReadConsoleRequest.EventHandle = ProcessData->ConsoleEvent; ApiMessage->Data.ReadConsoleRequest.EventHandle = ProcessData->ConsoleEvent;
Status = STATUS_PENDING; /* we haven't read anything (yet) */ Status = STATUS_PENDING; /* we haven't read anything (yet) */
if (Console->Mode & ENABLE_LINE_INPUT) if (Console->Mode & ENABLE_LINE_INPUT)
@ -71,8 +72,8 @@ CSR_API(CsrReadConsole)
Console->LineComplete = FALSE; Console->LineComplete = FALSE;
Console->LineUpPressed = FALSE; Console->LineUpPressed = FALSE;
Console->LineInsertToggle = 0; Console->LineInsertToggle = 0;
Console->LineWakeupMask = Request->Data.ReadConsoleRequest.CtrlWakeupMask; Console->LineWakeupMask = ApiMessage->Data.ReadConsoleRequest.CtrlWakeupMask;
Console->LineSize = Request->Data.ReadConsoleRequest.NrCharactersRead; Console->LineSize = ApiMessage->Data.ReadConsoleRequest.NrCharactersRead;
Console->LinePos = Console->LineSize; Console->LinePos = Console->LineSize;
/* pre-filling the buffer is only allowed in the Unicode API, /* pre-filling the buffer is only allowed in the Unicode API,
* so we don't need to worry about conversion */ * so we don't need to worry about conversion */
@ -100,7 +101,7 @@ CSR_API(CsrReadConsole)
&& Input->InputEvent.Event.KeyEvent.bKeyDown) && Input->InputEvent.Event.KeyEvent.bKeyDown)
{ {
LineInputKeyDown(Console, &Input->InputEvent.Event.KeyEvent); LineInputKeyDown(Console, &Input->InputEvent.Event.KeyEvent);
Request->Data.ReadConsoleRequest.ControlKeyState = Input->InputEvent.Event.KeyEvent.dwControlKeyState; ApiMessage->Data.ReadConsoleRequest.ControlKeyState = Input->InputEvent.Event.KeyEvent.dwControlKeyState;
} }
HeapFree(Win32CsrApiHeap, 0, Input); HeapFree(Win32CsrApiHeap, 0, Input);
} }
@ -111,7 +112,7 @@ CSR_API(CsrReadConsole)
while (i < nNumberOfCharsToRead && Console->LinePos != Console->LineSize) while (i < nNumberOfCharsToRead && Console->LinePos != Console->LineSize)
{ {
WCHAR Char = Console->LineBuffer[Console->LinePos++]; WCHAR Char = Console->LineBuffer[Console->LinePos++];
if (Request->Data.ReadConsoleRequest.Unicode) if (ApiMessage->Data.ReadConsoleRequest.Unicode)
UnicodeBuffer[i++] = Char; UnicodeBuffer[i++] = Char;
else else
ConsoleInputUnicodeCharToAnsiChar(Console, &Buffer[i++], &Char); ConsoleInputUnicodeCharToAnsiChar(Console, &Buffer[i++], &Char);
@ -144,7 +145,7 @@ CSR_API(CsrReadConsole)
&& Input->InputEvent.Event.KeyEvent.uChar.UnicodeChar != L'\0') && Input->InputEvent.Event.KeyEvent.uChar.UnicodeChar != L'\0')
{ {
WCHAR Char = Input->InputEvent.Event.KeyEvent.uChar.UnicodeChar; WCHAR Char = Input->InputEvent.Event.KeyEvent.uChar.UnicodeChar;
if (Request->Data.ReadConsoleRequest.Unicode) if (ApiMessage->Data.ReadConsoleRequest.Unicode)
UnicodeBuffer[i++] = Char; UnicodeBuffer[i++] = Char;
else else
ConsoleInputUnicodeCharToAnsiChar(Console, &Buffer[i++], &Char); ConsoleInputUnicodeCharToAnsiChar(Console, &Buffer[i++], &Char);
@ -154,7 +155,7 @@ CSR_API(CsrReadConsole)
} }
} }
done: done:
Request->Data.ReadConsoleRequest.NrCharactersRead = i; ApiMessage->Data.ReadConsoleRequest.NrCharactersRead = i;
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return Status; return Status;
@ -423,6 +424,7 @@ ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode)
CSR_API(CsrReadInputEvent) CSR_API(CsrReadInputEvent)
{ {
PLIST_ENTRY CurrentEntry; PLIST_ENTRY CurrentEntry;
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
NTSTATUS Status; NTSTATUS Status;
BOOLEAN Done = FALSE; BOOLEAN Done = FALSE;
@ -430,9 +432,9 @@ CSR_API(CsrReadInputEvent)
DPRINT("CsrReadInputEvent\n"); DPRINT("CsrReadInputEvent\n");
Request->Data.ReadInputRequest.Event = ProcessData->ConsoleEvent; ApiMessage->Data.ReadInputRequest.Event = ProcessData->ConsoleEvent;
Status = ConioLockConsole(ProcessData, Request->Data.ReadInputRequest.ConsoleHandle, &Console, GENERIC_READ); Status = ConioLockConsole(ProcessData, ApiMessage->Data.ReadInputRequest.ConsoleHandle, &Console, GENERIC_READ);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
@ -447,7 +449,7 @@ CSR_API(CsrReadInputEvent)
if (Done) if (Done)
{ {
Request->Data.ReadInputRequest.MoreEvents = TRUE; ApiMessage->Data.ReadInputRequest.MoreEvents = TRUE;
break; break;
} }
@ -455,10 +457,10 @@ CSR_API(CsrReadInputEvent)
if (!Done) if (!Done)
{ {
Request->Data.ReadInputRequest.Input = Input->InputEvent; ApiMessage->Data.ReadInputRequest.Input = Input->InputEvent;
if (Request->Data.ReadInputRequest.Unicode == FALSE) if (ApiMessage->Data.ReadInputRequest.Unicode == FALSE)
{ {
ConioInputEventToAnsi(Console, &Request->Data.ReadInputRequest.Input); ConioInputEventToAnsi(Console, &ApiMessage->Data.ReadInputRequest.Input);
} }
Done = TRUE; Done = TRUE;
} }
@ -490,8 +492,8 @@ CSR_API(CsrFlushInputBuffer)
DPRINT("CsrFlushInputBuffer\n"); DPRINT("CsrFlushInputBuffer\n");
Status = ConioLockConsole(ProcessData, Status = ConioLockConsole(CsrGetClientThread()->Process,
Request->Data.FlushInputBufferRequest.ConsoleInput, ApiMessage->Data.FlushInputBufferRequest.ConsoleInput,
&Console, &Console,
GENERIC_WRITE); GENERIC_WRITE);
if(! NT_SUCCESS(Status)) if(! NT_SUCCESS(Status))
@ -523,7 +525,7 @@ CSR_API(CsrGetNumberOfConsoleInputEvents)
DPRINT("CsrGetNumberOfConsoleInputEvents\n"); DPRINT("CsrGetNumberOfConsoleInputEvents\n");
Status = ConioLockConsole(ProcessData, Request->Data.GetNumInputEventsRequest.ConsoleHandle, &Console, GENERIC_READ); Status = ConioLockConsole(CsrGetClientThread()->Process, ApiMessage->Data.GetNumInputEventsRequest.ConsoleHandle, &Console, GENERIC_READ);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
@ -541,7 +543,7 @@ CSR_API(CsrGetNumberOfConsoleInputEvents)
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
Request->Data.GetNumInputEventsRequest.NumInputEvents = NumEvents; ApiMessage->Data.GetNumInputEventsRequest.NumInputEvents = NumEvents;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -549,6 +551,7 @@ CSR_API(CsrGetNumberOfConsoleInputEvents)
CSR_API(CsrPeekConsoleInput) CSR_API(CsrPeekConsoleInput)
{ {
NTSTATUS Status; NTSTATUS Status;
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
DWORD Length; DWORD Length;
PLIST_ENTRY CurrentItem; PLIST_ENTRY CurrentItem;
@ -558,14 +561,14 @@ CSR_API(CsrPeekConsoleInput)
DPRINT("CsrPeekConsoleInput\n"); DPRINT("CsrPeekConsoleInput\n");
Status = ConioLockConsole(ProcessData, Request->Data.GetNumInputEventsRequest.ConsoleHandle, &Console, GENERIC_READ); Status = ConioLockConsole(ProcessData, ApiMessage->Data.GetNumInputEventsRequest.ConsoleHandle, &Console, GENERIC_READ);
if(! NT_SUCCESS(Status)) if(! NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
InputRecord = Request->Data.PeekConsoleInputRequest.InputRecord; InputRecord = ApiMessage->Data.PeekConsoleInputRequest.InputRecord;
Length = Request->Data.PeekConsoleInputRequest.Length; Length = ApiMessage->Data.PeekConsoleInputRequest.Length;
if (!Win32CsrValidateBuffer(ProcessData, InputRecord, Length, sizeof(INPUT_RECORD))) if (!Win32CsrValidateBuffer(ProcessData, InputRecord, Length, sizeof(INPUT_RECORD)))
{ {
@ -586,7 +589,7 @@ CSR_API(CsrPeekConsoleInput)
++NumItems; ++NumItems;
*InputRecord = Item->InputEvent; *InputRecord = Item->InputEvent;
if (Request->Data.PeekConsoleInputRequest.Unicode == FALSE) if (ApiMessage->Data.PeekConsoleInputRequest.Unicode == FALSE)
{ {
ConioInputEventToAnsi(Console, InputRecord); ConioInputEventToAnsi(Console, InputRecord);
} }
@ -598,7 +601,7 @@ CSR_API(CsrPeekConsoleInput)
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
Request->Data.PeekConsoleInputRequest.Length = NumItems; ApiMessage->Data.PeekConsoleInputRequest.Length = NumItems;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -606,6 +609,7 @@ CSR_API(CsrPeekConsoleInput)
CSR_API(CsrWriteConsoleInput) CSR_API(CsrWriteConsoleInput)
{ {
PINPUT_RECORD InputRecord; PINPUT_RECORD InputRecord;
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
NTSTATUS Status; NTSTATUS Status;
DWORD Length; DWORD Length;
@ -613,14 +617,14 @@ CSR_API(CsrWriteConsoleInput)
DPRINT("CsrWriteConsoleInput\n"); DPRINT("CsrWriteConsoleInput\n");
Status = ConioLockConsole(ProcessData, Request->Data.WriteConsoleInputRequest.ConsoleHandle, &Console, GENERIC_WRITE); Status = ConioLockConsole(ProcessData, ApiMessage->Data.WriteConsoleInputRequest.ConsoleHandle, &Console, GENERIC_WRITE);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
InputRecord = Request->Data.WriteConsoleInputRequest.InputRecord; InputRecord = ApiMessage->Data.WriteConsoleInputRequest.InputRecord;
Length = Request->Data.WriteConsoleInputRequest.Length; Length = ApiMessage->Data.WriteConsoleInputRequest.Length;
if (!Win32CsrValidateBuffer(ProcessData, InputRecord, Length, sizeof(INPUT_RECORD))) if (!Win32CsrValidateBuffer(ProcessData, InputRecord, Length, sizeof(INPUT_RECORD)))
{ {
@ -630,7 +634,7 @@ CSR_API(CsrWriteConsoleInput)
for (i = 0; i < Length && NT_SUCCESS(Status); i++) for (i = 0; i < Length && NT_SUCCESS(Status); i++)
{ {
if (!Request->Data.WriteConsoleInputRequest.Unicode && if (!ApiMessage->Data.WriteConsoleInputRequest.Unicode &&
InputRecord->EventType == KEY_EVENT) InputRecord->EventType == KEY_EVENT)
{ {
CHAR AsciiChar = InputRecord->Event.KeyEvent.uChar.AsciiChar; CHAR AsciiChar = InputRecord->Event.KeyEvent.uChar.AsciiChar;
@ -643,7 +647,7 @@ CSR_API(CsrWriteConsoleInput)
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
Request->Data.WriteConsoleInputRequest.Length = i; ApiMessage->Data.WriteConsoleInputRequest.Length = i;
return Status; return Status;
} }

View file

@ -359,22 +359,23 @@ CSR_API(CsrWriteConsole)
NTSTATUS Status; NTSTATUS Status;
PCHAR Buffer; PCHAR Buffer;
PCSRSS_SCREEN_BUFFER Buff; PCSRSS_SCREEN_BUFFER Buff;
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
DWORD Written = 0; DWORD Written = 0;
ULONG Length; ULONG Length;
ULONG CharSize = (Request->Data.WriteConsoleRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR)); ULONG CharSize = (ApiMessage->Data.WriteConsoleRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR));
DPRINT("CsrWriteConsole\n"); DPRINT("CsrWriteConsole\n");
if (Request->Header.u1.s1.TotalLength if (ApiMessage->Header.u1.s1.TotalLength
< CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE) < CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE)
+ (Request->Data.WriteConsoleRequest.NrCharactersToWrite * CharSize)) + (ApiMessage->Data.WriteConsoleRequest.NrCharactersToWrite * CharSize))
{ {
DPRINT1("Invalid request size\n"); DPRINT1("Invalid ApiMessage size\n");
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
} }
Status = ConioLockScreenBuffer(ProcessData, Request->Data.WriteConsoleRequest.ConsoleHandle, &Buff, GENERIC_WRITE); Status = ConioLockScreenBuffer(ProcessData, ApiMessage->Data.WriteConsoleRequest.ConsoleHandle, &Buff, GENERIC_WRITE);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
@ -384,24 +385,24 @@ CSR_API(CsrWriteConsole)
if (Console->UnpauseEvent) if (Console->UnpauseEvent)
{ {
Status = NtDuplicateObject(GetCurrentProcess(), Console->UnpauseEvent, Status = NtDuplicateObject(GetCurrentProcess(), Console->UnpauseEvent,
ProcessData->ProcessHandle, &Request->Data.WriteConsoleRequest.UnpauseEvent, ProcessData->ProcessHandle, &ApiMessage->Data.WriteConsoleRequest.UnpauseEvent,
SYNCHRONIZE, 0, 0); SYNCHRONIZE, 0, 0);
ConioUnlockScreenBuffer(Buff); ConioUnlockScreenBuffer(Buff);
return NT_SUCCESS(Status) ? STATUS_PENDING : Status; return NT_SUCCESS(Status) ? STATUS_PENDING : Status;
} }
if(Request->Data.WriteConsoleRequest.Unicode) if(ApiMessage->Data.WriteConsoleRequest.Unicode)
{ {
Length = WideCharToMultiByte(Console->OutputCodePage, 0, Length = WideCharToMultiByte(Console->OutputCodePage, 0,
(PWCHAR)Request->Data.WriteConsoleRequest.Buffer, (PWCHAR)ApiMessage->Data.WriteConsoleRequest.Buffer,
Request->Data.WriteConsoleRequest.NrCharactersToWrite, ApiMessage->Data.WriteConsoleRequest.NrCharactersToWrite,
NULL, 0, NULL, NULL); NULL, 0, NULL, NULL);
Buffer = RtlAllocateHeap(GetProcessHeap(), 0, Length); Buffer = RtlAllocateHeap(GetProcessHeap(), 0, Length);
if (Buffer) if (Buffer)
{ {
WideCharToMultiByte(Console->OutputCodePage, 0, WideCharToMultiByte(Console->OutputCodePage, 0,
(PWCHAR)Request->Data.WriteConsoleRequest.Buffer, (PWCHAR)ApiMessage->Data.WriteConsoleRequest.Buffer,
Request->Data.WriteConsoleRequest.NrCharactersToWrite, ApiMessage->Data.WriteConsoleRequest.NrCharactersToWrite,
Buffer, Length, NULL, NULL); Buffer, Length, NULL, NULL);
} }
else else
@ -411,7 +412,7 @@ CSR_API(CsrWriteConsole)
} }
else else
{ {
Buffer = (PCHAR)Request->Data.WriteConsoleRequest.Buffer; Buffer = (PCHAR)ApiMessage->Data.WriteConsoleRequest.Buffer;
} }
if (Buffer) if (Buffer)
@ -419,20 +420,20 @@ CSR_API(CsrWriteConsole)
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
Status = ConioWriteConsole(Console, Buff, Buffer, Status = ConioWriteConsole(Console, Buff, Buffer,
Request->Data.WriteConsoleRequest.NrCharactersToWrite, TRUE); ApiMessage->Data.WriteConsoleRequest.NrCharactersToWrite, TRUE);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
Written = Request->Data.WriteConsoleRequest.NrCharactersToWrite; Written = ApiMessage->Data.WriteConsoleRequest.NrCharactersToWrite;
} }
} }
if (Request->Data.WriteConsoleRequest.Unicode) if (ApiMessage->Data.WriteConsoleRequest.Unicode)
{ {
RtlFreeHeap(GetProcessHeap(), 0, Buffer); RtlFreeHeap(GetProcessHeap(), 0, Buffer);
} }
} }
ConioUnlockScreenBuffer(Buff); ConioUnlockScreenBuffer(Buff);
Request->Data.WriteConsoleRequest.NrCharactersWritten = Written; ApiMessage->Data.WriteConsoleRequest.NrCharactersWritten = Written;
return Status; return Status;
} }
@ -477,13 +478,13 @@ CSR_API(CsrGetScreenBufferInfo)
DPRINT("CsrGetScreenBufferInfo\n"); DPRINT("CsrGetScreenBufferInfo\n");
Status = ConioLockScreenBuffer(ProcessData, Request->Data.ScreenBufferInfoRequest.ConsoleHandle, &Buff, GENERIC_READ); Status = ConioLockScreenBuffer(CsrGetClientThread()->Process, ApiMessage->Data.ScreenBufferInfoRequest.ConsoleHandle, &Buff, GENERIC_READ);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
Console = Buff->Header.Console; Console = Buff->Header.Console;
pInfo = &Request->Data.ScreenBufferInfoRequest.Info; pInfo = &ApiMessage->Data.ScreenBufferInfoRequest.Info;
pInfo->dwSize.X = Buff->MaxX; pInfo->dwSize.X = Buff->MaxX;
pInfo->dwSize.Y = Buff->MaxY; pInfo->dwSize.Y = Buff->MaxY;
pInfo->dwCursorPosition.X = Buff->CurrentX; pInfo->dwCursorPosition.X = Buff->CurrentX;
@ -510,15 +511,15 @@ CSR_API(CsrSetCursor)
DPRINT("CsrSetCursor\n"); DPRINT("CsrSetCursor\n");
Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorRequest.ConsoleHandle, &Buff, GENERIC_WRITE); Status = ConioLockScreenBuffer(CsrGetClientThread()->Process, ApiMessage->Data.SetCursorRequest.ConsoleHandle, &Buff, GENERIC_WRITE);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
Console = Buff->Header.Console; Console = Buff->Header.Console;
NewCursorX = Request->Data.SetCursorRequest.Position.X; NewCursorX = ApiMessage->Data.SetCursorRequest.Position.X;
NewCursorY = Request->Data.SetCursorRequest.Position.Y; NewCursorY = ApiMessage->Data.SetCursorRequest.Position.Y;
if (NewCursorX < 0 || NewCursorX >= Buff->MaxX || if (NewCursorX < 0 || NewCursorX >= Buff->MaxX ||
NewCursorY < 0 || NewCursorY >= Buff->MaxY) NewCursorY < 0 || NewCursorY >= Buff->MaxY)
{ {
@ -582,35 +583,35 @@ CSR_API(CsrWriteConsoleOutputChar)
DPRINT("CsrWriteConsoleOutputChar\n"); DPRINT("CsrWriteConsoleOutputChar\n");
CharSize = (Request->Data.WriteConsoleOutputCharRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR)); CharSize = (ApiMessage->Data.WriteConsoleOutputCharRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR));
if (Request->Header.u1.s1.TotalLength if (ApiMessage->Header.u1.s1.TotalLength
< CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR) < CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR)
+ (Request->Data.WriteConsoleOutputCharRequest.Length * CharSize)) + (ApiMessage->Data.WriteConsoleOutputCharRequest.Length * CharSize))
{ {
DPRINT1("Invalid request size\n"); DPRINT1("Invalid ApiMessage size\n");
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
} }
Status = ConioLockScreenBuffer(ProcessData, Status = ConioLockScreenBuffer(CsrGetClientThread()->Process,
Request->Data.WriteConsoleOutputCharRequest.ConsoleHandle, ApiMessage->Data.WriteConsoleOutputCharRequest.ConsoleHandle,
&Buff, &Buff,
GENERIC_WRITE); GENERIC_WRITE);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
Console = Buff->Header.Console; Console = Buff->Header.Console;
if(Request->Data.WriteConsoleOutputCharRequest.Unicode) if(ApiMessage->Data.WriteConsoleOutputCharRequest.Unicode)
{ {
Length = WideCharToMultiByte(Console->OutputCodePage, 0, Length = WideCharToMultiByte(Console->OutputCodePage, 0,
(PWCHAR)Request->Data.WriteConsoleOutputCharRequest.String, (PWCHAR)ApiMessage->Data.WriteConsoleOutputCharRequest.String,
Request->Data.WriteConsoleOutputCharRequest.Length, ApiMessage->Data.WriteConsoleOutputCharRequest.Length,
NULL, 0, NULL, NULL); NULL, 0, NULL, NULL);
tmpString = String = RtlAllocateHeap(GetProcessHeap(), 0, Length); tmpString = String = RtlAllocateHeap(GetProcessHeap(), 0, Length);
if (String) if (String)
{ {
WideCharToMultiByte(Console->OutputCodePage, 0, WideCharToMultiByte(Console->OutputCodePage, 0,
(PWCHAR)Request->Data.WriteConsoleOutputCharRequest.String, (PWCHAR)ApiMessage->Data.WriteConsoleOutputCharRequest.String,
Request->Data.WriteConsoleOutputCharRequest.Length, ApiMessage->Data.WriteConsoleOutputCharRequest.Length,
String, Length, NULL, NULL); String, Length, NULL, NULL);
} }
else else
@ -620,16 +621,16 @@ CSR_API(CsrWriteConsoleOutputChar)
} }
else else
{ {
String = (PCHAR)Request->Data.WriteConsoleOutputCharRequest.String; String = (PCHAR)ApiMessage->Data.WriteConsoleOutputCharRequest.String;
} }
if (String) if (String)
{ {
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
X = Request->Data.WriteConsoleOutputCharRequest.Coord.X; X = ApiMessage->Data.WriteConsoleOutputCharRequest.Coord.X;
Y = (Request->Data.WriteConsoleOutputCharRequest.Coord.Y + Buff->VirtualY) % Buff->MaxY; Y = (ApiMessage->Data.WriteConsoleOutputCharRequest.Coord.Y + Buff->VirtualY) % Buff->MaxY;
Length = Request->Data.WriteConsoleOutputCharRequest.Length; Length = ApiMessage->Data.WriteConsoleOutputCharRequest.Length;
Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X)]; Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X)];
while (Length--) while (Length--)
{ {
@ -648,23 +649,23 @@ CSR_API(CsrWriteConsoleOutputChar)
} }
if (Buff == Console->ActiveBuffer) if (Buff == Console->ActiveBuffer)
{ {
ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.WriteConsoleOutputCharRequest.Coord, ConioComputeUpdateRect(Buff, &UpdateRect, &ApiMessage->Data.WriteConsoleOutputCharRequest.Coord,
Request->Data.WriteConsoleOutputCharRequest.Length); ApiMessage->Data.WriteConsoleOutputCharRequest.Length);
ConioDrawRegion(Console, &UpdateRect); ConioDrawRegion(Console, &UpdateRect);
} }
Request->Data.WriteConsoleOutputCharRequest.EndCoord.X = X; ApiMessage->Data.WriteConsoleOutputCharRequest.EndCoord.X = X;
Request->Data.WriteConsoleOutputCharRequest.EndCoord.Y = (Y + Buff->MaxY - Buff->VirtualY) % Buff->MaxY; ApiMessage->Data.WriteConsoleOutputCharRequest.EndCoord.Y = (Y + Buff->MaxY - Buff->VirtualY) % Buff->MaxY;
} }
if (Request->Data.WriteConsoleRequest.Unicode) if (ApiMessage->Data.WriteConsoleRequest.Unicode)
{ {
RtlFreeHeap(GetProcessHeap(), 0, tmpString); RtlFreeHeap(GetProcessHeap(), 0, tmpString);
} }
} }
ConioUnlockScreenBuffer(Buff); ConioUnlockScreenBuffer(Buff);
} }
Request->Data.WriteConsoleOutputCharRequest.NrCharactersWritten = Written; ApiMessage->Data.WriteConsoleOutputCharRequest.NrCharactersWritten = Written;
return Status; return Status;
} }
@ -680,21 +681,21 @@ CSR_API(CsrFillOutputChar)
DPRINT("CsrFillOutputChar\n"); DPRINT("CsrFillOutputChar\n");
Status = ConioLockScreenBuffer(ProcessData, Request->Data.FillOutputRequest.ConsoleHandle, &Buff, GENERIC_WRITE); Status = ConioLockScreenBuffer(CsrGetClientThread()->Process, ApiMessage->Data.FillOutputRequest.ConsoleHandle, &Buff, GENERIC_WRITE);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
Console = Buff->Header.Console; Console = Buff->Header.Console;
X = Request->Data.FillOutputRequest.Position.X; X = ApiMessage->Data.FillOutputRequest.Position.X;
Y = (Request->Data.FillOutputRequest.Position.Y + Buff->VirtualY) % Buff->MaxY; Y = (ApiMessage->Data.FillOutputRequest.Position.Y + Buff->VirtualY) % Buff->MaxY;
Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X)]; Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X)];
if(Request->Data.FillOutputRequest.Unicode) if(ApiMessage->Data.FillOutputRequest.Unicode)
ConsoleUnicodeCharToAnsiChar(Console, &Char, &Request->Data.FillOutputRequest.Char.UnicodeChar); ConsoleUnicodeCharToAnsiChar(Console, &Char, &ApiMessage->Data.FillOutputRequest.Char.UnicodeChar);
else else
Char = Request->Data.FillOutputRequest.Char.AsciiChar; Char = ApiMessage->Data.FillOutputRequest.Char.AsciiChar;
Length = Request->Data.FillOutputRequest.Length; Length = ApiMessage->Data.FillOutputRequest.Length;
while (Length--) while (Length--)
{ {
*Buffer = Char; *Buffer = Char;
@ -713,14 +714,14 @@ CSR_API(CsrFillOutputChar)
if (Buff == Console->ActiveBuffer) if (Buff == Console->ActiveBuffer)
{ {
ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.FillOutputRequest.Position, ConioComputeUpdateRect(Buff, &UpdateRect, &ApiMessage->Data.FillOutputRequest.Position,
Request->Data.FillOutputRequest.Length); ApiMessage->Data.FillOutputRequest.Length);
ConioDrawRegion(Console, &UpdateRect); ConioDrawRegion(Console, &UpdateRect);
} }
ConioUnlockScreenBuffer(Buff); ConioUnlockScreenBuffer(Buff);
Length = Request->Data.FillOutputRequest.Length; Length = ApiMessage->Data.FillOutputRequest.Length;
Request->Data.FillOutputRequest.NrCharactersWritten = Length; ApiMessage->Data.FillOutputRequest.NrCharactersWritten = Length;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -736,16 +737,16 @@ CSR_API(CsrWriteConsoleOutputAttrib)
DPRINT("CsrWriteConsoleOutputAttrib\n"); DPRINT("CsrWriteConsoleOutputAttrib\n");
if (Request->Header.u1.s1.TotalLength if (ApiMessage->Header.u1.s1.TotalLength
< CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB) < CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB)
+ Request->Data.WriteConsoleOutputAttribRequest.Length * sizeof(WORD)) + ApiMessage->Data.WriteConsoleOutputAttribRequest.Length * sizeof(WORD))
{ {
DPRINT1("Invalid request size\n"); DPRINT1("Invalid ApiMessage size\n");
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
} }
Status = ConioLockScreenBuffer(ProcessData, Status = ConioLockScreenBuffer(CsrGetClientThread()->Process,
Request->Data.WriteConsoleOutputAttribRequest.ConsoleHandle, ApiMessage->Data.WriteConsoleOutputAttribRequest.ConsoleHandle,
&Buff, &Buff,
GENERIC_WRITE); GENERIC_WRITE);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
@ -754,11 +755,11 @@ CSR_API(CsrWriteConsoleOutputAttrib)
} }
Console = Buff->Header.Console; Console = Buff->Header.Console;
X = Request->Data.WriteConsoleOutputAttribRequest.Coord.X; X = ApiMessage->Data.WriteConsoleOutputAttribRequest.Coord.X;
Y = (Request->Data.WriteConsoleOutputAttribRequest.Coord.Y + Buff->VirtualY) % Buff->MaxY; Y = (ApiMessage->Data.WriteConsoleOutputAttribRequest.Coord.Y + Buff->VirtualY) % Buff->MaxY;
Length = Request->Data.WriteConsoleOutputAttribRequest.Length; Length = ApiMessage->Data.WriteConsoleOutputAttribRequest.Length;
Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X) + 1]; Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X) + 1];
Attribute = Request->Data.WriteConsoleOutputAttribRequest.Attribute; Attribute = ApiMessage->Data.WriteConsoleOutputAttribRequest.Attribute;
while (Length--) while (Length--)
{ {
*Buffer = (UCHAR)(*Attribute++); *Buffer = (UCHAR)(*Attribute++);
@ -776,13 +777,13 @@ CSR_API(CsrWriteConsoleOutputAttrib)
if (Buff == Console->ActiveBuffer) if (Buff == Console->ActiveBuffer)
{ {
ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.WriteConsoleOutputAttribRequest.Coord, ConioComputeUpdateRect(Buff, &UpdateRect, &ApiMessage->Data.WriteConsoleOutputAttribRequest.Coord,
Request->Data.WriteConsoleOutputAttribRequest.Length); ApiMessage->Data.WriteConsoleOutputAttribRequest.Length);
ConioDrawRegion(Console, &UpdateRect); ConioDrawRegion(Console, &UpdateRect);
} }
Request->Data.WriteConsoleOutputAttribRequest.EndCoord.X = X; ApiMessage->Data.WriteConsoleOutputAttribRequest.EndCoord.X = X;
Request->Data.WriteConsoleOutputAttribRequest.EndCoord.Y = (Y + Buff->MaxY - Buff->VirtualY) % Buff->MaxY; ApiMessage->Data.WriteConsoleOutputAttribRequest.EndCoord.Y = (Y + Buff->MaxY - Buff->VirtualY) % Buff->MaxY;
ConioUnlockScreenBuffer(Buff); ConioUnlockScreenBuffer(Buff);
@ -801,17 +802,17 @@ CSR_API(CsrFillOutputAttrib)
DPRINT("CsrFillOutputAttrib\n"); DPRINT("CsrFillOutputAttrib\n");
Status = ConioLockScreenBuffer(ProcessData, Request->Data.FillOutputAttribRequest.ConsoleHandle, &Buff, GENERIC_WRITE); Status = ConioLockScreenBuffer(CsrGetClientThread()->Process, ApiMessage->Data.FillOutputAttribRequest.ConsoleHandle, &Buff, GENERIC_WRITE);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
Console = Buff->Header.Console; Console = Buff->Header.Console;
X = Request->Data.FillOutputAttribRequest.Coord.X; X = ApiMessage->Data.FillOutputAttribRequest.Coord.X;
Y = (Request->Data.FillOutputAttribRequest.Coord.Y + Buff->VirtualY) % Buff->MaxY; Y = (ApiMessage->Data.FillOutputAttribRequest.Coord.Y + Buff->VirtualY) % Buff->MaxY;
Length = Request->Data.FillOutputAttribRequest.Length; Length = ApiMessage->Data.FillOutputAttribRequest.Length;
Attr = Request->Data.FillOutputAttribRequest.Attribute; Attr = ApiMessage->Data.FillOutputAttribRequest.Attribute;
Buffer = &Buff->Buffer[(Y * Buff->MaxX * 2) + (X * 2) + 1]; Buffer = &Buff->Buffer[(Y * Buff->MaxX * 2) + (X * 2) + 1];
while (Length--) while (Length--)
{ {
@ -830,8 +831,8 @@ CSR_API(CsrFillOutputAttrib)
if (Buff == Console->ActiveBuffer) if (Buff == Console->ActiveBuffer)
{ {
ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.FillOutputAttribRequest.Coord, ConioComputeUpdateRect(Buff, &UpdateRect, &ApiMessage->Data.FillOutputAttribRequest.Coord,
Request->Data.FillOutputAttribRequest.Length); ApiMessage->Data.FillOutputAttribRequest.Length);
ConioDrawRegion(Console, &UpdateRect); ConioDrawRegion(Console, &UpdateRect);
} }
@ -857,13 +858,13 @@ CSR_API(CsrGetCursorInfo)
DPRINT("CsrGetCursorInfo\n"); DPRINT("CsrGetCursorInfo\n");
Status = ConioLockScreenBuffer(ProcessData, Request->Data.GetCursorInfoRequest.ConsoleHandle, &Buff, GENERIC_READ); Status = ConioLockScreenBuffer(CsrGetClientThread()->Process, ApiMessage->Data.GetCursorInfoRequest.ConsoleHandle, &Buff, GENERIC_READ);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
Request->Data.GetCursorInfoRequest.Info.bVisible = Buff->CursorInfo.bVisible; ApiMessage->Data.GetCursorInfoRequest.Info.bVisible = Buff->CursorInfo.bVisible;
Request->Data.GetCursorInfoRequest.Info.dwSize = Buff->CursorInfo.dwSize; ApiMessage->Data.GetCursorInfoRequest.Info.dwSize = Buff->CursorInfo.dwSize;
ConioUnlockScreenBuffer(Buff); ConioUnlockScreenBuffer(Buff);
return STATUS_SUCCESS; return STATUS_SUCCESS;
@ -879,15 +880,15 @@ CSR_API(CsrSetCursorInfo)
DPRINT("CsrSetCursorInfo\n"); DPRINT("CsrSetCursorInfo\n");
Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorInfoRequest.ConsoleHandle, &Buff, GENERIC_WRITE); Status = ConioLockScreenBuffer(CsrGetClientThread()->Process, ApiMessage->Data.SetCursorInfoRequest.ConsoleHandle, &Buff, GENERIC_WRITE);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
Console = Buff->Header.Console; Console = Buff->Header.Console;
Size = Request->Data.SetCursorInfoRequest.Info.dwSize; Size = ApiMessage->Data.SetCursorInfoRequest.Info.dwSize;
Visible = Request->Data.SetCursorInfoRequest.Info.bVisible; Visible = ApiMessage->Data.SetCursorInfoRequest.Info.bVisible;
if (Size < 1) if (Size < 1)
{ {
Size = 1; Size = 1;
@ -923,14 +924,14 @@ CSR_API(CsrSetTextAttrib)
DPRINT("CsrSetTextAttrib\n"); DPRINT("CsrSetTextAttrib\n");
Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorRequest.ConsoleHandle, &Buff, GENERIC_WRITE); Status = ConioLockScreenBuffer(CsrGetClientThread()->Process, ApiMessage->Data.SetCursorRequest.ConsoleHandle, &Buff, GENERIC_WRITE);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
Console = Buff->Header.Console; Console = Buff->Header.Console;
Buff->DefaultAttrib = Request->Data.SetAttribRequest.Attrib; Buff->DefaultAttrib = ApiMessage->Data.SetAttribRequest.Attrib;
if (Buff == Console->ActiveBuffer) if (Buff == Console->ActiveBuffer)
{ {
if (! ConioUpdateScreenInfo(Console, Buff)) if (! ConioUpdateScreenInfo(Console, Buff))
@ -947,6 +948,7 @@ CSR_API(CsrSetTextAttrib)
CSR_API(CsrCreateScreenBuffer) CSR_API(CsrCreateScreenBuffer)
{ {
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
PCSRSS_SCREEN_BUFFER Buff; PCSRSS_SCREEN_BUFFER Buff;
NTSTATUS Status; NTSTATUS Status;
@ -991,11 +993,11 @@ CSR_API(CsrCreateScreenBuffer)
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
Status = Win32CsrInsertObject(ProcessData, Status = Win32CsrInsertObject(ProcessData,
&Request->Data.CreateScreenBufferRequest.OutputHandle, &ApiMessage->Data.CreateScreenBufferRequest.OutputHandle,
&Buff->Header, &Buff->Header,
Request->Data.CreateScreenBufferRequest.Access, ApiMessage->Data.CreateScreenBufferRequest.Access,
Request->Data.CreateScreenBufferRequest.Inheritable, ApiMessage->Data.CreateScreenBufferRequest.Inheritable,
Request->Data.CreateScreenBufferRequest.ShareMode); ApiMessage->Data.CreateScreenBufferRequest.ShareMode);
} }
} }
else else
@ -1016,7 +1018,7 @@ CSR_API(CsrSetScreenBuffer)
DPRINT("CsrSetScreenBuffer\n"); DPRINT("CsrSetScreenBuffer\n");
Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetScreenBufferRequest.OutputHandle, &Buff, GENERIC_WRITE); Status = ConioLockScreenBuffer(CsrGetClientThread()->Process, ApiMessage->Data.SetScreenBufferRequest.OutputHandle, &Buff, GENERIC_WRITE);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
@ -1047,6 +1049,7 @@ CSR_API(CsrSetScreenBuffer)
CSR_API(CsrWriteConsoleOutput) CSR_API(CsrWriteConsoleOutput)
{ {
SHORT i, X, Y, SizeX, SizeY; SHORT i, X, Y, SizeX, SizeY;
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
PCSRSS_SCREEN_BUFFER Buff; PCSRSS_SCREEN_BUFFER Buff;
SMALL_RECT ScreenBuffer; SMALL_RECT ScreenBuffer;
@ -1061,7 +1064,7 @@ CSR_API(CsrWriteConsoleOutput)
DPRINT("CsrWriteConsoleOutput\n"); DPRINT("CsrWriteConsoleOutput\n");
Status = ConioLockScreenBuffer(ProcessData, Status = ConioLockScreenBuffer(ProcessData,
Request->Data.WriteConsoleOutputRequest.ConsoleHandle, ApiMessage->Data.WriteConsoleOutputRequest.ConsoleHandle,
&Buff, &Buff,
GENERIC_WRITE); GENERIC_WRITE);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
@ -1070,16 +1073,16 @@ CSR_API(CsrWriteConsoleOutput)
} }
Console = Buff->Header.Console; Console = Buff->Header.Console;
BufferSize = Request->Data.WriteConsoleOutputRequest.BufferSize; BufferSize = ApiMessage->Data.WriteConsoleOutputRequest.BufferSize;
BufferCoord = Request->Data.WriteConsoleOutputRequest.BufferCoord; BufferCoord = ApiMessage->Data.WriteConsoleOutputRequest.BufferCoord;
CharInfo = Request->Data.WriteConsoleOutputRequest.CharInfo; CharInfo = ApiMessage->Data.WriteConsoleOutputRequest.CharInfo;
if (!Win32CsrValidateBuffer(ProcessData, CharInfo, if (!Win32CsrValidateBuffer(ProcessData, CharInfo,
BufferSize.X * BufferSize.Y, sizeof(CHAR_INFO))) BufferSize.X * BufferSize.Y, sizeof(CHAR_INFO)))
{ {
ConioUnlockScreenBuffer(Buff); ConioUnlockScreenBuffer(Buff);
return STATUS_ACCESS_VIOLATION; return STATUS_ACCESS_VIOLATION;
} }
WriteRegion = Request->Data.WriteConsoleOutputRequest.WriteRegion; WriteRegion = ApiMessage->Data.WriteConsoleOutputRequest.WriteRegion;
SizeY = min(BufferSize.Y - BufferCoord.Y, ConioRectHeight(&WriteRegion)); SizeY = min(BufferSize.Y - BufferCoord.Y, ConioRectHeight(&WriteRegion));
SizeX = min(BufferSize.X - BufferCoord.X, ConioRectWidth(&WriteRegion)); SizeX = min(BufferSize.X - BufferCoord.X, ConioRectWidth(&WriteRegion));
@ -1104,7 +1107,7 @@ CSR_API(CsrWriteConsoleOutput)
for (X = WriteRegion.Left; X <= WriteRegion.Right; X++) for (X = WriteRegion.Left; X <= WriteRegion.Right; X++)
{ {
CHAR AsciiChar; CHAR AsciiChar;
if (Request->Data.WriteConsoleOutputRequest.Unicode) if (ApiMessage->Data.WriteConsoleOutputRequest.Unicode)
{ {
ConsoleUnicodeCharToAnsiChar(Console, &AsciiChar, &CurCharInfo->Char.UnicodeChar); ConsoleUnicodeCharToAnsiChar(Console, &AsciiChar, &CurCharInfo->Char.UnicodeChar);
} }
@ -1122,10 +1125,10 @@ CSR_API(CsrWriteConsoleOutput)
ConioUnlockScreenBuffer(Buff); ConioUnlockScreenBuffer(Buff);
Request->Data.WriteConsoleOutputRequest.WriteRegion.Right = WriteRegion.Left + SizeX - 1; ApiMessage->Data.WriteConsoleOutputRequest.WriteRegion.Right = WriteRegion.Left + SizeX - 1;
Request->Data.WriteConsoleOutputRequest.WriteRegion.Bottom = WriteRegion.Top + SizeY - 1; ApiMessage->Data.WriteConsoleOutputRequest.WriteRegion.Bottom = WriteRegion.Top + SizeY - 1;
Request->Data.WriteConsoleOutputRequest.WriteRegion.Left = WriteRegion.Left; ApiMessage->Data.WriteConsoleOutputRequest.WriteRegion.Left = WriteRegion.Left;
Request->Data.WriteConsoleOutputRequest.WriteRegion.Top = WriteRegion.Top; ApiMessage->Data.WriteConsoleOutputRequest.WriteRegion.Top = WriteRegion.Top;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -1149,19 +1152,19 @@ CSR_API(CsrScrollConsoleScreenBuffer)
DPRINT("CsrScrollConsoleScreenBuffer\n"); DPRINT("CsrScrollConsoleScreenBuffer\n");
ConsoleHandle = Request->Data.ScrollConsoleScreenBufferRequest.ConsoleHandle; ConsoleHandle = ApiMessage->Data.ScrollConsoleScreenBufferRequest.ConsoleHandle;
UseClipRectangle = Request->Data.ScrollConsoleScreenBufferRequest.UseClipRectangle; UseClipRectangle = ApiMessage->Data.ScrollConsoleScreenBufferRequest.UseClipRectangle;
DestinationOrigin = Request->Data.ScrollConsoleScreenBufferRequest.DestinationOrigin; DestinationOrigin = ApiMessage->Data.ScrollConsoleScreenBufferRequest.DestinationOrigin;
Fill = Request->Data.ScrollConsoleScreenBufferRequest.Fill; Fill = ApiMessage->Data.ScrollConsoleScreenBufferRequest.Fill;
Status = ConioLockScreenBuffer(ProcessData, ConsoleHandle, &Buff, GENERIC_WRITE); Status = ConioLockScreenBuffer(CsrGetClientThread()->Process, ConsoleHandle, &Buff, GENERIC_WRITE);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
Console = Buff->Header.Console; Console = Buff->Header.Console;
ScrollRectangle = Request->Data.ScrollConsoleScreenBufferRequest.ScrollRectangle; ScrollRectangle = ApiMessage->Data.ScrollConsoleScreenBufferRequest.ScrollRectangle;
/* Make sure source rectangle is inside the screen buffer */ /* Make sure source rectangle is inside the screen buffer */
ConioInitRect(&ScreenBuffer, 0, 0, Buff->MaxY - 1, Buff->MaxX - 1); ConioInitRect(&ScreenBuffer, 0, 0, Buff->MaxY - 1, Buff->MaxX - 1);
@ -1183,7 +1186,7 @@ CSR_API(CsrScrollConsoleScreenBuffer)
if (UseClipRectangle) if (UseClipRectangle)
{ {
ClipRectangle = Request->Data.ScrollConsoleScreenBufferRequest.ClipRectangle; ClipRectangle = ApiMessage->Data.ScrollConsoleScreenBufferRequest.ClipRectangle;
if (!ConioGetIntersection(&ClipRectangle, &ClipRectangle, &ScreenBuffer)) if (!ConioGetIntersection(&ClipRectangle, &ClipRectangle, &ScreenBuffer))
{ {
ConioUnlockScreenBuffer(Buff); ConioUnlockScreenBuffer(Buff);
@ -1201,7 +1204,7 @@ CSR_API(CsrScrollConsoleScreenBuffer)
DestinationOrigin.Y + ConioRectHeight(&SrcRegion) - 1, DestinationOrigin.Y + ConioRectHeight(&SrcRegion) - 1,
DestinationOrigin.X + ConioRectWidth(&SrcRegion) - 1); DestinationOrigin.X + ConioRectWidth(&SrcRegion) - 1);
if (Request->Data.ScrollConsoleScreenBufferRequest.Unicode) if (ApiMessage->Data.ScrollConsoleScreenBufferRequest.Unicode)
ConsoleUnicodeCharToAnsiChar(Console, &FillChar, &Fill.Char.UnicodeChar); ConsoleUnicodeCharToAnsiChar(Console, &FillChar, &Fill.Char.UnicodeChar);
else else
FillChar = Fill.Char.AsciiChar; FillChar = Fill.Char.AsciiChar;
@ -1236,25 +1239,25 @@ CSR_API(CsrReadConsoleOutputChar)
DPRINT("CsrReadConsoleOutputChar\n"); DPRINT("CsrReadConsoleOutputChar\n");
ReadBuffer = Request->Data.ReadConsoleOutputCharRequest.String; ReadBuffer = ApiMessage->Data.ReadConsoleOutputCharRequest.String;
CharSize = (Request->Data.ReadConsoleOutputCharRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR)); CharSize = (ApiMessage->Data.ReadConsoleOutputCharRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR));
Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputCharRequest.ConsoleHandle, &Buff, GENERIC_READ); Status = ConioLockScreenBuffer(CsrGetClientThread()->Process, ApiMessage->Data.ReadConsoleOutputCharRequest.ConsoleHandle, &Buff, GENERIC_READ);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
Console = Buff->Header.Console; Console = Buff->Header.Console;
Xpos = Request->Data.ReadConsoleOutputCharRequest.ReadCoord.X; Xpos = ApiMessage->Data.ReadConsoleOutputCharRequest.ReadCoord.X;
Ypos = (Request->Data.ReadConsoleOutputCharRequest.ReadCoord.Y + Buff->VirtualY) % Buff->MaxY; Ypos = (ApiMessage->Data.ReadConsoleOutputCharRequest.ReadCoord.Y + Buff->VirtualY) % Buff->MaxY;
for (i = 0; i < Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead; ++i) for (i = 0; i < ApiMessage->Data.ReadConsoleOutputCharRequest.NumCharsToRead; ++i)
{ {
Char = Buff->Buffer[(Xpos * 2) + (Ypos * 2 * Buff->MaxX)]; Char = Buff->Buffer[(Xpos * 2) + (Ypos * 2 * Buff->MaxX)];
if(Request->Data.ReadConsoleOutputCharRequest.Unicode) if(ApiMessage->Data.ReadConsoleOutputCharRequest.Unicode)
{ {
ConsoleAnsiCharToUnicodeChar(Console, (WCHAR*)ReadBuffer, &Char); ConsoleAnsiCharToUnicodeChar(Console, (WCHAR*)ReadBuffer, &Char);
ReadBuffer += sizeof(WCHAR); ReadBuffer += sizeof(WCHAR);
@ -1277,13 +1280,13 @@ CSR_API(CsrReadConsoleOutputChar)
} }
*ReadBuffer = 0; *ReadBuffer = 0;
Request->Data.ReadConsoleOutputCharRequest.EndCoord.X = Xpos; ApiMessage->Data.ReadConsoleOutputCharRequest.EndCoord.X = Xpos;
Request->Data.ReadConsoleOutputCharRequest.EndCoord.Y = (Ypos - Buff->VirtualY + Buff->MaxY) % Buff->MaxY; ApiMessage->Data.ReadConsoleOutputCharRequest.EndCoord.Y = (Ypos - Buff->VirtualY + Buff->MaxY) % Buff->MaxY;
ConioUnlockScreenBuffer(Buff); ConioUnlockScreenBuffer(Buff);
Request->Data.ReadConsoleOutputCharRequest.CharsRead = (DWORD)((ULONG_PTR)ReadBuffer - (ULONG_PTR)Request->Data.ReadConsoleOutputCharRequest.String) / CharSize; ApiMessage->Data.ReadConsoleOutputCharRequest.CharsRead = (DWORD)((ULONG_PTR)ReadBuffer - (ULONG_PTR)ApiMessage->Data.ReadConsoleOutputCharRequest.String) / CharSize;
if (Request->Data.ReadConsoleOutputCharRequest.CharsRead * CharSize + CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR) > sizeof(CSR_API_MESSAGE)) if (ApiMessage->Data.ReadConsoleOutputCharRequest.CharsRead * CharSize + CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR) > sizeof(CSR_API_MESSAGE))
{ {
DPRINT1("Length won't fit in message\n"); DPRINT1("Length won't fit in message\n");
return STATUS_BUFFER_TOO_SMALL; return STATUS_BUFFER_TOO_SMALL;
@ -1304,18 +1307,18 @@ CSR_API(CsrReadConsoleOutputAttrib)
DPRINT("CsrReadConsoleOutputAttrib\n"); DPRINT("CsrReadConsoleOutputAttrib\n");
ReadBuffer = Request->Data.ReadConsoleOutputAttribRequest.Attribute; ReadBuffer = ApiMessage->Data.ReadConsoleOutputAttribRequest.Attribute;
Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputAttribRequest.ConsoleHandle, &Buff, GENERIC_READ); Status = ConioLockScreenBuffer(CsrGetClientThread()->Process, ApiMessage->Data.ReadConsoleOutputAttribRequest.ConsoleHandle, &Buff, GENERIC_READ);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
Xpos = Request->Data.ReadConsoleOutputAttribRequest.ReadCoord.X; Xpos = ApiMessage->Data.ReadConsoleOutputAttribRequest.ReadCoord.X;
Ypos = (Request->Data.ReadConsoleOutputAttribRequest.ReadCoord.Y + Buff->VirtualY) % Buff->MaxY; Ypos = (ApiMessage->Data.ReadConsoleOutputAttribRequest.ReadCoord.Y + Buff->VirtualY) % Buff->MaxY;
for (i = 0; i < Request->Data.ReadConsoleOutputAttribRequest.NumAttrsToRead; ++i) for (i = 0; i < ApiMessage->Data.ReadConsoleOutputAttribRequest.NumAttrsToRead; ++i)
{ {
*ReadBuffer = Buff->Buffer[(Xpos * 2) + (Ypos * 2 * Buff->MaxX) + 1]; *ReadBuffer = Buff->Buffer[(Xpos * 2) + (Ypos * 2 * Buff->MaxX) + 1];
@ -1336,13 +1339,13 @@ CSR_API(CsrReadConsoleOutputAttrib)
*ReadBuffer = 0; *ReadBuffer = 0;
Request->Data.ReadConsoleOutputAttribRequest.EndCoord.X = Xpos; ApiMessage->Data.ReadConsoleOutputAttribRequest.EndCoord.X = Xpos;
Request->Data.ReadConsoleOutputAttribRequest.EndCoord.Y = (Ypos - Buff->VirtualY + Buff->MaxY) % Buff->MaxY; ApiMessage->Data.ReadConsoleOutputAttribRequest.EndCoord.Y = (Ypos - Buff->VirtualY + Buff->MaxY) % Buff->MaxY;
ConioUnlockScreenBuffer(Buff); ConioUnlockScreenBuffer(Buff);
CurrentLength = CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB) CurrentLength = CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB)
+ Request->Data.ReadConsoleOutputAttribRequest.NumAttrsToRead * sizeof(WORD); + ApiMessage->Data.ReadConsoleOutputAttribRequest.NumAttrsToRead * sizeof(WORD);
if (CurrentLength > sizeof(CSR_API_MESSAGE)) if (CurrentLength > sizeof(CSR_API_MESSAGE))
{ {
DPRINT1("Length won't fit in message\n"); DPRINT1("Length won't fit in message\n");
@ -1354,6 +1357,7 @@ CSR_API(CsrReadConsoleOutputAttrib)
CSR_API(CsrReadConsoleOutput) CSR_API(CsrReadConsoleOutput)
{ {
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
PCHAR_INFO CharInfo; PCHAR_INFO CharInfo;
PCHAR_INFO CurCharInfo; PCHAR_INFO CurCharInfo;
PCSRSS_SCREEN_BUFFER Buff; PCSRSS_SCREEN_BUFFER Buff;
@ -1370,16 +1374,16 @@ CSR_API(CsrReadConsoleOutput)
DPRINT("CsrReadConsoleOutput\n"); DPRINT("CsrReadConsoleOutput\n");
Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputRequest.ConsoleHandle, &Buff, GENERIC_READ); Status = ConioLockScreenBuffer(ProcessData, ApiMessage->Data.ReadConsoleOutputRequest.ConsoleHandle, &Buff, GENERIC_READ);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
CharInfo = Request->Data.ReadConsoleOutputRequest.CharInfo; CharInfo = ApiMessage->Data.ReadConsoleOutputRequest.CharInfo;
ReadRegion = Request->Data.ReadConsoleOutputRequest.ReadRegion; ReadRegion = ApiMessage->Data.ReadConsoleOutputRequest.ReadRegion;
BufferSize = Request->Data.ReadConsoleOutputRequest.BufferSize; BufferSize = ApiMessage->Data.ReadConsoleOutputRequest.BufferSize;
BufferCoord = Request->Data.ReadConsoleOutputRequest.BufferCoord; BufferCoord = ApiMessage->Data.ReadConsoleOutputRequest.BufferCoord;
/* FIXME: Is this correct? */ /* FIXME: Is this correct? */
CodePage = ProcessData->Console->OutputCodePage; CodePage = ProcessData->Console->OutputCodePage;
@ -1410,7 +1414,7 @@ CSR_API(CsrReadConsoleOutput)
Ptr = ConioCoordToPointer(Buff, ReadRegion.Left, Y); Ptr = ConioCoordToPointer(Buff, ReadRegion.Left, Y);
for (X = ReadRegion.Left; X < ReadRegion.Right; ++X) for (X = ReadRegion.Left; X < ReadRegion.Right; ++X)
{ {
if (Request->Data.ReadConsoleOutputRequest.Unicode) if (ApiMessage->Data.ReadConsoleOutputRequest.Unicode)
{ {
MultiByteToWideChar(CodePage, 0, MultiByteToWideChar(CodePage, 0,
(PCHAR)Ptr++, 1, (PCHAR)Ptr++, 1,
@ -1427,10 +1431,10 @@ CSR_API(CsrReadConsoleOutput)
ConioUnlockScreenBuffer(Buff); ConioUnlockScreenBuffer(Buff);
Request->Data.ReadConsoleOutputRequest.ReadRegion.Right = ReadRegion.Left + SizeX - 1; ApiMessage->Data.ReadConsoleOutputRequest.ReadRegion.Right = ReadRegion.Left + SizeX - 1;
Request->Data.ReadConsoleOutputRequest.ReadRegion.Bottom = ReadRegion.Top + SizeY - 1; ApiMessage->Data.ReadConsoleOutputRequest.ReadRegion.Bottom = ReadRegion.Top + SizeY - 1;
Request->Data.ReadConsoleOutputRequest.ReadRegion.Left = ReadRegion.Left; ApiMessage->Data.ReadConsoleOutputRequest.ReadRegion.Left = ReadRegion.Left;
Request->Data.ReadConsoleOutputRequest.ReadRegion.Top = ReadRegion.Top; ApiMessage->Data.ReadConsoleOutputRequest.ReadRegion.Top = ReadRegion.Top;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -1441,14 +1445,14 @@ CSR_API(CsrSetScreenBufferSize)
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
PCSRSS_SCREEN_BUFFER Buff; PCSRSS_SCREEN_BUFFER Buff;
Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetScreenBufferSize.OutputHandle, &Buff, GENERIC_WRITE); Status = ConioLockScreenBuffer(CsrGetClientThread()->Process, ApiMessage->Data.SetScreenBufferSize.OutputHandle, &Buff, GENERIC_WRITE);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
Console = Buff->Header.Console; Console = Buff->Header.Console;
Status = ConioResizeBuffer(Console, Buff, Request->Data.SetScreenBufferSize.Size); Status = ConioResizeBuffer(Console, Buff, ApiMessage->Data.SetScreenBufferSize.Size);
ConioUnlockScreenBuffer(Buff); ConioUnlockScreenBuffer(Buff);
return Status; return Status;

View file

@ -174,6 +174,7 @@ CsrInitConsole(PCSRSS_CONSOLE Console, int ShowCmd)
CSR_API(CsrAllocConsole) CSR_API(CsrAllocConsole)
{ {
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
BOOLEAN NewConsole = FALSE; BOOLEAN NewConsole = FALSE;
@ -189,7 +190,7 @@ CSR_API(CsrAllocConsole)
} }
/* If we don't need a console, then get out of here */ /* If we don't need a console, then get out of here */
if (!Request->Data.AllocConsoleRequest.ConsoleNeeded) if (!ApiMessage->Data.AllocConsoleRequest.ConsoleNeeded)
{ {
DPRINT("No console needed\n"); DPRINT("No console needed\n");
RtlLeaveCriticalSection(&ProcessData->HandleTableLock); RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
@ -197,8 +198,8 @@ CSR_API(CsrAllocConsole)
} }
/* If we already have one, then don't create a new one... */ /* If we already have one, then don't create a new one... */
if (!Request->Data.AllocConsoleRequest.Console || if (!ApiMessage->Data.AllocConsoleRequest.Console ||
Request->Data.AllocConsoleRequest.Console != ProcessData->ParentConsole) ApiMessage->Data.AllocConsoleRequest.Console != ProcessData->ParentConsole)
{ {
/* Allocate a console structure */ /* Allocate a console structure */
NewConsole = TRUE; NewConsole = TRUE;
@ -214,7 +215,7 @@ CSR_API(CsrAllocConsole)
/* insert process data required for GUI initialization */ /* insert process data required for GUI initialization */
InsertHeadList(&Console->ProcessList, &ProcessData->ConsoleLink); InsertHeadList(&Console->ProcessList, &ProcessData->ConsoleLink);
/* Initialize the Console */ /* Initialize the Console */
Status = CsrInitConsole(Console, Request->Data.AllocConsoleRequest.ShowCmd); Status = CsrInitConsole(Console, ApiMessage->Data.AllocConsoleRequest.ShowCmd);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT1("Console init failed\n"); DPRINT1("Console init failed\n");
@ -226,14 +227,14 @@ CSR_API(CsrAllocConsole)
else else
{ {
/* Reuse our current console */ /* Reuse our current console */
Console = Request->Data.AllocConsoleRequest.Console; Console = ApiMessage->Data.AllocConsoleRequest.Console;
} }
/* Set the Process Console */ /* Set the Process Console */
ProcessData->Console = Console; ProcessData->Console = Console;
/* Return it to the caller */ /* Return it to the caller */
Request->Data.AllocConsoleRequest.Console = Console; ApiMessage->Data.AllocConsoleRequest.Console = Console;
/* Add a reference count because the process is tied to the console */ /* Add a reference count because the process is tied to the console */
_InterlockedIncrement(&Console->ReferenceCount); _InterlockedIncrement(&Console->ReferenceCount);
@ -242,7 +243,7 @@ CSR_API(CsrAllocConsole)
{ {
/* Insert the Objects */ /* Insert the Objects */
Status = Win32CsrInsertObject(ProcessData, Status = Win32CsrInsertObject(ProcessData,
&Request->Data.AllocConsoleRequest.InputHandle, &ApiMessage->Data.AllocConsoleRequest.InputHandle,
&Console->Header, &Console->Header,
GENERIC_READ | GENERIC_WRITE, GENERIC_READ | GENERIC_WRITE,
TRUE, TRUE,
@ -257,7 +258,7 @@ CSR_API(CsrAllocConsole)
} }
Status = Win32CsrInsertObject(ProcessData, Status = Win32CsrInsertObject(ProcessData,
&Request->Data.AllocConsoleRequest.OutputHandle, &ApiMessage->Data.AllocConsoleRequest.OutputHandle,
&Console->ActiveBuffer->Header, &Console->ActiveBuffer->Header,
GENERIC_READ | GENERIC_WRITE, GENERIC_READ | GENERIC_WRITE,
TRUE, TRUE,
@ -267,7 +268,7 @@ CSR_API(CsrAllocConsole)
DPRINT1("Failed to insert object\n"); DPRINT1("Failed to insert object\n");
ConioDeleteConsole((Object_t *) Console); ConioDeleteConsole((Object_t *) Console);
Win32CsrReleaseObject(ProcessData, Win32CsrReleaseObject(ProcessData,
Request->Data.AllocConsoleRequest.InputHandle); ApiMessage->Data.AllocConsoleRequest.InputHandle);
ProcessData->Console = 0; ProcessData->Console = 0;
RtlLeaveCriticalSection(&ProcessData->HandleTableLock); RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return Status; return Status;
@ -288,9 +289,9 @@ CSR_API(CsrAllocConsole)
if (NewConsole || !ProcessData->bInheritHandles) if (NewConsole || !ProcessData->bInheritHandles)
{ {
Win32CsrReleaseObject(ProcessData, Win32CsrReleaseObject(ProcessData,
Request->Data.AllocConsoleRequest.OutputHandle); ApiMessage->Data.AllocConsoleRequest.OutputHandle);
Win32CsrReleaseObject(ProcessData, Win32CsrReleaseObject(ProcessData,
Request->Data.AllocConsoleRequest.InputHandle); ApiMessage->Data.AllocConsoleRequest.InputHandle);
} }
ProcessData->Console = 0; ProcessData->Console = 0;
RtlLeaveCriticalSection(&ProcessData->HandleTableLock); RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
@ -298,7 +299,7 @@ CSR_API(CsrAllocConsole)
} }
/* Set the Ctrl Dispatcher */ /* Set the Ctrl Dispatcher */
ProcessData->CtrlDispatcher = Request->Data.AllocConsoleRequest.CtrlDispatcher; ProcessData->CtrlDispatcher = ApiMessage->Data.AllocConsoleRequest.CtrlDispatcher;
DPRINT("CSRSS:CtrlDispatcher address: %x\n", ProcessData->CtrlDispatcher); DPRINT("CSRSS:CtrlDispatcher address: %x\n", ProcessData->CtrlDispatcher);
if (!NewConsole) if (!NewConsole)
@ -313,7 +314,7 @@ CSR_API(CsrAllocConsole)
CSR_API(CsrFreeConsole) CSR_API(CsrFreeConsole)
{ {
Win32CsrReleaseConsole(ProcessData); Win32CsrReleaseConsole(CsrGetClientThread()->Process);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -390,8 +391,8 @@ CSR_API(CsrSetConsoleMode)
DPRINT("CsrSetConsoleMode\n"); DPRINT("CsrSetConsoleMode\n");
Status = Win32CsrLockObject(ProcessData, Status = Win32CsrLockObject(CsrGetClientThread()->Process,
Request->Data.SetConsoleModeRequest.ConsoleHandle, ApiMessage->Data.SetConsoleModeRequest.ConsoleHandle,
(Object_t **) &Console, GENERIC_WRITE, 0); (Object_t **) &Console, GENERIC_WRITE, 0);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
@ -401,11 +402,11 @@ CSR_API(CsrSetConsoleMode)
Buff = (PCSRSS_SCREEN_BUFFER)Console; Buff = (PCSRSS_SCREEN_BUFFER)Console;
if (CONIO_CONSOLE_MAGIC == Console->Header.Type) if (CONIO_CONSOLE_MAGIC == Console->Header.Type)
{ {
Console->Mode = Request->Data.SetConsoleModeRequest.Mode & CONSOLE_INPUT_MODE_VALID; Console->Mode = ApiMessage->Data.SetConsoleModeRequest.Mode & CONSOLE_INPUT_MODE_VALID;
} }
else if (CONIO_SCREEN_BUFFER_MAGIC == Console->Header.Type) else if (CONIO_SCREEN_BUFFER_MAGIC == Console->Header.Type)
{ {
Buff->Mode = Request->Data.SetConsoleModeRequest.Mode & CONSOLE_OUTPUT_MODE_VALID; Buff->Mode = ApiMessage->Data.SetConsoleModeRequest.Mode & CONSOLE_OUTPUT_MODE_VALID;
} }
else else
{ {
@ -425,7 +426,7 @@ CSR_API(CsrGetConsoleMode)
DPRINT("CsrGetConsoleMode\n"); DPRINT("CsrGetConsoleMode\n");
Status = Win32CsrLockObject(ProcessData, Request->Data.GetConsoleModeRequest.ConsoleHandle, Status = Win32CsrLockObject(CsrGetClientThread()->Process, ApiMessage->Data.GetConsoleModeRequest.ConsoleHandle,
(Object_t **) &Console, GENERIC_READ, 0); (Object_t **) &Console, GENERIC_READ, 0);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
@ -435,11 +436,11 @@ CSR_API(CsrGetConsoleMode)
Buff = (PCSRSS_SCREEN_BUFFER) Console; Buff = (PCSRSS_SCREEN_BUFFER) Console;
if (CONIO_CONSOLE_MAGIC == Console->Header.Type) if (CONIO_CONSOLE_MAGIC == Console->Header.Type)
{ {
Request->Data.GetConsoleModeRequest.ConsoleMode = Console->Mode; ApiMessage->Data.GetConsoleModeRequest.ConsoleMode = Console->Mode;
} }
else if (CONIO_SCREEN_BUFFER_MAGIC == Buff->Header.Type) else if (CONIO_SCREEN_BUFFER_MAGIC == Buff->Header.Type)
{ {
Request->Data.GetConsoleModeRequest.ConsoleMode = Buff->Mode; ApiMessage->Data.GetConsoleModeRequest.ConsoleMode = Buff->Mode;
} }
else else
{ {
@ -453,13 +454,14 @@ CSR_API(CsrGetConsoleMode)
CSR_API(CsrSetTitle) CSR_API(CsrSetTitle)
{ {
NTSTATUS Status; NTSTATUS Status;
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
PWCHAR Buffer; PWCHAR Buffer;
DPRINT("CsrSetTitle\n"); DPRINT("CsrSetTitle\n");
if (!Win32CsrValidateBuffer(ProcessData, Request->Data.SetTitleRequest.Title, if (!Win32CsrValidateBuffer(ProcessData, ApiMessage->Data.SetTitleRequest.Title,
Request->Data.SetTitleRequest.Length, 1)) ApiMessage->Data.SetTitleRequest.Length, 1))
{ {
return STATUS_ACCESS_VIOLATION; return STATUS_ACCESS_VIOLATION;
} }
@ -467,14 +469,14 @@ CSR_API(CsrSetTitle)
Status = ConioConsoleFromProcessData(ProcessData, &Console); Status = ConioConsoleFromProcessData(ProcessData, &Console);
if(NT_SUCCESS(Status)) if(NT_SUCCESS(Status))
{ {
Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, Request->Data.SetTitleRequest.Length); Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, ApiMessage->Data.SetTitleRequest.Length);
if (Buffer) if (Buffer)
{ {
/* copy title to console */ /* copy title to console */
RtlFreeUnicodeString(&Console->Title); RtlFreeUnicodeString(&Console->Title);
Console->Title.Buffer = Buffer; Console->Title.Buffer = Buffer;
Console->Title.Length = Console->Title.MaximumLength = Request->Data.SetTitleRequest.Length; Console->Title.Length = Console->Title.MaximumLength = ApiMessage->Data.SetTitleRequest.Length;
memcpy(Console->Title.Buffer, Request->Data.SetTitleRequest.Title, Console->Title.Length); memcpy(Console->Title.Buffer, ApiMessage->Data.SetTitleRequest.Title, Console->Title.Length);
if (! ConioChangeTitle(Console)) if (! ConioChangeTitle(Console))
{ {
Status = STATUS_UNSUCCESSFUL; Status = STATUS_UNSUCCESSFUL;
@ -497,14 +499,15 @@ CSR_API(CsrSetTitle)
CSR_API(CsrGetTitle) CSR_API(CsrGetTitle)
{ {
NTSTATUS Status; NTSTATUS Status;
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
DWORD Length; DWORD Length;
DPRINT("CsrGetTitle\n"); DPRINT("CsrGetTitle\n");
if (!Win32CsrValidateBuffer(ProcessData, Request->Data.GetTitleRequest.Title, if (!Win32CsrValidateBuffer(ProcessData, ApiMessage->Data.GetTitleRequest.Title,
Request->Data.GetTitleRequest.Length, 1)) ApiMessage->Data.GetTitleRequest.Length, 1))
{ {
return STATUS_ACCESS_VIOLATION; return STATUS_ACCESS_VIOLATION;
} }
@ -517,14 +520,14 @@ CSR_API(CsrGetTitle)
} }
/* Copy title of the console to the user title buffer */ /* Copy title of the console to the user title buffer */
if (Request->Data.GetTitleRequest.Length >= sizeof(WCHAR)) if (ApiMessage->Data.GetTitleRequest.Length >= sizeof(WCHAR))
{ {
Length = min(Request->Data.GetTitleRequest.Length - sizeof(WCHAR), Console->Title.Length); Length = min(ApiMessage->Data.GetTitleRequest.Length - sizeof(WCHAR), Console->Title.Length);
memcpy(Request->Data.GetTitleRequest.Title, Console->Title.Buffer, Length); memcpy(ApiMessage->Data.GetTitleRequest.Title, Console->Title.Buffer, Length);
Request->Data.GetTitleRequest.Title[Length / sizeof(WCHAR)] = L'\0'; ApiMessage->Data.GetTitleRequest.Title[Length / sizeof(WCHAR)] = L'\0';
} }
Request->Data.GetTitleRequest.Length = Console->Title.Length; ApiMessage->Data.GetTitleRequest.Length = Console->Title.Length;
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return STATUS_SUCCESS; return STATUS_SUCCESS;
@ -572,8 +575,8 @@ CSR_API(CsrHardwareStateProperty)
DPRINT("CsrHardwareStateProperty\n"); DPRINT("CsrHardwareStateProperty\n");
Status = ConioLockConsole(ProcessData, Status = ConioLockConsole(CsrGetClientThread()->Process,
Request->Data.ConsoleHardwareStateRequest.ConsoleHandle, ApiMessage->Data.ConsoleHardwareStateRequest.ConsoleHandle,
&Console, &Console,
GENERIC_READ); GENERIC_READ);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
@ -582,15 +585,15 @@ CSR_API(CsrHardwareStateProperty)
return Status; return Status;
} }
switch (Request->Data.ConsoleHardwareStateRequest.SetGet) switch (ApiMessage->Data.ConsoleHardwareStateRequest.SetGet)
{ {
case CONSOLE_HARDWARE_STATE_GET: case CONSOLE_HARDWARE_STATE_GET:
Request->Data.ConsoleHardwareStateRequest.State = Console->HardwareState; ApiMessage->Data.ConsoleHardwareStateRequest.State = Console->HardwareState;
break; break;
case CONSOLE_HARDWARE_STATE_SET: case CONSOLE_HARDWARE_STATE_SET:
DPRINT("Setting console hardware state.\n"); DPRINT("Setting console hardware state.\n");
Status = SetConsoleHardwareState(Console, Request->Data.ConsoleHardwareStateRequest.State); Status = SetConsoleHardwareState(Console, ApiMessage->Data.ConsoleHardwareStateRequest.State);
break; break;
default: default:
@ -610,13 +613,13 @@ CSR_API(CsrGetConsoleWindow)
DPRINT("CsrGetConsoleWindow\n"); DPRINT("CsrGetConsoleWindow\n");
Status = ConioConsoleFromProcessData(ProcessData, &Console); Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
Request->Data.GetConsoleWindowRequest.WindowHandle = Console->hWindow; ApiMessage->Data.GetConsoleWindowRequest.WindowHandle = Console->hWindow;
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return STATUS_SUCCESS; return STATUS_SUCCESS;
@ -629,13 +632,13 @@ CSR_API(CsrSetConsoleIcon)
DPRINT("CsrSetConsoleIcon\n"); DPRINT("CsrSetConsoleIcon\n");
Status = ConioConsoleFromProcessData(ProcessData, &Console); Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
Status = (ConioChangeIcon(Console, Request->Data.SetConsoleIconRequest.WindowIcon) Status = (ConioChangeIcon(Console, ApiMessage->Data.SetConsoleIconRequest.WindowIcon)
? STATUS_SUCCESS : STATUS_UNSUCCESSFUL); ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
@ -649,13 +652,13 @@ CSR_API(CsrGetConsoleCodePage)
DPRINT("CsrGetConsoleCodePage\n"); DPRINT("CsrGetConsoleCodePage\n");
Status = ConioConsoleFromProcessData(ProcessData, &Console); Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
Request->Data.GetConsoleCodePage.CodePage = Console->CodePage; ApiMessage->Data.GetConsoleCodePage.CodePage = Console->CodePage;
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -667,15 +670,15 @@ CSR_API(CsrSetConsoleCodePage)
DPRINT("CsrSetConsoleCodePage\n"); DPRINT("CsrSetConsoleCodePage\n");
Status = ConioConsoleFromProcessData(ProcessData, &Console); Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
if (IsValidCodePage(Request->Data.SetConsoleCodePage.CodePage)) if (IsValidCodePage(ApiMessage->Data.SetConsoleCodePage.CodePage))
{ {
Console->CodePage = Request->Data.SetConsoleCodePage.CodePage; Console->CodePage = ApiMessage->Data.SetConsoleCodePage.CodePage;
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -691,13 +694,13 @@ CSR_API(CsrGetConsoleOutputCodePage)
DPRINT("CsrGetConsoleOutputCodePage\n"); DPRINT("CsrGetConsoleOutputCodePage\n");
Status = ConioConsoleFromProcessData(ProcessData, &Console); Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
Request->Data.GetConsoleOutputCodePage.CodePage = Console->OutputCodePage; ApiMessage->Data.GetConsoleOutputCodePage.CodePage = Console->OutputCodePage;
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -709,15 +712,15 @@ CSR_API(CsrSetConsoleOutputCodePage)
DPRINT("CsrSetConsoleOutputCodePage\n"); DPRINT("CsrSetConsoleOutputCodePage\n");
Status = ConioConsoleFromProcessData(ProcessData, &Console); Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
if (IsValidCodePage(Request->Data.SetConsoleOutputCodePage.CodePage)) if (IsValidCodePage(ApiMessage->Data.SetConsoleOutputCodePage.CodePage))
{ {
Console->OutputCodePage = Request->Data.SetConsoleOutputCodePage.CodePage; Console->OutputCodePage = ApiMessage->Data.SetConsoleOutputCodePage.CodePage;
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -729,6 +732,7 @@ CSR_API(CsrSetConsoleOutputCodePage)
CSR_API(CsrGetProcessList) CSR_API(CsrGetProcessList)
{ {
PDWORD Buffer; PDWORD Buffer;
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
PCSR_PROCESS current; PCSR_PROCESS current;
PLIST_ENTRY current_entry; PLIST_ENTRY current_entry;
@ -737,8 +741,8 @@ CSR_API(CsrGetProcessList)
DPRINT("CsrGetProcessList\n"); DPRINT("CsrGetProcessList\n");
Buffer = Request->Data.GetProcessListRequest.ProcessId; Buffer = ApiMessage->Data.GetProcessListRequest.ProcessId;
if (!Win32CsrValidateBuffer(ProcessData, Buffer, Request->Data.GetProcessListRequest.nMaxIds, sizeof(DWORD))) if (!Win32CsrValidateBuffer(ProcessData, Buffer, ApiMessage->Data.GetProcessListRequest.nMaxIds, sizeof(DWORD)))
return STATUS_ACCESS_VIOLATION; return STATUS_ACCESS_VIOLATION;
Status = ConioConsoleFromProcessData(ProcessData, &Console); Status = ConioConsoleFromProcessData(ProcessData, &Console);
@ -752,7 +756,7 @@ CSR_API(CsrGetProcessList)
current_entry = current_entry->Flink) current_entry = current_entry->Flink)
{ {
current = CONTAINING_RECORD(current_entry, CSR_PROCESS, ConsoleLink); current = CONTAINING_RECORD(current_entry, CSR_PROCESS, ConsoleLink);
if (++nItems <= Request->Data.GetProcessListRequest.nMaxIds) if (++nItems <= ApiMessage->Data.GetProcessListRequest.nMaxIds)
{ {
*Buffer++ = HandleToUlong(current->ClientId.UniqueProcess); *Buffer++ = HandleToUlong(current->ClientId.UniqueProcess);
} }
@ -760,7 +764,7 @@ CSR_API(CsrGetProcessList)
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
Request->Data.GetProcessListRequest.nProcessIdsTotal = nItems; ApiMessage->Data.GetProcessListRequest.nProcessIdsTotal = nItems;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -772,13 +776,13 @@ CSR_API(CsrGenerateCtrlEvent)
DWORD Group; DWORD Group;
NTSTATUS Status; NTSTATUS Status;
Status = ConioConsoleFromProcessData(ProcessData, &Console); Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
} }
Group = Request->Data.GenerateCtrlEvent.ProcessGroup; Group = ApiMessage->Data.GenerateCtrlEvent.ProcessGroup;
Status = STATUS_INVALID_PARAMETER; Status = STATUS_INVALID_PARAMETER;
for (current_entry = Console->ProcessList.Flink; for (current_entry = Console->ProcessList.Flink;
current_entry != &Console->ProcessList; current_entry != &Console->ProcessList;
@ -787,7 +791,7 @@ CSR_API(CsrGenerateCtrlEvent)
current = CONTAINING_RECORD(current_entry, CSR_PROCESS, ConsoleLink); current = CONTAINING_RECORD(current_entry, CSR_PROCESS, ConsoleLink);
if (Group == 0 || current->ProcessGroupId == Group) if (Group == 0 || current->ProcessGroupId == Group)
{ {
ConioConsoleCtrlEvent(Request->Data.GenerateCtrlEvent.Event, current); ConioConsoleCtrlEvent(ApiMessage->Data.GenerateCtrlEvent.Event, current);
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
} }
} }
@ -802,12 +806,12 @@ CSR_API(CsrGetConsoleSelectionInfo)
NTSTATUS Status; NTSTATUS Status;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
Status = ConioConsoleFromProcessData(ProcessData, &Console); Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
memset(&Request->Data.GetConsoleSelectionInfo.Info, 0, sizeof(CONSOLE_SELECTION_INFO)); memset(&ApiMessage->Data.GetConsoleSelectionInfo.Info, 0, sizeof(CONSOLE_SELECTION_INFO));
if (Console->Selection.dwFlags != 0) if (Console->Selection.dwFlags != 0)
Request->Data.GetConsoleSelectionInfo.Info = Console->Selection; ApiMessage->Data.GetConsoleSelectionInfo.Info = Console->Selection;
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
} }
return Status; return Status;

View file

@ -254,7 +254,7 @@ CSR_API(CsrCreateDesktop)
* The desktop handle we got from win32k is in * The desktop handle we got from win32k is in
* the scope of CSRSS so we can just use it. * the scope of CSRSS so we can just use it.
*/ */
ThreadData.Desktop = Request->Data.CreateDesktopRequest.DesktopHandle; ThreadData.Desktop = ApiMessage->Data.CreateDesktopRequest.DesktopHandle;
ThreadData.Event = CreateEventW(NULL, FALSE, FALSE, NULL); ThreadData.Event = CreateEventW(NULL, FALSE, FALSE, NULL);
@ -292,14 +292,14 @@ CSR_API(CsrShowDesktop)
PRIVATE_NOTIFY_DESKTOP nmh; PRIVATE_NOTIFY_DESKTOP nmh;
DPRINT("CsrShowDesktop\n"); DPRINT("CsrShowDesktop\n");
nmh.hdr.hwndFrom = Request->Data.ShowDesktopRequest.DesktopWindow; nmh.hdr.hwndFrom = ApiMessage->Data.ShowDesktopRequest.DesktopWindow;
nmh.hdr.idFrom = 0; nmh.hdr.idFrom = 0;
nmh.hdr.code = PM_SHOW_DESKTOP; nmh.hdr.code = PM_SHOW_DESKTOP;
nmh.ShowDesktop.Width = (int)Request->Data.ShowDesktopRequest.Width; nmh.ShowDesktop.Width = (int)ApiMessage->Data.ShowDesktopRequest.Width;
nmh.ShowDesktop.Height = (int)Request->Data.ShowDesktopRequest.Height; nmh.ShowDesktop.Height = (int)ApiMessage->Data.ShowDesktopRequest.Height;
if (SendMessageW(Request->Data.ShowDesktopRequest.DesktopWindow, if (SendMessageW(ApiMessage->Data.ShowDesktopRequest.DesktopWindow,
WM_NOTIFY, WM_NOTIFY,
(WPARAM)nmh.hdr.hwndFrom, (WPARAM)nmh.hdr.hwndFrom,
(LPARAM)&nmh)) (LPARAM)&nmh))
@ -316,11 +316,11 @@ CSR_API(CsrHideDesktop)
PRIVATE_NOTIFY_DESKTOP nmh; PRIVATE_NOTIFY_DESKTOP nmh;
DPRINT("CsrHideDesktop\n"); DPRINT("CsrHideDesktop\n");
nmh.hdr.hwndFrom = Request->Data.ShowDesktopRequest.DesktopWindow; nmh.hdr.hwndFrom = ApiMessage->Data.ShowDesktopRequest.DesktopWindow;
nmh.hdr.idFrom = 0; nmh.hdr.idFrom = 0;
nmh.hdr.code = PM_HIDE_DESKTOP; nmh.hdr.code = PM_HIDE_DESKTOP;
if (SendMessageW(Request->Data.ShowDesktopRequest.DesktopWindow, if (SendMessageW(ApiMessage->Data.ShowDesktopRequest.DesktopWindow,
WM_NOTIFY, WM_NOTIFY,
(WPARAM)nmh.hdr.hwndFrom, (WPARAM)nmh.hdr.hwndFrom,
(LPARAM)&nmh)) (LPARAM)&nmh))

View file

@ -18,20 +18,20 @@ static HANDLE LogonProcess = NULL;
CSR_API(CsrRegisterLogonProcess) CSR_API(CsrRegisterLogonProcess)
{ {
if (Request->Data.RegisterLogonProcessRequest.Register) if (ApiMessage->Data.RegisterLogonProcessRequest.Register)
{ {
if (0 != LogonProcess) if (0 != LogonProcess)
{ {
return STATUS_LOGON_SESSION_EXISTS; return STATUS_LOGON_SESSION_EXISTS;
} }
LogonProcess = Request->Data.RegisterLogonProcessRequest.ProcessId; LogonProcess = ApiMessage->Data.RegisterLogonProcessRequest.ProcessId;
} }
else else
{ {
if (Request->Header.ClientId.UniqueProcess != LogonProcess) if (ApiMessage->Header.ClientId.UniqueProcess != LogonProcess)
{ {
DPRINT1("Current logon process 0x%x, can't deregister from process 0x%x\n", DPRINT1("Current logon process 0x%x, can't deregister from process 0x%x\n",
LogonProcess, Request->Header.ClientId.UniqueProcess); LogonProcess, ApiMessage->Header.ClientId.UniqueProcess);
return STATUS_NOT_LOGON_PROCESS; return STATUS_NOT_LOGON_PROCESS;
} }
LogonProcess = 0; LogonProcess = 0;
@ -44,7 +44,7 @@ CSR_API(CsrSetLogonNotifyWindow)
{ {
DWORD WindowCreator; DWORD WindowCreator;
if (0 == GetWindowThreadProcessId(Request->Data.SetLogonNotifyWindowRequest.LogonNotifyWindow, if (0 == GetWindowThreadProcessId(ApiMessage->Data.SetLogonNotifyWindowRequest.LogonNotifyWindow,
&WindowCreator)) &WindowCreator))
{ {
DPRINT1("Can't get window creator\n"); DPRINT1("Can't get window creator\n");
@ -56,7 +56,7 @@ CSR_API(CsrSetLogonNotifyWindow)
return STATUS_ACCESS_DENIED; return STATUS_ACCESS_DENIED;
} }
LogonNotifyWindow = Request->Data.SetLogonNotifyWindowRequest.LogonNotifyWindow; LogonNotifyWindow = ApiMessage->Data.SetLogonNotifyWindowRequest.LogonNotifyWindow;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -915,16 +915,16 @@ UserExitReactos(DWORD UserProcessId, UINT Flags)
CSR_API(CsrExitReactos) CSR_API(CsrExitReactos)
{ {
if (0 == (Request->Data.ExitReactosRequest.Flags & EWX_INTERNAL_FLAG)) if (0 == (ApiMessage->Data.ExitReactosRequest.Flags & EWX_INTERNAL_FLAG))
{ {
return UserExitReactos((DWORD_PTR) Request->Header.ClientId.UniqueProcess, return UserExitReactos((DWORD_PTR) ApiMessage->Header.ClientId.UniqueProcess,
Request->Data.ExitReactosRequest.Flags); ApiMessage->Data.ExitReactosRequest.Flags);
} }
else else
{ {
return InternalExitReactos((DWORD_PTR) Request->Header.ClientId.UniqueProcess, return InternalExitReactos((DWORD_PTR) ApiMessage->Header.ClientId.UniqueProcess,
(DWORD_PTR) Request->Header.ClientId.UniqueThread, (DWORD_PTR) ApiMessage->Header.ClientId.UniqueThread,
Request->Data.ExitReactosRequest.Flags); ApiMessage->Data.ExitReactosRequest.Flags);
} }
} }

View file

@ -73,9 +73,9 @@ CSR_API(CsrGetTempFile)
DPRINT("CsrGetTempFile entered\n"); DPRINT("CsrGetTempFile entered\n");
/* Return 16-bits ID */ /* Return 16-bits ID */
Request->Data.GetTempFile.UniqueID = (++CsrGetTempFileUnique & 0xFFFF); ApiMessage->Data.GetTempFile.UniqueID = (++CsrGetTempFileUnique & 0xFFFF);
DPRINT("Returning: %u\n", Request->Data.GetTempFile.UniqueID); DPRINT("Returning: %u\n", ApiMessage->Data.GetTempFile.UniqueID);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -106,16 +106,16 @@ CSR_API(CsrDefineDosDevice)
PWSTR lpBuffer; PWSTR lpBuffer;
DPRINT("CsrDefineDosDevice entered, Flags:%d, DeviceName:%wZ, TargetName:%wZ\n", DPRINT("CsrDefineDosDevice entered, Flags:%d, DeviceName:%wZ, TargetName:%wZ\n",
Request->Data.DefineDosDeviceRequest.dwFlags, ApiMessage->Data.DefineDosDeviceRequest.dwFlags,
&Request->Data.DefineDosDeviceRequest.DeviceName, &ApiMessage->Data.DefineDosDeviceRequest.DeviceName,
&Request->Data.DefineDosDeviceRequest.TargetName); &ApiMessage->Data.DefineDosDeviceRequest.TargetName);
Matched = AddHistory = FALSE; Matched = AddHistory = FALSE;
HistoryEntry = NULL; HistoryEntry = NULL;
AdminSid = SystemSid = WorldSid = NULL; AdminSid = SystemSid = WorldSid = NULL;
SecurityDescriptor = NULL; SecurityDescriptor = NULL;
ListHead = &DosDeviceHistory; ListHead = &DosDeviceHistory;
dwFlags = Request->Data.DefineDosDeviceRequest.dwFlags; dwFlags = ApiMessage->Data.DefineDosDeviceRequest.dwFlags;
/* Validate the flags */ /* Validate the flags */
if ( (dwFlags & 0xFFFFFFF0) || if ( (dwFlags & 0xFFFFFFF0) ||
@ -137,13 +137,13 @@ CSR_API(CsrDefineDosDevice)
{ {
Status = Status =
RtlUpcaseUnicodeString(&RequestDeviceName, RtlUpcaseUnicodeString(&RequestDeviceName,
&Request->Data.DefineDosDeviceRequest.DeviceName, &ApiMessage->Data.DefineDosDeviceRequest.DeviceName,
TRUE); TRUE);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
_SEH2_LEAVE; _SEH2_LEAVE;
RequestLinkTarget = RequestLinkTarget =
&Request->Data.DefineDosDeviceRequest.TargetName; &ApiMessage->Data.DefineDosDeviceRequest.TargetName;
lpBuffer = (PWSTR) RtlAllocateHeap(Win32CsrApiHeap, lpBuffer = (PWSTR) RtlAllocateHeap(Win32CsrApiHeap,
HEAP_ZERO_MEMORY, HEAP_ZERO_MEMORY,
RequestDeviceName.MaximumLength + 5 * sizeof(WCHAR)); RequestDeviceName.MaximumLength + 5 * sizeof(WCHAR));

View file

@ -259,20 +259,21 @@ Win32CsrDuplicateHandleTable(
CSR_API(CsrGetHandle) CSR_API(CsrGetHandle)
{ {
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
Request->Data.GetInputHandleRequest.Handle = INVALID_HANDLE_VALUE; ApiMessage->Data.GetInputHandleRequest.Handle = INVALID_HANDLE_VALUE;
RtlEnterCriticalSection(&ProcessData->HandleTableLock); RtlEnterCriticalSection(&ProcessData->HandleTableLock);
if (ProcessData->Console) if (ProcessData->Console)
{ {
DWORD DesiredAccess = Request->Data.GetInputHandleRequest.Access; DWORD DesiredAccess = ApiMessage->Data.GetInputHandleRequest.Access;
DWORD ShareMode = Request->Data.GetInputHandleRequest.ShareMode; DWORD ShareMode = ApiMessage->Data.GetInputHandleRequest.ShareMode;
PCSRSS_CONSOLE Console = ProcessData->Console; PCSRSS_CONSOLE Console = ProcessData->Console;
Object_t *Object; Object_t *Object;
EnterCriticalSection(&Console->Lock); EnterCriticalSection(&Console->Lock);
if (Request->Type == GET_OUTPUT_HANDLE) if (ApiMessage->ApiNumber == GET_OUTPUT_HANDLE)
Object = &Console->ActiveBuffer->Header; Object = &Console->ActiveBuffer->Header;
else else
Object = &Console->Header; Object = &Console->Header;
@ -288,10 +289,10 @@ CSR_API(CsrGetHandle)
else else
{ {
Status = Win32CsrInsertObject(ProcessData, Status = Win32CsrInsertObject(ProcessData,
&Request->Data.GetInputHandleRequest.Handle, &ApiMessage->Data.GetInputHandleRequest.Handle,
Object, Object,
DesiredAccess, DesiredAccess,
Request->Data.GetInputHandleRequest.Inheritable, ApiMessage->Data.GetInputHandleRequest.Inheritable,
ShareMode); ShareMode);
} }
LeaveCriticalSection(&Console->Lock); LeaveCriticalSection(&Console->Lock);
@ -303,15 +304,16 @@ CSR_API(CsrGetHandle)
CSR_API(CsrCloseHandle) CSR_API(CsrCloseHandle)
{ {
return Win32CsrReleaseObject(ProcessData, Request->Data.CloseHandleRequest.Handle); return Win32CsrReleaseObject(CsrGetClientThread()->Process, ApiMessage->Data.CloseHandleRequest.Handle);
} }
CSR_API(CsrVerifyHandle) CSR_API(CsrVerifyHandle)
{ {
ULONG_PTR Index; ULONG_PTR Index;
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
Index = (ULONG_PTR)Request->Data.VerifyHandleRequest.Handle >> 2; Index = (ULONG_PTR)ApiMessage->Data.VerifyHandleRequest.Handle >> 2;
RtlEnterCriticalSection(&ProcessData->HandleTableLock); RtlEnterCriticalSection(&ProcessData->HandleTableLock);
if (Index >= ProcessData->HandleTableSize || if (Index >= ProcessData->HandleTableSize ||
ProcessData->HandleTable[Index].Object == NULL) ProcessData->HandleTable[Index].Object == NULL)
@ -329,53 +331,54 @@ CSR_API(CsrDuplicateHandle)
ULONG_PTR Index; ULONG_PTR Index;
PCSRSS_HANDLE Entry; PCSRSS_HANDLE Entry;
DWORD DesiredAccess; DWORD DesiredAccess;
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
Index = (ULONG_PTR)Request->Data.DuplicateHandleRequest.Handle >> 2; Index = (ULONG_PTR)ApiMessage->Data.DuplicateHandleRequest.Handle >> 2;
RtlEnterCriticalSection(&ProcessData->HandleTableLock); RtlEnterCriticalSection(&ProcessData->HandleTableLock);
if (Index >= ProcessData->HandleTableSize if (Index >= ProcessData->HandleTableSize
|| (Entry = &ProcessData->HandleTable[Index])->Object == NULL) || (Entry = &ProcessData->HandleTable[Index])->Object == NULL)
{ {
DPRINT1("Couldn't dup invalid handle %p\n", Request->Data.DuplicateHandleRequest.Handle); DPRINT1("Couldn't dup invalid handle %p\n", ApiMessage->Data.DuplicateHandleRequest.Handle);
RtlLeaveCriticalSection(&ProcessData->HandleTableLock); RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return STATUS_INVALID_HANDLE; return STATUS_INVALID_HANDLE;
} }
if (Request->Data.DuplicateHandleRequest.Options & DUPLICATE_SAME_ACCESS) if (ApiMessage->Data.DuplicateHandleRequest.Options & DUPLICATE_SAME_ACCESS)
{ {
DesiredAccess = Entry->Access; DesiredAccess = Entry->Access;
} }
else else
{ {
DesiredAccess = Request->Data.DuplicateHandleRequest.Access; DesiredAccess = ApiMessage->Data.DuplicateHandleRequest.Access;
/* Make sure the source handle has all the desired flags */ /* Make sure the source handle has all the desired flags */
if (~Entry->Access & DesiredAccess) if (~Entry->Access & DesiredAccess)
{ {
DPRINT1("Handle %p only has access %X; requested %X\n", DPRINT1("Handle %p only has access %X; requested %X\n",
Request->Data.DuplicateHandleRequest.Handle, Entry->Access, DesiredAccess); ApiMessage->Data.DuplicateHandleRequest.Handle, Entry->Access, DesiredAccess);
RtlLeaveCriticalSection(&ProcessData->HandleTableLock); RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
} }
} }
Request->Status = Win32CsrInsertObject(ProcessData, ApiMessage->Status = Win32CsrInsertObject(ProcessData,
&Request->Data.DuplicateHandleRequest.Handle, &ApiMessage->Data.DuplicateHandleRequest.Handle,
Entry->Object, Entry->Object,
DesiredAccess, DesiredAccess,
Request->Data.DuplicateHandleRequest.Inheritable, ApiMessage->Data.DuplicateHandleRequest.Inheritable,
Entry->ShareMode); Entry->ShareMode);
if (NT_SUCCESS(Request->Status) if (NT_SUCCESS(ApiMessage->Status)
&& Request->Data.DuplicateHandleRequest.Options & DUPLICATE_CLOSE_SOURCE) && ApiMessage->Data.DuplicateHandleRequest.Options & DUPLICATE_CLOSE_SOURCE)
{ {
Win32CsrCloseHandleEntry(Entry); Win32CsrCloseHandleEntry(Entry);
} }
RtlLeaveCriticalSection(&ProcessData->HandleTableLock); RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return Request->Status; return ApiMessage->Status;
} }
CSR_API(CsrGetInputWaitHandle) CSR_API(CsrGetInputWaitHandle)
{ {
Request->Data.GetConsoleInputWaitHandle.InputWaitHandle = ProcessData->ConsoleEvent; ApiMessage->Data.GetConsoleInputWaitHandle.InputWaitHandle = CsrGetClientThread()->Process->ConsoleEvent;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }

View file

@ -149,6 +149,7 @@ HistoryDeleteBuffer(PHISTORY_BUFFER Hist)
CSR_API(CsrGetCommandHistoryLength) CSR_API(CsrGetCommandHistoryLength)
{ {
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
NTSTATUS Status; NTSTATUS Status;
PHISTORY_BUFFER Hist; PHISTORY_BUFFER Hist;
@ -156,8 +157,8 @@ CSR_API(CsrGetCommandHistoryLength)
INT i; INT i;
if (!Win32CsrValidateBuffer(ProcessData, if (!Win32CsrValidateBuffer(ProcessData,
Request->Data.GetCommandHistoryLength.ExeName.Buffer, ApiMessage->Data.GetCommandHistoryLength.ExeName.Buffer,
Request->Data.GetCommandHistoryLength.ExeName.Length, 1)) ApiMessage->Data.GetCommandHistoryLength.ExeName.Length, 1))
{ {
return STATUS_ACCESS_VIOLATION; return STATUS_ACCESS_VIOLATION;
} }
@ -165,13 +166,13 @@ CSR_API(CsrGetCommandHistoryLength)
Status = ConioConsoleFromProcessData(ProcessData, &Console); Status = ConioConsoleFromProcessData(ProcessData, &Console);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
Hist = HistoryFindBuffer(Console, &Request->Data.GetCommandHistory.ExeName); Hist = HistoryFindBuffer(Console, &ApiMessage->Data.GetCommandHistory.ExeName);
if (Hist) if (Hist)
{ {
for (i = 0; i < Hist->NumEntries; i++) for (i = 0; i < Hist->NumEntries; i++)
Length += Hist->Entries[i].Length + sizeof(WCHAR); Length += Hist->Entries[i].Length + sizeof(WCHAR);
} }
Request->Data.GetCommandHistoryLength.Length = Length; ApiMessage->Data.GetCommandHistoryLength.Length = Length;
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
} }
return Status; return Status;
@ -179,17 +180,18 @@ CSR_API(CsrGetCommandHistoryLength)
CSR_API(CsrGetCommandHistory) CSR_API(CsrGetCommandHistory)
{ {
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
NTSTATUS Status; NTSTATUS Status;
PHISTORY_BUFFER Hist; PHISTORY_BUFFER Hist;
PBYTE Buffer = (PBYTE)Request->Data.GetCommandHistory.History; PBYTE Buffer = (PBYTE)ApiMessage->Data.GetCommandHistory.History;
ULONG BufferSize = Request->Data.GetCommandHistory.Length; ULONG BufferSize = ApiMessage->Data.GetCommandHistory.Length;
INT i; INT i;
if (!Win32CsrValidateBuffer(ProcessData, Buffer, BufferSize, 1) || if (!Win32CsrValidateBuffer(ProcessData, Buffer, BufferSize, 1) ||
!Win32CsrValidateBuffer(ProcessData, !Win32CsrValidateBuffer(ProcessData,
Request->Data.GetCommandHistory.ExeName.Buffer, ApiMessage->Data.GetCommandHistory.ExeName.Buffer,
Request->Data.GetCommandHistory.ExeName.Length, 1)) ApiMessage->Data.GetCommandHistory.ExeName.Length, 1))
{ {
return STATUS_ACCESS_VIOLATION; return STATUS_ACCESS_VIOLATION;
} }
@ -197,7 +199,7 @@ CSR_API(CsrGetCommandHistory)
Status = ConioConsoleFromProcessData(ProcessData, &Console); Status = ConioConsoleFromProcessData(ProcessData, &Console);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
Hist = HistoryFindBuffer(Console, &Request->Data.GetCommandHistory.ExeName); Hist = HistoryFindBuffer(Console, &ApiMessage->Data.GetCommandHistory.ExeName);
if (Hist) if (Hist)
{ {
for (i = 0; i < Hist->NumEntries; i++) for (i = 0; i < Hist->NumEntries; i++)
@ -213,7 +215,7 @@ CSR_API(CsrGetCommandHistory)
Buffer += sizeof(WCHAR); Buffer += sizeof(WCHAR);
} }
} }
Request->Data.GetCommandHistory.Length = Buffer - (PBYTE)Request->Data.GetCommandHistory.History; ApiMessage->Data.GetCommandHistory.Length = Buffer - (PBYTE)ApiMessage->Data.GetCommandHistory.History;
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
} }
return Status; return Status;
@ -221,13 +223,14 @@ CSR_API(CsrGetCommandHistory)
CSR_API(CsrExpungeCommandHistory) CSR_API(CsrExpungeCommandHistory)
{ {
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
PHISTORY_BUFFER Hist; PHISTORY_BUFFER Hist;
NTSTATUS Status; NTSTATUS Status;
if (!Win32CsrValidateBuffer(ProcessData, if (!Win32CsrValidateBuffer(ProcessData,
Request->Data.ExpungeCommandHistory.ExeName.Buffer, ApiMessage->Data.ExpungeCommandHistory.ExeName.Buffer,
Request->Data.ExpungeCommandHistory.ExeName.Length, 1)) ApiMessage->Data.ExpungeCommandHistory.ExeName.Length, 1))
{ {
return STATUS_ACCESS_VIOLATION; return STATUS_ACCESS_VIOLATION;
} }
@ -235,7 +238,7 @@ CSR_API(CsrExpungeCommandHistory)
Status = ConioConsoleFromProcessData(ProcessData, &Console); Status = ConioConsoleFromProcessData(ProcessData, &Console);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
Hist = HistoryFindBuffer(Console, &Request->Data.ExpungeCommandHistory.ExeName); Hist = HistoryFindBuffer(Console, &ApiMessage->Data.ExpungeCommandHistory.ExeName);
HistoryDeleteBuffer(Hist); HistoryDeleteBuffer(Hist);
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
} }
@ -244,15 +247,16 @@ CSR_API(CsrExpungeCommandHistory)
CSR_API(CsrSetHistoryNumberCommands) CSR_API(CsrSetHistoryNumberCommands)
{ {
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
PHISTORY_BUFFER Hist; PHISTORY_BUFFER Hist;
NTSTATUS Status; NTSTATUS Status;
WORD MaxEntries = Request->Data.SetHistoryNumberCommands.NumCommands; WORD MaxEntries = ApiMessage->Data.SetHistoryNumberCommands.NumCommands;
PUNICODE_STRING OldEntryList, NewEntryList; PUNICODE_STRING OldEntryList, NewEntryList;
if (!Win32CsrValidateBuffer(ProcessData, if (!Win32CsrValidateBuffer(ProcessData,
Request->Data.SetHistoryNumberCommands.ExeName.Buffer, ApiMessage->Data.SetHistoryNumberCommands.ExeName.Buffer,
Request->Data.SetHistoryNumberCommands.ExeName.Length, 1)) ApiMessage->Data.SetHistoryNumberCommands.ExeName.Length, 1))
{ {
return STATUS_ACCESS_VIOLATION; return STATUS_ACCESS_VIOLATION;
} }
@ -260,7 +264,7 @@ CSR_API(CsrSetHistoryNumberCommands)
Status = ConioConsoleFromProcessData(ProcessData, &Console); Status = ConioConsoleFromProcessData(ProcessData, &Console);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
Hist = HistoryFindBuffer(Console, &Request->Data.SetHistoryNumberCommands.ExeName); Hist = HistoryFindBuffer(Console, &ApiMessage->Data.SetHistoryNumberCommands.ExeName);
if (Hist) if (Hist)
{ {
OldEntryList = Hist->Entries; OldEntryList = Hist->Entries;
@ -293,12 +297,12 @@ CSR_API(CsrSetHistoryNumberCommands)
CSR_API(CsrGetHistoryInfo) CSR_API(CsrGetHistoryInfo)
{ {
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
NTSTATUS Status = ConioConsoleFromProcessData(ProcessData, &Console); NTSTATUS Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
Request->Data.SetHistoryInfo.HistoryBufferSize = Console->HistoryBufferSize; ApiMessage->Data.SetHistoryInfo.HistoryBufferSize = Console->HistoryBufferSize;
Request->Data.SetHistoryInfo.NumberOfHistoryBuffers = Console->NumberOfHistoryBuffers; ApiMessage->Data.SetHistoryInfo.NumberOfHistoryBuffers = Console->NumberOfHistoryBuffers;
Request->Data.SetHistoryInfo.dwFlags = Console->HistoryNoDup; ApiMessage->Data.SetHistoryInfo.dwFlags = Console->HistoryNoDup;
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
} }
return Status; return Status;
@ -307,12 +311,12 @@ CSR_API(CsrGetHistoryInfo)
CSR_API(CsrSetHistoryInfo) CSR_API(CsrSetHistoryInfo)
{ {
PCSRSS_CONSOLE Console; PCSRSS_CONSOLE Console;
NTSTATUS Status = ConioConsoleFromProcessData(ProcessData, &Console); NTSTATUS Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
Console->HistoryBufferSize = (WORD)Request->Data.SetHistoryInfo.HistoryBufferSize; Console->HistoryBufferSize = (WORD)ApiMessage->Data.SetHistoryInfo.HistoryBufferSize;
Console->NumberOfHistoryBuffers = (WORD)Request->Data.SetHistoryInfo.NumberOfHistoryBuffers; Console->NumberOfHistoryBuffers = (WORD)ApiMessage->Data.SetHistoryInfo.NumberOfHistoryBuffers;
Console->HistoryNoDup = Request->Data.SetHistoryInfo.dwFlags & HISTORY_NO_DUP_FLAG; Console->HistoryNoDup = ApiMessage->Data.SetHistoryInfo.dwFlags & HISTORY_NO_DUP_FLAG;
ConioUnlockConsole(Console); ConioUnlockConsole(Console);
} }
return Status; return Status;