diff --git a/reactos/subsystems/win32/csrss/csrsrv/api/process.c b/reactos/subsystems/win32/csrss/csrsrv/api/process.c
index 580cb21943b..8b7a4832f8d 100644
--- a/reactos/subsystems/win32/csrss/csrsrv/api/process.c
+++ b/reactos/subsystems/win32/csrss/csrsrv/api/process.c
@@ -18,6 +18,9 @@
#define CsrAcquireProcessLock() LOCK
#define CsrReleaseProcessLock() UNLOCK
+extern NTSTATUS CallProcessInherit(PCSRSS_PROCESS_DATA, PCSRSS_PROCESS_DATA);
+extern NTSTATUS CallProcessDeleted(PCSRSS_PROCESS_DATA);
+
/* GLOBALS *******************************************************************/
static ULONG NrProcess;
@@ -157,7 +160,7 @@ NTSTATUS WINAPI CsrFreeProcessData(HANDLE Pid)
{
DPRINT("CsrFreeProcessData pid: %d\n", Pid);
Process = pProcessData->Process;
- CsrReleaseConsole(pProcessData);
+ CallProcessDeleted(pProcessData);
if (pProcessData->CsrSectionViewBase)
{
NtUnmapViewOfSection(NtCurrentProcess(), pProcessData->CsrSectionViewBase);
@@ -205,7 +208,7 @@ CSR_API(CsrCreateProcess)
NewProcessData->bInheritHandles = 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);
}
-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 */
diff --git a/reactos/subsystems/win32/csrss/csrsrv/csrsrv.rbuild b/reactos/subsystems/win32/csrss/csrsrv/csrsrv.rbuild
index 3f002106bfe..c7b9b53acff 100644
--- a/reactos/subsystems/win32/csrss/csrsrv/csrsrv.rbuild
+++ b/reactos/subsystems/win32/csrss/csrsrv/csrsrv.rbuild
@@ -10,7 +10,6 @@
pseh
smdll
- handle.c
process.c
user.c
wapi.c
diff --git a/reactos/subsystems/win32/csrss/csrsrv/init.c b/reactos/subsystems/win32/csrss/csrsrv/init.c
index a5076284740..c66411cf18a 100644
--- a/reactos/subsystems/win32/csrss/csrsrv/init.c
+++ b/reactos/subsystems/win32/csrss/csrsrv/init.c
@@ -18,10 +18,8 @@ HANDLE CsrHeap = (HANDLE) 0;
HANDLE CsrObjectDirectory = (HANDLE) 0;
UNICODE_STRING CsrDirectoryName;
extern HANDLE CsrssApiHeap;
-static unsigned InitCompleteProcCount;
-static CSRPLUGIN_INIT_COMPLETE_PROC *InitCompleteProcs = NULL;
-static unsigned HardErrorProcCount;
-static CSRPLUGIN_HARDERROR_PROC *HardErrorProcs = NULL;
+static unsigned ServerProcCount;
+static CSRPLUGIN_SERVER_PROCS *ServerProcs = NULL;
HANDLE hSbApiPort = (HANDLE) 0;
HANDLE hBootstrapOk = (HANDLE) 0;
HANDLE hSmApiPort = (HANDLE) 0;
@@ -124,60 +122,32 @@ InitializeVideoAddressSpace(VOID)
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__);
NewProcs = RtlAllocateHeap(CsrssApiHeap, 0,
- (InitCompleteProcCount + 1)
- * sizeof(CSRPLUGIN_INIT_COMPLETE_PROC));
+ (ServerProcCount + 1)
+ * sizeof(CSRPLUGIN_SERVER_PROCS));
if (NULL == NewProcs)
{
return STATUS_NO_MEMORY;
}
- if (0 != InitCompleteProcCount)
+ if (0 != ServerProcCount)
{
- RtlCopyMemory(NewProcs, InitCompleteProcs,
- InitCompleteProcCount * sizeof(CSRPLUGIN_INIT_COMPLETE_PROC));
- RtlFreeHeap(CsrssApiHeap, 0, InitCompleteProcs);
+ RtlCopyMemory(NewProcs, ServerProcs,
+ ServerProcCount * sizeof(CSRPLUGIN_SERVER_PROCS));
+ RtlFreeHeap(CsrssApiHeap, 0, ServerProcs);
}
- NewProcs[InitCompleteProcCount] = Proc;
- InitCompleteProcs = NewProcs;
- InitCompleteProcCount++;
+ NewProcs[ServerProcCount] = *Procs;
+ ServerProcs = NewProcs;
+ ServerProcCount++;
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
*/
@@ -190,13 +160,9 @@ CallInitComplete(void)
DPRINT("CSR: %s called\n", __FUNCTION__);
Ok = TRUE;
- if (0 != InitCompleteProcCount)
+ for (i = 0; i < ServerProcCount && Ok; i++)
{
- for (i = 0; i < InitCompleteProcCount && Ok; i++)
- {
- Ok = (*(InitCompleteProcs[i]))();
- }
- RtlFreeHeap(CsrssApiHeap, 0, InitCompleteProcs);
+ Ok = (*ServerProcs[i].InitCompleteProc)();
}
return Ok;
@@ -212,17 +178,44 @@ CallHardError(IN PCSRSS_PROCESS_DATA ProcessData,
DPRINT("CSR: %s called\n", __FUNCTION__);
Ok = TRUE;
- if (0 != HardErrorProcCount)
+ for (i = 0; i < ServerProcCount && Ok; i++)
{
- for (i = 0; i < HardErrorProcCount && Ok; i++)
- {
- Ok = (*(HardErrorProcs[i]))(ProcessData, HardErrorMessage);
- }
+ Ok = (*ServerProcs[i].HardErrorProc)(ProcessData, HardErrorMessage);
}
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
InitializeVideoAddressSpace(VOID);
@@ -313,9 +306,7 @@ CsrpInitWin32Csr (int argc, char ** argv, char ** envp)
CSRPLUGIN_INITIALIZE_PROC InitProc;
CSRSS_EXPORTED_FUNCS Exports;
PCSRSS_API_DEFINITION ApiDefinitions;
- PCSRSS_OBJECT_DEFINITION ObjectDefinitions;
- CSRPLUGIN_INIT_COMPLETE_PROC InitCompleteProc;
- CSRPLUGIN_HARDERROR_PROC HardErrorProc;
+ CSRPLUGIN_SERVER_PROCS ServerProcs;
DPRINT("CSR: %s called\n", __FUNCTION__);
@@ -331,14 +322,8 @@ CsrpInitWin32Csr (int argc, char ** argv, char ** envp)
{
return Status;
}
- Exports.CsrInsertObjectProc = CsrInsertObject;
- Exports.CsrGetObjectProc = CsrGetObject;
- Exports.CsrReleaseObjectByPointerProc = CsrReleaseObjectByPointer;
- Exports.CsrReleaseObjectProc = CsrReleaseObject;
- Exports.CsrReleaseConsoleProc = CsrReleaseConsole;
Exports.CsrEnumProcessesProc = CsrEnumProcesses;
- if (! (*InitProc)(&ApiDefinitions, &ObjectDefinitions, &InitCompleteProc,
- &HardErrorProc, &Exports, CsrssApiHeap))
+ if (! (*InitProc)(&ApiDefinitions, &ServerProcs, &Exports, CsrssApiHeap))
{
return STATUS_UNSUCCESSFUL;
}
@@ -348,17 +333,7 @@ CsrpInitWin32Csr (int argc, char ** argv, char ** envp)
{
return Status;
}
- Status = CsrRegisterObjectDefinitions(ObjectDefinitions);
- if (! NT_SUCCESS(Status))
- {
- return Status;
- }
- if (NULL != InitCompleteProc)
- {
- Status = CsrpAddInitCompleteProc(InitCompleteProc);
- }
- if (HardErrorProc) Status = CsrpAddHardErrorProc(HardErrorProc);
-
+ Status = CsrpAddServerProcs(&ServerProcs);
return Status;
}
@@ -371,12 +346,6 @@ CSRSS_API_DEFINITION NativeDefinitions[] =
CSRSS_DEFINE_API(REGISTER_SERVICES_PROCESS, CsrRegisterServicesProcess),
CSRSS_DEFINE_API(GET_SHUTDOWN_PARAMETERS, CsrGetShutdownParameters),
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 }
};
diff --git a/reactos/subsystems/win32/csrss/include/api.h b/reactos/subsystems/win32/csrss/include/api.h
index 444cee7777d..c927ea80360 100644
--- a/reactos/subsystems/win32/csrss/include/api.h
+++ b/reactos/subsystems/win32/csrss/include/api.h
@@ -71,8 +71,8 @@ typedef struct _CSRSS_HANDLE
typedef struct _CSRSS_PROCESS_DATA
{
- PCSRSS_CONSOLE Console;
- PCSRSS_CONSOLE ParentConsole;
+ struct tagCSRSS_CONSOLE *Console;
+ struct tagCSRSS_CONSOLE *ParentConsole;
BOOL bInheritHandles;
RTL_CRITICAL_SECTION HandleTableLock;
ULONG HandleTableSize;
diff --git a/reactos/subsystems/win32/csrss/include/csrplugin.h b/reactos/subsystems/win32/csrss/include/csrplugin.h
index 24c0c7debc3..20830bc76eb 100644
--- a/reactos/subsystems/win32/csrss/include/csrplugin.h
+++ b/reactos/subsystems/win32/csrss/include/csrplugin.h
@@ -21,29 +21,11 @@
#include
#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,
PVOID Context);
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_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,
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,
- PCSRSS_OBJECT_DEFINITION *ObjectDefinitions,
- CSRPLUGIN_INIT_COMPLETE_PROC *InitCompleteProc,
- CSRPLUGIN_HARDERROR_PROC *HardErrorProc,
+ PCSRPLUGIN_SERVER_PROCS ServerProcs,
PCSRSS_EXPORTED_FUNCS Exports,
HANDLE CsrssApiHeap);
diff --git a/reactos/subsystems/win32/csrss/include/conio.h b/reactos/subsystems/win32/csrss/win32csr/conio.h
similarity index 100%
rename from reactos/subsystems/win32/csrss/include/conio.h
rename to reactos/subsystems/win32/csrss/win32csr/conio.h
diff --git a/reactos/subsystems/win32/csrss/win32csr/dllmain.c b/reactos/subsystems/win32/csrss/win32csr/dllmain.c
index 52486633031..353d886babe 100644
--- a/reactos/subsystems/win32/csrss/win32csr/dllmain.c
+++ b/reactos/subsystems/win32/csrss/win32csr/dllmain.c
@@ -24,6 +24,12 @@ static CSRSS_EXPORTED_FUNCS CsrExports;
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(READ_CONSOLE, CsrReadConsole),
CSRSS_DEFINE_API(ALLOC_CONSOLE, CsrAllocConsole),
@@ -108,7 +114,7 @@ Win32CsrInsertObject(PCSRSS_PROCESS_DATA ProcessData,
DWORD Access,
BOOL Inheritable)
{
- return (CsrExports.CsrInsertObjectProc)(ProcessData, Handle, Object, Access, Inheritable);
+ return CsrInsertObject(ProcessData, Handle, Object, Access, Inheritable);
}
NTSTATUS FASTCALL
@@ -117,7 +123,7 @@ Win32CsrGetObject(PCSRSS_PROCESS_DATA ProcessData,
Object_t **Object,
DWORD Access)
{
- return (CsrExports.CsrGetObjectProc)(ProcessData, Handle, Object, Access);
+ return CsrGetObject(ProcessData, Handle, Object, Access);
}
NTSTATUS FASTCALL
@@ -129,7 +135,7 @@ Win32CsrLockObject(PCSRSS_PROCESS_DATA ProcessData,
{
NTSTATUS Status;
- Status = (CsrExports.CsrGetObjectProc)(ProcessData, Handle, Object, Access);
+ Status = CsrGetObject(ProcessData, Handle, Object, Access);
if (! NT_SUCCESS(Status))
{
return Status;
@@ -137,7 +143,7 @@ Win32CsrLockObject(PCSRSS_PROCESS_DATA ProcessData,
if ((*Object)->Type != Type)
{
- (CsrExports.CsrReleaseObjectByPointerProc)(*Object);
+ CsrReleaseObjectByPointer(*Object);
return STATUS_INVALID_HANDLE;
}
@@ -150,26 +156,26 @@ VOID FASTCALL
Win32CsrUnlockObject(Object_t *Object)
{
LeaveCriticalSection(&(Object->Lock));
- (CsrExports.CsrReleaseObjectByPointerProc)(Object);
+ CsrReleaseObjectByPointer(Object);
}
NTSTATUS FASTCALL
Win32CsrReleaseObjectByPointer(Object_t *Object)
{
- return (CsrExports.CsrReleaseObjectByPointerProc)(Object);
+ return CsrReleaseObjectByPointer(Object);
}
NTSTATUS FASTCALL
Win32CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData,
HANDLE Object)
{
- return (CsrExports.CsrReleaseObjectProc)(ProcessData, Object);
+ return CsrReleaseObject(ProcessData, Object);
}
NTSTATUS FASTCALL
Win32CsrReleaseConsole(PCSRSS_PROCESS_DATA ProcessData)
{
- return (CsrExports.CsrReleaseConsoleProc)(ProcessData);
+ return CsrReleaseConsole(ProcessData);
}
NTSTATUS FASTCALL
@@ -189,9 +195,7 @@ Win32CsrInitComplete(void)
BOOL WINAPI
Win32CsrInitialization(PCSRSS_API_DEFINITION *ApiDefinitions,
- PCSRSS_OBJECT_DEFINITION *ObjectDefinitions,
- CSRPLUGIN_INIT_COMPLETE_PROC *InitComplete,
- CSRPLUGIN_HARDERROR_PROC *HardError,
+ PCSRPLUGIN_SERVER_PROCS ServerProcs,
PCSRSS_EXPORTED_FUNCS Exports,
HANDLE CsrssApiHeap)
{
@@ -203,11 +207,13 @@ Win32CsrInitialization(PCSRSS_API_DEFINITION *ApiDefinitions,
PrivateCsrssManualGuiCheck(0);
CsrInitConsoleSupport();
+ CsrRegisterObjectDefinitions(Win32CsrObjectDefinitions);
*ApiDefinitions = Win32CsrApiDefinitions;
- *ObjectDefinitions = Win32CsrObjectDefinitions;
- *InitComplete = Win32CsrInitComplete;
- *HardError = Win32CsrHardError;
+ ServerProcs->InitCompleteProc = Win32CsrInitComplete;
+ ServerProcs->HardErrorProc = Win32CsrHardError;
+ ServerProcs->ProcessInheritProc = CsrDuplicateHandleTable;
+ ServerProcs->ProcessDeletedProc = CsrReleaseConsole;
return TRUE;
}
diff --git a/reactos/subsystems/win32/csrss/csrsrv/api/handle.c b/reactos/subsystems/win32/csrss/win32csr/handle.c
similarity index 61%
rename from reactos/subsystems/win32/csrss/csrsrv/api/handle.c
rename to reactos/subsystems/win32/csrss/win32csr/handle.c
index 6567f896c12..4d971b324d5 100644
--- a/reactos/subsystems/win32/csrss/csrsrv/api/handle.c
+++ b/reactos/subsystems/win32/csrss/win32csr/handle.c
@@ -9,7 +9,7 @@
/* INCLUDES ******************************************************************/
-#include
+#include
#define NDEBUG
#include
@@ -42,7 +42,7 @@ CsrRegisterObjectDefinitions(
NewCount++;
}
- New = RtlAllocateHeap(CsrssApiHeap,
+ New = RtlAllocateHeap(Win32CsrApiHeap,
0,
(ObjectDefinitionsCount + NewCount)
* sizeof(CSRSS_OBJECT_DEFINITION));
@@ -57,7 +57,7 @@ CsrRegisterObjectDefinitions(
RtlCopyMemory(New,
ObjectDefinitions,
ObjectDefinitionsCount * sizeof(CSRSS_OBJECT_DEFINITION));
- RtlFreeHeap(CsrssApiHeap, 0, ObjectDefinitions);
+ RtlFreeHeap(Win32CsrApiHeap, 0, ObjectDefinitions);
}
RtlCopyMemory(New + ObjectDefinitionsCount,
@@ -171,7 +171,7 @@ CsrReleaseConsole(
if (HandleTable[i].Object != NULL)
CsrReleaseObjectByPointer(HandleTable[i].Object);
}
- RtlFreeHeap(CsrssApiHeap, 0, HandleTable);
+ RtlFreeHeap(Win32CsrApiHeap, 0, HandleTable);
if (Console != NULL)
{
@@ -208,7 +208,7 @@ CsrInsertObject(
}
if (i >= ProcessData->HandleTableSize)
{
- Block = RtlAllocateHeap(CsrssApiHeap,
+ Block = RtlAllocateHeap(Win32CsrApiHeap,
HEAP_ZERO_MEMORY,
(ProcessData->HandleTableSize + 64) * sizeof(CSRSS_HANDLE));
if (Block == NULL)
@@ -220,7 +220,7 @@ CsrInsertObject(
ProcessData->HandleTable,
ProcessData->HandleTableSize * sizeof(CSRSS_HANDLE));
Block = _InterlockedExchangePointer((void* volatile)&ProcessData->HandleTable, Block);
- RtlFreeHeap( CsrssApiHeap, 0, Block );
+ RtlFreeHeap( Win32CsrApiHeap, 0, Block );
ProcessData->HandleTableSize += 64;
}
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 */
- TargetProcessData->HandleTable = RtlAllocateHeap(CsrssApiHeap,
+ TargetProcessData->HandleTable = RtlAllocateHeap(Win32CsrApiHeap,
HEAP_ZERO_MEMORY,
SourceProcessData->HandleTableSize
* sizeof(CSRSS_HANDLE));
@@ -289,4 +289,132 @@ CsrVerifyObject(
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 */
diff --git a/reactos/subsystems/win32/csrss/include/win32csr.h b/reactos/subsystems/win32/csrss/win32csr/win32csr.h
similarity index 100%
rename from reactos/subsystems/win32/csrss/include/win32csr.h
rename to reactos/subsystems/win32/csrss/win32csr/win32csr.h
diff --git a/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild b/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild
index eec81fcba60..8d04c718e73 100644
--- a/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild
+++ b/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild
@@ -22,6 +22,7 @@
dllmain.c
exitros.c
guiconsole.c
+ handle.c
harderror.c
tuiconsole.c
appswitch.c
diff --git a/reactos/subsystems/win32/csrss/win32csr/win32csr.spec b/reactos/subsystems/win32/csrss/win32csr/win32csr.spec
index 85e81a759b4..2e513757b03 100644
--- a/reactos/subsystems/win32/csrss/win32csr/win32csr.spec
+++ b/reactos/subsystems/win32/csrss/win32csr/win32csr.spec
@@ -1 +1 @@
-@ stdcall Win32CsrInitialization(ptr ptr ptr ptr ptr ptr)
+@ stdcall Win32CsrInitialization(ptr ptr ptr ptr)