From 7d88f002d24a5aec55ec9f6fda021c0ff0d9c276 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 14 Apr 2004 07:11:20 +0000 Subject: [PATCH] Implementation of system performance auditing hax. svn path=/trunk/; revision=9136 --- reactos/ntoskrnl/ex/sysinfo.c | 58 +++++++++++++++++++------- reactos/ntoskrnl/include/internal/ex.h | 2 +- reactos/ntoskrnl/include/internal/ke.h | 8 ++++ reactos/ntoskrnl/include/internal/mm.h | 2 + reactos/ntoskrnl/ke/timer.c | 30 +++++++++++-- reactos/ntoskrnl/mm/balance.c | 4 +- 6 files changed, 84 insertions(+), 20 deletions(-) diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index 3af5362a085..ddd43e5a625 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -1,4 +1,4 @@ -/* $Id: sysinfo.c,v 1.26 2003/12/14 17:44:02 hbirr Exp $ +/* $Id: sysinfo.c,v 1.27 2004/04/14 07:10:44 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -21,6 +21,7 @@ #include #include #include +#include #include @@ -303,7 +304,7 @@ QSI_DEF(SystemBasicInformation) Sbi->LowestUserAddress = 0; /* FIXME */ Sbi->HighestUserAddress = 0; /* FIXME */ Sbi->ActiveProcessors = 0x00000001; /* FIXME */ - Sbi->NumberProcessors = 1; /* FIXME */ + Sbi->NumberProcessors = KeNumberProcessors; return (STATUS_SUCCESS); } @@ -348,14 +349,15 @@ QSI_DEF(SystemPerformanceInformation) return (STATUS_INFO_LENGTH_MISMATCH); } - Spi->IdleTime.QuadPart = 0; /* FIXME */ + Spi->IdleTime.QuadPart = PsInitialSystemProcess->Pcb.KernelTime * 100000; + Spi->ReadTransferCount.QuadPart = 0; /* FIXME */ Spi->WriteTransferCount.QuadPart = 0; /* FIXME */ Spi->OtherTransferCount.QuadPart = 0; /* FIXME */ Spi->ReadOperationCount = 0; /* FIXME */ Spi->WriteOperationCount = 0; /* FIXME */ Spi->OtherOperationCount = 0; /* FIXME */ - Spi->AvailablePages = 0; /* FIXME */ + Spi->AvailablePages = MiNrAvailablePages; Spi->TotalCommittedPages = 0; /* FIXME */ Spi->TotalCommitLimit = 0; /* FIXME */ Spi->PeakCommitment = 0; /* FIXME */ @@ -435,6 +437,8 @@ QSI_DEF(SystemPerformanceInformation) /* Class 3 - Time Of Day Information */ QSI_DEF(SystemTimeOfDayInformation) { + LARGE_INTEGER CurrentTime; + PSYSTEM_TIMEOFDAY_INFORMATION Sti = (PSYSTEM_TIMEOFDAY_INFORMATION) Buffer; @@ -447,9 +451,11 @@ QSI_DEF(SystemTimeOfDayInformation) return (STATUS_INFO_LENGTH_MISMATCH); } - Sti->BootTime.QuadPart = 0; /* FIXME */ - Sti->CurrentTime.QuadPart = 0; /* FIXME */ - Sti->TimeZoneBias.QuadPart = 0; /* FIXME */ + KeQuerySystemTime(&CurrentTime); + + Sti->BootTime= SystemBootTime; + Sti->CurrentTime = CurrentTime; + Sti->TimeZoneBias.QuadPart = _SystemTimeZoneInfo.Bias; Sti->TimeZoneId = 0; /* FIXME */ Sti->Reserved = 0; /* FIXME */ @@ -515,8 +521,11 @@ QSI_DEF(SystemProcessInformation) SpiCur->NextEntryDelta = curSize+inLen; // relative offset to the beginnnig of the next structure SpiCur->ThreadCount = nThreads; SpiCur->CreateTime = pr->CreateTime; - //SpiCur->UserTime = 0; // FIXME - //SpiCur->KernelTime = 0; // FIXME +/* + * System Clock is 18.2 psec. + */ + SpiCur->UserTime.QuadPart = pr->Pcb.UserTime * 100000; + SpiCur->KernelTime.QuadPart = pr->Pcb.KernelTime * 100000; SpiCur->ProcessName.Length = strlen(pr->ImageFileName) * sizeof(WCHAR); SpiCur->ProcessName.MaximumLength = inLen; @@ -526,7 +535,7 @@ QSI_DEF(SystemProcessInformation) RtlInitAnsiString(&imgName, pr->ImageFileName); RtlAnsiStringToUnicodeString(&SpiCur->ProcessName, &imgName, FALSE); - SpiCur->BasePriority = 0; // FIXME + SpiCur->BasePriority = pr->Pcb.BasePriority; SpiCur->ProcessId = pr->UniqueProcessId; SpiCur->InheritedFromProcessId = (DWORD)(pr->InheritedFromUniqueProcessId); SpiCur->HandleCount = 0; // FIXME @@ -602,8 +611,27 @@ QSI_DEF(SystemDeviceInformation) /* Class 8 - Processor Performance Information */ QSI_DEF(SystemProcessorPerformanceInformation) { - /* FIXME */ - return (STATUS_NOT_IMPLEMENTED); + PSYSTEM_PROCESSORTIME_INFO Spi + = (PSYSTEM_PROCESSORTIME_INFO) Buffer; + + *ReqSize = sizeof (SYSTEM_PROCESSORTIME_INFO); + /* + * Check user buffer's size + */ + if (Size < sizeof (SYSTEM_PROCESSORTIME_INFO)) + { + return (STATUS_INFO_LENGTH_MISMATCH); + } + + Spi->TotalProcessorRunTime.QuadPart = + PsInitialSystemProcess->Pcb.KernelTime * 100000; // IdleTime + Spi->TotalProcessorTime.QuadPart = KiKernelTime * 100000; // KernelTime + Spi->TotalProcessorUserTime.QuadPart = KiUserTime * 100000; + Spi->TotalDPCTime.QuadPart = KiDpcTime * 100000; + Spi->TotalInterruptTime.QuadPart = 0; + Spi->TotalInterrupts = 0; // Interrupt Count + + return (STATUS_SUCCESS); } /* Class 9 - Flags Information */ @@ -941,7 +969,7 @@ QSI_DEF(SystemCurrentTimeZoneInformation) /* Copy the time zone information struct */ memcpy ( Buffer, - & SystemTimeZoneInfo, + & _SystemTimeZoneInfo, sizeof (TIME_ZONE_INFORMATION) ); @@ -960,7 +988,7 @@ SSI_DEF(SystemCurrentTimeZoneInformation) } /* Copy the time zone information struct */ memcpy ( - & SystemTimeZoneInfo, + & _SystemTimeZoneInfo, (TIME_ZONE_INFORMATION *) Buffer, sizeof (TIME_ZONE_INFORMATION) ); @@ -1141,6 +1169,8 @@ NtQuerySystemInformation (IN SYSTEM_INFORMATION_CLASS SystemInformationClass, NTSTATUS Status; NTSTATUS FStatus; + DPRINT("NtQuerySystemInformation Start.\n"); + /*if (ExGetPreviousMode() == KernelMode) {*/ SystemInformation = UnsafeSystemInformation; diff --git a/reactos/ntoskrnl/include/internal/ex.h b/reactos/ntoskrnl/include/internal/ex.h index 67789c91c64..633c262eea9 100644 --- a/reactos/ntoskrnl/include/internal/ex.h +++ b/reactos/ntoskrnl/include/internal/ex.h @@ -98,7 +98,7 @@ typedef VOID (*PLOOKASIDE_MINMAX_ROUTINE)( /* GLOBAL VARIABLES *********************************************************/ -TIME_ZONE_INFORMATION SystemTimeZoneInfo; +TIME_ZONE_INFORMATION _SystemTimeZoneInfo; extern POBJECT_TYPE ExEventPairObjectType; diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index 8dae2890189..fe638cc41fe 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -29,6 +29,14 @@ #include "arch/ke.h" + + +extern LARGE_INTEGER SystemBootTime; +extern ULONG KiKernelTime; +extern ULONG KiUserTime; +extern ULONG KiDpcTime; + + /* INTERNAL KERNEL FUNCTIONS ************************************************/ #ifdef __USE_W32API diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 028d2158138..737fb22f230 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -10,6 +10,8 @@ /* TYPES *********************************************************************/ +extern ULONG MiNrAvailablePages; + struct _EPROCESS; struct _MM_RMAP_ENTRY; diff --git a/reactos/ntoskrnl/ke/timer.c b/reactos/ntoskrnl/ke/timer.c index e6aa0f0d0fc..811f3889a8e 100644 --- a/reactos/ntoskrnl/ke/timer.c +++ b/reactos/ntoskrnl/ke/timer.c @@ -1,4 +1,4 @@ -/* $Id: timer.c,v 1.67 2004/01/18 22:32:47 gdalsnes Exp $ +/* $Id: timer.c,v 1.68 2004/04/14 07:10:58 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -33,11 +33,15 @@ * Current time */ #if defined(__GNUC__) -static LARGE_INTEGER SystemBootTime = (LARGE_INTEGER)0LL; +LARGE_INTEGER SystemBootTime = (LARGE_INTEGER)0LL; #else -static LARGE_INTEGER SystemBootTime = { 0 }; +LARGE_INTEGER SystemBootTime = { 0 }; #endif +ULONG KiKernelTime; +ULONG KiUserTime; +ULONG KiDpcTime; + /* * Number of timer interrupts since initialisation */ @@ -596,6 +600,9 @@ KiUpdateSystemTime(KIRQL oldIrql, */ { LARGE_INTEGER Time; + PKTHREAD CurrentThread; + PKPROCESS CurrentProcess; + assert(KeGetCurrentIrql() == PROFILE_LEVEL); KiRawTicks++; @@ -626,6 +633,23 @@ KiUpdateSystemTime(KIRQL oldIrql, SharedUserData->SystemTime.LowPart = Time.u.LowPart; SharedUserData->SystemTime.High1Part = Time.u.HighPart; + + CurrentThread = KeGetCurrentThread(); + CurrentProcess = KeGetCurrentProcess(); + + if (CurrentThread->PreviousMode == UserMode) + { + ++CurrentThread->UserTime; + ++CurrentProcess->UserTime; + ++KiUserTime; + } + if (CurrentThread->PreviousMode == KernelMode) + { + ++CurrentProcess->KernelTime; + ++CurrentThread->KernelTime; + ++KiKernelTime; + } + KiReleaseSpinLock(&TimerValueLock); /* diff --git a/reactos/ntoskrnl/mm/balance.c b/reactos/ntoskrnl/mm/balance.c index 3ed4d1c49ba..6a2ac0a6041 100644 --- a/reactos/ntoskrnl/mm/balance.c +++ b/reactos/ntoskrnl/mm/balance.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: balance.c,v 1.27 2004/04/10 22:35:25 gdalsnes Exp $ +/* $Id: balance.c,v 1.28 2004/04/14 07:11:08 jimtabor Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/balance.c @@ -57,7 +57,7 @@ MM_ALLOCATION_REQUEST, *PMM_ALLOCATION_REQUEST; static MM_MEMORY_CONSUMER MiMemoryConsumers[MC_MAXIMUM]; static ULONG MiMinimumAvailablePages; -static ULONG MiNrAvailablePages; +ULONG MiNrAvailablePages; static ULONG MiNrTotalPages; static LIST_ENTRY AllocationListHead; static KSPIN_LOCK AllocationListLock;