[CSRSRV], [WIN32CSR]

- Move code for managing console handles from csrsrv to win32csr, where the rest of the console code is. No changes in functionality intended.
- Unify the csrsrv->win32csr callbacks (now numbering 4) into one table to avoid excessive code duplication.

svn path=/trunk/; revision=47314
This commit is contained in:
Jeffrey Morlan 2010-05-22 23:47:54 +00:00
parent a2c5273653
commit 7d27afbe96
11 changed files with 228 additions and 259 deletions

View file

@ -18,6 +18,9 @@
#define CsrAcquireProcessLock() LOCK #define CsrAcquireProcessLock() LOCK
#define CsrReleaseProcessLock() UNLOCK #define CsrReleaseProcessLock() UNLOCK
extern NTSTATUS CallProcessInherit(PCSRSS_PROCESS_DATA, PCSRSS_PROCESS_DATA);
extern NTSTATUS CallProcessDeleted(PCSRSS_PROCESS_DATA);
/* GLOBALS *******************************************************************/ /* GLOBALS *******************************************************************/
static ULONG NrProcess; static ULONG NrProcess;
@ -157,7 +160,7 @@ NTSTATUS WINAPI CsrFreeProcessData(HANDLE Pid)
{ {
DPRINT("CsrFreeProcessData pid: %d\n", Pid); DPRINT("CsrFreeProcessData pid: %d\n", Pid);
Process = pProcessData->Process; Process = pProcessData->Process;
CsrReleaseConsole(pProcessData); CallProcessDeleted(pProcessData);
if (pProcessData->CsrSectionViewBase) if (pProcessData->CsrSectionViewBase)
{ {
NtUnmapViewOfSection(NtCurrentProcess(), pProcessData->CsrSectionViewBase); NtUnmapViewOfSection(NtCurrentProcess(), pProcessData->CsrSectionViewBase);
@ -205,7 +208,7 @@ CSR_API(CsrCreateProcess)
NewProcessData->bInheritHandles = Request->Data.CreateProcessRequest.bInheritHandles; NewProcessData->bInheritHandles = Request->Data.CreateProcessRequest.bInheritHandles;
if (Request->Data.CreateProcessRequest.bInheritHandles) if (Request->Data.CreateProcessRequest.bInheritHandles)
{ {
Status = CsrDuplicateHandleTable(ProcessData, NewProcessData); Status = CallProcessInherit(ProcessData, NewProcessData);
} }
} }
@ -343,134 +346,4 @@ CSR_API(CsrSetShutdownParameters)
return(STATUS_SUCCESS); return(STATUS_SUCCESS);
} }
CSR_API(CsrGetInputHandle)
{
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
if (ProcessData->Console)
{
Request->Status = CsrInsertObject(ProcessData,
&Request->Data.GetInputHandleRequest.InputHandle,
(Object_t *)ProcessData->Console,
Request->Data.GetInputHandleRequest.Access,
Request->Data.GetInputHandleRequest.Inheritable);
}
else
{
Request->Data.GetInputHandleRequest.InputHandle = INVALID_HANDLE_VALUE;
Request->Status = STATUS_SUCCESS;
}
return Request->Status;
}
CSR_API(CsrGetOutputHandle)
{
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
if (ProcessData->Console)
{
RtlEnterCriticalSection(&ProcessDataLock);
Request->Status = CsrInsertObject(ProcessData,
&Request->Data.GetOutputHandleRequest.OutputHandle,
&ProcessData->Console->ActiveBuffer->Header,
Request->Data.GetOutputHandleRequest.Access,
Request->Data.GetOutputHandleRequest.Inheritable);
RtlLeaveCriticalSection(&ProcessDataLock);
}
else
{
Request->Data.GetOutputHandleRequest.OutputHandle = INVALID_HANDLE_VALUE;
Request->Status = STATUS_SUCCESS;
}
return Request->Status;
}
CSR_API(CsrCloseHandle)
{
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
return CsrReleaseObject(ProcessData, Request->Data.CloseHandleRequest.Handle);
}
CSR_API(CsrVerifyHandle)
{
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
Request->Status = CsrVerifyObject(ProcessData, Request->Data.VerifyHandleRequest.Handle);
if (!NT_SUCCESS(Request->Status))
{
DPRINT("CsrVerifyObject failed, status=%x\n", Request->Status);
}
return Request->Status;
}
CSR_API(CsrDuplicateHandle)
{
ULONG_PTR Index;
PCSRSS_HANDLE Entry;
DWORD DesiredAccess;
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
Index = (ULONG_PTR)Request->Data.DuplicateHandleRequest.Handle >> 2;
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
if (Index >= ProcessData->HandleTableSize
|| (Entry = &ProcessData->HandleTable[Index])->Object == NULL)
{
DPRINT1("Couldn't dup invalid handle %p\n", Request->Data.DuplicateHandleRequest.Handle);
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return STATUS_INVALID_HANDLE;
}
if (Request->Data.DuplicateHandleRequest.Options & DUPLICATE_SAME_ACCESS)
{
DesiredAccess = Entry->Access;
}
else
{
DesiredAccess = Request->Data.DuplicateHandleRequest.Access;
/* Make sure the source handle has all the desired flags */
if (~Entry->Access & DesiredAccess)
{
DPRINT1("Handle %p only has access %X; requested %X\n",
Request->Data.DuplicateHandleRequest.Handle, Entry->Access, DesiredAccess);
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return STATUS_INVALID_PARAMETER;
}
}
Request->Status = CsrInsertObject(ProcessData,
&Request->Data.DuplicateHandleRequest.Handle,
Entry->Object,
DesiredAccess,
Request->Data.DuplicateHandleRequest.Inheritable);
if (NT_SUCCESS(Request->Status)
&& Request->Data.DuplicateHandleRequest.Options & DUPLICATE_CLOSE_SOURCE)
{
/* Close the original handle. This cannot drop the count to 0, since a new handle now exists */
_InterlockedDecrement(&Entry->Object->ReferenceCount);
Entry->Object = NULL;
}
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return Request->Status;
}
CSR_API(CsrGetInputWaitHandle)
{
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
Request->Data.GetConsoleInputWaitHandle.InputWaitHandle = ProcessData->ConsoleEvent;
return STATUS_SUCCESS;
}
/* EOF */ /* EOF */

