Problème lecture adresse mémoire

xmaz57000 Messages postés 11 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 13 octobre 2005 - 20 juin 2005 à 15:06
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 - 25 juin 2005 à 16:17
Voilà je viens de recevoir un ordinateur industriel qui dispose en standard de 8 entrées TOR.

Malheureusement, il n'y a aucun driver qui permet de récupérer l'état des entrées mais uniquement une adresse mémoire.

J'utilise comme logiciel de développement, WINDEV 8.0 et la seul fonction qui était suceptible de faire ca ne marche pas.

Existe t'il une fonction dans les API de Windows qui permettrait de lire cette adresse ?

L'adresse est fixe et est : #803H

Merci d'avance

14 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juin 2005 à 15:20
si 803h est bien dans l'espace mémoire de TON processus:
mov edx, 803h
mov eax, [edx]

sinon ReadProcessMemory()

ciao...
BruNews, MVP VC++
0
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
20 juin 2005 à 16:03
Brunews, peut-on utiliser les instructions suivantes ?



mov dx,803h

in eax,dx



Sinon pourquoi



Un Newbie souhaitant progresser
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juin 2005 à 16:16
Ne pas employer 'IN' sous Windows (généralement en mode protégé), il faut utiliser l'API pour accéder au matériel sinon tu auras une exception.

ciao...
BruNews, MVP VC++
0
xmaz57000 Messages postés 11 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 13 octobre 2005
20 juin 2005 à 16:52
comment vous faites pour intégrer ce code dans Windev ???? C po faisable je crois.

