OVH Cloud OVH Cloud

Prb avec SetThreadContext/GetThreadContext

41 réponses
Avatar
Olivier
Bonjour,

J'ai un probleme avec les fonctions SetThreadContext et GetThreadContext
sous Windows XP cela fonctionne
mais sous Windows 2000 sur certains postes (apparemment du Pentium M 1.6
GHz)

Les registres Dr0, Dr1, Dr2, Dr3, Dr6, Dr7 ne sont pas restitués
correctement.
CONTEXT context;

context.ContextFlags = CONTEXT_DEBUG_REGISTERS;

context.Dr2=context.Dr0=0x123;

context.Dr3=context.Dr1=0x321;

context.Dr6=0xFFFF0FF0;

context.Dr7=0;

SetThreadContext(GetCurrentThread(), &context);

context.Dr2=context.Dr0=context.Dr3=context.Dr1=context.Dr7=context.Dr6=0;

context.ContextFlags=CONTEXT_DEBUG_REGISTERS;

GetThreadContext(GetCurrentThread(), &context);

// dr0 dr1 dr2 dr3 dr6 dr7 =0 -> c'est pas bon

Merci,

10 réponses

1 2 3 4 5
Avatar
Vincent Burel
"Paul Bacelar" wrote in message
news:drp3fc$dpm$
"Arnold McDonald (AMcD)" wrote in message
news:43df5ef7$0$25425$
> Remi THOMAS wrote:
>
J'ai ajouté MVP à ma signature sur le NG
"fr.comp.os.ms-windows.programmation" suite à la réponse bien plus


agressive
de Mr Vincent Burel qui avait le condescendance de nous donner un


programme
bateau montrant son dédain pour ma remarque sur le mécanisme de


Zéro-Paging
de WindowNT, montrant par la même sa totale ignorance de ces mécanismes


(et
le manque de clarté de ma remarque peut-être) mais aussi son "ouverture"
d'esprit.



n'importe quoi, c'est vous même qui avait commencé par faire de la
condescendence à 2 balles , genre "c'est quoi ce type qui se permet de
parler de la pile en ces termes" ...

Le seul but de cet ajout était de monter à Mr Vincent Burel, que je
maîtrisais quand même assez le sujet pour éviter ses sarcasmes et pour que
ma remarque ait un peu plus d'écho sur son ego.



en l'occurence vous avez montrer le contraire à l'assistance a plus vu votre
ego que le mien.

Si on passait plus de temps à s'aider les uns les autres plutôt qu'à voir
qui à la plus grosse "maîtrise" ;-)



non, vous racontez des barres, vous ne répondez pas au questions qu'on vous
pose, vous ne réfutez même pas les preuves qu'on vous donne... c'est pas
comme ca que ca marche. Changer de métier, la prétrise vous irez bien par
exemple :-)

VB
Avatar
halfwolf
Vincent Burel wrote:
Pas de probleme, dans ma fonction, déclare une chaine de 256 ko, et é crit
sur le dernier ko.



Fait, mais comment puis-je provoquer un swap sur ce processus sans
attendre qu'il tombe du ciel ?
De plus j'aurais pensé que le fait d'avoir une boucle infinie sans
sleep force le processus a rester en mémoire en permanence pour être
exécuté et donc à ne pas être swappé.

HalfWolf
Avatar
Vincent Burel
wrote in message
news:
Vincent Burel wrote:
Pas de probleme, dans ma fonction, déclare une chaine de 256 ko, et écrit
sur le dernier ko.





Fait, mais comment puis-je provoquer un swap sur ce processus sans
attendre qu'il tombe du ciel ?





C'est Toutle problème. normallement on y arrive en saturant le systeme
d'applications, lancer donc des applications qui bouffe de la mémoire, et
qui font qqc de temps en temps... Vous pouvez faire une appli qui reserve
64Mo de RAM et qui la parcoure par tranche de 16Ko, vous en lancez une
vingtaine ou plus en fonction de votre RAM, ca doit obliger le systeme à
faire du swapping.

Mais est ce que le systeme swap toute l'application ? pile comprise ? je ne
le crois pas. D'ailleurs, est-ce que le systeme swap la mémoire de la pile
non utilisé ? j'ai un gros doute... Est-ce que Paul Bacelar peut répondre à
ces questions ? :-))

De plus j'aurais pensé que le fait d'avoir une boucle infinie sans
sleep force le processus a rester en mémoire en permanence pour être
exécuté et donc à ne pas être swappé.



Faites un Sleep(10.000) dans la boucle si vous voulez (en ayant écrit dans
la pile 255ko plus loins vous pouvez vous payer le lux d'appeler des
fonctions entre chaque lectures).

VB
Avatar
halfwolf
Vincent Burel wrote:
Mais est ce que le systeme swap toute l'application ? pile comprise ? je ne
le crois pas. D'ailleurs, est-ce que le systeme swap la mémoire de la p ile
non utilisé ? j'ai un gros doute... Est-ce que Paul Bacelar peut répo ndre à
ces questions ? :-))



