Re: How come this is different?
Michael C <[email protected]> Sat, 10 Dec 2016 23:26:50 +0000
| Newsgroups | gmane.comp.python.ctypes |
|---|---|
| Message-ID | <CANyKM1i8uZeciFziYOu43Ma-kobWznXvQH0_Y1CfVd-NKgWiew@mail.gmail.com> |
--===============5562974484312584968== Content-Type: multipart/alternative; boundary=001a114a9eae202a1d05435635eb --001a114a9eae202a1d05435635eb Content-Type: text/plain; charset=UTF-8 i have to go to work, will take a look later! thx! On Sat, Dec 10, 2016 at 3:25 PM eryk sun <[email protected]> wrote: > On Sat, Dec 10, 2016 at 9:30 PM, Michael C > > <[email protected]> wrote: > > > I am stuck on which line of information to feed to ReadmemoryProcess with > > > this, I think I properly retrieved the information from Virtualqueryex > > > > Here's an example that uses VirtualQueryEx to determine whether the > > specified address is allocated and readable. If so, it reads up to > > `count` double-precision floats via ReadProcessMemory, but it won't > > read past the allocated region size. > > > > import ctypes > > from ctypes import wintypes > > > > kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) > > > > PROCESS_VM_READ = 0x0010 > > PROCESS_QUERY_INFORMATION = 0x0400 > > > > MEM_COMMIT = 0x00001000 > > MEM_RESERVE = 0x00002000 > > MEM_FREE = 0x00010000 > > MEM_PRIVATE = 0x00020000 > > MEM_MAPPED = 0x00040000 > > MEM_IMAGE = 0x01000000 > > > > PAGE_NOACCESS = 0x00000001 > > PAGE_READONLY = 0x00000002 > > PAGE_READWRITE = 0x00000004 > > PAGE_WRITECOPY = 0x00000008 > > PAGE_EXECUTE = 0x00000010 > > PAGE_EXECUTE_READ = 0x00000020 > > PAGE_EXECUTE_READWRITE = 0x00000040 > > PAGE_EXECUTE_WRITECOPY = 0x00000080 > > PAGE_GUARD = 0x00000100 > > PAGE_NOCACHE = 0x00000200 > > PAGE_WRITECOMBINE = 0x00000400 > > PAGE_TARGETS_INVALID = 0x40000000 > > > > if not hasattr(wintypes, 'PVOID'): > > wintypes.PVOID = wintypes.LPVOID > > > > if not hasattr(wintypes, 'SIZE_T'): > > wintypes.SIZE_T = ctypes.c_size_t > > > > if not hasattr(wintypes, 'PSIZE_T'): > > wintypes.PSIZE_T = ctypes.POINTER(wintypes.SIZE_T) > > > > class MEMORY_BASIC_INFORMATION(ctypes.Structure): > > _fields_ = (('BaseAddress', wintypes.PVOID), > > ('AllocationBase', wintypes.PVOID), > > ('AllocationProtect', wintypes.DWORD), > > ('RegionSize', wintypes.SIZE_T), > > ('State', wintypes.DWORD), > > ('Protect', wintypes.DWORD), > > ('Type', wintypes.DWORD)) > > > > PMEMORY_BASIC_INFORMATION = ctypes.POINTER(MEMORY_BASIC_INFORMATION) > > > > def _check_zero(result, func, args): > > """ Check for zero or NULL return value. """ > > if not result: > > raise ctypes.WinError(ctypes.get_last_error()) > > return args > > > > # https://msdn.microsoft.com/en-us/library/ms683179 > > kernel32.GetCurrentProcess.restype = wintypes.HANDLE > > > > # https://msdn.microsoft.com/en-us/library/ms684320 > > kernel32.OpenProcess.errcheck = _check_zero > > kernel32.OpenProcess.restype = wintypes.HANDLE > > > > # https://msdn.microsoft.com/en-us/library/ms680553 > > kernel32.ReadProcessMemory.errcheck = _check_zero > > kernel32.ReadProcessMemory.argtypes = ( > > wintypes.HANDLE, # _In_ hProcess > > wintypes.LPCVOID, # _In_ lpBaseAddress > > wintypes.LPVOID, # _Out_ lpBuffer > > wintypes.SIZE_T, # _In_ nSize > > wintypes.PSIZE_T) # _Out_ lpNumberOfBytesRead > > > > # https://msdn.microsoft.com/en-us/library/aa366907 > > kernel32.VirtualQueryEx.errcheck = _check_zero > > kernel32.VirtualQueryEx.restype = wintypes.SIZE_T > > kernel32.VirtualQueryEx.argtypes = ( > > wintypes.HANDLE, # _In_ hProcess > > wintypes.LPCVOID, # _In_opt_ lpAddress > > PMEMORY_BASIC_INFORMATION, # _Out_ lpBuffer > > wintypes.SIZE_T) # _In_ dwLength > > > > if __name__ == '__main__': > > import sys > > > > dtype = ctypes.c_double > > > > if len(sys.argv) == 4: > > ph = kernel32.OpenProcess(PROCESS_QUERY_INFORMATION | > > PROCESS_VM_READ, False, int(sys.argv[1])) > > address = int(sys.argv[2], 16) > > count = int(sys.argv[3]) > > elif len(sys.argv) == 1: > > ph = kernel32.GetCurrentProcess() > > count = 10 > > source_array = (dtype * count)(*range(10)) > > address = ctypes.addressof(source_array) > > else: > > sys.exit('Usage: %s pid address count' % sys.argv[0]) > > > > mbi = MEMORY_BASIC_INFORMATION() > > kernel32.VirtualQueryEx(ph, address, ctypes.byref(mbi), > > ctypes.sizeof(mbi)) > > > > if mbi.State & MEM_FREE: > > sys.exit('Address not allocated') > > if mbi.State & MEM_RESERVE: > > sys.exit('Address reserved but not committed') > > if mbi.Protect & PAGE_NOACCESS: > > sys.exit('Address not accessible') > > > > block_size = min(mbi.RegionSize - (address - mbi.BaseAddress), > > ctypes.sizeof(dtype) * count) > > address_list = range(address, address + block_size, > > ctypes.sizeof(dtype)) > > > > input('Press enter to list %d values, or Ctrl+Break to quit\n' > > % len(address_list)) > > > > data = dtype() > > for address in address_list: > > kernel32.ReadProcessMemory(ph, address, ctypes.byref(data), > > ctypes.sizeof(data), None) > > print('%x: %f' % (address, data.value)) > > --001a114a9eae202a1d05435635eb Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable <div>i have to go to work, will take a look later!</div><div><br></div><div= >thx!<br><div class=3D"gmail_quote"><div>On Sat, Dec 10, 2016 at 3:25 PM er= yk sun <<a href=3D"mailto:[email protected]">[email protected]</a>> w= rote:<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex= ;border-left:1px #ccc solid;padding-left:1ex">On Sat, Dec 10, 2016 at 9:30 = PM, Michael C<br class=3D"gmail_msg"><br><<a href=3D"mailto:mysecretrobo= [email protected]" class=3D"gmail_msg" target=3D"_blank">mysecretrobotfact= [email protected]</a>> wrote:<br class=3D"gmail_msg"><br>> I am stuck on = which line of information to feed to ReadmemoryProcess with<br class=3D"gma= il_msg"><br>> this, I think I properly retrieved the information from Vi= rtualqueryex<br class=3D"gmail_msg"><br><br class=3D"gmail_msg"><br>Here= 9;s an example that uses VirtualQueryEx to determine whether the<br class= =3D"gmail_msg"><br>specified address is allocated and readable. If so, it r= eads up to<br class=3D"gmail_msg"><br>`count` double-precision floats via R= eadProcessMemory, but it won't<br class=3D"gmail_msg"><br>read past the= allocated region size.<br class=3D"gmail_msg"><br><br class=3D"gmail_msg">= <br>=C2=A0 =C2=A0 import ctypes<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 fr= om ctypes import wintypes<br class=3D"gmail_msg"><br><br class=3D"gmail_msg= "><br>=C2=A0 =C2=A0 kernel32 =3D ctypes.WinDLL('kernel32', use_last= _error=3DTrue)<br class=3D"gmail_msg"><br><br class=3D"gmail_msg"><br>=C2= =A0 =C2=A0 PROCESS_VM_READ=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D 0x00= 10<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 PROCESS_QUERY_INFORMATION =3D 0= x0400<br class=3D"gmail_msg"><br><br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 = MEM_COMMIT=C2=A0 =3D 0x00001000<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 ME= M_RESERVE =3D 0x00002000<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 MEM_FREE= =C2=A0 =C2=A0 =3D 0x00010000<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 MEM_P= RIVATE =3D 0x00020000<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 MEM_MAPPED= =C2=A0 =3D 0x00040000<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 MEM_IMAGE=C2= =A0 =C2=A0=3D 0x01000000<br class=3D"gmail_msg"><br><br class=3D"gmail_msg"= ><br>=C2=A0 =C2=A0 PAGE_NOACCESS=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =3D 0x00= 000001<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 PAGE_READONLY=C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =3D 0x00000002<br class=3D"gmail_msg"><br>=C2=A0 =C2= =A0 PAGE_READWRITE=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D 0x00000004<br class= =3D"gmail_msg"><br>=C2=A0 =C2=A0 PAGE_WRITECOPY=C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0=3D 0x00000008<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 PAGE_EXECUTE= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D 0x00000010<br class=3D"gmail_m= sg"><br>=C2=A0 =C2=A0 PAGE_EXECUTE_READ=C2=A0 =C2=A0 =C2=A0 =3D 0x00000020<= br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 PAGE_EXECUTE_READWRITE =3D 0x00000= 040<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 PAGE_EXECUTE_WRITECOPY =3D 0x0= 0000080<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 PAGE_GUARD=C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D 0x00000100<br class=3D"gmail_msg"><br= >=C2=A0 =C2=A0 PAGE_NOCACHE=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D 0x0= 0000200<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 PAGE_WRITECOMBINE=C2=A0 = =C2=A0 =C2=A0 =3D 0x00000400<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 PAGE_= TARGETS_INVALID=C2=A0 =C2=A0=3D 0x40000000<br class=3D"gmail_msg"><br><br c= lass=3D"gmail_msg"><br>=C2=A0 =C2=A0 if not hasattr(wintypes, 'PVOID= 9;):<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 wintypes.PVOID = =3D wintypes.LPVOID<br class=3D"gmail_msg"><br><br class=3D"gmail_msg"><br>= =C2=A0 =C2=A0 if not hasattr(wintypes, 'SIZE_T'):<br class=3D"gmail= _msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 wintypes.SIZE_T =3D ctypes.c_size_t<b= r class=3D"gmail_msg"><br><br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 if not = hasattr(wintypes, 'PSIZE_T'):<br class=3D"gmail_msg"><br>=C2=A0 =C2= =A0 =C2=A0 =C2=A0 wintypes.PSIZE_T =3D ctypes.POINTER(wintypes.SIZE_T)<br c= lass=3D"gmail_msg"><br><br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 class MEMO= RY_BASIC_INFORMATION(ctypes.Structure):<br class=3D"gmail_msg"><br>=C2=A0 = =C2=A0 =C2=A0 =C2=A0 _fields_ =3D (('BaseAddress',=C2=A0 =C2=A0 =C2= =A0 =C2=A0wintypes.PVOID),<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ('AllocationBase',= =C2=A0 =C2=A0 wintypes.PVOID),<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ('AllocationProtec= t', wintypes.DWORD),<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ('RegionSize',=C2= =A0 =C2=A0 =C2=A0 =C2=A0 wintypes.SIZE_T),<br class=3D"gmail_msg"><br>=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ('St= ate',=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0wintypes.DWORD),<b= r class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 ('Protect',=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0wintypes.DWORD),<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ('Type',=C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 wintypes.DWORD))<br class=3D"gmail_msg"= ><br><br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 PMEMORY_BASIC_INFORMATION = =3D ctypes.POINTER(MEMORY_BASIC_INFORMATION)<br class=3D"gmail_msg"><br><br= class=3D"gmail_msg"><br>=C2=A0 =C2=A0 def _check_zero(result, func, args):= <br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 """ = Check for zero or NULL return value. """<br class=3D"gmail_m= sg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 if not result:<br class=3D"gmail_msg"><= br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 raise ctypes.WinError(ctypes.g= et_last_error())<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 ret= urn args<br class=3D"gmail_msg"><br><br class=3D"gmail_msg"><br>=C2=A0 =C2= =A0 # <a href=3D"https://msdn.microsoft.com/en-us/library/ms683179" rel=3D"= noreferrer" class=3D"gmail_msg" target=3D"_blank">https://msdn.microsoft.co= m/en-us/library/ms683179</a><br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 kerne= l32.GetCurrentProcess.restype =3D wintypes.HANDLE<br class=3D"gmail_msg"><b= r><br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 # <a href=3D"https://msdn.micro= soft.com/en-us/library/ms684320" rel=3D"noreferrer" class=3D"gmail_msg" tar= get=3D"_blank">https://msdn.microsoft.com/en-us/library/ms684320</a><br cla= ss=3D"gmail_msg"><br>=C2=A0 =C2=A0 kernel32.OpenProcess.errcheck =3D _check= _zero<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 kernel32.OpenProcess.restype= =3D wintypes.HANDLE<br class=3D"gmail_msg"><br><br class=3D"gmail_msg"><br= >=C2=A0 =C2=A0 # <a href=3D"https://msdn.microsoft.com/en-us/library/ms6805= 53" rel=3D"noreferrer" class=3D"gmail_msg" target=3D"_blank">https://msdn.m= icrosoft.com/en-us/library/ms680553</a><br class=3D"gmail_msg"><br>=C2=A0 = =C2=A0 kernel32.ReadProcessMemory.errcheck =3D _check_zero<br class=3D"gmai= l_msg"><br>=C2=A0 =C2=A0 kernel32.ReadProcessMemory.argtypes =3D (<br class= =3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 wintypes.HANDLE,=C2=A0 # _In= _=C2=A0 hProcess<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 win= types.LPCVOID, # _In_=C2=A0 lpBaseAddress<br class=3D"gmail_msg"><br>=C2=A0= =C2=A0 =C2=A0 =C2=A0 wintypes.LPVOID,=C2=A0 # _Out_ lpBuffer<br class=3D"g= mail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 wintypes.SIZE_T,=C2=A0 # _In_=C2= =A0 nSize<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 wintypes.P= SIZE_T) # _Out_ lpNumberOfBytesRead<br class=3D"gmail_msg"><br><br class=3D= "gmail_msg"><br>=C2=A0 =C2=A0 # <a href=3D"https://msdn.microsoft.com/en-us= /library/aa366907" rel=3D"noreferrer" class=3D"gmail_msg" target=3D"_blank"= >https://msdn.microsoft.com/en-us/library/aa366907</a><br class=3D"gmail_ms= g"><br>=C2=A0 =C2=A0 kernel32.VirtualQueryEx.errcheck =3D _check_zero<br cl= ass=3D"gmail_msg"><br>=C2=A0 =C2=A0 kernel32.VirtualQueryEx.restype =3D win= types.SIZE_T<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 kernel32.VirtualQuery= Ex.argtypes =3D (<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 wi= ntypes.HANDLE,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0# _In_=C2=A0 =C2=A0 = =C2=A0hProcess<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 winty= pes.LPCVOID,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 # _In_opt_ lpAddress<br clas= s=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 PMEMORY_BASIC_INFORMATION, = # _Out_=C2=A0 =C2=A0 lpBuffer<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2= =A0 =C2=A0 wintypes.SIZE_T)=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0# _In_= =C2=A0 =C2=A0 =C2=A0dwLength<br class=3D"gmail_msg"><br><br class=3D"gmail_= msg"><br>=C2=A0 =C2=A0 if __name__ =3D=3D '__main__':<br class=3D"g= mail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 import sys<br class=3D"gmail_msg"= ><br><br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 dtype =3D ctyp= es.c_double<br class=3D"gmail_msg"><br><br class=3D"gmail_msg"><br>=C2=A0 = =C2=A0 =C2=A0 =C2=A0 if len(sys.argv) =3D=3D 4:<br class=3D"gmail_msg"><br>= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ph =3D kernel32.OpenProcess(PROCE= SS_QUERY_INFORMATION |<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 PROCESS_VM_READ, False, int(s= ys.argv[1]))<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 address =3D int(sys.argv[2], 16)<br class=3D"gmail_msg"><br>=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 count =3D int(sys.argv[3])<br class=3D"g= mail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 elif len(sys.argv) =3D=3D 1:<br c= lass=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ph =3D ker= nel32.GetCurrentProcess()<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 count =3D 10<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 source_array =3D (dtype * count)(*range(10))<br= class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 address = =3D ctypes.addressof(source_array)<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0= =C2=A0 =C2=A0 else:<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 sys.exit('Usage: %s pid address count' % sys.argv[0]= )<br class=3D"gmail_msg"><br><br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2= =A0 =C2=A0 mbi =3D MEMORY_BASIC_INFORMATION()<br class=3D"gmail_msg"><br>= =C2=A0 =C2=A0 =C2=A0 =C2=A0 kernel32.VirtualQueryEx(ph, address, ctypes.byr= ef(mbi),<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 ctypes.sizeof(mbi))<br class=3D"gmail_msg"><br><br class=3D"gmail_msg">= <br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 if mbi.State & MEM_FREE:<br class=3D"gm= ail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sys.exit('Addres= s not allocated')<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2= =A0 if mbi.State & MEM_RESERVE:<br class=3D"gmail_msg"><br>=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sys.exit('Address reserved but not comm= itted')<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 if mbi.P= rotect & PAGE_NOACCESS:<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 sys.exit('Address not accessible')<br class= =3D"gmail_msg"><br><br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 = block_size =3D min(mbi.RegionSize - (address - mbi.BaseAddress),<br class= =3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ctypes.sizeof(dtype) * count)<br class=3D= "gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 address_list =3D range(address,= address + block_size,<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0ctypes.sizeof(dtype))<br class=3D"gmail_msg"><br><br class=3D"gmail_m= sg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 input('Press enter to list %d value= s, or Ctrl+Break to quit\n'<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 % len(address_list))<br class=3D"gmail_m= sg"><br><br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 data =3D dt= ype()<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 for address in= address_list:<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 kernel32.ReadProcessMemory(ph, address, ctypes.byref(data),<br c= lass=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 ctypes.sizeof(data), None)<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 print('%x: %f' % (address, data.value))<br= class=3D"gmail_msg"><br></blockquote></div></div> --001a114a9eae202a1d05435635eb-- --===============5562974484312584968== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------------ Developer Access Program for Intel Xeon Phi Processors Access to Intel Xeon Phi processor-based developer platforms. With one year of Intel Parallel Studio XE. Training and support from Colfax. Order your platform today.http://sdm.link/xeonphi --===============5562974484312584968== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ ctypes-users mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ctypes-users --===============5562974484312584968==--