IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaçage autre langage Python Discussion :

réussir à convertir une valeur "ctypes"


Sujet :

Interfaçage autre langage Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 3
    Points
    3
    Par défaut [Résolu] réussir à convertir une valeur "ctypes"
    Salut tout le monde

    Le titre n'est peut-être pas assez évocateur, il fallait faire court...

    Je suis en train de programmer un truc qui traite des valeurs récupérées dans une autre application en train de tourner, du memory dump.
    Je suis parvenu à trouver sur le net une fonction qui récupère avec succès les valeurs qui m'intéressent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    import ctypes
    import ctypes.wintypes
     
    kernel32 = ctypes.wintypes.windll.kernel32
    # Various access flag definitions:
    class Access:
        DELETE      = 0x00010000
        READ_CONTROL= 0x00020000
        SYNCHRONIZE = 0x00100000
        WRITE_DAC   = 0x00040000
        WRITE_OWNER = 0x00080000
        PROCESS_VM_WRITE = 0x0020
        PROCESS_VM_READ = 0x0010
        PROCESS_VM_OPERATION = 0x0008
        PROCESS_TERMINATE = 0x0001
        PROCESS_SUSPEND_RESUME = 0x0800
        PROCESS_SET_QUOTA = 0x0100
        PROCESS_SET_INFORMATION = 0x0200
        PROCESS_QUERY_LIMITED_INFORMATION = 0x1000
        PROCESS_QUERY_INFORMATION = 0x0400
        PROCESS_DUP_HANDLE = 0x0040
        PROCESS_CREATE_THREAD = 0x0002
        PROCESS_CREATE_PROCESS = 0x0080
     
    def read_process_mem(pid, address, size):
        "Read memory of the specified process ID."
        buf = ctypes.create_string_buffer(size)
        gotBytes = ctypes.c_ulong(0)
        h = kernel32.OpenProcess(Access.PROCESS_VM_READ, False, pid)
        try:
            if kernel32.ReadProcessMemory(h, address, buf, size, ctypes.byref(gotBytes)):
                return buf
            else:
                raise Exception("Failed to access process memory.")
        finally:
            kernel32.CloseHandle(h)
    La fonction renvoie un objet ctypes.c_char_array4 (car dans size je mets 4), que je décode en binaire avec read_process_mem(pid, address, size).value, puis convertis en float avec struct.pack('f', valeur_binaire)[0].
    Cela fonctionne en général mais pour des valeurs attendues telles que 0, 1 ainsi que quelques autres valeurs entre les deux à intervalles réguliers, la valeur binaire retournée est b'' uniquement, faisant planter le reste de mon programme.

    Je voudrais savoir s'il existe une alternative relativement simple pour convertir ce genre d'objet en float, sachant que je ne comprends quasiment rien au module ctypes, le niveau étant très élevé pour moi, un simple programmeur du dimanche.

    merci d'avance

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bon, il ne fallait pas utiliser .value mais .raw.
    value ne fonctionnant que pour les valeurs se terminant par NUL d'après la doc Python. Ce qui n'était pas mon cas pour les valeurs float tombant juste (nombre entier ou quelques chiffres derrière la virgule).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/09/2006, 17h18
  2. [TAG] Convertir une valeur numérique en hh:mm:ss
    Par Rafiki dans le forum Taglibs
    Réponses: 6
    Dernier message: 09/06/2006, 13h21
  3. Convertir une valeur d'une zone de texte en date
    Par os_rasta dans le forum ASP
    Réponses: 17
    Dernier message: 27/02/2006, 15h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo