update for HEAD-2003091401
[reactos.git] / lib / kernel32 / process / proc.c
index a243ce4..0c3d0cb 100644 (file)
 
 /* INCLUDES ****************************************************************/
 
-#include <ddk/ntddk.h>
-#include <ntdll/rtl.h>
-#include <windows.h>
-#include <kernel32/proc.h>
-#include <kernel32/thread.h>
-#include <kernel32/error.h>
-#include <wchar.h>
-#include <string.h>
-#include <napi/i386/segment.h>
-#include <napi/teb.h>
-#include <ntdll/csr.h>
-#include <ntdll/ldr.h>
+#include <k32.h>
 
 
 #define NDEBUG
 
 WaitForInputIdleType  lpfnGlobalRegisterWaitForInputIdle;
 
-LPSTARTUPINFO lpLocalStartupInfo = NULL;
+LPSTARTUPINFOA lpLocalStartupInfo = NULL;
 
 VOID STDCALL
-RegisterWaitForInputIdle (WaitForInputIdleType lpfnRegisterWaitForInputIdle);
+RegisterWaitForInputIdle(WaitForInputIdleType lpfnRegisterWaitForInputIdle);
 
+WINBOOL STDCALL
+InternalGetProcessId (HANDLE hProcess, LPDWORD lpProcessId);
 
-/* FUNCTIONS ****************************************************************/
 
-WINBOOL STDCALL
-GetProcessId (HANDLE   hProcess, LPDWORD       lpProcessId);
+/* FUNCTIONS ****************************************************************/
 
-WINBOOL STDCALL
-GetProcessAffinityMask(HANDLE hProcess,
-                      LPDWORD lpProcessAffinityMask,
-                      LPDWORD lpSystemAffinityMask)
+/*
+ * @implemented
+ */
+BOOL STDCALL
+GetProcessAffinityMask (HANDLE hProcess,
+                       LPDWORD lpProcessAffinityMask,
+                       LPDWORD lpSystemAffinityMask)
 {
-  if ((NULL == lpProcessAffinityMask)
-      || (NULL == lpSystemAffinityMask))
+  PROCESS_BASIC_INFORMATION ProcessInfo;
+  ULONG BytesWritten;
+  NTSTATUS Status;
+
+  Status = NtQueryInformationProcess (hProcess,
+                                     ProcessBasicInformation,
+                                     (PVOID)&ProcessInfo,
+                                     sizeof(PROCESS_BASIC_INFORMATION),
+                                     &BytesWritten);
+  if (!NT_SUCCESS(Status))
     {
-      SetLastError(ERROR_BAD_ARGUMENTS);
-      return(FALSE);
+      SetLastError (Status);
+      return FALSE;
     }
 
-  /* FIXME: check hProcess is actually a process */
-  /* FIXME: query the kernel process object */
-  *lpProcessAffinityMask = 0x00000001;
+  *lpProcessAffinityMask = (DWORD)ProcessInfo.AffinityMask;
+
+  /* FIXME */
   *lpSystemAffinityMask  = 0x00000001;
 
-  return(TRUE);
+  return TRUE;
 }
 
 
+/*
+ * @implemented
+ */
+BOOL STDCALL
+SetProcessAffinityMask (HANDLE hProcess,
+                       DWORD dwProcessAffinityMask)
+{
+  NTSTATUS Status;
+
+  Status = NtSetInformationProcess (hProcess,
+                                   ProcessAffinityMask,
+                                   (PVOID)&dwProcessAffinityMask,
+                                   sizeof(DWORD));
+  if (!NT_SUCCESS(Status))
+    {
+      SetLastError (Status);
+      return FALSE;
+    }
+
+  return TRUE;
+}
+
+
+/*
+ * @implemented
+ */
 WINBOOL STDCALL
