Added process ids.
[reactos.git] / reactos / ntoskrnl / ps / process.c
index a1b76fe..fd4def4 100644 (file)
@@ -3,7 +3,7 @@
  * 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 ******************************************************************/
@@ -25,6 +29,8 @@ HANDLE SystemProcessHandle = NULL;
 
 POBJECT_TYPE PsProcessType = NULL;
 
+static ULONG NextUniqueProcessId = 0;
+
 /* FUNCTIONS *****************************************************************/
 
 VOID PsInitProcessManagment(VOID)
@@ -47,7 +53,7 @@ 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;
@@ -59,16 +65,30 @@ VOID PsInitProcessManagment(VOID)
    /*
     * 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)
@@ -84,8 +104,8 @@ struct _EPROCESS* PsGetCurrentProcess(VOID)
  * FUNCTION: Returns a pointer to the current process
  */
 {
-   if (PsGetCurrentThread()==NULL 
-       || PsGetCurrentThread()->ThreadsProcess==NULL)
+   if (PsGetCurrentThread() == NULL || 
+       PsGetCurrentThread()->ThreadsProcess == NULL)
      {
        return(SystemProcess);
      }
@@ -148,60 +168,55 @@ NTSTATUS STDCALL ZwCreateProcess(
 {
    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);
 }
 
 
@@ -224,8 +239,7 @@ NTSTATUS STDCALL ZwOpenProcess (OUT PHANDLE ProcessHandle,
    UNIMPLEMENTED;
 }
 
-NTSTATUS STDCALL NtQueryInformationProcess(
-                                          IN HANDLE ProcessHandle,
+NTSTATUS STDCALL NtQueryInformationProcess(IN HANDLE ProcessHandle,
                                           IN CINT ProcessInformationClass,
                                           OUT PVOID ProcessInformation,
                                           IN ULONG ProcessInformationLength,
@@ -238,8 +252,7 @@ NTSTATUS STDCALL NtQueryInformationProcess(
                                    ReturnLength));
 }
 
-NTSTATUS STDCALL ZwQueryInformationProcess(
-                                          IN HANDLE ProcessHandle,
+NTSTATUS STDCALL ZwQueryInformationProcess(IN HANDLE ProcessHandle,
                                           IN CINT ProcessInformationClass,
                                           OUT PVOID ProcessInformation,
                                           IN ULONG ProcessInformationLength,
@@ -247,12 +260,13 @@ NTSTATUS STDCALL ZwQueryInformationProcess(
 {
    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)
      {
@@ -262,6 +276,17 @@ NTSTATUS STDCALL ZwQueryInformationProcess(
    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:
@@ -285,17 +310,14 @@ NTSTATUS STDCALL ZwQueryInformationProcess(
       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,
@@ -303,14 +325,59 @@ NtSetInformationProcess(
                                  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);
 }