server: Don't force the process affinity to 1, leave it up to the client.
diff --git a/dlls/ntdll/process.c b/dlls/ntdll/process.c
index b5e6a64..2a09390 100644
--- a/dlls/ntdll/process.c
+++ b/dlls/ntdll/process.c
@@ -146,6 +146,7 @@
     case ProcessBasicInformation:
         {
             PROCESS_BASIC_INFORMATION pbi;
+            const unsigned int affinity_mask = (1 << NtCurrentTeb()->Peb->NumberOfProcessors) - 1;
 
             if (ProcessInformationLength >= sizeof(PROCESS_BASIC_INFORMATION))
             {
@@ -162,7 +163,7 @@
                         {
                             pbi.ExitStatus = reply->exit_code;
                             pbi.PebBaseAddress = reply->peb;
-                            pbi.AffinityMask = reply->affinity;
+                            pbi.AffinityMask = reply->affinity & affinity_mask;
                             pbi.BasePriority = reply->priority;
                             pbi.UniqueProcessId = reply->pid;
                             pbi.InheritedFromUniqueProcessId = reply->ppid;
@@ -359,6 +360,8 @@
     {
     case ProcessAffinityMask:
         if (ProcessInformationLength != sizeof(DWORD_PTR)) return STATUS_INVALID_PARAMETER;
+        if (*(PDWORD_PTR)ProcessInformation & ~((1 << NtCurrentTeb()->Peb->NumberOfProcessors) - 1))
+            return STATUS_INVALID_PARAMETER;
         SERVER_START_REQ( set_process_info )
         {
             req->handle   = ProcessHandle;
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index 88ded56..8944b6a 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -1177,6 +1177,7 @@
     case ThreadBasicInformation:
         {
             THREAD_BASIC_INFORMATION info;
+            const unsigned int affinity_mask = (1 << NtCurrentTeb()->Peb->NumberOfProcessors) - 1;
 
             SERVER_START_REQ( get_thread_info )
             {
@@ -1188,7 +1189,7 @@
                     info.TebBaseAddress         = reply->teb;
                     info.ClientId.UniqueProcess = ULongToHandle(reply->pid);
                     info.ClientId.UniqueThread  = ULongToHandle(reply->tid);
-                    info.AffinityMask           = reply->affinity;
+                    info.AffinityMask           = reply->affinity & affinity_mask;
                     info.Priority               = reply->priority;
                     info.BasePriority           = reply->priority;  /* FIXME */
                 }
@@ -1427,8 +1428,10 @@
         return status;
     case ThreadAffinityMask:
         {
+            const DWORD affinity_mask = (1 << NtCurrentTeb()->Peb->NumberOfProcessors) - 1;
             const DWORD *paff = data;
             if (length != sizeof(DWORD)) return STATUS_INVALID_PARAMETER;
+            if (*paff & ~affinity_mask) return STATUS_INVALID_PARAMETER;
             SERVER_START_REQ( set_thread_info )
             {
                 req->handle   = handle;
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 798fda5..b26ac15 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -595,7 +595,7 @@
     process_id_t ppid;
     int          exit_code;
     int          priority;
-    int          affinity;
+    unsigned int affinity;
     void*        peb;
     timeout_t    start_time;
     timeout_t    end_time;
@@ -609,7 +609,7 @@
     obj_handle_t handle;
     int          mask;
     int          priority;
-    int          affinity;
+    unsigned int affinity;
 };
 struct set_process_info_reply
 {
@@ -634,7 +634,7 @@
     void*        teb;
     int          exit_code;
     int          priority;
-    int          affinity;
+    unsigned int affinity;
     timeout_t    creation_time;
     timeout_t    exit_time;
     int          last;
@@ -648,7 +648,7 @@
     obj_handle_t handle;
     int          mask;
     int          priority;
-    int          affinity;
+    unsigned int affinity;
     obj_handle_t token;
 };
 struct set_thread_info_reply
@@ -4976,6 +4976,6 @@
     struct add_fd_completion_reply add_fd_completion_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 335
+#define SERVER_PROTOCOL_VERSION 336
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/process.c b/server/process.c
index 35740fe..f427716 100644
--- a/server/process.c
+++ b/server/process.c
@@ -322,7 +322,7 @@
     process->exit_code       = STILL_ACTIVE;
     process->running_threads = 0;
     process->priority        = PROCESS_PRIOCLASS_NORMAL;
-    process->affinity        = 1;
+    process->affinity        = ~0;
     process->suspend         = 0;
     process->is_system       = 0;
     process->create_flags    = 0;
@@ -1098,11 +1098,7 @@
     if ((process = get_process_from_handle( req->handle, PROCESS_SET_INFORMATION )))
     {
         if (req->mask & SET_PROCESS_INFO_PRIORITY) process->priority = req->priority;
-        if (req->mask & SET_PROCESS_INFO_AFFINITY)
-        {
-            if (req->affinity != 1) set_error( STATUS_INVALID_PARAMETER );
-            else process->affinity = req->affinity;
-        }
+        if (req->mask & SET_PROCESS_INFO_AFFINITY) process->affinity = req->affinity;
         release_object( process );
     }
 }
diff --git a/server/process.h b/server/process.h
index dbd7dac..cfe223a 100644
--- a/server/process.h
+++ b/server/process.h
@@ -64,7 +64,7 @@
     timeout_t            start_time;      /* absolute time at process start */
     timeout_t            end_time;        /* absolute time at process end */
     int                  priority;        /* priority class */
-    int                  affinity;        /* process affinity mask */
+    unsigned int         affinity;        /* process affinity mask */
     int                  suspend;         /* global process suspend count */
     int                  is_system;       /* is it a system process? */
     unsigned int         create_flags;    /* process creation flags */
diff --git a/server/protocol.def b/server/protocol.def
index bfd7242..1dff790 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -565,7 +565,7 @@
     process_id_t ppid;             /* server process id of parent */
     int          exit_code;        /* process exit code */
     int          priority;         /* priority class */
-    int          affinity;         /* process affinity mask */
+    unsigned int affinity;         /* process affinity mask */
     void*        peb;              /* PEB address in process address space */
     timeout_t    start_time;       /* process start time */
     timeout_t    end_time;         /* process end time */
@@ -577,7 +577,7 @@
     obj_handle_t handle;       /* process handle */
     int          mask;         /* setting mask (see below) */
     int          priority;     /* priority class */
-    int          affinity;     /* affinity mask */
+    unsigned int affinity;     /* affinity mask */
 @END
 #define SET_PROCESS_INFO_PRIORITY 0x01
 #define SET_PROCESS_INFO_AFFINITY 0x02
@@ -593,7 +593,7 @@
     void*        teb;           /* thread teb pointer */
     int          exit_code;     /* thread exit code */
     int          priority;      /* thread priority level */
-    int          affinity;      /* thread affinity mask */
+    unsigned int affinity;      /* thread affinity mask */
     timeout_t    creation_time; /* thread creation time */
     timeout_t    exit_time;     /* thread exit time */
     int          last;          /* last thread in process */
@@ -605,7 +605,7 @@
     obj_handle_t handle;       /* thread handle */
     int          mask;         /* setting mask (see below) */
     int          priority;     /* priority class */
-    int          affinity;     /* affinity mask */
+    unsigned int affinity;     /* affinity mask */
     obj_handle_t token;        /* impersonation token */
 @END
 #define SET_THREAD_INFO_PRIORITY 0x01
diff --git a/server/thread.c b/server/thread.c
index a7d51a1..4929b4a 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -171,7 +171,7 @@
     thread->state           = RUNNING;
     thread->exit_code       = 0;
     thread->priority        = 0;
-    thread->affinity        = 1;
+    thread->affinity        = ~0;
     thread->suspend         = 0;
     thread->desktop_users   = 0;
     thread->token           = NULL;
@@ -413,10 +413,7 @@
             set_error( STATUS_INVALID_PARAMETER );
     }
     if (req->mask & SET_THREAD_INFO_AFFINITY)
-    {
-        if (req->affinity != 1) set_error( STATUS_INVALID_PARAMETER );
-        else thread->affinity = req->affinity;
-    }
+        thread->affinity = req->affinity;
     if (req->mask & SET_THREAD_INFO_TOKEN)
         security_set_thread_token( thread, req->token );
 }
diff --git a/server/thread.h b/server/thread.h
index 94a2c6a..b4ca567 100644
--- a/server/thread.h
+++ b/server/thread.h
@@ -80,7 +80,7 @@
     CONTEXT               *suspend_context; /* current context if suspended */
     void                  *teb;           /* TEB address (in client address space) */
     int                    priority;      /* priority level */
-    int                    affinity;      /* affinity mask */
+    unsigned int           affinity;      /* affinity mask */
     int                    suspend;       /* suspend count */
     obj_handle_t           desktop;       /* desktop handle */
     int                    desktop_users; /* number of objects using the thread desktop */
diff --git a/server/trace.c b/server/trace.c
index dab137d..e188b3f 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -957,7 +957,7 @@
     fprintf( stderr, " ppid=%04x,", req->ppid );
     fprintf( stderr, " exit_code=%d,", req->exit_code );
     fprintf( stderr, " priority=%d,", req->priority );
-    fprintf( stderr, " affinity=%d,", req->affinity );
+    fprintf( stderr, " affinity=%08x,", req->affinity );
     fprintf( stderr, " peb=%p,", req->peb );
     fprintf( stderr, " start_time=" );
     dump_timeout( &req->start_time );
@@ -971,7 +971,7 @@
     fprintf( stderr, " handle=%p,", req->handle );
     fprintf( stderr, " mask=%d,", req->mask );
     fprintf( stderr, " priority=%d,", req->priority );
-    fprintf( stderr, " affinity=%d", req->affinity );
+    fprintf( stderr, " affinity=%08x", req->affinity );
 }
 
 static void dump_get_thread_info_request( const struct get_thread_info_request *req )
@@ -987,7 +987,7 @@
     fprintf( stderr, " teb=%p,", req->teb );
     fprintf( stderr, " exit_code=%d,", req->exit_code );
     fprintf( stderr, " priority=%d,", req->priority );
-    fprintf( stderr, " affinity=%d,", req->affinity );
+    fprintf( stderr, " affinity=%08x,", req->affinity );
     fprintf( stderr, " creation_time=" );
     dump_timeout( &req->creation_time );
     fprintf( stderr, "," );
@@ -1002,7 +1002,7 @@
     fprintf( stderr, " handle=%p,", req->handle );
     fprintf( stderr, " mask=%d,", req->mask );
     fprintf( stderr, " priority=%d,", req->priority );
-    fprintf( stderr, " affinity=%d,", req->affinity );
+    fprintf( stderr, " affinity=%08x,", req->affinity );
     fprintf( stderr, " token=%p", req->token );
 }