@@ -80,7 +80,62 @@ read_memory(proc_handle_t *handle, uint64_t remote_address, size_t len, void* ds
8080static int
8181write_memory (proc_handle_t * handle , uintptr_t remote_address , size_t len , const void * src )
8282{
83- return _Py_RemoteDebug_WriteRemoteMemory (handle , remote_address , len , src );
83+ #ifdef MS_WINDOWS
84+ SIZE_T written = 0 ;
85+ SIZE_T result = 0 ;
86+ do {
87+ if (!WriteProcessMemory (handle -> hProcess , (LPVOID )(remote_address + result ), (const char * )src + result , len - result , & written )) {
88+ PyErr_SetFromWindowsErr (0 );
89+ return -1 ;
90+ }
91+ result += written ;
92+ } while (result < len );
93+ return 0 ;
94+ #elif defined(__linux__ ) && HAVE_PROCESS_VM_READV
95+ struct iovec local [1 ];
96+ struct iovec remote [1 ];
97+ Py_ssize_t result = 0 ;
98+ Py_ssize_t written = 0 ;
99+
100+ do {
101+ local [0 ].iov_base = (void * )((char * )src + result );
102+ local [0 ].iov_len = len - result ;
103+ remote [0 ].iov_base = (void * )((char * )remote_address + result );
104+ remote [0 ].iov_len = len - result ;
105+
106+ written = process_vm_writev (handle -> pid , local , 1 , remote , 1 , 0 );
107+ if (written < 0 ) {
108+ PyErr_SetFromErrno (PyExc_OSError );
109+ return -1 ;
110+ }
111+
112+ result += written ;
113+ } while ((size_t )written != local [0 ].iov_len );
114+ return 0 ;
115+ #elif defined(__APPLE__ ) && TARGET_OS_OSX
116+ kern_return_t kr = mach_vm_write (
117+ pid_to_task (handle -> pid ),
118+ (mach_vm_address_t )remote_address ,
119+ (vm_offset_t )src ,
120+ (mach_msg_type_number_t )len );
121+
122+ if (kr != KERN_SUCCESS ) {
123+ switch (kr ) {
124+ case KERN_PROTECTION_FAILURE :
125+ PyErr_SetString (PyExc_PermissionError , "Not enough permissions to write memory" );
126+ break ;
127+ case KERN_INVALID_ARGUMENT :
128+ PyErr_SetString (PyExc_PermissionError , "Invalid argument to mach_vm_write" );
129+ break ;
130+ default :
131+ PyErr_Format (PyExc_RuntimeError , "Unknown error writing memory: %d" , (int )kr );
132+ }
133+ return -1 ;
134+ }
135+ return 0 ;
136+ #else
137+ Py_UNREACHABLE ();
138+ #endif
84139}
85140
86141static int
@@ -801,68 +856,6 @@ _Py_RemoteDebug_ReadRemoteMemory(proc_handle_t *handle, uintptr_t remote_address
801856#endif
802857}
803858
804- // Platform-independent memory write function
805- int
806- _Py_RemoteDebug_WriteRemoteMemory (proc_handle_t * handle , uintptr_t remote_address , size_t len , const void * src )
807- {
808- #ifdef MS_WINDOWS
809- SIZE_T written = 0 ;
810- SIZE_T result = 0 ;
811- do {
812- if (!WriteProcessMemory (handle -> hProcess , (LPVOID )(remote_address + result ), (const char * )src + result , len - result , & written )) {
813- PyErr_SetFromWindowsErr (0 );
814- return -1 ;
815- }
816- result += written ;
817- } while (result < len );
818- return 0 ;
819- #elif defined(__linux__ ) && HAVE_PROCESS_VM_READV
820- struct iovec local [1 ];
821- struct iovec remote [1 ];
822- Py_ssize_t result = 0 ;
823- Py_ssize_t written = 0 ;
824-
825- do {
826- local [0 ].iov_base = (void * )((char * )src + result );
827- local [0 ].iov_len = len - result ;
828- remote [0 ].iov_base = (void * )((char * )remote_address + result );
829- remote [0 ].iov_len = len - result ;
830-
831- written = process_vm_writev (handle -> pid , local , 1 , remote , 1 , 0 );
832- if (written < 0 ) {
833- PyErr_SetFromErrno (PyExc_OSError );
834- return -1 ;
835- }
836-
837- result += written ;
838- } while ((size_t )written != local [0 ].iov_len );
839- return 0 ;
840- #elif defined(__APPLE__ ) && TARGET_OS_OSX
841- kern_return_t kr = mach_vm_write (
842- pid_to_task (handle -> pid ),
843- (mach_vm_address_t )remote_address ,
844- (vm_offset_t )src ,
845- (mach_msg_type_number_t )len );
846-
847- if (kr != KERN_SUCCESS ) {
848- switch (kr ) {
849- case KERN_PROTECTION_FAILURE :
850- PyErr_SetString (PyExc_PermissionError , "Not enough permissions to write memory" );
851- break ;
852- case KERN_INVALID_ARGUMENT :
853- PyErr_SetString (PyExc_PermissionError , "Invalid argument to mach_vm_write" );
854- break ;
855- default :
856- PyErr_Format (PyExc_RuntimeError , "Unknown error writing memory: %d" , (int )kr );
857- }
858- return -1 ;
859- }
860- return 0 ;
861- #else
862- Py_UNREACHABLE ();
863- #endif
864- }
865-
866859static int
867860is_prerelease_version (uint64_t version )
868861{
0 commit comments