J'aimerais bien aussi, car mon test ne penche pas en faveur de la
thèse de Paul.
Donc :
- soit la pile (au delà du pointeur de pile) n'est jamais modifiée
par le système.
- soit le test ne se met pas dans les conditions où le système
modifie la pile.

J'ai testé sous Windows 2000 SP4.
J'ai lancé les 2 programmes suivants en même temps. J'ai bien eu du
swap (on m'a même étendu ma mémoire virtuelle, c'est dire) et je
n'ai jamais vu affiché "On a touche a ma pile.".
La balle est dans le camp de Paul...

Voici le code en C du test de la pile :

#include <windows.h>
#include <stdio.h>

static char machaine[]="Ma pile n'est jamais modifiée, sauf si je fais
en sorte qu'elle le soit ";


static char * WriteInStack(void)
{
char sss[256 * 1024];
char* p;

p = sss + 255 * 1024;
strcpy(p,machaine);
return p;
}


void TestSiQQcToucheAMaPile(void)
{
long vi;
char * lp;
lp=WriteInStack();
while (1)
{
Sleep(10 * 1000);
vi=0;
while (machaine[vi]!=0)
{
if (lp[vi] != machaine[vi])
{
printf("On a touche a ma pile.n");
return;
}
vi++;
}
}
}

int main(void)
{
TestSiQQcToucheAMaPile();

return 0;
}

Et voici le code en C utilisé pour provoquer un swap (j'ai 256 Mo de
mémoire physique) :

#include <windows.h>
#include <stdio.h>

int main(void)
{
char* p;
size_t sz;

sz = 256 * 1024 * 1024;
p = malloc(sz);
if (p == NULL)
{
printf("Pas assez de memoire.n");
return EXIT_FAILURE;
}

while (1)
{
size_t i;

for (i = 0; i < sz; i += 16 * 1024)
{
p[i] = 't';
}

Sleep(1000);
}

free(p);

return EXIT_SUCCESS;
}

HalfWolf
Avatar
Vincent Burel
wrote in message
news:

Et voici le code en C utilisé pour provoquer un swap (j'ai 256 Mo de
mémoire physique) :



[..]

while (1)
{
size_t i;

for (i = 0; i < sz; i += 16 * 1024)
{
p[i] = 't';
}

Sleep(1000);
}



le code ci-dessus ne fait pas grand chose, faite plutot

size_t i,n;
i=0;
while (1)
{
for (n = 0; n < 16 * 1024; i ++) p[i] = 't';
if (i>=sz) i=0;
Sleep(100);
}

et pour vraiment stresser le systeme, lancez en un dizaine.


VB
Avatar
halfwolf
Vincent Burel wrote:
le code ci-dessus ne fait pas grand chose, faite plutot

size_t i,n;
i=0;
while (1)
{
for (n = 0; n < 16 * 1024; i ++) p[i] = 't';
if (i>=sz) i=0;
Sleep(100);
}



Je ne comprends pas ce que tu veux faire avec la modification que tu me
proposes car le code est buggé : n n'est jamais incrémenté donc on a
une belle boucle infini avec i qui s'incrémente jusqu'au crash.

Je pensais que s'il suffisait de modifier 1 octet par page pour
provoquer le retour de la page dans la mémoire physique et donc forcer
le swap de la page qui était présente dans la mémoire physique.

Au passage une page fait bien 16Ko ? Je pensais de mémoire que
c'était 4Ko, mais je mélange peut-être.

et pour vraiment stresser le systeme, lancez en un dizaine.



Qu'entends tu par stress ?
Je pensais qu'il nous suffisait juste de s'assurer qu'il y ait eu un
swap pour que la pile soit modifiée.
Tu penses qu'il faut que j'aille jusqu'à ce que je ne puisse plus
augmenter ma mémoire virtuelle pour que le système commence à
envisager un swap de la pile ?

Je ne mets pas de mauvaise volonté, mais j'aimerais faire le minimum
testant, parce qu'après c'est moi qui stresse pour récupérer la main
sur le PC :-)

HalfWolf
Avatar
Vincent Burel
wrote in message
news:
Vincent Burel wrote:
le code ci-dessus ne fait pas grand chose, faite plutot

size_t i,n;
i=0;
while (1)
{
for (n = 0; n < 16 * 1024; i ++) p[i] = 't';
if (i>=sz) i=0;
Sleep(100);
}



Je ne comprends pas ce que tu veux faire avec la modification que tu me
proposes car le code est buggé : n n'est jamais incrémenté donc on a
une belle boucle infini avec i qui s'incrémente jusqu'au crash.





oui, c'est n++

Je pensais que s'il suffisait de modifier 1 octet par page pour
provoquer le retour de la page dans la mémoire physique et donc forcer
le swap de la page qui était présente dans la mémoire physique.



ha oui exact, j'ai mal lu.

Au passage une page fait bien 16Ko ? Je pensais de mémoire que
c'était 4Ko, mais je mélange peut-être.



je crois que c'est 4ko la page... mais j'imagine que ce paramètre peut
évoluer.

