OVH Cloud OVH Cloud

Win XP - limitations d'accès au hardware

39 réponses
Avatar
CriCri
Salut l'encyclopédie pour les nuls

J'avais compris que sous Win XP l'accès direct au hardware était
interdit. Et depuis mon passage à XP il y a quelques ans je n'en avais
jamais vraiment eu besoin: une fois j'ai bien reçu une insulte parce que
je voulais m'adresser directement à un périph - mais ce n'était pas
indispensable et j'ai trouvé une autre solution sans devoir chercher
plus loin.

Cependant, suite au discussions récentes concernant certains problèmes
de clavier j'ai découvert que
1. des utilitaires que j'ai écrits il y a longtemps (compilés sous MSC
5 - et que je viens de mettre à jour); qui utilisent de l'assembleur
'inline' - avec des appels aux Int21H, 10H, 13H et 16H - fonctionnent
toujours parfaitement sous XP.
2. je peux toujours me servir de 'debug' dans une console DOS sous
Windows XP pour inspecter et modifier directement la mémoire (en
particulier dans le cas présent des adresses 0000:nnnnH dans le BIOS)
sans aucune contrainte.

Alors où est la réalité? Qu'est qui est autorisé et qu'est-ce qui est
vraiment interdit?
En clair, y a-t-il des accès qui sont réellement interdits, ou peut-on
_tout_ contourner avec des astuces officieux?
Je vais bien sûr poursuivre mes propres tests mais je serais également
intéressé par les expériences des autres.

Amicalement
CriCri

PS - je vais rajouter quelques utilitaires de diagnostic sur mon site
(tout à fait au fond) - que je croyais périmés mais qui finalement ne le
sont pas du tout.

--
bitwyse [PGP KeyID 0xA79C8F2C]
Les conseils - c'est ce qu'on demande quand on connaît déjà la réponse
mais aurait préféré ne pas la savoir.
http://www.le-maquis.net

10 réponses

1 2 3 4
Avatar
CriCri
Salut

Michel__D a écrit :

...tes appels aux interruptions BIOS...



