170 lines
3.3 KiB
C++
170 lines
3.3 KiB
C++
|
//
|
||
|
// Universal Resource Consumer: Just an innocent stress program
|
||
|
// Copyright (c) Microsoft Corporation, 1997, 1998, 1999
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// module: physmem.cxx
|
||
|
// author: silviuc
|
||
|
// created: Fri Apr 10 14:05:05 1998
|
||
|
//
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <stdarg.h>
|
||
|
#include <windows.h>
|
||
|
|
||
|
#include "error.hxx"
|
||
|
#include "physmem.hxx"
|
||
|
#include "consume.hxx"
|
||
|
|
||
|
//
|
||
|
// Local functions
|
||
|
//
|
||
|
|
||
|
BOOL
|
||
|
CheckMemoryRegion (
|
||
|
|
||
|
LPVOID Address,
|
||
|
SIZE_T Size);
|
||
|
|
||
|
//
|
||
|
// Function:
|
||
|
//
|
||
|
// ConsumeAllPhysicalMemory
|
||
|
//
|
||
|
// Description:
|
||
|
//
|
||
|
// This routine will consume all physical memory.
|
||
|
// It will do so by increasing the working set size and locking the pages
|
||
|
// in memory.
|
||
|
//
|
||
|
|
||
|
void ConsumeAllPhysicalMemory ()
|
||
|
{
|
||
|
BOOL Result;
|
||
|
SIZE_T MinWsSize;
|
||
|
SIZE_T MaxWsSize;
|
||
|
SIZE_T RegionSize;
|
||
|
LPVOID Region;
|
||
|
|
||
|
//
|
||
|
// For ever loop in which we try to grab as much physical memory
|
||
|
// as possible.
|
||
|
//
|
||
|
|
||
|
|
||
|
for (RegionSize = 0x100000; ; )
|
||
|
{
|
||
|
//
|
||
|
// Eat more ...
|
||
|
//
|
||
|
|
||
|
Region = VirtualAlloc (NULL, RegionSize, MEM_COMMIT, PAGE_READWRITE);
|
||
|
|
||
|
if (Region == NULL) {
|
||
|
|
||
|
Sleep (1000);
|
||
|
|
||
|
//
|
||
|
// We've got an allocation error.
|
||
|
// Switch to 64K chunks and try again.
|
||
|
//
|
||
|
|
||
|
RegionSize = 0x10000;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if (VirtualLock (Region, RegionSize) == FALSE) {
|
||
|
|
||
|
VirtualFree (Region, 0, MEM_RELEASE);
|
||
|
|
||
|
//
|
||
|
// We have to increase the working set if possible.
|
||
|
//
|
||
|
|
||
|
Result = GetProcessWorkingSetSize(
|
||
|
GetCurrentProcess(),
|
||
|
&MinWsSize,
|
||
|
&MaxWsSize);
|
||
|
|
||
|
if (Result == FALSE)
|
||
|
{
|
||
|
Sleep (1000);
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
MinWsSize += 0x10000;
|
||
|
MaxWsSize += 0x10000;
|
||
|
|
||
|
Result = SetProcessWorkingSetSize(
|
||
|
GetCurrentProcess(),
|
||
|
MinWsSize,
|
||
|
MaxWsSize);
|
||
|
|
||
|
if (Result == FALSE) {
|
||
|
Sleep (1000);
|
||
|
}
|
||
|
|
||
|
continue;
|
||
|
}
|
||
|
else {
|
||
|
|
||
|
//
|
||
|
// Memory is allocated and locked. Touch it.
|
||
|
//
|
||
|
|
||
|
assert_ (Region != NULL);
|
||
|
CheckMemoryRegion (Region, RegionSize);
|
||
|
}
|
||
|
|
||
|
printf (".");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Function:
|
||
|
//
|
||
|
// CheckMemoryRegion
|
||
|
//
|
||
|
// Description:
|
||
|
//
|
||
|
// This function checks that the memory region is zeroed as
|
||
|
// it should be when a region has just been allocated and
|
||
|
// then reads and writes work properly.
|
||
|
//
|
||
|
|
||
|
BOOL
|
||
|
CheckMemoryRegion (
|
||
|
|
||
|
LPVOID Address,
|
||
|
SIZE_T Size)
|
||
|
{
|
||
|
LPBYTE Start, End, Current;
|
||
|
|
||
|
Current = Start = (LPBYTE) Address;
|
||
|
End = Start + Size;
|
||
|
|
||
|
for ( ; Current < End; Current += 1024) {
|
||
|
|
||
|
if (*Current != 0 || (End - Current >= 1024 && *(Current + 1023) != 0)) {
|
||
|
Message ("Page at %p not zeroed \n");
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
*Current = *(Current + 1023) = 0xAB;
|
||
|
|
||
|
if (*Current != 0xAB || (End - Current >= 1024 && *(Current + 1023) != 0xAB)) {
|
||
|
Message ("Page at %p has R/W error \n");
|
||
|
return FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// end of module: physmem.cxx
|
||
|
//
|
||
|
|