@@ -1833,9 +1833,12 @@ def poke(self, lpBaseAddress, lpBuffer):
18331833 prot = win32 .PAGE_EXECUTE_READWRITE
18341834 else :
18351835 prot = win32 .PAGE_READWRITE
1836+ org_length = len (lpBuffer )
1837+ org_lpBaseAddress = lpBaseAddress
1838+ length = org_length
18361839 if prot is not None :
18371840 try :
1838- self .mprotect (lpBaseAddress , len ( lpBuffer ) , prot )
1841+ self .mprotect (org_lpBaseAddress , org_length , prot )
18391842 except Exception :
18401843 prot = None
18411844 msg = (
@@ -1848,11 +1851,17 @@ def poke(self, lpBaseAddress, lpBuffer):
18481851 )
18491852 warnings .warn (msg , RuntimeWarning )
18501853 try :
1851- r = win32 .WriteProcessMemory (hProcess , lpBaseAddress , lpBuffer )
1854+ while length :
1855+ r = win32 .WriteProcessMemory (hProcess , lpBaseAddress , lpBuffer )
1856+ if r == 0 :
1857+ break
1858+ length -= r
1859+ lpBaseAddress += r
1860+ lpBuffer = lpBuffer [r :]
18521861 finally :
18531862 if prot is not None :
1854- self .mprotect (lpBaseAddress , len ( lpBuffer ) , mbi .Protect )
1855- return r
1863+ self .mprotect (org_lpBaseAddress , org_length , mbi .Protect )
1864+ return org_length
18561865
18571866 def peek_char (self , lpBaseAddress ):
18581867 """
@@ -4681,3 +4690,8 @@ def _notify_exit_process(self, event):
46814690 if dwProcessId in self .__processDict :
46824691 self ._del_process (dwProcessId )
46834692 return True
4693+
4694+
4695+
4696+
4697+
0 commit comments