Tu penses qu'il faut que j'aille jusqu'à ce que je ne puisse plus
augmenter ma mémoire virtuelle pour que le système commence à
envisager un swap de la pile ?



ouai, parce que, à la place du système, si swapperait la pile en dernier
recours. Le systeme est bien stresse quand il swappe en permanence, ton
disque dur ne s'arrète plus.

Je ne mets pas de mauvaise volonté, mais j'aimerais faire le minimum
testant, parce qu'après c'est moi qui stresse pour récupérer la main
sur le PC :-)



ha oui :-), fait une boucle de message pour récupérer un event de sortie...

VB
Avatar
halfwolf
Après plusieurs test, je me suis aperçu qu'il était assez difficile
de faire swapper la pile car elle est petite.
J'ai adopté une autre méthode : j'utilise 64Mo sur la pile
(utilisation de /STACK pour ne pas crasher) et je lance plusieurs
instances du programme.
J'ai observé dans le gestionnaire de tâches que l'utilisation
mémoire du programme est descendue (passée de 64Ko à 12Ko), donc la
pile a bien été swappée.
Après avoir tué une instance, l'utilisation mémoire du programme est
remontée à 64Ko.
Aucune modification de la pile n'a été détectée.

Conclusion : la pile a été swappée mais elle n'a pas été
modifiée.

Voici le seul et unique programme de test à lancer plusieurs fois
(attention de bien utiliser /STACK:70000000).

#include <windows.h>
#include <stdio.h>

#define DATA_ON_STACK_SIZE (64 * 1024 * 1024)
#define PAGE_SIZE (4 * 1024)

static char machaine[]="Ma pile n'est jamais modifiée, sauf si je fais
en sorte qu'elle le soit ";


static char * WriteInStack(void)
{
char sss[DATA_ON_STACK_SIZE];
size_t i;

for (i = 0; i < DATA_ON_STACK_SIZE; i += PAGE_SIZE)
{
strcpy(sss + i,machaine);
}

return sss;
}


void TestSiQQcToucheAMaPile(void)
{
char * lp;
size_t i;

lp=WriteInStack();

while (1)
{
Sleep(10 * 1000);

for (i = 0; i < DATA_ON_STACK_SIZE; i += PAGE_SIZE)
{
if (strcmp(lp + i, machaine) != 0)
{
printf("nOn a touche a ma pile.n");
return;
}
}
printf(".");
}
}

int main(void)
{
TestSiQQcToucheAMaPile();

return 0;
}

HalfWolf
Avatar
Bertrand Lenoir-Welter
Paul Bacelar :

La fatigue aidant, mon sens de l'humour ne c'est pas déclanché sur ta
remarque (je cherche toujours les smiley ;-))))



De nombreuses civilisations s'en sont passées pendant quelques
millénaires. Même les hiéroglyphes égyptiens et le Kanji chinois n'en
ont pas vu l'utilité. Désolé, je dois être vieux jeu.

Inversement, si tu penses que les smileys sont de rigueur, sois cohérent
et ajoute un truc genre ;-) quand tu traites quelqu'un de clown. Parce
que ni Vincent ni moi ne l'avons compris comme un trait d'humour.


Quand à mes explications, le post de halfwolf dans ce même fil semble
montrer qu'elles n'étaient pas si obscures ;-)))



Je ne te critique pas. Me faire traiter de clown est assez anodin sur
les NG quand on compare aux noms d'oiseaux qui circulent.

Mais je pense que la perche tendue par Vincent valait la peine que tu
prennes quelques minutes à la frotter à ta conviction, histoire de voir
laquelle des deux était la plus abrasive. Moi j'ai pas essayé, mais
j'avais pas non plus de conviction en la matière.

Que Vincent ait un style un peu rugueux dans les NG, tout le monde le
sait et s'en accomode fort bien. Suffit de ne pas trop provoquer la
bête. Mais son côté orageux n'enlève rien de rien à ses compétences. Je
souhaite à beaucoup de monde de connaître les arcanes de Windows comme
lui et d'aider avec autant d'efficacité. En tout cas je me le souhaite à
moi.


Passons à des choses bien plus constructives.

Happy programming.



Thanks, same to you.
Avatar
Vincent Burel
Bravo pour le test !
c'est comme ca que j'aime l'informatique, avec des exemples concrets, des
protocoles de test intelligents et des conclusions qui découlent de
l'expérimentation.

VB


wrote in message
news:
Après plusieurs test, je me suis aperçu qu'il était assez difficile
de faire swapper la pile car elle est petite.
J'ai adopté une autre méthode : j'utilise 64Mo sur la pile
(utilisation de /STACK pour ne pas crasher) et je lance plusieurs
instances du programme.
J'ai observé dans le gestionnaire de tâches que l'utilisation
mémoire du programme est descendue (passée de 64Ko à 12Ko), donc la
pile a bien été swappée.
Après avoir tué une instance, l'utilisation mémoire du programme est
remontée à 64Ko.
Aucune modification de la pile n'a été détectée.

Conclusion : la pile a été swappée mais elle n'a pas été
modifiée.
1 2 3 4 5