Mais je ne fais pas appel aux interruptions BIOS.
Si j'ai oublié ma montre je fais (par exemple)
mov ah,2ch
int 21h
...en faisant appel à _DOS_
(ce qu'il fait après et où il va creuser la réponse ne me regarde pas)

Au fait il n'y a pas de DOS sous XP.



Dis-moi plus.
Même si ce n'est pas pareil pour NTFS, XP peut tourner sous et manipuler
des disques (qui n'ont pas changé) formatés FAT32.
Donc quoi qu'on les appelle il doit avoir des fonctions équivalentes du
type DOS ('Disque Operating System') dans le sens large (pas MS-DOS) -
pour la trilogie ouvrir - lire/écrire - fermer etc.

Hum, c'est un peu plus compliqué en mode protégé (depuis le 80386)
avec les *System Address Registers*



Merci pour ces infos. Je n'ai pas travaillé en assembleur 80x86 depuis
le 80186 (mon intérêt et boulot étant pour les 680x0, d'une
architecture orthogonale et propre; et toujours plus performante -
génération par génération et MHz pour MHz).

Mais ça soulève certaines questions:
1. Un DOS (MS-, DR-, GEM-, Caldéra etc) antérieur au 80386 ne connaît
rien à ces registres, donc ne va pas les initialiser. Avec leurs
valeurs par défaut je suppose donc que le proc se comporte comme un 80186.
2. Si j'ai bien compris tes explications on pourrait créer des machines
virtuelles sur un 80386 avec un DOS adéquat, sans avoir recours à un OS
à un niveau plus haut.

Oui pourquoi pas si tu respecte le traitement effectué avant la
redirection vers le vecteur 0x40.



Faudrait que je ressorte SoftICE ;-) - mais c'est juste par curiosité.

Amicalement
CriCri

--
bitwyse [PGP KeyID 0xA79C8F2C]
Les conseils - c'est ce qu'on demande quand on connaît déjà la réponse
mais aurait préféré ne pas la savoir.
http://www.le-maquis.net
Avatar
Michel__D
CriCri a écrit :
Salut

Michel__D a écrit :

...tes appels aux interruptions BIOS...



Mais normalement je ne fais pas appel aux interruptions BIOS
(c'était exceptionnel pour le truc du clavier l'autre jour).
Si j'ai oublié ma montre je fais (par exemple)
mov ah,2ch
int 21h
....en faisant appel à _DOS_



Non dans ce cas précis tu fais appel à la fonction 0x2C de l'interruption
0x21 qui a été mise en place par un système d'exploitation qui par exemple
pourrait être un DOS comme MSDOS qui se caractérise par le chargement et
éventuellement l'exécution de IO.SYS, MSDOS.SYS et COMMAND.COM et
accompagné des fichiers de configuration CONFIG.SYS et AUTOEXEC.BAT, alors
que sous XP, la présence et l'émulation de cette interruption c'est plus
pour une raison de compatibilité qu'autre chose.

(ce qu'il fait après et où il va creuser la réponse ne me regarde pas)

Au fait il n'y a pas de DOS sous XP.



Dis-moi plus.
Même si ce n'est pas pareil pour NTFS, XP peut tourner sous et manipuler
des disques (qui n'ont pas changé) formatés FAT32.
Donc quoi qu'on les appelle il doit avoir des fonctions équivalentes du
type DOS ('Disque Operating System') dans le sens large (pas MS-DOS) -
pour la trilogie ouvrir - lire/écrire - fermer etc.



Comme cela a déja été dit, sous XP c'est plutot une émulation car
derrière ce n'est pas le même code qui tourne.

Hum, c'est un peu plus compliqué en mode protégé (depuis le 80386)
avec les *System Address Registers*



Merci pour ces infos. Je n'ai pas travaillé en assembleur 80x86 depuis
le 80186 (mon intérêt et boulot étant pour les 680x0, d'une
architecture orthogonale et propre; et toujours plus performante -
génération par génération et MHz pour MHz).



Moi aussi je préférai l'architecture du 680x0 !

Mais ça soulève certaines questions:
1. Un DOS (MS-, DR-, GEM-, Caldéra etc) antérieur au 80386 ne connaît
rien à ces registres, donc ne va pas les initialiser. Avec leurs
valeurs par défaut je suppose donc que le proc se comporte comme un 80186.
2. Si j'ai bien compris tes explications on pourrait créer des machines
virtuelles sur un 80386 avec un DOS adéquat, sans avoir recours à un OS
à un niveau plus haut.



Ben le problème du DOS c'est qu'il est monotache donc je ne pense pas que
ce soit une bonne base à moins de tout reécrire et dans ce cas là autant
partir de 0 (mais sacré boulot en perspective).

PS:Pour te rendre compte que la table d'interruption n'est pas figée il
suffit (sous XP) de lançer debug à partir de cmd.exe et de command.com
et tu te rendras compte que les vecteurs d'interruptions 0x22,0x23,0x24
n'ont pas les mêmes valeurs.

Oui pourquoi pas si tu respecte le traitement effectué avant la
redirection vers le vecteur 0x40.



Faudrait que je ressorte SoftICE ;-) - mais c'est juste par curiosité.


Avatar
CriCri
Salut

Michel__D a écrit :

Non dans ce cas précis tu fais appel à la fonction 0x2C de
l'interruption 0x21 qui a été mise en place par un système
d'exploitation qui par exemple pourrait être un DOS...


[couic]
alors que sous XP, la présence et l'émulation de cette interruption
c'est plus pour une raison de compatibilité qu'autre chose.



Sans vouloir quadrisectionner les poils:
- incorporées dans cette émulation il y a forcément des sections de
code qui exécute les mêmes fonctions que les interruptions d'un DOS
ordinaire quelconque (rétro-compatibilité oblige)
- si l'on considère l'ensemble de ces sections d'émulation (et même si
elles sont éparpillées), il existe donc bien tous les composants d'un
DOS dans XP.

Comme cela a déja été dit, sous XP c'est plutot une émulation car
derrière ce n'est pas le même code qui tourne.



Ce n'est pas le même code qui exécute les mêmes fonctions dans
MS-, DR-, GEM- et Caldéra DOS, mais le résultat est +/- le même.

Moi aussi je préférai l'architecture du 680x0 !



Eh oui, et si elle avait été adopté à la place du boulet de celle des
80x86 on aurait vite été plusieurs années plus en avance ;-)

Ben le problème du DOS c'est qu'il est monotache donc je ne pense pas
que ce soit une bonne base à moins de tout reécrire et dans ce cas
là autant partir de 0 (mais sacré boulot en perspective).



En 1987 j'ai commencé à travailler sur un GEMDOS multitâche pour Atari
ST et j'avais déjà un prototype (limité) qui fonctionnait.
Puis à peu près en même temps
- Atari a développé un multiTOS pour les TT
- la vente des Atari a chuté (baisse de prix des Mac et des copies
importées)
- la vente des PC a décollé.
Alors il en est resté là.

