Alexandre Julliard : ntdll: Implement the ProcessAffinityMask case in NtQueryInformationProcess.

Alexandre Julliard julliard at winehq.org
Fri Apr 15 10:19:23 CDT 2011


Module: wine
Branch: master
Commit: baa04014ebd686d95214beb3cd2183ff9a85b4f4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=baa04014ebd686d95214beb3cd2183ff9a85b4f4

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Apr 14 19:57:34 2011 +0200

ntdll: Implement the ProcessAffinityMask case in NtQueryInformationProcess.

---

 dlls/kernel32/process.c |   22 ++++++++--------------
 dlls/ntdll/process.c    |   19 ++++++++++++++++++-
 2 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
index e039cad..c263092 100644
--- a/dlls/kernel32/process.c
+++ b/dlls/kernel32/process.c
@@ -3137,24 +3137,18 @@ BOOL WINAPI SetProcessAffinityMask( HANDLE hProcess, DWORD_PTR affmask )
 /**********************************************************************
  *          GetProcessAffinityMask    (KERNEL32.@)
  */
-BOOL WINAPI GetProcessAffinityMask( HANDLE hProcess,
-                                    PDWORD_PTR lpProcessAffinityMask,
-                                    PDWORD_PTR lpSystemAffinityMask )
+BOOL WINAPI GetProcessAffinityMask( HANDLE hProcess, PDWORD_PTR process_mask, PDWORD_PTR system_mask )
 {
-    PROCESS_BASIC_INFORMATION   pbi;
-    NTSTATUS                    status;
+    NTSTATUS status = STATUS_SUCCESS;
 
-    status = NtQueryInformationProcess(hProcess,
-                                       ProcessBasicInformation,
-                                       &pbi, sizeof(pbi), NULL);
-    if (status)
+    if (system_mask) *system_mask = (1 << NtCurrentTeb()->Peb->NumberOfProcessors) - 1;
+    if (process_mask)
     {
-        SetLastError( RtlNtStatusToDosError(status) );
-        return FALSE;
+        if ((status = NtQueryInformationProcess( hProcess, ProcessAffinityMask,
+                                                 process_mask, sizeof(*process_mask), NULL )))
+            SetLastError( RtlNtStatusToDosError(status) );
     }
-    if (lpProcessAffinityMask) *lpProcessAffinityMask = pbi.AffinityMask;
-    if (lpSystemAffinityMask)  *lpSystemAffinityMask = (1 << NtCurrentTeb()->Peb->NumberOfProcessors) - 1;
-    return TRUE;
+    return !status;
 }
 
 
diff --git a/dlls/ntdll/process.c b/dlls/ntdll/process.c
index eff3f58..a39f5d0 100644
--- a/dlls/ntdll/process.c
+++ b/dlls/ntdll/process.c
@@ -134,7 +134,6 @@ NTSTATUS WINAPI NtQueryInformationProcess(
     UNIMPLEMENTED_INFO_CLASS(ProcessEnableAlignmentFaultFixup);
     UNIMPLEMENTED_INFO_CLASS(ProcessPriorityClass);
     UNIMPLEMENTED_INFO_CLASS(ProcessWx86Information);
-    UNIMPLEMENTED_INFO_CLASS(ProcessAffinityMask);
     UNIMPLEMENTED_INFO_CLASS(ProcessPriorityBoost);
     UNIMPLEMENTED_INFO_CLASS(ProcessDeviceMap);
     UNIMPLEMENTED_INFO_CLASS(ProcessSessionInformation);
@@ -385,6 +384,24 @@ NTSTATUS WINAPI NtQueryInformationProcess(
             ret = STATUS_INFO_LENGTH_MISMATCH;
         }
         break;
+
+    case ProcessAffinityMask:
+        len = sizeof(ULONG_PTR);
+        if (ProcessInformationLength == len)
+        {
+            const ULONG_PTR system_mask = ((ULONG_PTR)1 << NtCurrentTeb()->Peb->NumberOfProcessors) - 1;
+
+            SERVER_START_REQ(get_process_info)
+            {
+                req->handle = wine_server_obj_handle( ProcessHandle );
+                if (!(ret = wine_server_call( req )))
+                    *(ULONG_PTR *)ProcessInformation = reply->affinity & system_mask;
+            }
+            SERVER_END_REQ;
+        }
+        else ret = STATUS_INFO_LENGTH_MISMATCH;
+        break;
+
     case ProcessWow64Information:
         len = sizeof(DWORD);
         if (ProcessInformationLength == len)




More information about the wine-cvs mailing list