-/* $Id$
- *
+/*
* reactos/subsys/csrss/api/process.c
*
* "\windows\ApiPort" port process management functions
{
DPRINT1("CsrCreateProcessData() failed\n");
}
+ else
+ {
+ pProcessData->Terminated = FALSE;
+
+ /* Set default shutdown parameters */
+ pProcessData->ShutdownLevel = 0x280;
+ pProcessData->ShutdownFlags = 0;
+ }
return pProcessData;
}
return STATUS_INVALID_PARAMETER;
}
+NTSTATUS STDCALL
+CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc, PVOID Context)
+{
+ UINT Hash;
+ PCSRSS_PROCESS_DATA pProcessData;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ LOCK;
+
+ for (Hash = 0; Hash < (sizeof(ProcessData) / sizeof(*ProcessData)); Hash++)
+ {
+ pProcessData = ProcessData[Hash];
+ while (NULL != pProcessData)
+ {
+ Status = EnumProc(pProcessData, Context);
+ if (STATUS_SUCCESS != Status)
+ {
+ UNLOCK;
+ return Status;
+ }
+ pProcessData = pProcessData->next;
+ }
+ }
+
+ UNLOCK;
+
+ return Status;
+}
/**********************************************************************
* CSRSS API
return(Request->Status = STATUS_INVALID_PARAMETER);
}
+ ProcessData->Terminated = TRUE;
Request->Status = STATUS_SUCCESS;
return STATUS_SUCCESS;
}
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
ProcessData = CsrGetProcessData(Request->Data.DuplicateHandleRequest.ProcessId);
+ if (NULL == ProcessData || ProcessData->Terminated)
+ {
+ DPRINT1("Invalid source process %d\n", Request->Data.DuplicateHandleRequest.ProcessId);
+ Request->Status = STATUS_INVALID_PARAMETER;
+ return Request->Status;
+ }
+
Request->Status = CsrGetObject(ProcessData, Request->Data.DuplicateHandleRequest.Handle, &Object);
if (! NT_SUCCESS(Request->Status))
{
#include <csrss.h>
+#define NDEBUG
+
#define NDEBUG
#include <debug.h>
&Request->Header);
if (!NT_SUCCESS(Status))
{
- DPRINT1("CSR: NtReplyWaitReceivePort failed\n");
- break;
+ DPRINT1("NtReplyWaitReceivePort failed\n");
+ break;
}
/* If the connection was closed, handle that */
ProcessData = CsrGetProcessData(Request->Header.ClientId.UniqueProcess);
if (ProcessData == NULL)
{
- DPRINT1("CSR: Message %d: Unable to find data for process 0x%x\n",
+ DPRINT1("Message %d: Unable to find data for process 0x%x\n",
Request->Header.u2.s2.Type,
Request->Header.ClientId.UniqueProcess);
break;
}
+ if (ProcessData->Terminated)
+ {
+ DPRINT1("Message %d: process %d already terminated\n",
+ Request->Type, (ULONG)Request->Header.ClientId.UniqueProcess);
+ continue;
+ }
/* Call the Handler */
CsrApiCallHandler(ProcessData, Request);
struct _CSRSS_PROCESS_DATA * next;
LIST_ENTRY ProcessEntry;
PCONTROLDISPATCHER CtrlDispatcher;
+ BOOL Terminated;
} CSRSS_PROCESS_DATA, *PCSRSS_PROCESS_DATA;
typedef VOID (STDCALL *CSR_CLEANUP_OBJECT_PROC)(Object_t *Object);
VOID STDCALL CsrInitConsoleSupport(VOID);
/* api/process.c */
+typedef NTSTATUS (STDCALL *CSRSS_ENUM_PROCESS_PROC)(PCSRSS_PROCESS_DATA ProcessData,
+ PVOID Context);
VOID STDCALL CsrInitProcessData(VOID);
PCSRSS_PROCESS_DATA STDCALL CsrGetProcessData(HANDLE ProcessId);
PCSRSS_PROCESS_DATA STDCALL CsrCreateProcessData(HANDLE ProcessId);
NTSTATUS STDCALL CsrFreeProcessData( HANDLE Pid );
+NTSTATUS STDCALL CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc, PVOID Context);
/* api/handle.c */
NTSTATUS FASTCALL CsrRegisterObjectDefinitions(PCSRSS_OBJECT_DEFINITION NewDefinitions);
LONG *LogicalY);
VOID FASTCALL ConioDrawConsole(PCSRSS_CONSOLE Console);
VOID FASTCALL ConioConsoleCtrlEvent(DWORD Event, PCSRSS_PROCESS_DATA ProcessData);
+VOID FASTCALL ConioConsoleCtrlEventTimeout(DWORD Event, PCSRSS_PROCESS_DATA ProcessData,
+ DWORD Timeout);
/* api/conio.c */
CSR_API(CsrWriteConsole);
Object_t **Object);
typedef NTSTATUS (STDCALL *CSRSS_RELEASE_OBJECT_PROC)(PCSRSS_PROCESS_DATA ProcessData,
HANDLE Object );
+typedef NTSTATUS (STDCALL *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_PROC CsrReleaseObjectProc;
+ CSRSS_ENUM_PROCESSES_PROC CsrEnumProcessesProc;
} CSRSS_EXPORTED_FUNCS, *PCSRSS_EXPORTED_FUNCS;
typedef BOOL (STDCALL *CSRPLUGIN_INIT_COMPLETE_PROC)(void);
#define WIN32CSR_H_INCLUDED
#include <windows.h>
+#include <commctrl.h>
extern HANDLE Win32CsrApiHeap;
extern HINSTANCE Win32CsrDllHandle;
long Type);
VOID FASTCALL Win32CsrUnlockObject(Object_t *Object);
-#ifndef TODO
NTSTATUS FASTCALL Win32CsrGetObject(PCSRSS_PROCESS_DATA ProcessData,
HANDLE Handle,
Object_t **Object);
NTSTATUS FASTCALL Win32CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData,
HANDLE Object);
-#endif
+NTSTATUS FASTCALL Win32CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc,
+ PVOID Context);
#endif /* WIN32CSR_H_INCLUDED */
Exports.CsrInsertObjectProc = CsrInsertObject;
Exports.CsrGetObjectProc = CsrGetObject;
Exports.CsrReleaseObjectProc = CsrReleaseObject;
+ Exports.CsrEnumProcessesProc = CsrEnumProcesses;
if (! (*InitProc)(&ApiDefinitions, &ObjectDefinitions, &InitCompleteProc,
&Exports, CsrssApiHeap))
{