group idle threads into the idle process

svn path=/trunk/; revision=14058
This commit is contained in:
Thomas Bluemel
2005-03-14 13:18:29 +00:00
parent 61c807a7ec
commit 009fddf0b2
4 changed files with 76 additions and 38 deletions
+14 -21
View File
@@ -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 @@ QSI_DEF(SystemProcessInformation)
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 @@ QSI_DEF(SystemProcessInformation)
} while ((pr != syspr) && (pr != NULL));
*ReqSize = ovlSize;
if (pr != NULL)
{
ObDereferenceObject(pr);
}
return (STATUS_SUCCESS);
}
@@ -849,7 +853,7 @@ QSI_DEF(SystemHandleInformation)
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 @@ QSI_DEF(SystemHandleInformation)
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 @@ QSI_DEF(SystemHandleInformation)
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 @@ QSI_DEF(SystemHandleInformation)
break;
} while ((pr != syspr) && (pr != NULL));
if (pr != NULL)
{
ObDereferenceObject(pr);
}
DPRINT("SystemHandleInformation 4\n");
return (STATUS_SUCCESS);
+4 -2
View File
@@ -16,6 +16,8 @@
/* GLOBALS *******************************************************************/
extern PEPROCESS PsIdleProcess;
/* FUNCTIONS *****************************************************************/
/** System idle thread procedure
@@ -53,8 +55,8 @@ PsInitIdleThread(VOID)
NTSTATUS Status;
PETHREAD IdleThread;
KIRQL oldIrql;
Status = PsInitializeThread(NULL,
Status = PsInitializeThread(PsIdleProcess,
&IdleThread,
NULL,
KernelMode,
+56 -14
View File
@@ -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 @@ PsGetNextProcess(PEPROCESS OldProcess)
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 @@ PsGetNextProcess(PEPROCESS OldProcess)
}
else if (!NT_SUCCESS(Status))
{
CPRINT("PsGetNextProcess(): ObReferenceObjectByPointer failed\n");
KEBUGCHECK(0);
continue;
}
}
@@ -362,6 +364,44 @@ PsInitProcessManagment(VOID)
RtlZeroMemory(PiProcessNotifyRoutine, sizeof(PiProcessNotifyRoutine));
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
*/
@@ -376,7 +416,9 @@ PsInitProcessManagment(VOID)
(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 @@ exitdereferenceobjects:
Process->Win32WindowStation = (HANDLE)0;
ExAcquireFastMutex(&PspActiveProcessMutex);
InsertHeadList(&PsActiveProcessHead, &Process->ProcessListEntry);
InsertTailList(&PsActiveProcessHead, &Process->ProcessListEntry);
InitializeListHead(&Process->ThreadListHead);
ExReleaseFastMutex(&PspActiveProcessMutex);
+2 -1
View File
@@ -28,6 +28,7 @@
/* GLOBALS ******************************************************************/
extern LIST_ENTRY PsActiveProcessHead;
extern PEPROCESS PsIdleProcess;
POBJECT_TYPE EXPORTED PsThreadType = NULL;
@@ -703,7 +704,7 @@ PsPrepareForApplicationProcessorInit(ULONG Id)
PETHREAD IdleThread;
PKPRCB Prcb = ((PKPCR)((ULONG_PTR)KPCR_BASE + Id * PAGE_SIZE))->Prcb;
PsInitializeThread(NULL,
PsInitializeThread(PsIdleProcess,
&IdleThread,
NULL,
KernelMode,