Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Application DOS et ports COM sous Win NT-2000-XP

5 réponses
Avatar
Yves
Est-il possible de g=E9rer les ports s=E9rie par un programme=20
DOS, ex=E9cut=E9 sur les postes sous Win NT, 2000 ou XP ?

Les essais que j'ai effectu=E9s permettent d'envoyer les=20
donn=E9es vers le port COM mais ne donnent pas de r=E9sultat=20
en lecture (cette application de communication bi-
directionnelle fonctionne parfaitement sur les postes Win=20
9x).

Merci =E0 tous
Yves

5 réponses

Avatar
Jean-Claude BELLAMY
Yves s'est ainsi exprimé:

Est-il possible de gérer les ports série par un programme
DOS, exécuté sur les postes sous Win NT, 2000 ou XP ?

Les essais que j'ai effectués permettent d'envoyer les
données vers le port COM mais ne donnent pas de résultat
en lecture (cette application de communication bi-
directionnelle fonctionne parfaitement sur les postes Win
9x).



Il est strictement interdit sous NT d'accéder DIRECTEMENT (par des "in",
"out", "intxxh",... au matériel)
(ports E/S, DD, vidéo,..)!

Tout accès au matériel DOIT passer par le système.

Dans un programme Win32, on doit utiliser la fonction "CreateFile" (de
kernel32.dll), qui permet d'ouvrir à peu près n'importe quoi (fichiers,
répertoires, ports COM et LPT,..)
Syntaxe C :
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);

On doit avoir, dans le cas d'un port, :
dwShareMode = 0 (accès exclusif)
dwCreationDisposition = OPEN_EXISTING
hTemplateFile = NULL


On peut aussi s'en tirer à l'aide d'une interface nommée "NTPort", qui
fonctionne très bien (sous Win9X/ME/NT3.5x/NT4/W2K/XP/W2K3) , et est
utilisable dans toute appli C,/C++, VB, Delphi, VN.NET, C#, ...(tout est
fourni : les *.h, *.cpp, *.dsw, ..*.dfm, *.dpr, *.pas, ...*.frm..)

Son usage est plus simple que celui de Createfile.

Ce n'est pas gratuit, mais le prix est raisonnable (30 $)
http://zealsoftstudio.com/ntport/


Si le programme est non modifiable (parce qu'on n'a pas le source, ...)
et/ou parce que c'est une vieille appli DOS, la seule solution (pas
évidente!) est de développer un VDD (Virtual Dos Driver), qui est une DLL 32
bits un peu spéciale, dont le rôle est d'intercepter tous les appels
matériels directs d'une appli DOS, pour les retransmettre "correctement" à
Windows.


--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*
Avatar
Yves
Merci beaucoup pour ces explications claires et précises.
Compte tenu de la complexité d'une éventuelle solution, je crois que je vais
attendre le portage de mon appli vers une interface Windows (projet en
cours) et continuer l'exploitation sur les postes W9x seuls.
Bien cordialement
Yves

"Jean-Claude BELLAMY" a écrit dans le
message de news:
Yves s'est ainsi exprimé:

> Est-il possible de gérer les ports série par un programme
> DOS, exécuté sur les postes sous Win NT, 2000 ou XP ?
>
> Les essais que j'ai effectués permettent d'envoyer les
> données vers le port COM mais ne donnent pas de résultat
> en lecture (cette application de communication bi-
> directionnelle fonctionne parfaitement sur les postes Win
> 9x).

Il est strictement interdit sous NT d'accéder DIRECTEMENT (par des "in",
"out", "intxxh",... au matériel)
(ports E/S, DD, vidéo,..)!

Tout accès au matériel DOIT passer par le système.

Dans un programme Win32, on doit utiliser la fonction "CreateFile" (de
kernel32.dll), qui permet d'ouvrir à peu près n'importe quoi (fichiers,
répertoires, ports COM et LPT,..)
Syntaxe C :
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);

On doit avoir, dans le cas d'un port, :
dwShareMode = 0 (accès exclusif)
dwCreationDisposition = OPEN_EXISTING
hTemplateFile = NULL


On peut aussi s'en tirer à l'aide d'une interface nommée "NTPort", qui
fonctionne très bien (sous Win9X/ME/NT3.5x/NT4/W2K/XP/W2K3) , et est
utilisable dans toute appli C,/C++, VB, Delphi, VN.NET, C#, ...(tout est
fourni : les *.h, *.cpp, *.dsw, ..*.dfm, *.dpr, *.pas, ...*.frm..)

Son usage est plus simple que celui de Createfile.

Ce n'est pas gratuit, mais le prix est raisonnable (30 $)
http://zealsoftstudio.com/ntport/


Si le programme est non modifiable (parce qu'on n'a pas le source, ...)
et/ou parce que c'est une vieille appli DOS, la seule solution (pas
évidente!) est de développer un VDD (Virtual Dos Driver), qui est une DLL


32
bits un peu spéciale, dont le rôle est d'intercepter tous les appels
matériels directs d'une appli DOS, pour les retransmettre "correctement" à
Windows.


--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*




Avatar
JoeBaratin
On Thu, 16 Oct 2003 10:19:39 +0200, "Jean-Claude BELLAMY"
wrote:

