branch update for HEAD-2003050101
[reactos.git] / lib / kernel32 / process / proc.c
index 71a3926..651d888 100644 (file)
@@ -33,38 +33,58 @@ GetProcessId (HANDLE hProcess, LPDWORD lpProcessId);
 
 /* FUNCTIONS ****************************************************************/
 
-WINBOOL STDCALL
-GetProcessAffinityMask(HANDLE hProcess,
-                      LPDWORD lpProcessAffinityMask,
-                      LPDWORD lpSystemAffinityMask)
+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;
 }
 
 
 BOOL STDCALL
-SetProcessAffinityMask(HANDLE hProcess,
-                      DWORD dwProcessAffinityMask)
+SetProcessAffinityMask (HANDLE hProcess,
+                       DWORD dwProcessAffinityMask)
 {
-  return(FALSE);
+  NTSTATUS Status;
+
+  Status = NtSetInformationProcess (hProcess,
+                                   ProcessAffinityMask,
+                                   (PVOID)&dwProcessAffinityMask,
+                                   sizeof(DWORD));
+  if (!NT_SUCCESS(Status))
+    {
+      SetLastError (Status);
+      return FALSE;
+    }
+
+  return TRUE;
 }
 
 
 WINBOOL STDCALL
-GetProcessShutdownParameters(LPDWORD lpdwLevel,
-                            LPDWORD lpdwFlags)
+GetProcessShutdownParameters (LPDWORD lpdwLevel,
+                             LPDWORD lpdwFlags)
 {
   CSRSS_API_REQUEST CsrRequest;
   CSRSS_API_REPLY CsrReply;
@@ -89,8 +109,8 @@ GetProcessShutdownParameters(LPDWORD lpdwLevel,
 
 
 WINBOOL STDCALL
-SetProcessShutdownParameters(DWORD dwLevel,
-                            DWORD dwFlags)
+SetProcessShutdownParameters (DWORD dwLevel,
+                             DWORD dwFlags)
 {
   CSRSS_API_REQUEST CsrRequest;
   CSRSS_API_REPLY CsrReply;
@@ -115,9 +135,9 @@ SetProcessShutdownParameters(DWORD dwLevel,
 
 
 WINBOOL STDCALL
-GetProcessWorkingSetSize(HANDLE hProcess,
-                        LPDWORD lpMinimumWorkingSetSize,
-                        LPDWORD lpMaximumWorkingSetSize)
+GetProcessWorkingSetSize (HANDLE hProcess,
+                         LPDWORD lpMinimumWorkingSetSize,
+                         LPDWORD lpMaximumWorkingSetSize)
 {
   QUOTA_LIMITS QuotaLimits;
   NTSTATUS Status;
@@ -544,6 +564,10 @@ ExitProcess(UINT uExitCode)
   
   NtTerminateProcess (NtCurrentProcess (),
                      uExitCode);
+
+  /* should never get here */
+  assert(0);
+  while(1);
 }
 
 
@@ -690,14 +714,14 @@ SetPriorityClass (HANDLE  hProcess,
 
 
 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);