View file

@ -10,7 +10,6 @@
<library>pseh</library> <library>pseh</library>
<library>smdll</library> <library>smdll</library>
<directory name="api"> <directory name="api">
<file>handle.c</file>
<file>process.c</file> <file>process.c</file>
<file>user.c</file> <file>user.c</file>
<file>wapi.c</file> <file>wapi.c</file>

View file

@ -18,10 +18,8 @@ HANDLE CsrHeap = (HANDLE) 0;
HANDLE CsrObjectDirectory = (HANDLE) 0; HANDLE CsrObjectDirectory = (HANDLE) 0;
UNICODE_STRING CsrDirectoryName; UNICODE_STRING CsrDirectoryName;
extern HANDLE CsrssApiHeap; extern HANDLE CsrssApiHeap;
static unsigned InitCompleteProcCount; static unsigned ServerProcCount;
static CSRPLUGIN_INIT_COMPLETE_PROC *InitCompleteProcs = NULL; static CSRPLUGIN_SERVER_PROCS *ServerProcs = NULL;
static unsigned HardErrorProcCount;
static CSRPLUGIN_HARDERROR_PROC *HardErrorProcs = NULL;
HANDLE hSbApiPort = (HANDLE) 0; HANDLE hSbApiPort = (HANDLE) 0;
HANDLE hBootstrapOk = (HANDLE) 0; HANDLE hBootstrapOk = (HANDLE) 0;
HANDLE hSmApiPort = (HANDLE) 0; HANDLE hSmApiPort = (HANDLE) 0;
@ -124,60 +122,32 @@ InitializeVideoAddressSpace(VOID)
static NTSTATUS FASTCALL static NTSTATUS FASTCALL
CsrpAddInitCompleteProc(CSRPLUGIN_INIT_COMPLETE_PROC Proc) CsrpAddServerProcs(CSRPLUGIN_SERVER_PROCS *Procs)
{ {
CSRPLUGIN_INIT_COMPLETE_PROC *NewProcs; CSRPLUGIN_SERVER_PROCS *NewProcs;
DPRINT("CSR: %s called\n", __FUNCTION__); DPRINT("CSR: %s called\n", __FUNCTION__);
NewProcs = RtlAllocateHeap(CsrssApiHeap, 0, NewProcs = RtlAllocateHeap(CsrssApiHeap, 0,
(InitCompleteProcCount + 1) (ServerProcCount + 1)
* sizeof(CSRPLUGIN_INIT_COMPLETE_PROC)); * sizeof(CSRPLUGIN_SERVER_PROCS));
if (NULL == NewProcs) if (NULL == NewProcs)
{ {
return STATUS_NO_MEMORY; return STATUS_NO_MEMORY;
} }
if (0 != InitCompleteProcCount) if (0 != ServerProcCount)
{ {
RtlCopyMemory(NewProcs, InitCompleteProcs, RtlCopyMemory(NewProcs, ServerProcs,
InitCompleteProcCount * sizeof(CSRPLUGIN_INIT_COMPLETE_PROC)); ServerProcCount * sizeof(CSRPLUGIN_SERVER_PROCS));
RtlFreeHeap(CsrssApiHeap, 0, InitCompleteProcs); RtlFreeHeap(CsrssApiHeap, 0, ServerProcs);
} }
NewProcs[InitCompleteProcCount] = Proc; NewProcs[ServerProcCount] = *Procs;
InitCompleteProcs = NewProcs; ServerProcs = NewProcs;
InitCompleteProcCount++; ServerProcCount++;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
static NTSTATUS FASTCALL
CsrpAddHardErrorProc(CSRPLUGIN_HARDERROR_PROC Proc)
{
CSRPLUGIN_HARDERROR_PROC *NewProcs;
DPRINT("CSR: %s called\n", __FUNCTION__);
NewProcs = RtlAllocateHeap(CsrssApiHeap, 0,
(HardErrorProcCount + 1)
* sizeof(CSRPLUGIN_HARDERROR_PROC));
if (NULL == NewProcs)
{
return STATUS_NO_MEMORY;
}
if (0 != HardErrorProcCount)
{
RtlCopyMemory(NewProcs, HardErrorProcs,
HardErrorProcCount * sizeof(CSRPLUGIN_HARDERROR_PROC));
RtlFreeHeap(CsrssApiHeap, 0, HardErrorProcs);
}
NewProcs[HardErrorProcCount] = Proc;
HardErrorProcs = NewProcs;
HardErrorProcCount++;
return STATUS_SUCCESS;
}
/********************************************************************** /**********************************************************************
* CallInitComplete/0 * CallInitComplete/0
*/ */
@ -190,13 +160,9 @@ CallInitComplete(void)
DPRINT("CSR: %s called\n", __FUNCTION__); DPRINT("CSR: %s called\n", __FUNCTION__);
Ok = TRUE; Ok = TRUE;
if (0 != InitCompleteProcCount) for (i = 0; i < ServerProcCount && Ok; i++)
{ {
for (i = 0; i < InitCompleteProcCount && Ok; i++) Ok = (*ServerProcs[i].InitCompleteProc)();
{
Ok = (*(InitCompleteProcs[i]))();
}
RtlFreeHeap(CsrssApiHeap, 0, InitCompleteProcs);
} }
return Ok; return Ok;
@ -212,17 +178,44 @@ CallHardError(IN PCSRSS_PROCESS_DATA ProcessData,
DPRINT("CSR: %s called\n", __FUNCTION__); DPRINT("CSR: %s called\n", __FUNCTION__);
Ok = TRUE; Ok = TRUE;
if (0 != HardErrorProcCount) for (i = 0; i < ServerProcCount && Ok; i++)
{ {
for (i = 0; i < HardErrorProcCount && Ok; i++) Ok = (*ServerProcs[i].HardErrorProc)(ProcessData, HardErrorMessage);
{
Ok = (*(HardErrorProcs[i]))(ProcessData, HardErrorMessage);
}
} }
return Ok; return Ok;
} }
NTSTATUS
CallProcessInherit(IN PCSRSS_PROCESS_DATA SourceProcessData,
IN PCSRSS_PROCESS_DATA TargetProcessData)
{
NTSTATUS Status = STATUS_SUCCESS;
unsigned i;
DPRINT("CSR: %s called\n", __FUNCTION__);
for (i = 0; i < ServerProcCount && NT_SUCCESS(Status); i++)
Status = (*ServerProcs[i].ProcessInheritProc)(SourceProcessData, TargetProcessData);
return Status;
}
NTSTATUS
CallProcessDeleted(IN PCSRSS_PROCESS_DATA ProcessData)
{
NTSTATUS Status = STATUS_SUCCESS;
unsigned i;
DPRINT("CSR: %s called\n", __FUNCTION__);
for (i = 0; i < ServerProcCount && NT_SUCCESS(Status); i++)
Status = (*ServerProcs[i].ProcessDeletedProc)(ProcessData);
return Status;
}
ULONG ULONG
InitializeVideoAddressSpace(VOID); InitializeVideoAddressSpace(VOID);
@ -313,9 +306,7 @@ CsrpInitWin32Csr (int argc, char ** argv, char ** envp)
CSRPLUGIN_INITIALIZE_PROC InitProc; CSRPLUGIN_INITIALIZE_PROC InitProc;
CSRSS_EXPORTED_FUNCS Exports; CSRSS_EXPORTED_FUNCS Exports;
PCSRSS_API_DEFINITION ApiDefinitions; PCSRSS_API_DEFINITION ApiDefinitions;
PCSRSS_OBJECT_DEFINITION ObjectDefinitions; CSRPLUGIN_SERVER_PROCS ServerProcs;
CSRPLUGIN_INIT_COMPLETE_PROC InitCompleteProc;
CSRPLUGIN_HARDERROR_PROC HardErrorProc;
DPRINT("CSR: %s called\n", __FUNCTION__); DPRINT("CSR: %s called\n", __FUNCTION__);
@ -331,14 +322,8 @@ CsrpInitWin32Csr (int argc, char ** argv, char ** envp)
{ {
return Status; return Status;
} }
Exports.CsrInsertObjectProc = CsrInsertObject;
Exports.CsrGetObjectProc = CsrGetObject;
Exports.CsrReleaseObjectByPointerProc = CsrReleaseObjectByPointer;
Exports.CsrReleaseObjectProc = CsrReleaseObject;
Exports.CsrReleaseConsoleProc = CsrReleaseConsole;
Exports.CsrEnumProcessesProc = CsrEnumProcesses; Exports.CsrEnumProcessesProc = CsrEnumProcesses;
if (! (*InitProc)(&ApiDefinitions, &ObjectDefinitions, &InitCompleteProc, if (! (*InitProc)(&ApiDefinitions, &ServerProcs, &Exports, CsrssApiHeap))
&HardErrorProc, &Exports, CsrssApiHeap))
{ {
return STATUS_UNSUCCESSFUL; return STATUS_UNSUCCESSFUL;
} }
@ -348,17 +333,7 @@ CsrpInitWin32Csr (int argc, char ** argv, char ** envp)
{ {
return Status; return Status;
} }
Status = CsrRegisterObjectDefinitions(ObjectDefinitions); Status = CsrpAddServerProcs(&ServerProcs);
if (! NT_SUCCESS(Status))
{
return Status;
}
if (NULL != InitCompleteProc)
{
Status = CsrpAddInitCompleteProc(InitCompleteProc);
}
if (HardErrorProc) Status = CsrpAddHardErrorProc(HardErrorProc);
return Status; return Status;
} }
@ -371,12 +346,6 @@ CSRSS_API_DEFINITION NativeDefinitions[] =
CSRSS_DEFINE_API(REGISTER_SERVICES_PROCESS, CsrRegisterServicesProcess), CSRSS_DEFINE_API(REGISTER_SERVICES_PROCESS, CsrRegisterServicesProcess),
CSRSS_DEFINE_API(GET_SHUTDOWN_PARAMETERS, CsrGetShutdownParameters), CSRSS_DEFINE_API(GET_SHUTDOWN_PARAMETERS, CsrGetShutdownParameters),
CSRSS_DEFINE_API(SET_SHUTDOWN_PARAMETERS, CsrSetShutdownParameters), CSRSS_DEFINE_API(SET_SHUTDOWN_PARAMETERS, CsrSetShutdownParameters),
CSRSS_DEFINE_API(GET_INPUT_HANDLE, CsrGetInputHandle),
CSRSS_DEFINE_API(GET_OUTPUT_HANDLE, CsrGetOutputHandle),
CSRSS_DEFINE_API(CLOSE_HANDLE, CsrCloseHandle),
CSRSS_DEFINE_API(VERIFY_HANDLE, CsrVerifyHandle),
CSRSS_DEFINE_API(DUPLICATE_HANDLE, CsrDuplicateHandle),
CSRSS_DEFINE_API(GET_INPUT_WAIT_HANDLE, CsrGetInputWaitHandle),
{ 0, 0, NULL } { 0, 0, NULL }
}; };

