group idle threads into the idle process Modified: trunk/reactos/ntoskrnl/ex/sysinfo.c Modified: trunk/reactos/ntoskrnl/ps/idle.c Modified: trunk/reactos/ntoskrnl/ps/process.c Modified: trunk/reactos/ntoskrnl/ps/thread.c _____
Modified: trunk/reactos/ntoskrnl/ex/sysinfo.c --- trunk/reactos/ntoskrnl/ex/sysinfo.c 2005-03-14 11:34:02 UTC (rev 14057) +++ trunk/reactos/ntoskrnl/ex/sysinfo.c 2005-03-14 13:18:29 UTC (rev 14058) @@ -15,6 +15,7 @@
#define NDEBUG #include <internal/debug.h>
+extern PEPROCESS PsIdleProcess; extern ULONG NtGlobalFlag; /* FIXME: it should go in a ddk/?.h */ ULONGLONG STDCALL KeQueryInterruptTime(VOID);
@@ -611,13 +612,20 @@ SpiCur->ProcessName.Buffer = (void*)(pCur+curSize);
// copy name to the end of the struct - RtlInitAnsiString(&imgName, pr->ImageFileName); - RtlAnsiStringToUnicodeString(&SpiCur->ProcessName, &imgName, FALSE); + if(pr != PsIdleProcess) + { + RtlInitAnsiString(&imgName, pr->ImageFileName); + RtlAnsiStringToUnicodeString(&SpiCur->ProcessName, &imgName, FALSE); + } + else + { + RtlInitUnicodeString(&SpiCur->ProcessName, NULL); + }
SpiCur->BasePriority = pr->Pcb.BasePriority; SpiCur->ProcessId = pr->UniqueProcessId; SpiCur->InheritedFromProcessId = pr->InheritedFromUniqueProcessId; - SpiCur->HandleCount = ObpGetHandleCountByHandleTable(pr->ObjectTable); + SpiCur->HandleCount = (pr->ObjectTable ? ObpGetHandleCountByHandleTable(pr->ObjectTable) : 0); SpiCur->VmCounters.PeakVirtualSize = pr->PeakVirtualSize; SpiCur->VmCounters.VirtualSize = pr->VirtualSize.QuadPart; SpiCur->VmCounters.PageFaultCount = pr->LastFaultCount; @@ -670,10 +678,6 @@ } while ((pr != syspr) && (pr != NULL));
*ReqSize = ovlSize; - if (pr != NULL) - { - ObDereferenceObject(pr); - } return (STATUS_SUCCESS); }
@@ -849,7 +853,7 @@
do { - hCount = hCount + ObpGetHandleCountByHandleTable(pr->ObjectTable); + hCount = hCount + (pr->ObjectTable ? ObpGetHandleCountByHandleTable(pr->ObjectTable) : 0); pr = PsGetNextProcess(pr);
if ((pr == syspr) || (pr == NULL)) @@ -858,11 +862,6 @@
DPRINT("SystemHandleInformation 2\n");
- if (pr != NULL) - { - ObDereferenceObject(pr); - } - curSize = sizeof(SYSTEM_HANDLE_INFORMATION)+ ( (sizeof(SYSTEM_HANDLE_TABLE_ENTRY_INFO) * hCount) - (sizeof(SYSTEM_HANDLE_TABLE_ENTRY_INFO) )); @@ -883,9 +882,9 @@
do { - int Count = 0, HandleCount = 0; + int Count = 0, HandleCount;
- HandleCount = ObpGetHandleCountByHandleTable(pr->ObjectTable); + HandleCount = (pr->ObjectTable ? ObpGetHandleCountByHandleTable(pr->ObjectTable) : 0);
for (Count = 0; HandleCount > 0 ; HandleCount--) { @@ -900,12 +899,6 @@ break; } while ((pr != syspr) && (pr != NULL));
- - if (pr != NULL) - { - ObDereferenceObject(pr); - } - DPRINT("SystemHandleInformation 4\n"); return (STATUS_SUCCESS);
_____
Modified: trunk/reactos/ntoskrnl/ps/idle.c --- trunk/reactos/ntoskrnl/ps/idle.c 2005-03-14 11:34:02 UTC (rev 14057) +++ trunk/reactos/ntoskrnl/ps/idle.c 2005-03-14 13:18:29 UTC (rev 14058) @@ -16,6 +16,8 @@
/* GLOBALS *******************************************************************/
+extern PEPROCESS PsIdleProcess; + /* FUNCTIONS *****************************************************************/
/** System idle thread procedure @@ -53,8 +55,8 @@ NTSTATUS Status; PETHREAD IdleThread; KIRQL oldIrql; - - Status = PsInitializeThread(NULL, + + Status = PsInitializeThread(PsIdleProcess, &IdleThread, NULL, KernelMode, _____
Modified: trunk/reactos/ntoskrnl/ps/process.c --- trunk/reactos/ntoskrnl/ps/process.c 2005-03-14 11:34:02 UTC (rev 14057) +++ trunk/reactos/ntoskrnl/ps/process.c 2005-03-14 13:18:29 UTC (rev 14058) @@ -19,6 +19,7 @@
VOID INIT_FUNCTION PsInitClientIDManagment(VOID);
PEPROCESS EXPORTED PsInitialSystemProcess = NULL; +PEPROCESS PsIdleProcess = NULL;
POBJECT_TYPE EXPORTED PsProcessType = NULL;
@@ -120,34 +121,36 @@
if (OldProcess == NULL) { - Status = ObReferenceObjectByPointer(PsInitialSystemProcess, + Status = ObReferenceObjectByPointer(PsIdleProcess, PROCESS_ALL_ACCESS, PsProcessType, KernelMode); if (!NT_SUCCESS(Status)) { - CPRINT("PsGetNextProcess(): ObReferenceObjectByPointer failed for PsInitialSystemProcess\n"); + CPRINT("PsGetNextProcess(): ObReferenceObjectByPointer failed for PsIdleProcess\n"); KEBUGCHECK(0); } - return PsInitialSystemProcess; + return PsIdleProcess; }
ExAcquireFastMutex(&PspActiveProcessMutex); NextProcess = OldProcess; while (1) { - if (NextProcess->ProcessListEntry.Blink == &PsActiveProcessHead) + PLIST_ENTRY Flink = (NextProcess == PsIdleProcess ? PsActiveProcessHead.Flink : + NextProcess->ProcessListEntry.Flink); + if (Flink != &PsActiveProcessHead) { - NextProcess = CONTAINING_RECORD(PsActiveProcessHead.Blink, - EPROCESS, - ProcessListEntry); + NextProcess = CONTAINING_RECORD(Flink, + EPROCESS, + ProcessListEntry); } else { - NextProcess = CONTAINING_RECORD(NextProcess->ProcessListEntry.Blink, - EPROCESS, - ProcessListEntry); + NextProcess = NULL; + break; } + Status = ObReferenceObjectByPointer(NextProcess, PROCESS_ALL_ACCESS, PsProcessType, @@ -162,8 +165,7 @@ } else if (!NT_SUCCESS(Status)) { - CPRINT("PsGetNextProcess(): ObReferenceObjectByPointer failed\n"); - KEBUGCHECK(0); + continue; } }
@@ -363,6 +365,44 @@ RtlZeroMemory(PiLoadImageNotifyRoutine, sizeof(PiLoadImageNotifyRoutine));
/* + * Initialize the idle process + */ + Status = ObCreateObject(KernelMode, + PsProcessType, + NULL, + KernelMode, + NULL, + sizeof(EPROCESS), + 0, + 0, + (PVOID*)&PsIdleProcess); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to create the idle process object, Status: 0x%x\n", Status); + KEBUGCHECK(0); + return; + } + + RtlZeroMemory(PsIdleProcess, sizeof(EPROCESS)); + + PsIdleProcess->Pcb.Affinity = 0xFFFFFFFF; + PsIdleProcess->Pcb.IopmOffset = 0xffff; + PsIdleProcess->Pcb.LdtDescriptor[0] = 0; + PsIdleProcess->Pcb.LdtDescriptor[1] = 0; + PsIdleProcess->Pcb.BasePriority = PROCESS_PRIO_IDLE; + PsIdleProcess->Pcb.ThreadQuantum = 6; + InitializeListHead(&PsIdleProcess->Pcb.ThreadListHead); + InitializeListHead(&PsIdleProcess->ThreadListHead); + InitializeListHead(&PsIdleProcess->ProcessListEntry); + KeInitializeDispatcherHeader(&PsIdleProcess->Pcb.DispatcherHeader, + ProcessObject, + sizeof(EPROCESS), + FALSE); + PsIdleProcess->Pcb.DirectoryTableBase = + (LARGE_INTEGER)(LONGLONG)(ULONG)MmGetPageDirectory(); + strcpy(PsInitialSystemProcess->ImageFileName, "Idle"); + + /* * Initialize the system process */ Status = ObCreateObject(KernelMode, @@ -376,7 +416,9 @@ (PVOID*)&PsInitialSystemProcess); if (!NT_SUCCESS(Status)) { - return; + DPRINT1("Failed to create the system process object, Status: 0x%x\n", Status); + KEBUGCHECK(0); + return; }
/* System threads may run on any processor. */ @@ -886,7 +928,7 @@ Process->Win32WindowStation = (HANDLE)0;
ExAcquireFastMutex(&PspActiveProcessMutex); - InsertHeadList(&PsActiveProcessHead, &Process->ProcessListEntry); + InsertTailList(&PsActiveProcessHead, &Process->ProcessListEntry); InitializeListHead(&Process->ThreadListHead); ExReleaseFastMutex(&PspActiveProcessMutex);
_____
Modified: trunk/reactos/ntoskrnl/ps/thread.c --- trunk/reactos/ntoskrnl/ps/thread.c 2005-03-14 11:34:02 UTC (rev 14057) +++ trunk/reactos/ntoskrnl/ps/thread.c 2005-03-14 13:18:29 UTC (rev 14058) @@ -28,6 +28,7 @@
/* GLOBALS ******************************************************************/
extern LIST_ENTRY PsActiveProcessHead; +extern PEPROCESS PsIdleProcess;
POBJECT_TYPE EXPORTED PsThreadType = NULL;
@@ -703,7 +704,7 @@ PETHREAD IdleThread; PKPRCB Prcb = ((PKPCR)((ULONG_PTR)KPCR_BASE + Id * PAGE_SIZE))->Prcb;
- PsInitializeThread(NULL, + PsInitializeThread(PsIdleProcess, &IdleThread, NULL, KernelMode,