IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 16-bits Assembleur Discussion :

Détournement de l'IRQ12


Sujet :

x86 16-bits Assembleur

  1. #21
    Membre chevronné Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Par défaut
    j'avait oublié mais effectivement les port du clavier et de la souris sont partagé, tout cela est reglé par la puce 8042:

    la meilleur doc que j'ai sur le sujet etait sur le programme helppc mais heureusement quelqu'un en a fait une version html ici: http://www.stanislavs.org/helppc/8042.html

    apparament tu a tous simplement envoyé les commandes au clavier plutot qu'as la souris

    ps: dans la doc c'est "Auxiliary Device" la souris

  2. #22
    Membre averti

    Homme Profil pro
    passionné
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : passionné
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Par défaut
    Bonjour bifur,merci pour le lien.
    Mais je continue de patauger ...

    Après avoir lu tout ce que j'ai trouvé sur le web,voici où j'en suis,je détourne l'IRQ12,j'initialise la souris,je passe en mode par défaut
    j'active l'envoie des données,j'écris un gestionnaire tout simple qui ne fait que lire le premier octet de données,et .. et ... et ça plante.

    voici le code qui plante sous dosxBox et virtualbox


    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    org 100h
     
    mov ax,cs
    mov ds,ax
     
    ;passage en mode texte 80*25 16 couleurs
     
    mov ah,0	
    mov al,3h
    int 10h
     
    ;sauvegarde du pointeur originale sur IRQ 12=int 74h (souris)
     
    push 0
    pop es
    mov si,74h
    shl si,2
     
    cli
    mov ax,[es:si]
    mov [offset_IRQ12_original],ax
    mov ax,[es:si+2]
    mov [segment_IRQ12_original],ax 
     
    ;mis en place de notre IRQ12 perso
     
    mov ax,souris
    mov [es:si],ax		;offset
    mov ax,cs
    mov [es:si+2],ax	;segment
    sti
     
     
    ;----------------- initialisation souris -----------
     
    xor ax,ax
    xor bx,bx
     
    call mouse_wait1
    mov al,0A8h
    out 64h,al		;active interface auxilliaire du 8042
     
    call mouse_wait0
    in al,60h		;attend ACK
     
    call mouse_wait1
    mov al,20h
    out 64h,al		;données ps2
     
    call mouse_wait0
    in al,60h
    bts ax,1	;bit 1 dans cf puis bit 1 armé=donnée présente sur 60h
    btr ax,5	;bit 5 dans cf puis bit 5 désarmé=donnée non liée à la souris ps2
     
    mov bl,al
     
    call mouse_wait1
    mov al,60h
    out 64h,al		
     
    call mouse_wait1
    mov al,bl	
    out 60h,al
     
    call mouse_wait0
     
    mov ah,0F6h
    call mouse_write	;réinitialise la souris,active la scrutation (stream mode)
     
    ;----------------------------------------------
     
    ;tester souris
     
    mov ax,65535
    B:
    mov cx,65535
    C: loop C
    dec ax
    jnz B
     
     
    ;restauration de IRQ12 original
     
    cli
    push 0
    pop es
    mov si,74h
    shl si,2
    mov ax,[offset_IRQ12_original]
    mov [es:si],ax
    mov ax,[segment_IRQ12_original]
    mov [es:si+2],ax
    sti
     
    ret
     
     
    ;--------------attend qu'une donnée soit présente sur 60h
    mouse_wait0:
     
    	mov cx,1000
    wait0:	in al,64h
    	test al,1
    	loope wait0
    ret
    ;---------------attend que le controleur soit disponible
    mouse_wait1:
     
    	mov cx,1000
    wait1:	in al,64h
    	test al,10b
    	loopne	wait1
    ret
    ;------------- mouse_write
    mouse_write:
     
    ;en entrée: ah=commande à envoyer
     
    call mouse_wait1
    mov al,0D4h
    out 64h,al
    call mouse_wait1
    xchg al,ah
    out 60h,al
    xchg al,ah
    call mouse_wait0
    in al,60h	;lit ack
     
    ret
    ;-----------------
    souris:
     
    push ax
    push bx
    push cx
    push si
    push di
     
    mov cx,100
    xor ax,ax
     
    waitkey:
    	in al,64h
    	dec cl
    	jnz souris1
    ret
     
    souris1:
     
    	and al,20h	;20h=100 000b
    	jz waitkey	;on boucle car bit 5 de 64h pas armé=c'est pas une donnée souris
     
    	in al,60h
     
    	;ici al contient normalement le premier octet envoyé
     
     
    ;acquitement
     
    mov al,20h
    out 0A0h,al	;pic escalve (irq 12 gérée par irq2 du maitre)
    out 20h,al	;pic maitre
     
    pop di
    pop si
    pop cx
    pop bx
    pop ax
     
     
    fin_souris:
     
    iret
     
     
    offset_IRQ12_original	resw	1
    segment_IRQ12_original	resw	1
    HELP !

  3. #23
    Membre Expert
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Par défaut
    à la ligne 146 tu as un "ret" mais les registres sont toujours sauvegardés sur la pile

    De plus tu revectorise l'int avant d'initialiser la souris. Je verrais plutôt l'inverse

  4. #24
    Membre averti

    Homme Profil pro
    passionné
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : passionné
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Par défaut
    merci pour la correction (je commence à fatiguer ...)
    j'ai initialiser la souris puis détourné l'irq mais toujours rien.
    Je continue de chercher.

  5. #25
    Membre chevronné Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Par défaut
    j'avoue que je sèche

    j'ai regardé ce que j'avais fait il y a quelques années sur le sujet:
    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
    mov al,0A8h     ;activation de la souris ps/2   
    out 64h,al
    call attporok
    mov al,0D4h     ;la prochaine commande sera pour la souris
    out 64h,al            
    call attporok
    mov al,0F4h      ;commande souris > active la souris
    out 60h,al            
    call attporok
     
    mov al,060h     ;la prochaine commande sera pour le 8042 command byte
    out 64h,al            
    call attporok
    mov al,047h      ;8042 command byte  (01000111b)
    out 60h,al            
    call attporok
    avec la fonctionn attporok:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    attporok:        ;attend la fin du traitement des donn‚es par la puce 8042
    in al,64h
    jmp $+2
    test al,1
    jz suit842
    in al,60h
    in al,64h
    suit842:
    and al,2
    jnz attporok
    ret
    ce n'est pas un bon exemple a vrais dire car ça n'as fonctionné que sur une seul souris sur les quatres de test, et je m'était contenté de ce résultat car je n'avait pas besoin de la souris
    les seules différences que je voie avec ton code (en dehors de l'ordre des opérations) c'est que j'uttillise la commande F4h alors que tu uttilise la commande F6h et que je n'écoute pas les acknowledgement de la souris

  6. #26
    Membre averti

    Homme Profil pro
    passionné
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : passionné
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Par défaut
    C'est à dire que même si on utilise les ports 60 et 64h avec les bonne commandes du 8042,on peut avoir des souris branchées sur le ps2 qui ne répondent pas ?? Le protocole ps2/8042 n'est pas universel quelque soit le type de souris utilisé ? (Microsoft,labtec,logitech,...)

  7. #27
    Membre chevronné Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Par défaut
    je pense plutôt que nous n'envoyons pas les bonnes commandes aux souris

    j'avoue ne pas avoir trop le temp de me pencher sur le sujet, je vais quand même essayer de modifier mon code pour qu'il attende les ack de la souris car je pense que c'est ça qui me fait foirer l'initialisation dans certains cas

  8. #28
    Membre averti

    Homme Profil pro
    passionné
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : passionné
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Par défaut
    effectivement,je pense que le problème vient des commandes.Je vais re tester tout ça.

  9. #29
    Membre chevronné Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Par défaut
    j'aperçoit le bout du tunnel...

    après plusieurs essais j'ai plus vérifier que la commande F4 (enable data reporting) suffisait pour démarrer une souris juste après le démarrage de l'ordinateur, pour être certain d'avoir les valeur par défaut on peut au préalable uttiliser la commande F6 pour initialiser la souris mais celle ci ne suffit pas

    taux de succès parmis les souris testé: 4 sur 5. seul une veritable intellimouse microsoft reste sourde a mes tentatives de démarrage, j'ai vérifié celle ci fonctionne avec windows me mais pas avec dos 6.22, peut être que celle ci ne répond qu'as un véritable pilote microsoftien

    puisque que je suis lancé je vais tenter le coup d'initialiser les souris a molettes avec la procédure décrit dans le document sur computer-engineering.org (peut être que la souris microsoft répondra)

  10. #30
    Membre averti

    Homme Profil pro
    passionné
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : passionné
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Par défaut
    pour ma part je suis toujours dans le flou,

    j'ai essayé cela;

    envoie de F4 à la souris
    souris renvoie ACK
    envoie de E9 à la souris (demande d'émission des 3 octets de status)
    souris renvoie ACK
    souris renvoie encore poliment ACK () au lieu du premier octet de donnée

    ce qui est bizarre c'est que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     mov al,0F4h
     out 60h,al
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     mov al,0F4h 
    out 64h,al
    entraine l'émission
    d'un ack de la souris alors que pour moi le port 60h et le port 64h n'ont pas la même fonction.

    lorsque tu test tes souris,tu le fais en boot sur un "vrai PC" ou tu passes par un émulateur de pc ? (moi je travaille sur virtualbox)

  11. #31
    Membre chevronné Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Par défaut
    je travaille uniquement sur pc réel, d'ailleur j'ai un pc rien que pour faire des essai, équipé d'un simple lecteur de disquette comme mémoire de masse (si on peu dire) de cette façon je prend aucun risque et j'ai un autre poste pour ecrire/compiler les programmes

    envoyer F4h sur le port 64h fait théoriquement rebooter le pc, vraiment curieux que ça fassent réagire la souris

  12. #32
    Membre averti

    Homme Profil pro
    passionné
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : passionné
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Par défaut
    je vais essayer de changer d'émulateur pour voir.

  13. #33
    Membre Expert
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Par défaut
    perso je suis preneur de vos fichiers source car sous DOS ou FREEDOS j'ai des problèmes avec certains drivers de souris.
    Pour l'instant, les machines qui fonctionnent avec ces OS n'ont pas besoin de souris, donc pas bien grave.
    Mais certains écrans tactiles "émulent" une souris PS/2 et ÇA ça pourrait m'intéresser

  14. #34
    Membre averti

    Homme Profil pro
    passionné
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : passionné
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Par défaut
    Bonjour Forthman,

    dès que j'ai une solution qui me parait tenir la route,je la poste.

  15. #35
    Membre chevronné Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Par défaut
    je travaille sur mon propre os donc je ne sais pas si c'est adaptable a dos mais voici ce que j'ai écrit:

    d'abord la partie initialisation:
    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
    ;programme souris ps/2
     
    mov ax,seldat    ;charge les info souris de base
    mov ds,ax
    mov byte[nbts1],03          ;nombre d'octet de la trame souris
     
     
    call at8042ok 
    mov al,0A8h     ;activation de la souris ps/2   
    out 64h,al
     
    call at8042ok 
    mov al,0D4h     ;la prochaine commande sera pour la souris
    out 64h,al            
     
    call at8042ok
    cli
    mov al,0FFh      ;commande souris > reset souris
    out 60h,al            
    or byte[atts1],01h  ;met a 1 le bit ack attendu
    sti
    call atacks
    cli
    or byte[atts1],01h  ;met a 1 le bit ack attendu
    sti
    call atacks
    cli
    or byte[atts1],01h  ;met a 1 le bit ack attendu
    sti
    call atacks
     
     
    call at8042ok 
    mov al,0D4h     ;la prochaine commande sera pour la souris
    out 64h,al            
     
    call at8042ok
    cli
    mov al,0F4h      ;commande souris > active le data reporting 
    out 60h,al            
    or byte[atts1],01h  ;met a 1 le bit ack attendu
    sti
    call atacks
    avec les fonctions uttilisé par la partie initialisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    at8042ok:        ;attend la fin du traitement des donn‚es par la puce 8042
    in al,64h
    test al,2
    jnz at8042ok
    ret
     
    atacks:
    test byte[atts1],01
    jnz atacks
    ret
    attention il n'y a aucune sécurité et ces fonction peuvent partir en boucle infinis si 8042 ou la souris ne fonctionnent pas!

    et enfin la partie interprétation de l'irq12:
    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    irqsouris:
    push ax
    push bx
    push si
    push ds
     
    mov bx,seldat
    mov ds,bx
     
    test byte[atts1],01h ;test si un ack est atendu
    jz pasacks
    in al,60h
    and byte[atts1],0FEh
    jmp finirqs
     
    pasacks:
    mov bl,[nbzt1]       ;charge le nombre d'octet déja reçu
    xor bh,bh
    mov si,bx
    inc bl
    mov [nbzt1],bl       ; et l'incrémente
    in al,60h
    mov [zts1+si],al    ;met le caractère reçu dans la zt souris
    cmp [nbts1],bl
    jne finirqs         ;si la trame n'as pas été totalement reçu -> fin
     
     
    xor al,al            ;on décode, d'abord mettre le compteur de la trame a zéros
    mov [nbzt1],al
     
    mov al,[zts1]       ;extrait le déplacement en x
    xor bh,bh
    mov bl,[zts1+1]
    test al,10h
    jz noadjx1
    not bh
    noadjx1:
    add [xs1],bx      ;et l'additionne (c'est un nombre signé)
     
    xor bh,bh         ;extrait le déplacement en y
    mov bl,[zts1+2]
    test al,20h
    jz noadjy1
    not bh
    noadjy1:
    sub [ys1],bx     ;et l'additionne (c'est un nombre signé)
     
    mov ax,[xs1]                     ;ajuste la position x de la souris par
    cmp ax,[resx]                    ;rapport a la résolution de l'écran
    jng passupxs1
    mov ax,[resx]
    passupxs1:
    cmp ax,0
    jnl pasinfxs1
    mov ax,0
    pasinfxs1:
    mov [xs1],ax
     
    mov ax,[ys1]                   ;ajuste la position y de la souris par
    cmp ax,[resy]                  ;rapport a la résolution de l'écran
    jng passupys1
    mov ax,[resy]
    passupys1:
    cmp ax,0
    jnl pasinfys1
    mov ax,0
    pasinfys1:
    mov [ys1],ax
     
    ;**************************************
    ;que faire du "clic"
    mov al,[zts1]    
    test al,1
    jz stopbip
    mov al,3
    out 61h,al        ;allume le bipper
    jmp finirqs
     
    stopbip:
    mov al,0
    out 61h,al        ;‚teint le bip
    ;**************************************
     
    finirqs:
    mov al,20h
    out 0A0h,al
    mov al,20h
    out 20h,al
    pop ds
    pop si
    pop bx
    pop ax
    sti
    iret
    cette partie ne fait que extraire les déplacement souris et fait un bip lorsque que l'on appuye sur le bouton gauche, j'ai pas poussé cette partie du code parce que pour le moment mon os n'as pas d'interface graphique et parce que je n'ais pas encore définit comment tout cela fonctionnera

    testé avec succès sur 6 souris (dont une usb branché sur adaptateur usb/ps2) sur 7, la souris microsoft/gateway ne répond toujours pas je suspecte que le problème vienne d'autre chose que mon code (sans en etre certain) comme par exemple un probleme d'alim electrique de la part du port ps2 de ma tour de teste

Discussions similaires

  1. [TASM] Détournement d'interruption
    Par adrien_najaque dans le forum x86 16-bits
    Réponses: 12
    Dernier message: 24/05/2008, 14h23
  2. Méthodes de détournement de trafic
    Par Diody dans le forum Développement
    Réponses: 5
    Dernier message: 10/11/2006, 15h48
  3. Détournement des touches
    Par mappy dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 07/08/2006, 22h05
  4. Détournement d'une interruption
    Par Invité dans le forum Assembleur
    Réponses: 18
    Dernier message: 16/02/2005, 14h49
  5. Proxy, tunneling, détournement de firewall
    Par Davide dans le forum Développement
    Réponses: 19
    Dernier message: 08/10/2003, 14h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo