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 &lt;<a href=3D"mailto:[email protected]">[email protected]</a>&gt; 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>&lt;<a href=3D"mailto:mysecretrobo=
[email protected]" class=3D"gmail_msg" target=3D"_blank">mysecretrobotfact=
[email protected]</a>&gt; wrote:<br class=3D"gmail_msg"><br>&gt; I am stuck on =
which line of information to feed to ReadmemoryProcess with<br class=3D"gma=
il_msg"><br>&gt; this, I think I properly retrieved the information from Vi=
rtualqueryex<br class=3D"gmail_msg"><br><br class=3D"gmail_msg"><br>Here&#3=
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&#39;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(&#39;kernel32&#39;, 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, &#39;PVOID&#3=
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, &#39;SIZE_T&#39;):<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, &#39;PSIZE_T&#39;):<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 ((&#39;BaseAddress&#39;,=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 (&#39;AllocationBase&#39;,=
=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 (&#39;AllocationProtec=
t&#39;, 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 (&#39;RegionSize&#39;,=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 (&#39;St=
ate&#39;,=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 (&#39;Protect&#39;,=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 (&#39;Type&#39;,=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 &quot;&quot;&quot; =
Check for zero or NULL return value. &quot;&quot;&quot;<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 &#39;__main__&#39;:<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(&#39;Usage: %s pid address count&#39; % 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 &amp; MEM_FREE:<br class=3D"gm=
ail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sys.exit(&#39;Addres=
s not allocated&#39;)<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 if mbi.State &amp; MEM_RESERVE:<br class=3D"gmail_msg"><br>=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sys.exit(&#39;Address reserved but not comm=
itted&#39;)<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 if mbi.P=
rotect &amp; PAGE_NOACCESS:<br class=3D"gmail_msg"><br>=C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 sys.exit(&#39;Address not accessible&#39;)<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(&#39;Press enter to list %d value=
s, or Ctrl+Break to quit\n&#39;<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(&#39;%x: %f&#39; % (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==--