programme qui tourne sous win98 et plante sous win xp
bonjour à tous,
tout d'abord,
le sujet.
un collègue, a fabriqué, pour moi, un .exe en vb4, celui ci fait appelle à une dll, écrite en assembleur (masm32), le tout fonctionne bien sous win98, mais "plante" sous win xp.

but du prog:
interrogation de l'état de la broche 6 (DSR) du port com1, à une fréquence élevée, au delà des capacités de réponse, de l'api win xp dédiée. ce qui explique que l'on n'y fasse pas appelle.

le programme "plante" lors de l'instruction "in" notament (boucle1 dans le .asm utiliser pour la dll) mais pas seulement.

l'explication mon collègue la connait:

on essaye de récupérer des informations, à des "emplacements" où il nous est "interdit d'accèder" par xp (protection)

la question maintenant:
comment devrait-on faire pour obtenir le résultat souhaité, tout en respectant les règles de programmation sous xp.
j'espère avoir été clair dans mon explication.
je place ci-dessous le contenu du .asm utilisé dans la dll pour plus de clareté.
merci d'avance
cordialement


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
  comment * -----------------------------------------------------
          début fonction MESURE:
Cette fonction renvoie le nb changements etats de DSR (com1) [DWORD] ,pendant le 
temps "nb_cycl" passé en argument [WORD] .
          ------------------------------------------------------- *
          
mesure PROC nb_cycl:WORD    ;nb_cycl contient nb pas de 54.9 ms

LOCAL   com_prec :BYTE
LOCAL   count_fin :WORD  ;heure fin
LOCAL   count_deb :WORD  ;heure debut
LOCAL   count_com :DWORD ;nb changements etats DSR (com1)

pushcontext all
pushfd


    ;debut time dans bx
push ds
mov bx,040h
mov ds,bx
mov bx,word ptr ds:[06Ch]
pop ds
    ;fin time dans bx
mov count_deb,bx


.while count_deb==bx       ;synchro compteur temps.
    ;debut time dans bx
push ds
mov bx,040h
mov ds,bx
mov bx,word ptr ds:[06Ch]
pop ds
    ;fin time dans bx
.endw

add bx,nb_cycl
mov count_fin,bx
mov count_com,0


;debut mesure nb cycles

push ds
mov dx,040h
mov ds,dx
mov dx,word ptr ds:[0000h] ; met adresse de COM1 dans dx.
pop ds

add dx,6 ; met adresse du registre d'etat de COM1 dans dx.
in al,dx
and al,20h  ;mesure le bit 5 de COM1
mov com_prec,al


boucle1 LABEL near           ;entree du test

in al,dx
and al,20h  ;mesure le bit 5 de COM1

.if al != com_prec
mov com_prec,al
inc count_com
.endif


    ;debut time dans bx
push ds
mov bx,040h
mov ds,bx
mov bx,word ptr ds:[06Ch]
pop ds
    ;fin time dans bx
.if bx != count_fin
jmp boucle1
.endif


popfd
popcontext all

return count_com 

mesure ENDP