1 /* 2 * Memory Manager Information and Test driver 3 * 4 * Copyright 2006 Aleksey Bragin <alekset@reactos.org> 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Library General Public 8 * License as published by the Free Software Foundation; either 9 * version 2 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Library General Public License for more details. 15 * 16 * You should have received a copy of the GNU Library General Public 17 * License along with this library; see the file COPYING.LIB. 18 * If not, write to the Free Software Foundation, 19 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 20 */ 21 22 /* INCLUDES *******************************************************************/ 23 24 #include <ddk/ntddk.h> 25 #include "memtest.h" 26 27 //#define NDEBUG 28 #include <debug.h> 29 30 HANDLE MonitorThreadHandle; 31 32 /* FUNCTIONS ***********************************************************/ 33 34 static VOID NTAPI 35 MonitorThread(PVOID Ignored) 36 { 37 SYSTEM_PERFORMANCE_INFORMATION PerformanceInfo; 38 ULONG Length; 39 LARGE_INTEGER Interval, SystemTime; 40 41 /* Main loop */ 42 while (TRUE) 43 { 44 Interval.QuadPart = -300 * 10000; // 300 ms 45 46 /* Query information */ 47 if (ZwQuerySystemInformation(SystemPerformanceInformation, 48 (PVOID) &PerformanceInfo, 49 sizeof(SYSTEM_PERFORMANCE_INFORMATION), 50 &Length) != STATUS_SUCCESS) 51 { 52 break; 53 } 54 55 /* Query current system time */ 56 KeQuerySystemTime(&SystemTime); 57 58 59 DbgPrint("%I64d;%d;%d\n", SystemTime.QuadPart, 60 PerformanceInfo.CommittedPages, PerformanceInfo.AvailablePages); 61 62 /* Wait for a bit. */ 63 KeDelayExecutionThread(KernelMode, FALSE, &Interval); 64 } 65 66 DPRINT("Finishing monitoring thread.\n"); 67 68 PsTerminateSystemThread(0); 69 } 70 71 72 VOID 73 StartMemoryMonitor() 74 { 75 NTSTATUS Status; 76 77 Status = PsCreateSystemThread( 78 &MonitorThreadHandle, 79 THREAD_ALL_ACCESS, 80 NULL, 81 NULL, 82 NULL, 83 MonitorThread, 84 NULL); 85 86 if (!NT_SUCCESS(Status)) 87 { 88 DPRINT1("Failed to start a monitoring thread\n"); 89 return; 90 } 91 } 92 93 /* PUBLIC FUNCTIONS ***********************************************************/ 94 95 /* 96 * DriverEntry 97 */ 98 NTSTATUS 99 NTAPI 100 DriverEntry(PDRIVER_OBJECT DriverObject, 101 PUNICODE_STRING RegistryPath) 102 { 103 DbgPrint("\n===============================================\n Memory Manager Information and Test driver\n"); 104 DbgPrint("Time;Memory pages allocated;Memory pages free\n"); 105 106 107 StartMemoryMonitor(); 108 109 return STATUS_SUCCESS; 110 } 111