Si le programme est non modifiable (parce qu'on n'a pas le source, ...)
et/ou parce que c'est une vieille appli DOS, la seule solution (pas
évidente!) est de développer un VDD (Virtual Dos Driver), qui est une DLL 32
bits un peu spéciale, dont le rôle est d'intercepter tous les appels
matériels directs d'une appli DOS, pour les retransmettre "correctement" à
Windows.



J'ai une question :

existe t il un programme analysant un vieux programme dos afin de
savoir quelles sont les appel au materiel ?

J'ai un programme qui ne fonctionne pas sous 2000 et qui rame a fond
sur XP au point que si je le lance une deuxieme fois j'ai le temps de
boire un café entre chaque manip (celeron 2000). J'aimerai developper
un VDD si cela permet d'accelerer son traitement mais je ne sais pas
où trouver de tutorial en francais.

merci d'avance pour les info.


--
Les fautes d'orthographes sus-citées sont déposées auprès de leurs
propriétaires respectifs. Aucune responsabilité n'est engagée sur
la lisibilité du message ou les éventuels dommages qu'ils peuvent
engendrer.
Avatar
Jean-Claude BELLAMY
JoeBaratin <Ben Y En A Pas> s'est ainsi exprimé:

On Thu, 16 Oct 2003 10:19:39 +0200, "Jean-Claude BELLAMY"
wrote:

Si le programme est non modifiable (parce qu'on n'a pas le source,
...) et/ou parce que c'est une vieille appli DOS, la seule solution
(pas évidente!) est de développer un VDD (Virtual Dos Driver), qui
est une DLL 32 bits un peu spéciale, dont le rôle est d'intercepter
tous les appels matériels directs d'une appli DOS, pour les
retransmettre "correctement" à Windows.



J'ai une question :

existe t il un programme analysant un vieux programme dos afin de
savoir quelles sont les appel au materiel ?



DEBUG !
Et beaucoup de patience !!!!

J'ai un programme qui ne fonctionne pas sous 2000 et qui rame a fond
sur XP au point que si je le lance une deuxieme fois j'ai le temps de
boire un café entre chaque manip (celeron 2000). J'aimerai developper
un VDD si cela permet d'accelerer son traitement mais je ne sais pas
où trouver de tutorial en francais.



Ouh la !!!!!!!!
Déjà en anglais ce n'est pas de la tarte, alors trouver çà en français ....

La seule doc sur les VDD que je possède est dans le MSDN :
chapitre
Windows Development
DDK
Other devices
Devices Requiring VDDs
Design Guide
Writing a VDD

Un VDD est une DLL 32-bits qui tourne en mode user.
Il transforme toutes les requêtes de programmes MS-DOS en appels en mode
kernel.
Il peut être appelé :
- soit directement par une appli DOS modifiée,
qui fera appel aux fonctions
DispatchCall,
RegisterModule
UnRegisterModule
- soit indirectement par la VDM (Virtual DOS machine) qui intercepte
les accès périphériques de l'appli DOS et les redirige vers
les fonctions "callback" du VDD.
Dans ce cas, le VDD doit être déclaré explictement dans la Base de
registres :

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlVirtualDeviceDrivers.
entrée "VDD" (type REG_MULTI_SZ)
valeur : <chemin complet VDD1.DLL><chemin complet VDD2.DLL>

Un VDD est composé d'une routine d'initialisation :

BOOL VDDInitialize(IN PVOID DllHandle, IN ULONG Reason,
IN PCONTEXT Context OPTIONAL)
{
switch (Reason) {
case DLL_PROCESS_ATTACH:
// Allocation mémoire éventuelle ("HeapCreate(...")
// tests de présence du périphérique concerné....
// installation de "hooks" E/S et mémoire
VDDInstallIOHook(...)
VDDInstallMemoryHook(...)
...
break;
case DLL_PROCESS_DETACH:
// Libération mémoire éventuelle.
// message éventuel de déconnexion envoyé au périphérique
// désinstallation des "hooks"
VDDDeInstallIOHook(...)
VDDDeInstallMemoryHook(...)
...
break;
default:
break;
} return TRUE;
}

et de routines
- de "hook" de ports d'E/S
- de "hook" de mémoire
- de "hook" utilisateur
- de simulation d'interruptions
- de gestion de DMA
- ...

Les VDD functions sont au nombre de 28 et les VDD Structures au nombre de 3!

Bref, vraiment pas évident !!!!
Personnellement, je ne m'y suis jamais "frotté"!

--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*
Avatar
JoeBaratin
On Fri, 17 Oct 2003 13:13:11 +0200, "Jean-Claude BELLAMY"
wrote:

ok merci, je crois que je vais passer plus de temps a faire ca qu'a
reecrire le programme.

Probleme j'ai plus vraiment le temps, ni la volonté de me faire chi..
devant un PC a me casser la tete. Probablement l'age aussi.......


--
Les fautes d'orthographes sus-citées sont déposées auprès de leurs
propriétaires respectifs. Aucune responsabilité n'est engagée sur
la lisibilité du message ou les éventuels dommages qu'ils peuvent
engendrer.