PS:Pour te rendre compte que la table d'interruption n'est pas figée
il suffit (sous XP) de lançer debug à partir de cmd.exe et de
command.com et tu te rendras compte que les vecteurs d'interruptions
0x22,0x23,0x24 n'ont pas les mêmes valeurs.



Pourquoi les auraient-ils?
'Terminate' (terminaison normal), '<CTRL>-C' (interruption utilisateur)
et 'Critical Error' (généralement du hardware) - sont pas pareils...

Amicalement
CriCri

--
bitwyse [PGP KeyID 0xA79C8F2C]
Les conseils - c'est ce qu'on demande quand on connaît déjà la réponse
mais aurait préféré ne pas la savoir.
http://www.le-maquis.net
Avatar
Michel__D
CriCri a écrit :
Salut

Michel__D a écrit :

Non dans ce cas précis tu fais appel à la fonction 0x2C de
l'interruption 0x21 qui a été mise en place par un système
d'exploitation qui par exemple pourrait être un DOS...


[couic]
alors que sous XP, la présence et l'émulation de cette interruption
c'est plus pour une raison de compatibilité qu'autre chose.



Sans vouloir quadrisectionner les poils:
- incorporées dans cette émulation il y a forcément des sections de
code qui exécute les mêmes fonctions que les interruptions d'un DOS
ordinaire quelconque (rétro-compatibilité oblige)
- si l'on considère l'ensemble de ces sections d'émulation (et même si
elles sont éparpillées), il existe donc bien tous les composants d'un
DOS dans XP.



Ben non, le DOS ne fait appel qu'au BIOS tandis que XP adresse
directement le matériel via ses pilotes/drivers.

Comme cela a déja été dit, sous XP c'est plutot une émulation car
derrière ce n'est pas le même code qui tourne.



Ce n'est pas le même code qui exécute les mêmes fonctions dans
MS-, DR-, GEM- et Caldéra DOS, mais le résultat est +/- le même.



Ha c'est sur que *superficiellemnt* le résultat est le même, c'est à
dire un traitement d'information.

Moi aussi je préférai l'architecture du 680x0 !



Eh oui, et si elle avait été adopté à la place du boulet de celle des
80x86 on aurait vite été plusieurs années plus en avance ;-)

Ben le problème du DOS c'est qu'il est monotache donc je ne pense pas
que ce soit une bonne base à moins de tout reécrire et dans ce cas là
autant partir de 0 (mais sacré boulot en perspective).



En 1987 j'ai commencé à travailler sur un GEMDOS multitâche pour Atari
ST et j'avais déjà un prototype (limité) qui fonctionnait.



Mouais mais avec le VDI et l'AES du GEMDOS on s'éloigne du simple DOS !

Puis à peu près en même temps
- Atari a développé un multiTOS pour les TT
- la vente des Atari a chuté (baisse de prix des Mac et des copies
importées)
- la vente des PC a décollé.
Alors il en est resté là.

PS:Pour te rendre compte que la table d'interruption n'est pas figée
il suffit (sous XP) de lançer debug à partir de cmd.exe et de
command.com et tu te rendras compte que les vecteurs d'interruptions
0x22,0x23,0x24 n'ont pas les mêmes valeurs.



Pourquoi les auraient-ils?
'Terminate' (terminaison normal), '<CTRL>-C' (interruption utilisateur)
et 'Critical Error' (généralement du hardware) - sont pas pareils...



C'est par rapport à une de tes réponses, je cite "Que dans une machine
_physique_ il n'y a qu'un seul tableau de vecteurs d'interruptions au
tout début de la mémoire _physique_. Que ça dépend du microcode du
processeur et qu'on ne peut pas le modifier.
Donc si tu changes un vecteur, tu le changes pour tout le monde."
Avatar
CriCri
Re-salut

C'est vachement difficile de comprendre les détails des mécanismes tant
que l'éditeur fait tout pour empêcher les gens de s'informer...

Michel__D a écrit :

Ben non, le DOS ne fait appel qu'au BIOS tandis que XP adresse
directement le matériel via ses pilotes/drivers.



D'après ce que tu dis ça veut dire donc qu'au lieu des couches
classiques, genre

GUI Win 9x ->
--------
fonctions MS-DOS ->
--------
fonctions BIOS ->
--------
pilotes hardware normaux


...ça devient...

GUI Win XP ->
--------
machine DOS virtuelle ->
--------
pilotes hardware XP (en contournant entièrement le BIOS).

Comment ça se passe donc si XP daigne encore utiliser un ancien pilote
qui compte sur le BIOS pour que son périph' soit 'compris'?

Ha c'est sur que *superficiellemnt* le résultat est le même, c'est à
dire un traitement d'information.



