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