* PROJECT: ReactOS kernel
* FILE: ntoskrnl/ps/process.c
* PURPOSE: Process managment
- * PROGRAMMER: David Welch (welch@mcmail.com)
+ * PROGRAMMER: David Welch (welch@cwcom.net)
* REVISION HISTORY:
* 21/07/98: Created
*/
#include <ddk/ntddk.h>
#include <internal/ob.h>
#include <internal/mm.h>
+#include <internal/ke.h>
+#include <internal/ps.h>
+#include <string.h>
#include <internal/string.h>
+#include <internal/id.h>
-//#define NDEBUG
+#define NDEBUG
#include <internal/debug.h>
/* GLOBALS ******************************************************************/
POBJECT_TYPE PsProcessType = NULL;
+static ULONG NextUniqueProcessId = 0;
+
/* FUNCTIONS *****************************************************************/
VOID PsInitProcessManagment(VOID)
PsProcessType->Dump = NULL;
PsProcessType->Open = NULL;
PsProcessType->Close = NULL;
- PsProcessType->Delete = NULL;
+ PsProcessType->Delete = PiDeleteProcess;
PsProcessType->Parse = NULL;
PsProcessType->Security = NULL;
PsProcessType->QueryName = NULL;
/*
* Initialize the system process
*/
- SystemProcess = ObGenericCreateObject(NULL,PROCESS_ALL_ACCESS,NULL,
- PsProcessType);
+ SystemProcess = ObCreateObject(NULL,
+ PROCESS_ALL_ACCESS,
+ NULL,
+ PsProcessType);
+ KeInitializeDispatcherHeader(&SystemProcess->Pcb.DispatcherHeader,
+ ID_PROCESS_OBJECT,
+ sizeof(EPROCESS),
+ FALSE);
+ DPRINT("SystemProcess->Pcb.Type %x\n",
+ SystemProcess->Pcb.Type);
KProcess = &SystemProcess->Pcb;
InitializeListHead(&(KProcess->MemoryAreaList));
- ObInitializeHandleTable(NULL,FALSE,KProcess);
+ ObCreateHandleTable(NULL,FALSE,SystemProcess);
KProcess->PageTableDirectory = get_page_directory();
+
+ SystemProcess->UniqueProcessId = NextUniqueProcessId;
+ SystemProcess->InheritedFromUniqueProcessId = NextUniqueProcessId;
- SystemProcessHandle = ObInsertHandle(KProcess,SystemProcess,
- PROCESS_ALL_ACCESS,FALSE);
+ ObCreateHandle(SystemProcess,
+ SystemProcess,
+ PROCESS_ALL_ACCESS,
+ FALSE,
+ &SystemProcessHandle);
}
PKPROCESS KeGetCurrentProcess(VOID)
* FUNCTION: Returns a pointer to the current process
*/
{
- if (PsGetCurrentThread()==NULL
- || PsGetCurrentThread()->ThreadsProcess==NULL)
+ if (PsGetCurrentThread() == NULL ||
+ PsGetCurrentThread()->ThreadsProcess == NULL)
{
return(SystemProcess);
}
{
PEPROCESS Process;
PEPROCESS ParentProcess;
- PULONG PageDirectory;
- PULONG CurrentPageDirectory;
- ULONG i;
PKPROCESS KProcess;
- ULONG Base;
- ULONG Length;
- LARGE_INTEGER Offset;
NTSTATUS Status;
+ DPRINT("ZwCreateProcess(ObjectAttributes %x)\n",ObjectAttributes);
+
Status = ObReferenceObjectByHandle(ParentProcessHandle,
PROCESS_CREATE_PROCESS,
PsProcessType,
UserMode,
- &ParentProcessHandle,
+ (PVOID*)&ParentProcess,
NULL);
+
if (Status != STATUS_SUCCESS)
{
DPRINT("ZwCreateProcess() = %x\n",Status);
return(Status);
}
-
- Process = ObGenericCreateObject(ProcessHandle,DesiredAccess,
- ObjectAttributes,PsProcessType);
+
+ Process = ObCreateObject(ProcessHandle,
+ DesiredAccess,
+ ObjectAttributes,
+ PsProcessType);
+ KeInitializeDispatcherHeader(&Process->Pcb.DispatcherHeader,
+ ID_PROCESS_OBJECT,
+ sizeof(EPROCESS),
+ FALSE);
KProcess = &(Process->Pcb);
InitializeListHead(&(KProcess->MemoryAreaList));
- ObInitializeHandleTable(KProcess,InheritObjectTable,KProcess);
-
- PageDirectory = physical_to_linear((ULONG)get_free_page());
- KProcess->PageTableDirectory = PageDirectory;
-
- CurrentPageDirectory = get_page_directory();
-
- memset(PageDirectory,0,PAGESIZE);
- for (i=768;i<1024;i++)
+ Process->UniqueProcessId = InterlockedIncrement(&NextUniqueProcessId);
+ Process->InheritedFromUniqueProcessId = ParentProcess->UniqueProcessId;
+ ObCreateHandleTable(ParentProcess,
+ InheritObjectTable,
+ Process);
+ MmCopyMmInfo(ParentProcess, Process);
+
+ /*
+ * FIXME: I don't what I'm supposed to know with a section handle
+ */
+ if (SectionHandle != NULL)
{
- PageDirectory[i]=CurrentPageDirectory[i];
+ DbgPrint("ZwCreateProcess() non-NULL SectionHandle\n");
+ return(STATUS_UNSUCCESSFUL);
}
-
-
- return(STATUS_SUCCESS);
-}
-
-NTSTATUS STDCALL NtTerminateProcess(IN HANDLE ProcessHandle,
- IN NTSTATUS ExitStatus)
-{
- return(ZwTerminateProcess(ProcessHandle,ExitStatus));
-}
-
-NTSTATUS STDCALL ZwTerminateProcess(IN HANDLE ProcessHandle,
- IN NTSTATUS ExitStatus)
-{
- UNIMPLEMENTED;
+ Process->Pcb.ProcessState = PROCESS_STATE_ACTIVE;
+ ObDereferenceObject(Process);
+ ObDereferenceObject(ParentProcess);
+ return(STATUS_SUCCESS);
}
UNIMPLEMENTED;
}
-NTSTATUS STDCALL NtQueryInformationProcess(
- IN HANDLE ProcessHandle,
+NTSTATUS STDCALL NtQueryInformationProcess(IN HANDLE ProcessHandle,
IN CINT ProcessInformationClass,
OUT PVOID ProcessInformation,
IN ULONG ProcessInformationLength,
ReturnLength));
}
-NTSTATUS STDCALL ZwQueryInformationProcess(
- IN HANDLE ProcessHandle,
+NTSTATUS STDCALL ZwQueryInformationProcess(IN HANDLE ProcessHandle,
IN CINT ProcessInformationClass,
OUT PVOID ProcessInformation,
IN ULONG ProcessInformationLength,
{
PEPROCESS Process;
NTSTATUS Status;
+ PPROCESS_BASIC_INFORMATION ProcessBasicInformationP;
Status = ObReferenceObjectByHandle(ProcessHandle,
- PROCESS_QUERY_INFORMATION,
+ PROCESS_SET_INFORMATION,
PsProcessType,
UserMode,
- &ProcessHandle,
+ (PVOID*)&Process,
NULL);
if (Status != STATUS_SUCCESS)
{
switch (ProcessInformationClass)
{
case ProcessBasicInformation:
+ ProcessBasicInformationP = (PPROCESS_BASIC_INFORMATION)
+ ProcessInformation;
+ memset(ProcessBasicInformationP, 0, sizeof(PROCESS_BASIC_INFORMATION));
+ ProcessBasicInformationP->AffinityMask = Process->Pcb.Affinity;
+ ProcessBasicInformationP->UniqueProcessId =
+ Process->UniqueProcessId;
+ ProcessBasicInformationP->InheritedFromUniqueProcessId =
+ Process->InheritedFromUniqueProcessId;
+ Status = STATUS_SUCCESS;
+ break;
+
case ProcessQuotaLimits:
case ProcessIoCounters:
case ProcessVmCounters:
default:
Status = STATUS_NOT_IMPLEMENTED;
}
+ ObDereferenceObject(Process);
return(Status);
}
-NTSTATUS
-STDCALL
-NtSetInformationProcess(
- IN HANDLE ProcessHandle,
- IN CINT ProcessInformationClass,
- IN PVOID ProcessInformation,
- IN ULONG ProcessInformationLength
- )
+NTSTATUS STDCALL NtSetInformationProcess(IN HANDLE ProcessHandle,
+ IN CINT ProcessInformationClass,
+ IN PVOID ProcessInformation,
+ IN ULONG ProcessInformationLength)
{
return(ZwSetInformationProcess(ProcessHandle,
ProcessInformationClass,
ProcessInformationLength));
}
-NTSTATUS
-STDCALL
-ZwSetInformationProcess(
- IN HANDLE ProcessHandle,
- IN CINT ProcessInformationClass,
- IN PVOID ProcessInformation,
- IN ULONG ProcessInformationLength
- )
+NTSTATUS STDCALL ZwSetInformationProcess(IN HANDLE ProcessHandle,
+ IN CINT ProcessInformationClass,
+ IN PVOID ProcessInformation,
+ IN ULONG ProcessInformationLength)
{
- UNIMPLEMENTED;
+ PEPROCESS Process;
+ NTSTATUS Status;
+ PPROCESS_BASIC_INFORMATION ProcessBasicInformationP;
+
+ Status = ObReferenceObjectByHandle(ProcessHandle,
+ PROCESS_SET_INFORMATION,
+ PsProcessType,
+ UserMode,
+ (PVOID*)&Process,
+ NULL);
+ if (Status != STATUS_SUCCESS)
+ {
+ return(Status);
+ }
+
+ switch (ProcessInformationClass)
+ {
+ case ProcessBasicInformation:
+ ProcessBasicInformationP = (PPROCESS_BASIC_INFORMATION)
+ ProcessInformation;
+ memset(ProcessBasicInformationP, 0, sizeof(PROCESS_BASIC_INFORMATION));
+ Process->Pcb.Affinity = ProcessBasicInformationP->AffinityMask;
+ Status = STATUS_SUCCESS;
+ break;
+
+ case ProcessQuotaLimits:
+ case ProcessIoCounters:
+ case ProcessVmCounters:
+ case ProcessTimes:
+ case ProcessBasePriority:
+ case ProcessRaisePriority:
+ case ProcessDebugPort:
+ case ProcessExceptionPort:
+ case ProcessAccessToken:
+ case ProcessLdtInformation:
+ case ProcessLdtSize:
+ case ProcessDefaultHardErrorMode:
+ case ProcessIoPortHandlers:
+ case ProcessWorkingSetWatch:
+ case ProcessUserModeIOPL:
+ case ProcessEnableAlignmentFaultFixup:
+ case ProcessPriorityClass:
+ case ProcessWx86Information:
+ case ProcessHandleCount:
+ case ProcessAffinityMask:
+ default:
+ Status = STATUS_NOT_IMPLEMENTED;
+ }
+ ObDereferenceObject(Process);
+ return(Status);
}