Nan - si tu demandes à remplir un tampon avec le contenu du disque n,
face x, piste y, secteur z tu va toujours obtenir les mêmes données,
quelle que soit ta flaveur de DOS.

Mouais mais avec le VDI et l'AES du GEMDOS on s'éloigne du simple DOS
!



En fait ce n'est pas là le problème.
Puisque le BIOS n'est pas ré-entrant tu refuses tout simplement toute
requête pré-emptive tant que tu es actuellement dans
- le BIOS
- le VDI, ou
- les AES
...et tu l'enregistres mais tu la mets en file d'attente.
Comme ça tu évites tout conflit et (si tout va bien) l'utilisateur ne va
même pas s'en apercevoir)

Seulement puisque la majorité des programmes n'a pas écrite pour
fonctionner en multi-tâche, ça peut bloquer. Dans ce cas-là, tu prévois
des tranches de temps processeur limitées.

C'est par rapport à une de tes réponses, je cite...



OK, compris, je parlais des procs jusqu'au 80186 avec des OS antérieurs
(MS-DOS 3.2, par exemple).
Mais qu'est-ce que ça change au niveau des interruptions 0x22, 0x23 et
0x24 -
'Terminate' (terminaison normal), '<CTRL>-C' (interruption utilisateur)
et 'Critical Error' (généralement du hardware).
Ça n'a jamais été autrement: les vecteurs ont toujours été différentes
comme il se doit; dans le cas contraire ça pourrait provoquer de graves
problèmes.

--
bitwyse [PGP KeyID 0xA79C8F2C]
Les conseils - c'est ce qu'on demande quand on connaît déjà la réponse
mais aurait préféré ne pas la savoir.
http://www.le-maquis.net
Avatar
Michel__D
CriCri a écrit :
Re-salut

C'est vachement difficile de comprendre les détails des mécanismes tant
que l'éditeur fait tout pour empêcher les gens de s'informer...

Michel__D a écrit :

Ben non, le DOS ne fait appel qu'au BIOS tandis que XP adresse
directement le matériel via ses pilotes/drivers.



D'après ce que tu dis ça veut dire donc qu'au lieu des couches
classiques, genre

GUI Win 9x ->
--------
fonctions MS-DOS ->
--------
fonctions BIOS ->
--------
pilotes hardware normaux


....ça devient...

GUI Win XP ->
--------
machine DOS virtuelle ->
--------
pilotes hardware XP (en contournant entièrement le BIOS).

Comment ça se passe donc si XP daigne encore utiliser un ancien pilote
qui compte sur le BIOS pour que son périph' soit 'compris'?



Si tu as un pilote compatible avec un l'OS c'est qu'il respecte un
cahier des charges et généralement c'est soit le constructeur qui
fournis les spécifications de son matériel afin de développer le
pilote/drivers adéquat ou c'est lui-même qui le réalise.

Ha c'est sur que *superficiellemnt* le résultat est le même, c'est à
dire un traitement d'information.



Nan - si tu demandes à remplir un tampon avec le contenu du disque n,
face x, piste y, secteur z tu va toujours obtenir les mêmes données,
quelle que soit ta flaveur de DOS.



Ouais si tu veux, sauf que le terme DOS est associé à un système
d'exploitation qui n'est pas mis en oeuvre dans le cas présent.

Mouais mais avec le VDI et l'AES du GEMDOS on s'éloigne du simple DOS
!



En fait ce n'est pas là le problème.
Puisque le BIOS n'est pas ré-entrant tu refuses tout simplement toute
requête pré-emptive tant que tu es actuellement dans
- le BIOS
- le VDI, ou
- les AES
....et tu l'enregistres mais tu la mets en file d'attente.
Comme ça tu évites tout conflit et (si tout va bien) l'utilisateur ne va
même pas s'en apercevoir)

Seulement puisque la majorité des programmes n'a pas écrite pour
fonctionner en multi-tâche, ça peut bloquer. Dans ce cas-là, tu prévois
des tranches de temps processeur limitées.

C'est par rapport à une de tes réponses, je cite...



OK, compris, je parlais des procs jusqu'au 80186 avec des OS antérieurs
(MS-DOS 3.2, par exemple).
Mais qu'est-ce que ça change au niveau des interruptions 0x22, 0x23 et
0x24 -
'Terminate' (terminaison normal), '<CTRL>-C' (interruption utilisateur)
et 'Critical Error' (généralement du hardware).
Ça n'a jamais été autrement: les vecteurs ont toujours été différentes
comme il se doit; dans le cas contraire ça pourrait provoquer de graves
problèmes.



