Peek & poke, acces direct a la memoire

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

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.