Peek & poke, acces direct a la memoire

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 824 fois - Téléchargée 44 fois

Contenu du snippet

Ces deux fonctions permettent de faire les fonctions Peek et Poke de QBasic.
Celles-ci permettent d'écrire et de lire directement dans une adresse mémoire.
Elles ne font pas apellent à la DLL habituellement utilisée dans ce genre de
situation: INPOUT32.DLL

ATTENTION: cette routine semble ne pas fonctionner sous winxp

Source / Exemple :


'déclarations API (pour les deux fonctions)
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As _
    Any, Source As Any, ByVal Bytes As Long)

Function Peek(ByVal Addresse As Long, ByVal ValueType As VbVarType) As Variant
    'Permet de lire une valeur d'une adresse mémoire
      Select Case ValueType
        Case vbByte
            Dim valueB As Byte
            CopyMemory valueB, ByVal Addresse, 1
            Peek = valueB
        Case vbInteger
            Dim valueI As Integer
            CopyMemory valueI, ByVal Addresse, 2
            Peek = valueI
        Case vbBoolean
            Dim valueBool As Boolean
            CopyMemory valueBool, ByVal Addresse, 2
            Peek = valueBool
        Case vbLong
            Dim valueL As Long
            CopyMemory valueL, ByVal Addresse, 4
            Peek = valueL
        Case vbSingle
            Dim valueS As Single
            CopyMemory valueS, ByVal Addresse, 4
            Peek = valueS
        Case vbDouble
            Dim valueD As Double
            CopyMemory valueD, ByVal Addresse, 8
            Peek = valueD
        Case vbCurrency
            Dim valueC As Currency
            CopyMemory valueC, ByVal Addresse, 8
            Peek = valueC
        Case vbDate
            Dim valueDate As Date
            CopyMemory valueDate, ByVal Addresse, 8
            Peek = valueDate
        Case vbVariant
            'dans ce cas il n'y a pas besoin de variable intermédiaire
            CopyMemory Peek, ByVal Addresse, 16
        Case Else
            Err.Raise 1001, , "Type inconnnu"
    End Select

End Function

Sub Poke(ByVal Addresse As Long, value As Variant, Optional ByVal ValueType As VbVarType = -1)
	'écrire une valeur n'importe ou dans la mémoire
	'la valeur est écrite dans le format indiqué par le second argument
	'cependant vous pouvez forcer le type par le troisième argument
	
	'ATTENTION !!
	'Cette sub ne supporte ni les Strings ni les Objets
    If ValueType = -1 Then ValueType = VarType(value)
    Select Case ValueType
        Case vbByte
            CopyMemory ByVal Addresse, CByte(value), 1
        Case vbInteger
            CopyMemory ByVal Addresse, CInt(value), 2
        Case vbBoolean
            CopyMemory ByVal Addresse, CBool(value), 2
        Case vbLong
            CopyMemory ByVal Addresse, CLng(value), 4
        Case vbSingle
            CopyMemory ByVal Addresse, CSng(value), 4
        Case vbDouble
            CopyMemory ByVal Addresse, CDbl(value), 8
        Case vbCurrency
            CopyMemory ByVal Addresse, CCur(value), 8
        Case vbDate
            CopyMemory ByVal Addresse, CDate(value), 8
        Case vbVariant
            CopyMemory ByVal Addresse, value, 16
        Case Else
            Err.Raise 1001, , "Type inconnu"
    End Select

End Sub

Conclusion :


Cependant, il faut faire très attention avec ces deux fonctions qui permettent d'écrire
et de lire directement le contenu d'une adresse mémoire car si l'on écrit dans un espace
réservé à une application cette dernière risquerait de fonctionner bizarrement ou meme
d'entrainer un crash de Windows. :(

Ti£oi$

A voir également

Ajouter un commentaire

Commentaires

Gethro
Messages postés
1
Date d'inscription
mercredi 29 octobre 2003
Statut
Membre
Dernière intervention
31 octobre 2003
-
Super, c'est tout à fait ce que je cherchais (mais je n'ai pas encore testé sur XP).
Cependant, ce n'est qu'une partie du problème de la lecture et de l'écriture de données directement en mémoire qui est résolue : il est très risqué d'utiliser cette source tel quel.
En effet, comment être sûr que telle ou telle adresse RAM n'est pas déjà utilisée par une application ou par le système ?
Existe-t-il une fonction VB qui permette de réserver une zone mémoire libre, qui ne pourra pas être utilisée par une autre application tant que le programme VB sera ouvert ?

Dans les "anciens" Basic, il existait la fonction suivante pour réserver une zone mémoire :
A = MEMORY (M)
Avec M qui est la quantité de mémoire désirée et A qui retourne l'adresse du premier octet réservé.
Tilois
Messages postés
721
Date d'inscription
dimanche 10 juin 2001
Statut
Membre
Dernière intervention
27 mars 2011
4 -
DEF SEG, ya pas besoin ...
LUCCQ
Messages postés
1
Date d'inscription
mardi 12 août 2003
Statut
Membre
Dernière intervention
14 octobre 2003
-
ET DEF-SEG ???
dualite2
Messages postés
16
Date d'inscription
vendredi 11 octobre 2002
Statut
Membre
Dernière intervention
27 avril 2005
-
Bien heureux de lire une source interessante, je sombrerai bien a la nostalgie moi aussi l'ennui s'est que je n'ai pas eu la chance de m'amuser avec ces machines. Ceci dit je me refuse à croire que l'on ne peut pas s'amuser sous windows avec softice héhéhé... et un désassembleur genre windasm...
Maintenant je pensse qu'il serait interessant de concevoir un logiciel genre 'reamcheat' en vb en permettant aussi les instantanée et la restauration de tout le systeme... pour le debogage et le piratage se serai super!
bye
cs_Tidus
Messages postés
78
Date d'inscription
dimanche 21 avril 2002
Statut
Membre
Dernière intervention
7 juillet 2003
-
Mais en fin de compte ça marche sous XP ou pas cette merveille ???

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.