- Last patch was incomplete, apologies. SVN @ 5AM = bad idea.
- Do not report that ROS is running on 0 active processors, that's a bad
idea.
- Actually check the affinity mask set by NtSetInformationThread
- Fix the check in KeSetAffinityThread
- Give a valid affinity to the system thread (corresponding to the
active cpu affinity set).
This removes all bugchecks from the kernel32 thread winetest.
Modified: trunk/reactos/ntoskrnl/include/internal/ke.h
Modified: trunk/reactos/ntoskrnl/ke/kthread.c
Modified: trunk/reactos/ntoskrnl/ke/main.c
Modified: trunk/reactos/ntoskrnl/ps/psmgr.c
Modified: trunk/reactos/ntoskrnl/ps/query.c
_____
Modified: trunk/reactos/ntoskrnl/include/internal/ke.h
--- trunk/reactos/ntoskrnl/include/internal/ke.h 2005-08-09
08:02:05 UTC (rev 17234)
+++ trunk/reactos/ntoskrnl/include/internal/ke.h 2005-08-09
08:50:57 UTC (rev 17235)
@@ -228,6 +228,12 @@
VOID
STDCALL
+KiSetPriorityThread(PKTHREAD Thread,
+ KPRIORITY Priority,
+ PBOOLEAN Released);
+
+VOID
+STDCALL
KeStackAttachProcess (
IN struct _KPROCESS* Process,
OUT PKAPC_STATE ApcState
_____
Modified: trunk/reactos/ntoskrnl/ke/kthread.c
--- trunk/reactos/ntoskrnl/ke/kthread.c 2005-08-09 08:02:05 UTC (rev
17234)
+++ trunk/reactos/ntoskrnl/ke/kthread.c 2005-08-09 08:50:57 UTC (rev
17235)
@@ -1299,7 +1299,12 @@
DPRINT("KeSetAffinityThread(Thread %x, Affinity %x)\n", Thread,
Affinity);
- ASSERT(Affinity & ((1 << KeNumberProcessors) - 1));
+ /* Verify correct affinity */
+ if ((Affinity & Thread->ApcStatePointer[0]->Process->Affinity) !=
+ Affinity || !Affinity)
+ {
+ KEBUGCHECK(INVALID_AFFINITY_SET);
+ }
OldIrql = KeAcquireDispatcherDatabaseLock();
_____
Modified: trunk/reactos/ntoskrnl/ke/main.c
--- trunk/reactos/ntoskrnl/ke/main.c 2005-08-09 08:02:05 UTC (rev
17234)
+++ trunk/reactos/ntoskrnl/ke/main.c 2005-08-09 08:50:57 UTC (rev
17235)
@@ -25,7 +25,7 @@
EXPORTED ULONG NtBuildNumber = KERNEL_VERSION_BUILD;
EXPORTED ULONG NtGlobalFlag = 0;
EXPORTED CHAR KeNumberProcessors;
-EXPORTED KAFFINITY KeActiveProcessors;
+EXPORTED KAFFINITY KeActiveProcessors = 1;
EXPORTED LOADER_PARAMETER_BLOCK KeLoaderBlock;
EXPORTED ULONG KeDcacheFlushCount = 0;
EXPORTED ULONG KeIcacheFlushCount = 0;
_____
Modified: trunk/reactos/ntoskrnl/ps/psmgr.c
--- trunk/reactos/ntoskrnl/ps/psmgr.c 2005-08-09 08:02:05 UTC (rev
17234)
+++ trunk/reactos/ntoskrnl/ps/psmgr.c 2005-08-09 08:50:57 UTC (rev
17235)
@@ -213,7 +213,7 @@
/* System threads may run on any processor. */
RtlZeroMemory(PsInitialSystemProcess, sizeof(EPROCESS));
- PsInitialSystemProcess->Pcb.Affinity = 0xFFFFFFFF;
+ PsInitialSystemProcess->Pcb.Affinity = KeActiveProcessors;
PsInitialSystemProcess->Pcb.IopmOffset = 0xffff;
PsInitialSystemProcess->Pcb.BasePriority = PROCESS_PRIO_NORMAL;
PsInitialSystemProcess->Pcb.QuantumReset = 6;
_____
Modified: trunk/reactos/ntoskrnl/ps/query.c
--- trunk/reactos/ntoskrnl/ps/query.c 2005-08-09 08:02:05 UTC (rev
17234)
+++ trunk/reactos/ntoskrnl/ps/query.c 2005-08-09 08:50:57 UTC (rev
17235)
@@ -1194,6 +1194,8 @@
SetInformationData[ThreadInformationClass].Size);
}
+ /* FIXME: This is REALLY wrong. Some types don't need
THREAD_SET_INFORMATION */
+ /* FIXME: We should also check for certain things before doing the
reference */
Status = ObReferenceObjectByHandle (ThreadHandle,
THREAD_SET_INFORMATION,
PsThreadType,
@@ -1218,7 +1220,19 @@
break;
case ThreadAffinityMask:
- Status = KeSetAffinityThread(&Thread->Tcb, u.Affinity);
+
+ /* Check if this is valid */
+ DPRINT1("%lx, %lx\n",
Thread->ThreadsProcess->Pcb.Affinity, u.Affinity);
+ if ((Thread->ThreadsProcess->Pcb.Affinity & u.Affinity)
!=
+ u.Affinity)
+ {
+ DPRINT1("Wrong affinity given\n");
+ Status = STATUS_INVALID_PARAMETER;
+ }
+ else
+ {
+ Status = KeSetAffinityThread(&Thread->Tcb,
u.Affinity);
+ }
break;
case ThreadImpersonationToken:
Show replies by date