View file

@ -71,8 +71,8 @@ typedef struct _CSRSS_HANDLE
typedef struct _CSRSS_PROCESS_DATA typedef struct _CSRSS_PROCESS_DATA
{ {
PCSRSS_CONSOLE Console; struct tagCSRSS_CONSOLE *Console;
PCSRSS_CONSOLE ParentConsole; struct tagCSRSS_CONSOLE *ParentConsole;
BOOL bInheritHandles; BOOL bInheritHandles;
RTL_CRITICAL_SECTION HandleTableLock; RTL_CRITICAL_SECTION HandleTableLock;
ULONG HandleTableSize; ULONG HandleTableSize;

View file

@ -21,29 +21,11 @@
#include <windows.h> #include <windows.h>
#include "api.h" #include "api.h"
typedef NTSTATUS (WINAPI *CSRSS_INSERT_OBJECT_PROC)(PCSRSS_PROCESS_DATA ProcessData,
PHANDLE Handle,
Object_t *Object,
DWORD Access,
BOOL Inheritable);
typedef NTSTATUS (WINAPI *CSRSS_GET_OBJECT_PROC)(PCSRSS_PROCESS_DATA ProcessData,
HANDLE Handle,
Object_t **Object,
DWORD Access);
typedef NTSTATUS (WINAPI *CSRSS_RELEASE_OBJECT_BY_POINTER_PROC)(Object_t *Object);
typedef NTSTATUS (WINAPI *CSRSS_RELEASE_OBJECT_PROC)(PCSRSS_PROCESS_DATA ProcessData,
HANDLE Object );
typedef NTSTATUS (WINAPI *CSRSS_RELEASE_CONSOLE_PROC)(PCSRSS_PROCESS_DATA ProcessData);
typedef NTSTATUS (WINAPI *CSRSS_ENUM_PROCESSES_PROC)(CSRSS_ENUM_PROCESS_PROC EnumProc, typedef NTSTATUS (WINAPI *CSRSS_ENUM_PROCESSES_PROC)(CSRSS_ENUM_PROCESS_PROC EnumProc,
PVOID Context); PVOID Context);
typedef struct tagCSRSS_EXPORTED_FUNCS typedef struct tagCSRSS_EXPORTED_FUNCS
{ {
CSRSS_INSERT_OBJECT_PROC CsrInsertObjectProc;
CSRSS_GET_OBJECT_PROC CsrGetObjectProc;
CSRSS_RELEASE_OBJECT_BY_POINTER_PROC CsrReleaseObjectByPointerProc;
CSRSS_RELEASE_OBJECT_PROC CsrReleaseObjectProc;
CSRSS_RELEASE_CONSOLE_PROC CsrReleaseConsoleProc;
CSRSS_ENUM_PROCESSES_PROC CsrEnumProcessesProc; CSRSS_ENUM_PROCESSES_PROC CsrEnumProcessesProc;
} CSRSS_EXPORTED_FUNCS, *PCSRSS_EXPORTED_FUNCS; } CSRSS_EXPORTED_FUNCS, *PCSRSS_EXPORTED_FUNCS;
@ -52,10 +34,21 @@ typedef BOOL (WINAPI *CSRPLUGIN_INIT_COMPLETE_PROC)(void);
typedef BOOL (WINAPI *CSRPLUGIN_HARDERROR_PROC)(IN PCSRSS_PROCESS_DATA ProcessData, typedef BOOL (WINAPI *CSRPLUGIN_HARDERROR_PROC)(IN PCSRSS_PROCESS_DATA ProcessData,
IN PHARDERROR_MSG HardErrorMessage); IN PHARDERROR_MSG HardErrorMessage);
typedef NTSTATUS (WINAPI *CSRPLUGIN_PROCESS_INHERIT_PROC)(IN PCSRSS_PROCESS_DATA SourceProcessData,
IN PCSRSS_PROCESS_DATA TargetProcessData);
typedef NTSTATUS (WINAPI *CSRPLUGIN_PROCESS_DELETED_PROC)(IN PCSRSS_PROCESS_DATA ProcessData);
typedef struct tagCSRSS_SERVER_PROCS
{
CSRPLUGIN_INIT_COMPLETE_PROC InitCompleteProc;
CSRPLUGIN_HARDERROR_PROC HardErrorProc;
CSRPLUGIN_PROCESS_INHERIT_PROC ProcessInheritProc;
CSRPLUGIN_PROCESS_DELETED_PROC ProcessDeletedProc;
} CSRPLUGIN_SERVER_PROCS, *PCSRPLUGIN_SERVER_PROCS;
typedef BOOL (WINAPI *CSRPLUGIN_INITIALIZE_PROC)(PCSRSS_API_DEFINITION *ApiDefinitions, typedef BOOL (WINAPI *CSRPLUGIN_INITIALIZE_PROC)(PCSRSS_API_DEFINITION *ApiDefinitions,
PCSRSS_OBJECT_DEFINITION *ObjectDefinitions, PCSRPLUGIN_SERVER_PROCS ServerProcs,
CSRPLUGIN_INIT_COMPLETE_PROC *InitCompleteProc,
CSRPLUGIN_HARDERROR_PROC *HardErrorProc,
PCSRSS_EXPORTED_FUNCS Exports, PCSRSS_EXPORTED_FUNCS Exports,
HANDLE CsrssApiHeap); HANDLE CsrssApiHeap);

View file

@ -24,6 +24,12 @@ static CSRSS_EXPORTED_FUNCS CsrExports;
static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] = static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] =
{ {
CSRSS_DEFINE_API(GET_INPUT_HANDLE, CsrGetInputHandle),
CSRSS_DEFINE_API(GET_OUTPUT_HANDLE, CsrGetOutputHandle),
CSRSS_DEFINE_API(CLOSE_HANDLE, CsrCloseHandle),
CSRSS_DEFINE_API(VERIFY_HANDLE, CsrVerifyHandle),
CSRSS_DEFINE_API(DUPLICATE_HANDLE, CsrDuplicateHandle),
CSRSS_DEFINE_API(GET_INPUT_WAIT_HANDLE, CsrGetInputWaitHandle),
CSRSS_DEFINE_API(WRITE_CONSOLE, CsrWriteConsole), CSRSS_DEFINE_API(WRITE_CONSOLE, CsrWriteConsole),
CSRSS_DEFINE_API(READ_CONSOLE, CsrReadConsole), CSRSS_DEFINE_API(READ_CONSOLE, CsrReadConsole),
CSRSS_DEFINE_API(ALLOC_CONSOLE, CsrAllocConsole), CSRSS_DEFINE_API(ALLOC_CONSOLE, CsrAllocConsole),
@ -108,7 +114,7 @@ Win32CsrInsertObject(PCSRSS_PROCESS_DATA ProcessData,
DWORD Access, DWORD Access,
BOOL Inheritable) BOOL Inheritable)
{ {
return (CsrExports.CsrInsertObjectProc)(ProcessData, Handle, Object, Access, Inheritable); return CsrInsertObject(ProcessData, Handle, Object, Access, Inheritable);
} }
NTSTATUS FASTCALL NTSTATUS FASTCALL
@ -117,7 +123,7 @@ Win32CsrGetObject(PCSRSS_PROCESS_DATA ProcessData,
Object_t **Object, Object_t **Object,
DWORD Access) DWORD Access)
{ {
return (CsrExports.CsrGetObjectProc)(ProcessData, Handle, Object, Access); return CsrGetObject(ProcessData, Handle, Object, Access);
} }
NTSTATUS FASTCALL NTSTATUS FASTCALL
@ -129,7 +135,7 @@ Win32CsrLockObject(PCSRSS_PROCESS_DATA ProcessData,
{ {
NTSTATUS Status; NTSTATUS Status;
Status = (CsrExports.CsrGetObjectProc)(ProcessData, Handle, Object, Access); Status = CsrGetObject(ProcessData, Handle, Object, Access);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
@ -137,7 +143,7 @@ Win32CsrLockObject(PCSRSS_PROCESS_DATA ProcessData,
if ((*Object)->Type != Type) if ((*Object)->Type != Type)
{ {
(CsrExports.CsrReleaseObjectByPointerProc)(*Object); CsrReleaseObjectByPointer(*Object);
return STATUS_INVALID_HANDLE; return STATUS_INVALID_HANDLE;
} }
@ -150,26 +156,26 @@ VOID FASTCALL
Win32CsrUnlockObject(Object_t *Object) Win32CsrUnlockObject(Object_t *Object)
{ {
LeaveCriticalSection(&(Object->Lock)); LeaveCriticalSection(&(Object->Lock));
(CsrExports.CsrReleaseObjectByPointerProc)(Object); CsrReleaseObjectByPointer(Object);
} }
NTSTATUS FASTCALL NTSTATUS FASTCALL
Win32CsrReleaseObjectByPointer(Object_t *Object) Win32CsrReleaseObjectByPointer(Object_t *Object)
{ {
return (CsrExports.CsrReleaseObjectByPointerProc)(Object); return CsrReleaseObjectByPointer(Object);
} }
NTSTATUS FASTCALL NTSTATUS FASTCALL
Win32CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData, Win32CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData,
HANDLE Object) HANDLE Object)
{ {
return (CsrExports.CsrReleaseObjectProc)(ProcessData, Object); return CsrReleaseObject(ProcessData, Object);
} }
NTSTATUS FASTCALL NTSTATUS FASTCALL
Win32CsrReleaseConsole(PCSRSS_PROCESS_DATA ProcessData) Win32CsrReleaseConsole(PCSRSS_PROCESS_DATA ProcessData)
{ {
return (CsrExports.CsrReleaseConsoleProc)(ProcessData); return CsrReleaseConsole(ProcessData);
} }
NTSTATUS FASTCALL NTSTATUS FASTCALL
@ -189,9 +195,7 @@ Win32CsrInitComplete(void)
BOOL WINAPI BOOL WINAPI
Win32CsrInitialization(PCSRSS_API_DEFINITION *ApiDefinitions, Win32CsrInitialization(PCSRSS_API_DEFINITION *ApiDefinitions,
PCSRSS_OBJECT_DEFINITION *ObjectDefinitions, PCSRPLUGIN_SERVER_PROCS ServerProcs,
CSRPLUGIN_INIT_COMPLETE_PROC *InitComplete,
CSRPLUGIN_HARDERROR_PROC *HardError,
PCSRSS_EXPORTED_FUNCS Exports, PCSRSS_EXPORTED_FUNCS Exports,
HANDLE CsrssApiHeap) HANDLE CsrssApiHeap)
{ {
@ -203,11 +207,13 @@ Win32CsrInitialization(PCSRSS_API_DEFINITION *ApiDefinitions,
PrivateCsrssManualGuiCheck(0); PrivateCsrssManualGuiCheck(0);
CsrInitConsoleSupport(); CsrInitConsoleSupport();
CsrRegisterObjectDefinitions(Win32CsrObjectDefinitions);
*ApiDefinitions = Win32CsrApiDefinitions; *ApiDefinitions = Win32CsrApiDefinitions;
*ObjectDefinitions = Win32CsrObjectDefinitions; ServerProcs->InitCompleteProc = Win32CsrInitComplete;
*InitComplete = Win32CsrInitComplete; ServerProcs->HardErrorProc = Win32CsrHardError;
*HardError = Win32CsrHardError; ServerProcs->ProcessInheritProc = CsrDuplicateHandleTable;
ServerProcs->ProcessDeletedProc = CsrReleaseConsole;
return TRUE; return TRUE;
} }

View file

@ -9,7 +9,7 @@
/* INCLUDES ******************************************************************/ /* INCLUDES ******************************************************************/
#include <srv.h> #include <w32csr.h>
#define NDEBUG #define NDEBUG
#include <debug.h> #include <debug.h>
@ -42,7 +42,7 @@ CsrRegisterObjectDefinitions(
NewCount++; NewCount++;
} }
New = RtlAllocateHeap(CsrssApiHeap, New = RtlAllocateHeap(Win32CsrApiHeap,
0, 0,
(ObjectDefinitionsCount + NewCount) (ObjectDefinitionsCount + NewCount)
* sizeof(CSRSS_OBJECT_DEFINITION)); * sizeof(CSRSS_OBJECT_DEFINITION));
@ -57,7 +57,7 @@ CsrRegisterObjectDefinitions(
RtlCopyMemory(New, RtlCopyMemory(New,
ObjectDefinitions, ObjectDefinitions,
ObjectDefinitionsCount * sizeof(CSRSS_OBJECT_DEFINITION)); ObjectDefinitionsCount * sizeof(CSRSS_OBJECT_DEFINITION));
RtlFreeHeap(CsrssApiHeap, 0, ObjectDefinitions); RtlFreeHeap(Win32CsrApiHeap, 0, ObjectDefinitions);
} }
RtlCopyMemory(New + ObjectDefinitionsCount, RtlCopyMemory(New + ObjectDefinitionsCount,
@ -171,7 +171,7 @@ CsrReleaseConsole(
if (HandleTable[i].Object != NULL) if (HandleTable[i].Object != NULL)
CsrReleaseObjectByPointer(HandleTable[i].Object); CsrReleaseObjectByPointer(HandleTable[i].Object);
} }
RtlFreeHeap(CsrssApiHeap, 0, HandleTable); RtlFreeHeap(Win32CsrApiHeap, 0, HandleTable);
if (Console != NULL) if (Console != NULL)
{ {
@ -208,7 +208,7 @@ CsrInsertObject(
} }
if (i >= ProcessData->HandleTableSize) if (i >= ProcessData->HandleTableSize)
{ {
Block = RtlAllocateHeap(CsrssApiHeap, Block = RtlAllocateHeap(Win32CsrApiHeap,
HEAP_ZERO_MEMORY, HEAP_ZERO_MEMORY,
(ProcessData->HandleTableSize + 64) * sizeof(CSRSS_HANDLE)); (ProcessData->HandleTableSize + 64) * sizeof(CSRSS_HANDLE));
if (Block == NULL) if (Block == NULL)
@ -220,7 +220,7 @@ CsrInsertObject(
ProcessData->HandleTable, ProcessData->HandleTable,
ProcessData->HandleTableSize * sizeof(CSRSS_HANDLE)); ProcessData->HandleTableSize * sizeof(CSRSS_HANDLE));
Block = _InterlockedExchangePointer((void* volatile)&ProcessData->HandleTable, Block); Block = _InterlockedExchangePointer((void* volatile)&ProcessData->HandleTable, Block);
RtlFreeHeap( CsrssApiHeap, 0, Block ); RtlFreeHeap( Win32CsrApiHeap, 0, Block );
ProcessData->HandleTableSize += 64; ProcessData->HandleTableSize += 64;
} }
ProcessData->HandleTable[i].Object = Object; ProcessData->HandleTable[i].Object = Object;
@ -249,7 +249,7 @@ CsrDuplicateHandleTable(
/* we are called from CreateProcessData, it isn't necessary to lock the target process data */ /* we are called from CreateProcessData, it isn't necessary to lock the target process data */
TargetProcessData->HandleTable = RtlAllocateHeap(CsrssApiHeap, TargetProcessData->HandleTable = RtlAllocateHeap(Win32CsrApiHeap,
HEAP_ZERO_MEMORY, HEAP_ZERO_MEMORY,
SourceProcessData->HandleTableSize SourceProcessData->HandleTableSize
* sizeof(CSRSS_HANDLE)); * sizeof(CSRSS_HANDLE));
@ -289,4 +289,132 @@ CsrVerifyObject(
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
CSR_API(CsrGetInputHandle)
{
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
if (ProcessData->Console)
{
Request->Status = CsrInsertObject(ProcessData,
&Request->Data.GetInputHandleRequest.InputHandle,
(Object_t *)ProcessData->Console,
Request->Data.GetInputHandleRequest.Access,
Request->Data.GetInputHandleRequest.Inheritable);
}
else
{
Request->Data.GetInputHandleRequest.InputHandle = INVALID_HANDLE_VALUE;
Request->Status = STATUS_SUCCESS;
}
return Request->Status;
}
CSR_API(CsrGetOutputHandle)
{
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
if (ProcessData->Console)
{
Request->Status = CsrInsertObject(ProcessData,
&Request->Data.GetOutputHandleRequest.OutputHandle,
&ProcessData->Console->ActiveBuffer->Header,
Request->Data.GetOutputHandleRequest.Access,
Request->Data.GetOutputHandleRequest.Inheritable);
}
else
{
Request->Data.GetOutputHandleRequest.OutputHandle = INVALID_HANDLE_VALUE;
Request->Status = STATUS_SUCCESS;
}
return Request->Status;
}
CSR_API(CsrCloseHandle)
{
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
return CsrReleaseObject(ProcessData, Request->Data.CloseHandleRequest.Handle);
}
CSR_API(CsrVerifyHandle)
{
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
Request->Status = CsrVerifyObject(ProcessData, Request->Data.VerifyHandleRequest.Handle);
if (!NT_SUCCESS(Request->Status))
{
DPRINT("CsrVerifyObject failed, status=%x\n", Request->Status);
}
return Request->Status;
}
CSR_API(CsrDuplicateHandle)
{
ULONG_PTR Index;
PCSRSS_HANDLE Entry;
DWORD DesiredAccess;
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
Index = (ULONG_PTR)Request->Data.DuplicateHandleRequest.Handle >> 2;
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
if (Index >= ProcessData->HandleTableSize
|| (Entry = &ProcessData->HandleTable[Index])->Object == NULL)
{
DPRINT1("Couldn't dup invalid handle %p\n", Request->Data.DuplicateHandleRequest.Handle);
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return STATUS_INVALID_HANDLE;
}
if (Request->Data.DuplicateHandleRequest.Options & DUPLICATE_SAME_ACCESS)
{
DesiredAccess = Entry->Access;
}
else
{
DesiredAccess = Request->Data.DuplicateHandleRequest.Access;
/* Make sure the source handle has all the desired flags */
if (~Entry->Access & DesiredAccess)
{
DPRINT1("Handle %p only has access %X; requested %X\n",
Request->Data.DuplicateHandleRequest.Handle, Entry->Access, DesiredAccess);
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return STATUS_INVALID_PARAMETER;
}
}
Request->Status = CsrInsertObject(ProcessData,
&Request->Data.DuplicateHandleRequest.Handle,
Entry->Object,
DesiredAccess,
Request->Data.DuplicateHandleRequest.Inheritable);
if (NT_SUCCESS(Request->Status)
&& Request->Data.DuplicateHandleRequest.Options & DUPLICATE_CLOSE_SOURCE)
{
/* Close the original handle. This cannot drop the count to 0, since a new handle now exists */
_InterlockedDecrement(&Entry->Object->ReferenceCount);
Entry->Object = NULL;
}
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return Request->Status;
}
CSR_API(CsrGetInputWaitHandle)
{
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
Request->Data.GetConsoleInputWaitHandle.InputWaitHandle = ProcessData->ConsoleEvent;
return STATUS_SUCCESS;
}
/* EOF */ /* EOF */

View file

@ -22,6 +22,7 @@
<file>dllmain.c</file> <file>dllmain.c</file>
<file>exitros.c</file> <file>exitros.c</file>
<file>guiconsole.c</file> <file>guiconsole.c</file>
<file>handle.c</file>
<file>harderror.c</file> <file>harderror.c</file>
<file>tuiconsole.c</file> <file>tuiconsole.c</file>
<file>appswitch.c</file> <file>appswitch.c</file>

View file

@ -1 +1 @@
@ stdcall Win32CsrInitialization(ptr ptr ptr ptr ptr ptr) @ stdcall Win32CsrInitialization(ptr ptr ptr ptr)