-GetProcessShutdownParameters(LPDWORD lpdwLevel,
-                            LPDWORD lpdwFlags)
+GetProcessShutdownParameters (LPDWORD lpdwLevel,
+                             LPDWORD lpdwFlags)
 {
   CSRSS_API_REQUEST CsrRequest;
   CSRSS_API_REPLY CsrReply;
@@ -91,9 +117,12 @@ GetProcessShutdownParameters(LPDWORD lpdwLevel,
 }
 
 
+/*
+ * @implemented
+ */
 WINBOOL STDCALL
-SetProcessShutdownParameters(DWORD dwLevel,
-                            DWORD dwFlags)
+SetProcessShutdownParameters (DWORD dwLevel,
+                             DWORD dwFlags)
 {
   CSRSS_API_REQUEST CsrRequest;
   CSRSS_API_REPLY CsrReply;
@@ -117,16 +146,38 @@ SetProcessShutdownParameters(DWORD dwLevel,
 }
 
 
+/*
+ * @implemented
+ */
 WINBOOL STDCALL
-GetProcessWorkingSetSize(HANDLE hProcess,
-                        LPDWORD lpMinimumWorkingSetSize,
-                        LPDWORD lpMaximumWorkingSetSize)
+GetProcessWorkingSetSize (HANDLE hProcess,
+                         LPDWORD lpMinimumWorkingSetSize,
+                         LPDWORD lpMaximumWorkingSetSize)
 {
-  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-  return(FALSE);
+  QUOTA_LIMITS QuotaLimits;
+  NTSTATUS Status;
+
+  Status = NtQueryInformationProcess(hProcess,
+                                    ProcessQuotaLimits,
+                                    &QuotaLimits,
+                                    sizeof(QUOTA_LIMITS),
+                                    NULL);
+  if (!NT_SUCCESS(Status))
+    {
+      SetLastErrorByStatus(Status);
+      return(FALSE);
+    }
+
+  *lpMinimumWorkingSetSize = (DWORD)QuotaLimits.MinimumWorkingSetSize;
+  *lpMaximumWorkingSetSize = (DWORD)QuotaLimits.MaximumWorkingSetSize;
+
+  return(TRUE);
 }
 
 
+/*
+ * @unimplemented
+ */
 WINBOOL STDCALL
 SetProcessWorkingSetSize(HANDLE hProcess,
                         DWORD dwMinimumWorkingSetSize,
@@ -137,6 +188,9 @@ SetProcessWorkingSetSize(HANDLE hProcess,
 }
 
 
+/*
+ * @implemented
+ */
 WINBOOL STDCALL
 GetProcessTimes(HANDLE hProcess,
                LPFILETIME lpCreationTime,
@@ -158,7 +212,7 @@ GetProcessTimes(HANDLE hProcess,
       return(FALSE);
     }
 
-  lpCreationTime->dwLowDateTime        = Kut.CreateTime.u.LowPart;
+  lpCreationTime->dwLowDateTime = Kut.CreateTime.u.LowPart;
   lpCreationTime->dwHighDateTime = Kut.CreateTime.u.HighPart;
 
   lpExitTime->dwLowDateTime = Kut.ExitTime.u.LowPart;
@@ -174,6 +228,9 @@ GetProcessTimes(HANDLE hProcess,
 }
 
 
+/*
+ * @implemented
+ */
 HANDLE STDCALL
 GetCurrentProcess(VOID)
 {
@@ -181,6 +238,9 @@ GetCurrentProcess(VOID)
 }
 
 
+/*
+ * @implemented
+ */
 HANDLE STDCALL
 GetCurrentThread(VOID)
 {
@@ -188,6 +248,9 @@ GetCurrentThread(VOID)
 }
 
 
+/*
+ * @implemented
+ */
 DWORD STDCALL
 GetCurrentProcessId(VOID)
 {
@@ -195,6 +258,9 @@ GetCurrentProcessId(VOID)
 }
 
 
+/*
+ * @implemented
+ */
 WINBOOL STDCALL
 GetExitCodeProcess(HANDLE hProcess,
                   LPDWORD lpExitCode)
@@ -220,29 +286,37 @@ GetExitCodeProcess(HANDLE hProcess,
 }
 
 
+/*
+ * @implemented
+ */
 WINBOOL STDCALL
-GetProcessId(HANDLE hProcess,
+InternalGetProcessId(HANDLE hProcess,
             LPDWORD lpProcessId)
 {
-   NTSTATUS errCode;
-   PROCESS_BASIC_INFORMATION ProcessBasic;
-   ULONG BytesWritten;
-
-   errCode = NtQueryInformationProcess(hProcess,
-                                      ProcessBasicInformation,
-                                      &ProcessBasic,
-                                      sizeof(PROCESS_BASIC_INFORMATION),
-                                      &BytesWritten);
-   if (!NT_SUCCESS(errCode))
-     {
-       SetLastErrorByStatus (errCode);
-       return FALSE;
-     }
-   memcpy( lpProcessId ,&ProcessBasic.UniqueProcessId,sizeof(DWORD));
-   return TRUE;
+  PROCESS_BASIC_INFORMATION ProcessBasic;
+  ULONG BytesWritten;
+  NTSTATUS Status;
+
+  Status = NtQueryInformationProcess(hProcess,
+                                    ProcessBasicInformation,
+                                    &ProcessBasic,
+                                    sizeof(PROCESS_BASIC_INFORMATION),
+                                    &BytesWritten);
+  if (!NT_SUCCESS(Status))
+    {
+      SetLastErrorByStatus(Status);
+      return(FALSE);
+    }
+
+  memcpy(lpProcessId, &ProcessBasic.UniqueProcessId, sizeof(DWORD));
+
+  return(TRUE);
 }
 
 
+/*
+ * @implemented
+ */
 HANDLE STDCALL
 OpenProcess(DWORD dwDesiredAccess,
            WINBOOL bInheritHandle,
@@ -280,6 +354,9 @@ OpenProcess(DWORD dwDesiredAccess,
 }
 
 
+/*
+ * @implemented
+ */
 UINT STDCALL
 WinExec(LPCSTR lpCmdLine,
        UINT uCmdShow)
@@ -321,6 +398,9 @@ WinExec(LPCSTR lpCmdLine,
 }
 
 
+/*
+ * @implemented
+ */
 VOID STDCALL
 RegisterWaitForInputIdle (
        WaitForInputIdleType    lpfnRegisterWaitForInputIdle
@@ -331,6 +411,9 @@ RegisterWaitForInputIdle (
 }
 
 
+/*
+ * @unimplemented
+ */
 DWORD STDCALL
 WaitForInputIdle (
        HANDLE  hProcess,
@@ -341,6 +424,9 @@ WaitForInputIdle (
 }
 
 
+/*
+ * @implemented
+ */
 VOID STDCALL
 Sleep(DWORD dwMilliseconds)
 {
@@ -349,6 +435,9 @@ Sleep(DWORD dwMilliseconds)
 }
 
 
+/*
+ * @implemented
+ */
 DWORD STDCALL
 SleepEx(DWORD dwMilliseconds,
        BOOL bAlertable)
@@ -381,6 +470,9 @@ SleepEx(DWORD dwMilliseconds,
 }
 
 
+/*
+ * @implemented
+ */
 VOID STDCALL
 GetStartupInfoW(LPSTARTUPINFOW lpStartupInfo)
 {
@@ -416,6 +508,9 @@ GetStartupInfoW(LPSTARTUPINFOW lpStartupInfo)
 }
 
 
+/*
+ * @implemented
+ */
 VOID STDCALL
 GetStartupInfoA(LPSTARTUPINFOA lpStartupInfo)
 {
@@ -485,6 +580,9 @@ GetStartupInfoA(LPSTARTUPINFOA lpStartupInfo)
 }
 
 
+/*
+ * @implemented
+ */
 BOOL STDCALL
 FlushInstructionCache (HANDLE  hProcess,
                       LPCVOID  lpBaseAddress,
@@ -504,6 +602,9 @@ FlushInstructionCache (HANDLE       hProcess,
 }
 
 
+/*
+ * @implemented
+ */
 VOID STDCALL
 ExitProcess(UINT uExitCode)
 {
@@ -529,9 +630,16 @@ ExitProcess(UINT uExitCode)
   
   NtTerminateProcess (NtCurrentProcess (),
                      uExitCode);
+
+  /* should never get here */
+  assert(0);
+  while(1);
 }
 
 
+/*
+ * @implemented
+ */
 WINBOOL STDCALL
 TerminateProcess (HANDLE       hProcess,
                  UINT  uExitCode)
@@ -548,6 +656,9 @@ TerminateProcess (HANDLE    hProcess,
 }
 
 
+/*
+ * @unimplemented
+ */
 VOID STDCALL
 FatalAppExitA (UINT    uAction,
               LPCSTR   lpMessageText)
@@ -567,6 +678,9 @@ FatalAppExitA (UINT uAction,
 }
 
 
+/*
+ * @unimplemented
+ */
 VOID STDCALL
 FatalAppExitW(UINT uAction,
              LPCWSTR lpMessageText)
@@ -575,6 +689,9 @@ FatalAppExitW(UINT uAction,
 }
 
 
+/*
+ * @implemented
+ */
 VOID STDCALL
 FatalExit (int ExitCode)
 {
@@ -582,6 +699,9 @@ FatalExit (int ExitCode)
 }
 
 
+/*
+ * @implemented
+ */
 DWORD STDCALL
 GetPriorityClass (HANDLE       hProcess)
 {
@@ -622,7 +742,9 @@ GetPriorityClass (HANDLE    hProcess)
 }
 
 
-
+/*
+ * @implemented
+ */
 WINBOOL STDCALL
 SetPriorityClass (HANDLE       hProcess,
                  DWORD dwPriorityClass)
@@ -674,15 +796,18 @@ SetPriorityClass (HANDLE  hProcess,
 }
 
 
+/*
+ * @implemented
+ */
 DWORD STDCALL
-GetProcessVersion (DWORD       ProcessId)
+GetProcessVersion (DWORD ProcessId)
 {
   DWORD                        Version = 0;
   PIMAGE_NT_HEADERS    NtHeader = NULL;
   PVOID                        BaseAddress = NULL;
 
   /* Caller's */
-  if (0 == ProcessId)
+  if (0 == ProcessId || GetCurrentProcessId() == ProcessId)
     {
       BaseAddress = (PVOID) NtCurrentPeb()->ImageBaseAddress;
       NtHeader = RtlImageNtHeader (BaseAddress);
@@ -701,6 +826,4 @@ GetProcessVersion (DWORD    ProcessId)
   return (Version);
 }
 
-
-
 /* EOF */