C'était juste pour dire qu'avec ta théorie l'on aurait du trouver les
mêmes valeurs que l'on soit sous la ligne de commande classique
(cmd.exe) et/ou que l'on soit sous l'interpréteur de commande 16 bits
(command.com) autrement dit le vecteur 0x22 lu sous debug lançé sous
la ligne de commande (cmd.exe) aurait du avoir la même valeur que sous
l'interpréteur de commande 16 bits (command.com) alors que ce n'est
pas le cas et c'est ainsi aussi pour les vecteurs 0x23 et 0x24.
Avatar
CriCri
Michel__D a écrit :

Si tu as un pilote compatible avec un l'OS c'est qu'il respecte un
cahier des charges...



Ben oui, mais il existe des pilotes développés pour W9x qui continuent à
fonctionner parfaitement sous XP; même si le cahier des charges a évolué
depuis (mais dans ces cas particuliers, sans doute pas).

Ouais si tu veux, sauf que le terme DOS est associé à un système
d'exploitation qui n'est pas mis en oeuvre dans le cas présent.



Donc dans ce cas c'est l'émulation qui continue à fonctionner exactement
comme tous les divers DOS précédents (tant mieux).

C'était juste pour dire qu'avec ta théorie l'on aurait du trouver les
mêmes valeurs que l'on soit sous la ligne de commande classique
(cmd.exe) et/ou que l'on soit sous l'interpréteur de commande 16 bits
(command.com)...



Eh ben voilà j'ai enfin bien compris ta thèse! (excuse-moi, je suis
parfois un peu lent...).
La conclusion est donc que l'émulation n'est pas toujours parfaite
(voire parfois un peu n'importe quoi...). Merci de me l'avoir appris -
je mourrai moins bête. Et ça pourrait être bien utile à savoir dans
certains cas pratiques où on n'arrive pas à comprendre exactement ce qui
ne va pas.

Amicalement
CriCri

--
bitwyse [PGP KeyID 0xA79C8F2C]
Les conseils - c'est ce qu'on demande quand on connaît déjà la réponse
mais aurait préféré ne pas la savoir.
http://www.le-maquis.net
Avatar
CriCri
Michel__D a écrit :

C'était juste pour dire qu'avec ta théorie l'on aurait du trouver les
mêmes valeurs que l'on soit sous la ligne de commande classique
(cmd.exe) et/ou que l'on soit sous l'interpréteur de commande 16 bits
(command.com)...



Alors (je n'ai pas eu le temps de l'expérimenter) si on se limite au
lancement de programmes 16 bits depuis 'command.com', on devrait
retrouver toutes les fonctionnalités normales de MS-DOS? - même sous XP?

--
bitwyse [PGP KeyID 0xA79C8F2C]
Les conseils - c'est ce qu'on demande quand on connaît déjà la réponse
mais aurait préféré ne pas la savoir.
http://www.le-maquis.net
Avatar
Michel_D
Bonjour,

"CriCri" a écrit dans le message de news:489f6392$0$926$

Alors (je n'ai pas eu le temps de l'expérimenter) si on se limite au
lancement de programmes 16 bits depuis 'command.com', on devrait
retrouver toutes les fonctionnalités normales de MS-DOS? - même sous XP?



Non, je l'ai déja dit certaines fonctions de l'interruption 0x21 ne réagissent
pas pareil et que ce soit sous le 'command.com' comme sous le 'cmd.exe'
ce qui n'est pas anormal puisque ce n'est pas réellement du DOS mais
une émulation.
Avatar
Michel_D
"CriCri" a écrit dans le message de news:489f5b50$0$956$
Michel__D a écrit :
>
> Si tu as un pilote compatible avec un l'OS c'est qu'il respecte un
> cahier des charges...

Ben oui, mais il existe des pilotes développés pour W9x qui continuent à
fonctionner parfaitement sous XP; même si le cahier des charges a évolué
depuis (mais dans ces cas particuliers, sans doute pas).



Les pilotes développés pour W9x ne peuvent pas être certifiés pour XP
il suffit de voir le .inf qui est différent et donc essayer de l'utiliser avec XP
entraîne forcément une modification préable avant l'installation et de toute
façon l'utilisation d'un pilote/driver de W9x sous XP est toujours à tes
risques et périls.

> Ouais si tu veux, sauf que le terme DOS est associé à un système
> d'exploitation qui n'est pas mis en oeuvre dans le cas présent.

Donc dans ce cas c'est l'émulation qui continue à fonctionner exactement
comme tous les divers DOS précédents (tant mieux).



Oui mais comme c'est une émulation, la compatibilité n'est pas totale.
1 2 3 4