2010-10-30 5 views
0

Comment puis-je ralentir un processus Windows? Je comprends que j'ai besoin de hook queryperformancecounter mais que dois-je faire ensuite? Aide de Plaseralentir un processus?

+0

Est-ce que c'est juste pour votre propre programme ou pour n'importe quel programme? – casablanca

+0

Voulez-vous ralentir une partie qui utilise un compteur de queues pour déterminer sa vitesse, ou voulez-vous ralentir un processus de calcul intensif? – CodesInChaos

+0

@casablanca: tout programme je sais comment injecter une DLL n'est pas un problème – opc0de

Répondre

3

Je ne suis pas sûr de comprendre la relation entre l'accrochage de QueryPerformanceCounter et le ralentissement d'un processus que vous avez décrit. Peut-être que si vous développez dans la question originale ou un commentaire, je peux vous aider davantage.

Pour répondre à votre question, vous pouvez utiliser cpustres.exe du kit de ressources Windows 2000 pour charger votre système et provoquer le changement de contexte. Si vous mettez assez de charge et que vous surchargez tous les processeurs disponibles, vous ralentirez votre processus. Selon le niveau de charge que vous sélectionnez avec les réglages de cpustres, vous pouvez ralentir votre processus beaucoup ou peu.

Si vous voulez ralentir le processus programme d'une manière plus contrôlée sans le faire tomber si elle est un jeu, vous pouvez utiliser la réponse de casablanca, mais remplacer sommeil (10) avec:

// 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) 
    ; 
} 
+0

lire ici http://ce.colddot.nl/browser/Cheat%20Engine/CEHook/speedhack.pas – opc0de

+0

rdtsc est encore plus problématique sur les processeurs multicœurs que Queryperformancecounter, donc l'utiliser est probablement une mauvaise idée. – CodesInChaos

+0

rdtsc fonctionne parfaitement sur les processeurs i7 et est même synchronisé sur les quatre cœurs sur un seul processeur (et fonctionne à l'état P le plus élevé, donc il n'y a pas de dérive de fréquence avec SpeedStep et Turbo). Je ne suis pas sûr si cela est vrai pour Core 2, donc certains tests peuvent être nécessaires. –

1

Une façon Je peux penser est d'avoir une utilisation de fil dédié SuspendThread sur le fil que vous voulez ralentir, attendez un peu de temps, puis reprendre le fil:

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); 
} 
+0

J'ai essayé cela et il bloque l'application cible (est un jeu). Il fonctionne ralentir avec le moteur de triche. – opc0de

0

Je ne comprends pas quel est le motif/contexte de votre question puisque vous ne l'avez pas expliqué clairement. Toutefois, en utilisant SetPriorityClass(), vous pouvez définir la classe de priorité pour le processus spécifié à BELOW_NORMAL_PRIORITY_CLASS ou même à IDLE_PRIORITY_CLASS afin que le processus s'exécute plus lentement; et vous pouvez également définir la classe de priorité pour le processus spécifié à ABOVE_NORMAL_PRIORITY_CLASS ou même à HIGH_PRIORITY_CLASS afin que le processus s'exécute plus rapidement. Avant de le faire, vous aurez besoin d'obtenir le handle du processus cible par son PID, regardez here.

+0

Cela ne rend pas le processus plus rapide ou plus lent. Cela change simplement l'allocation possible des cycles du processeur au processus. Si aucun autre processus n'a besoin de cycles CPU (par exemple, les processus sont en sommeil ou bloqués), la classe prioritaire ne fait rien - le processus "éclatera" pour utiliser les cycles CPU disponibles, jusqu'à ce qu'un autre processus avec une priorité plus élevée . – user314104

0

Windows 2000 a introduit une nouvelle couche sur la gestion de processus interne qui permet de définir des limites supplémentaires sur un ou plusieurs processus: Travaux. Je ne suis pas sûr si cela permet de définir une limite sur le temps processeur utilisé, mais si l'application n'utilise pas déjà la méthode, vous pouvez simplement appeler AssignProcessToJobObject et SetInformationJobObject pour imposer des limitations supplémentaires.