mov edx, 803h
mov eax, [edx]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juin 2005 à 17:11
C'est syntaxe Intel standard qui s'emploie sur MS VC++ (que j'utilise) et aussi sur Borland.
Aucune idée du sabir utilisé par Windev, peut-être AT&T ?

ciao...
BruNews, MVP VC++
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
21 juin 2005 à 10:58
salut,

je pense que tu devrais pouvoir utiliser l'instruction in si ton port a son iopl a 3.
la manière de le passer l'iopl a la valeur voulue ?

sinon, pour windev, je pense que le mieux est de passer par une dll.
l'appel de dll ne pose pas de probleme sous windev.


tu peux meme directement creer ta dll en asm avec masm et l'utiliser dans windev sans problèmes.


@++
0
xmaz57000 Messages postés 11 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 13 octobre 2005
21 juin 2005 à 11:08
Je ne suis pas assez callé pour faire mon driver ^^.

Pas que je ne veux po mais je ne c po du tout comment faire et le temps me manque pour me plonger dedans.
Y a po qqun de motivé pour faire ça vite fait ?

Ce qui me pose prob c comment récup la valeur en passant par la DLL

mov edx, 803h
mov eax, [edx]

G vite fait compri ce que ca fesait mais comment dans la DLL mettre le résultat eax dans une variable ?
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
21 juin 2005 à 12:05
re,

dans windev, tu auras simplement:
mavar = AppelDll("madll","ReadIOMapPortORDII",0803h)

les fonctions de ta dll:
ReadIOMapPortORDII PROC portID:DWORD
mov edx,portID
mov eax,[edx]
ret
ENDP

ReadIOPortORDII PROC portID:DWORD
mov edx,portID
in eax,dx
ret
ENDP

le passage eax -> mavar est automatique vu que eax est forcement la valeur de retour dans l'API win32.

@++
0
xmaz57000 Messages postés 11 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 13 octobre 2005
21 juin 2005 à 14:18
Bon encore une question comme je connais po Masm g un doute.

G copié collé ton code et g fait create DLL
Voila ce qu'il ma sortie


; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««


.486 ; create 32 bit code


.model flat, stdcall ; 32 bit memory model


option casemap :none ; case sensitive


; include files


; ~~~~~~~~~~~~~


include \masm32\include\windows.inc


include \masm32\include\masm32.inc


include \masm32\include\gdi32.inc


include \masm32\include\user32.inc


include \masm32\include\kernel32.inc


include \masm32\include\Comctl32.inc


include \masm32\include\comdlg32.inc


include \masm32\include\shell32.inc


include \masm32\include\oleaut32.inc


include \masm32\include\dialogs.inc


include \masm32\macros\macros.asm ; the macro file


; libraries


; ~~~~~~~~~


includelib \masm32\lib\masm32.lib


includelib \masm32\lib\gdi32.lib


includelib \masm32\lib\user32.lib


includelib \masm32\lib\kernel32.lib


includelib \masm32\lib\Comctl32.lib


includelib \masm32\lib\comdlg32.lib


includelib \masm32\lib\shell32.lib


includelib \masm32\lib\oleaut32.lib


; ----------------------------------------


; prototypes for local procedures go here


; ----------------------------------------


.data?


hInstance dd ?


.code


; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««


LibMain proc instance:DWORD,reason:DWORD,unused:DWORD


.if reason = = DLL_PROCESS_ATTACH


push instance


pop hInstance


mov eax, TRUE


.elseif reason == DLL_PROCESS_DETACH


.elseif reason == DLL_THREAD_ATTACH


.elseif reason == DLL_THREAD_DETACH


.endif


ret


LibMain endp


; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««


comment * -----------------------------------------------------


You should add the procedures your DLL requires AFTER


the LibMain procedure. For each procedure that you


wish to EXPORT you must place its name in the "testdll.def"


file so that the linker will know which procedures to


put in the EXPORT table in the DLL. Use the following


syntax AFTER the LIBRARY name on the 1st line.


LIBRARY testdll


EXPORTS YourProcName


EXPORTS AnotherProcName


------------------------------------------------------- *


; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««


end LibMain

Je ne retrouve à aucun endroit le code que g collé. Est ce que c normal ?

Ensuite il me demande de lancer MAKEIT.bat et la je vois bien apparaitre ma DLL mais impossible de l'ouvrir pour voir si c bon. G que des caractères illisibles.
Me serais je trompé qqpart ?

Encore merci PATALO et les autres
0
xmaz57000 Messages postés 11 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 13 octobre 2005
21 juin 2005 à 14:36
Bon g un peu lu ^^ et g vu mon problème par contre il y en a forcément un autre maintenant.

Voilà mon fichier avant compilation


; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««


.486 ; create 32 bit code


.model flat, stdcall ; 32 bit memory model


option casemap :none ; case sensitive


; include files


; ~~~~~~~~~~~~~


include \masm32\include\windows.inc


include \masm32\include\masm32.inc


include \masm32\include\gdi32.inc


include \masm32\include\user32.inc


include \masm32\include\kernel32.inc


include \masm32\include\Comctl32.inc


include \masm32\include\comdlg32.inc


include \masm32\include\shell32.inc


include \masm32\include\oleaut32.inc


include \masm32\include\dialogs.inc


include \masm32\macros\macros.asm ; the macro file


; libraries


; ~~~~~~~~~


includelib \masm32\lib\masm32.lib


includelib \masm32\lib\gdi32.lib


includelib \masm32\lib\user32.lib


includelib \masm32\lib\kernel32.lib


includelib \masm32\lib\Comctl32.lib


includelib \masm32\lib\comdlg32.lib


includelib \masm32\lib\shell32.lib


includelib \masm32\lib\oleaut32.lib


; ----------------------------------------


; prototypes for local procedures go here


; ----------------------------------------


.data?


hInstance dd ?


.code





; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««


LibMain proc instance:DWORD,reason:DWORD,unused:DWORD


.if reason = = DLL_PROCESS_ATTACH


push instance


pop hInstance


mov eax, TRUE


.elseif reason == DLL_PROCESS_DETACH


.elseif reason == DLL_THREAD_ATTACH


.elseif reason == DLL_THREAD_DETACH


.endif


ret


LibMain endp


; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««


comment * -----------------------------------------------------


You should add the procedures your DLL requires AFTER


the LibMain procedure. For each procedure that you


wish to EXPORT you must place its name in the "LIREIO.def"


file so that the linker will know which procedures to


put in the EXPORT table in the DLL. Use the following


syntax AFTER the LIBRARY name on the 1st line.


LIBRARY LIREIO


EXPORTS YourProcName


EXPORTS AnotherProcName


------------------------------------------------------- *


; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««


end LibMain


ReadIOMapPortORDII PROC portID:DWORD


mov edx,portID


mov eax,[edx]


ret


ENDP


ReadIOPortORDII PROC portID:DWORD


mov edx,portID


in eax,dx


ret


ENDP

Si je c lire, c marqué en commentaire qu'il faut placer les procédure après la fonction principale.
C ce que g fait. G ensuite mis dans le fichier Madll.def qques lignes de codes comme demandé à savoir :

LIBRARY LIREIO
EXPORTS ReadIOMapPortORDII
EXPORTS ReadIOPortORDII

Et en lancant le .bat il me met des erreurs
Je pense que c dû à la déclaration des fonctions dans le .def mais pourquoi je c po (g po mis la variable en paramètre) ??
0
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
21 juin 2005 à 14:46
Qu'utilises-tu habituellement comme compilateur/linker. A mon avis il y
a beaucoup de choses inutiles la dedans. Si tu utilise Nasm, il y a un
exemple simple de création de dll



http://www.asmfr.com/code.aspx?ID=31253



Dans la dll tu declares (avec Nasm)



Global ReadIOMapPortORDII ;rend public la fonction (nom de la fonction)

Export ReadIOMapPortORDII ;exporte la fonction



puis dans le code

ReadIOMapPortORDII: ton code
0
xmaz57000 Messages postés 11 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 13 octobre 2005
21 juin 2005 à 15:22
Bon c po faute d'avoir essayé mais je n'y arrive pas.

Je me suis bien fait ma DLL mais dès que j'y accéde avec Windev ça plante de suite.

Qqun pourrait me faire cette DLL plz puis me l'envoyer par mail avec les sources et prog pour compiler histoire que je vois comment ca marche.

Je n'ai pas essayé avec NASM mais je suis ouvert à tout tant que ca marche.

MERCI
0
xmaz57000 Messages postés 11 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 13 octobre 2005
21 juin 2005 à 15:23
Mon adresse email est XMAZ57@HOTMAIL.COM
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
25 juin 2005 à 16:17
re,

si le port doit etre mappé, cela m'etonnerai qu'il soit accessible par l'adresse 0x803 ce qui peut expliquer ton plantage.

meme probleme avec l'instruction "in", si le port n'est pas en iopl 3 -> plantage.

un truc pour changer l'iopl:
http://www.beyondlogic.org/porttalk/porttalk.htm
par contre, c'est en kernel mode donc driver ou service

@++
0
Rejoignez-nous