views:

140

answers:

4

How can i slow down a windows process ? I understand that i need to hook queryperformancecounter but what do i need to do next ? Plase help

+3  A: 

I am not sure I understand the relationship of hooking QueryPerformanceCounter to slowing down a process that you described. Perhaps if you elaborate in the original question or a comment, I can help you further.

To answer your question, you can use cpustres.exe from the Windows 2000 resource kit to put a load on your system, causing context switching. If you put enough of a load and oversubscribe all available CPUs, you will slow down your process. Depending on the load level you select with the cpustres settings, you can slow your process down a lot or a little.

If you want to slow down the process programmatically in a more controlled way without crashing it if it is a game, you can use casablanca's answer, but replace Sleep(10) with:

// Turn off optimizations to make sure the busy wait loops do
// not get optimized out!

HANDLE hThread = ...; // thread that you want to slow down 
for (;;) { 
  SuspendThread(hThread); // Do this for each process thread

  // Busy wait for pause (possibly small)
  const DWORDLONG pauseFactor=1000; // In cycles
  DWORDLONG start=__rdtsc();

  while (__rdtsc()-start<pauseFactor)
    ;  

  ResumeThread(hThread); // Do this for each process thread

  // Busy wait for resume
  const DWORDLONG runFactor=1000; // In cycles
  DWORDLONG start=__rdtsc();

  while (__rdtsc()-start<runFactor)
    ;  
} 
Michael Goldshteyn
read here http://ce.colddot.nl/browser/Cheat%20Engine/CEHook/speedhack.pas
opc0de
rdtsc is even more problematic on multicore processors than queryperformancecounter, so using it is probably a bad idea.
CodeInChaos
rdtsc works perfectly on i7 processors and is even synchronized across the four cores on a single CPU (and runs at the highest P-State, so there is no frequency drift with SpeedStep and Turbo). I am not sure if this is true for Core 2, so some testing may be necessary.
Michael Goldshteyn
+1  A: 

One way I can think of is to have a dedicated thread use SuspendThread on the thread that you want to slow down, wait for a little while and then resume the thread:

HANDLE hThread = ...; // thread that you want to slow down
for (;;) {
  SuspendThread(hThread);
  Sleep(10); // some number of milliseconds - larger values will slow down more
  ResumeThread(hThread);
}
casablanca
i've tryed that and it crashes the target application ( is a game ).It works slowing down with cheat engine.
opc0de
A: 

I don't understand what is the motive/background of your question since you didn't explain it clearly. However, using SetPriorityClass(), you can sets the priority class for the specified process to BELOW_NORMAL_PRIORITY_CLASS or even to IDLE_PRIORITY_CLASS so that the process running slower; and you can also sets the priority class for the specified process to ABOVE_NORMAL_PRIORITY_CLASS or even to HIGH_PRIORITY_CLASS so that the process running faster. Before doing that, you'll need to get handle of target process by its PID, look here.

Vantomex
A: 

Windows 2000 introduced a new layer over internal process management that allows to set extra limits on one or more processes: Jobs. I'm not sure if it allows to set a limit on processor time used, but if the application isn't using the method already, you might just be able to call AssignProcessToJobObject and SetInformationJobObject to impose extra limitations.

Stijn Sanders