PyMemoryEditor 3.4.1__tar.gz → 3.4.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PKG-INFO +1 -1
  2. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/__init__.py +1 -1
  3. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/mcp/toolset.py +15 -2
  4. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/conf.py +1 -1
  5. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/mcp_server/test_toolset.py +70 -0
  6. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/.flake8 +0 -0
  7. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/.gitignore +0 -0
  8. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/.readthedocs.yaml +0 -0
  9. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/CODE_OF_CONDUCT.md +0 -0
  10. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/CONTRIBUTING.md +0 -0
  11. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/LICENSE +0 -0
  12. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/Makefile +0 -0
  13. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/__main__.py +0 -0
  14. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/__init__.py +0 -0
  15. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/_auto_refresh_dialog.py +0 -0
  16. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/_gc.py +0 -0
  17. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/_icon.py +0 -0
  18. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/_widgets.py +0 -0
  19. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/application.py +0 -0
  20. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/assets/icon.svg +0 -0
  21. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/cheat_entry.py +0 -0
  22. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/cheat_poll_worker.py +0 -0
  23. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/cheat_table.py +0 -0
  24. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/log_console_dialog.py +0 -0
  25. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/main_window.py +0 -0
  26. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/memory_map_dialog.py +0 -0
  27. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/memory_viewer_dialog.py +0 -0
  28. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/modules_dialog.py +0 -0
  29. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/open_process_dialog.py +0 -0
  30. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/pointer_chain_dialog.py +0 -0
  31. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/pointer_scan_dialog.py +0 -0
  32. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/results_view.py +0 -0
  33. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/scan_types.py +0 -0
  34. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/scan_worker.py +0 -0
  35. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/scanner_panel.py +0 -0
  36. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/threads_dialog.py +0 -0
  37. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/value_types.py +0 -0
  38. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/enums.py +0 -0
  39. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/linux/functions.py +0 -0
  40. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/linux/libc.py +0 -0
  41. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/linux/process.py +0 -0
  42. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/linux/types.py +0 -0
  43. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/macos/__init__.py +0 -0
  44. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/macos/functions.py +0 -0
  45. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/macos/libsystem.py +0 -0
  46. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/macos/process.py +0 -0
  47. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/macos/types.py +0 -0
  48. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/mcp/__init__.py +0 -0
  49. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/mcp/__main__.py +0 -0
  50. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/mcp/config.py +0 -0
  51. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/mcp/policy.py +0 -0
  52. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/mcp/procinfo.py +0 -0
  53. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/mcp/server.py +0 -0
  54. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/mcp/session.py +0 -0
  55. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/__init__.py +0 -0
  56. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/_guard.py +0 -0
  57. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/abstract.py +0 -0
  58. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/errors.py +0 -0
  59. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/info.py +0 -0
  60. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/module_info.py +0 -0
  61. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/pointer_scan.py +0 -0
  62. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/region.py +0 -0
  63. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/remote_pointer.py +0 -0
  64. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/scanning.py +0 -0
  65. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/thread_info.py +0 -0
  66. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/util.py +0 -0
  67. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/py.typed +0 -0
  68. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/util/__init__.py +0 -0
  69. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/util/convert.py +0 -0
  70. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/util/pattern.py +0 -0
  71. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/util/scan.py +0 -0
  72. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/util/scan_numpy.py +0 -0
  73. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/enums/__init__.py +0 -0
  74. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/enums/memory_allocation_states.py +0 -0
  75. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/enums/memory_protections.py +0 -0
  76. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/enums/memory_types.py +0 -0
  77. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/enums/process_operations.py +0 -0
  78. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/enums/standard_access_rights.py +0 -0
  79. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/functions.py +0 -0
  80. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/process.py +0 -0
  81. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/types.py +0 -0
  82. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/README.md +0 -0
  83. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/SECURITY.md +0 -0
  84. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/assets/screenshots/app.png +0 -0
  85. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/assets/social-preview.html +0 -0
  86. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/assets/social-preview.png +0 -0
  87. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/_static/.gitkeep +0 -0
  88. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/_static/custom.css +0 -0
  89. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/_templates/layout.html +0 -0
  90. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/api/enums.md +0 -0
  91. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/api/errors.md +0 -0
  92. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/api/index.md +0 -0
  93. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/api/memory-region.md +0 -0
  94. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/api/module-info.md +0 -0
  95. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/api/openprocess.md +0 -0
  96. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/api/pointer-path.md +0 -0
  97. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/api/remote-pointer.md +0 -0
  98. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/api/thread-info.md +0 -0
  99. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/api/utilities.md +0 -0
  100. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/app.md +0 -0
  101. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/contributing.md +0 -0
  102. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/funding.md +0 -0
  103. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/glossary.md +0 -0
  104. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/guide/allocate-free.md +0 -0
  105. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/guide/logging.md +0 -0
  106. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/guide/memory-regions.md +0 -0
  107. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/guide/modules-threads.md +0 -0
  108. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/guide/opening-process.md +0 -0
  109. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/guide/pattern-scan.md +0 -0
  110. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/guide/pointer-scan.md +0 -0
  111. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/guide/pointers.md +0 -0
  112. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/guide/read-write.md +0 -0
  113. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/guide/searching.md +0 -0
  114. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/index.md +0 -0
  115. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/installation.md +0 -0
  116. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/license.md +0 -0
  117. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/mcp.md +0 -0
  118. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/platform-notes.md +0 -0
  119. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/quickstart.md +0 -0
  120. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/requirements.txt +0 -0
  121. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/troubleshooting.md +0 -0
  122. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/docs/why.md +0 -0
  123. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/pyproject.toml +0 -0
  124. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/app/__init__.py +0 -0
  125. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/app/conftest.py +0 -0
  126. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/app/test_app_cheat_entry.py +0 -0
  127. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/app/test_app_gc.py +0 -0
  128. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/app/test_app_pointer_parsing.py +0 -0
  129. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/app/test_app_scan_request.py +0 -0
  130. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/app/test_app_smoke.py +0 -0
  131. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/app/test_app_value_types.py +0 -0
  132. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/app/test_app_widgets.py +0 -0
  133. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/app/test_auto_refresh_dialog.py +0 -0
  134. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/app/test_cheat_poll_worker.py +0 -0
  135. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/app/test_main_window_lifecycle.py +0 -0
  136. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/app/test_open_process_dialog.py +0 -0
  137. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/app/test_refine_scan_worker.py +0 -0
  138. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/app/test_results_model.py +0 -0
  139. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/conftest.py +0 -0
  140. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/core/__init__.py +0 -0
  141. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/core/test_abstract_process.py +0 -0
  142. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/core/test_errors.py +0 -0
  143. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/core/test_logger.py +0 -0
  144. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/mcp_server/__init__.py +0 -0
  145. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/mcp_server/conftest.py +0 -0
  146. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/mcp_server/test_argument_fuzz.py +0 -0
  147. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/mcp_server/test_fake_fidelity.py +0 -0
  148. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/mcp_server/test_live.py +0 -0
  149. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/mcp_server/test_parsing.py +0 -0
  150. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/mcp_server/test_policy.py +0 -0
  151. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/mcp_server/test_registry.py +0 -0
  152. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/mcp_server/test_server.py +0 -0
  153. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/mcp_server/test_session.py +0 -0
  154. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/memory/__init__.py +0 -0
  155. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/memory/test_allocate_free.py +0 -0
  156. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/memory/test_bufflength_inference.py +0 -0
  157. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/memory/test_editor.py +0 -0
  158. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/memory/test_narrow_width_consistency.py +0 -0
  159. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/memory/test_partial_io.py +0 -0
  160. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/memory/test_read_into.py +0 -0
  161. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/memory/test_search_argument_errors.py +0 -0
  162. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/memory/test_str_boundary.py +0 -0
  163. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/memory/test_str_decode_consistency.py +0 -0
  164. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/memory/test_typed_accessors.py +0 -0
  165. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/memory/test_unaligned_scan.py +0 -0
  166. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/memory/test_write_safety.py +0 -0
  167. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/memory/test_write_span.py +0 -0
  168. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/memory/test_write_str_bytes_width.py +0 -0
  169. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/__init__.py +0 -0
  170. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/test_bitness.py +0 -0
  171. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/test_bitness_fallback_warns.py +0 -0
  172. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/test_closed_generators.py +0 -0
  173. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/test_linux_error_hints.py +0 -0
  174. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/test_linux_pid_reuse.py +0 -0
  175. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/test_linux_proc_decoding.py +0 -0
  176. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/test_linux_snapshot_passthrough.py +0 -0
  177. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/test_linux_types.py +0 -0
  178. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/test_macos_close.py +0 -0
  179. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/test_macos_load_commands.py +0 -0
  180. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/test_macos_protect.py +0 -0
  181. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/test_macos_region_walk.py +0 -0
  182. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/test_macos_snapshot.py +0 -0
  183. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/test_macos_threads.py +0 -0
  184. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/test_macos_transient_reads.py +0 -0
  185. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/test_macos_types.py +0 -0
  186. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/test_win32_backend_guards.py +0 -0
  187. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/test_win32_permissions.py +0 -0
  188. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/test_win32_region_walk.py +0 -0
  189. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/test_win32_toolhelp.py +0 -0
  190. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/platforms/test_win32_wow64.py +0 -0
  191. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/pointer/__init__.py +0 -0
  192. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/pointer/test_pointer_chain.py +0 -0
  193. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/pointer/test_pointer_scan.py +0 -0
  194. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/pointer/test_remote_pointer.py +0 -0
  195. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/process/__init__.py +0 -0
  196. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/process/test_foreign_process.py +0 -0
  197. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/process/test_memory_region.py +0 -0
  198. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/process/test_module_enumeration.py +0 -0
  199. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/process/test_partial_name_match.py +0 -0
  200. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/process/test_process_enumeration.py +0 -0
  201. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/process/test_process_lookup.py +0 -0
  202. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/process/test_thread_enumeration.py +0 -0
  203. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/scan/__init__.py +0 -0
  204. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/scan/_fakes.py +0 -0
  205. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/scan/test_chunking_integration.py +0 -0
  206. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/scan/test_pattern_compile.py +0 -0
  207. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/scan/test_pattern_scan.py +0 -0
  208. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/scan/test_region_snapshot.py +0 -0
  209. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/scan/test_scan.py +0 -0
  210. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/scan/test_scan_numpy.py +0 -0
  211. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/scan/test_scan_properties.py +0 -0
  212. {pymemoryeditor-3.4.1 → pymemoryeditor-3.4.2}/tests/scan/test_scanning_helper.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: PyMemoryEditor
3
- Version: 3.4.1
3
+ Version: 3.4.2
4
4
  Summary: Read, write and scan process memory in a few lines of Python — Cheat Engine-style scans, pointer chains and AOB search on Windows, Linux and macOS.
5
5
  Project-URL: Homepage, https://github.com/JeanExtreme002/PyMemoryEditor
6
6
  Project-URL: Documentation, https://pymemoryeditor.readthedocs.io
@@ -8,7 +8,7 @@ Supported platforms: Windows, Linux and macOS (32-bit and 64-bit).
8
8
  """
9
9
 
10
10
  __author__ = "Jean Loui Bernard Silva de Jesus"
11
- __version__ = "3.4.1"
11
+ __version__ = "3.4.2"
12
12
 
13
13
  import logging
14
14
  import sys
@@ -1946,9 +1946,13 @@ class MemoryToolset:
1946
1946
  # per region, so one whole multi-gigabyte heap would be
1947
1947
  # mapped however far past the budget that ran. Aligned
1948
1948
  # seams cut no pointer slot, and the map merges adjacent
1949
- # ranges back, so the result is unchanged.
1949
+ # ranges back, so the result is unchanged. Unreadable
1950
+ # regions are left out before cutting: the map skips them
1951
+ # anyway, and on Windows they are most of the address
1952
+ # space -- millions of pieces for nothing (#127).
1950
1953
  memory_regions=split_regions(
1951
- regions, self.config.scan_batch_bytes
1954
+ [region for region in regions if region.is_readable],
1955
+ self.config.scan_batch_bytes,
1952
1956
  ),
1953
1957
  progress_callback=progress,
1954
1958
  should_stop=should_stop,
@@ -2247,6 +2251,15 @@ class MemoryToolset:
2247
2251
  truncated = False
2248
2252
  timed_out = False
2249
2253
 
2254
+ # Only readable memory can hold a match, and the library drops the
2255
+ # rest itself -- but only once a batch reaches it, after the cutting
2256
+ # and batching here have been paid for. On Windows the snapshot spans
2257
+ # the whole address space, MEM_FREE and MEM_RESERVE included (~128 TiB
2258
+ # on a 64-bit target): cut into 64 MiB pieces, that was ~2 million
2259
+ # batches, and the scan spent its whole budget on them before it
2260
+ # reached the heap (#127).
2261
+ regions = [region for region in regions if region.is_readable]
2262
+
2250
2263
  if split_overlap is not None:
2251
2264
  regions = split_regions(
2252
2265
  regions, self.config.scan_batch_bytes, overlap=split_overlap
@@ -23,7 +23,7 @@ copyright = f"{datetime.now().year}, {author}"
23
23
  try:
24
24
  from PyMemoryEditor import __version__ as release
25
25
  except Exception: # pragma: no cover - docs can build without the package installed
26
- release = "3.4.1"
26
+ release = "3.4.2"
27
27
 
28
28
  version = ".".join(release.split(".")[:2])
29
29
 
@@ -2656,6 +2656,76 @@ class TestHugeRegionsAreScannedInPieces:
2656
2656
  sizes = [region.size for region in seen["regions"]]
2657
2657
  assert max(sizes) == 0x400 and len(sizes) == 8 # two 4 KiB regions
2658
2658
 
2659
+ @staticmethod
2660
+ def _with_unreadable_space(fake_process, size):
2661
+ """Put a large unreadable region below the fake's two, the way the
2662
+ Windows backend reports MEM_FREE and MEM_RESERVE ranges."""
2663
+ from PyMemoryEditor.process.region import MemoryRegion
2664
+
2665
+ readable = fake_process.get_memory_regions
2666
+
2667
+ def regions():
2668
+ yield MemoryRegion(address=0x1_0000, size=size) # not readable
2669
+ yield from readable()
2670
+
2671
+ fake_process.get_memory_regions = regions
2672
+
2673
+ def test_unreadable_regions_never_become_batches(
2674
+ self, make_toolset, fake_process, monkeypatch
2675
+ ):
2676
+ """On Windows the snapshot spans the whole address space, MEM_FREE and
2677
+ MEM_RESERVE included. Cut into pieces, that was ~2 million batches on a
2678
+ 64-bit target, and scan_value spent its whole budget on them before it
2679
+ reached the heap (#127)."""
2680
+ from PyMemoryEditor.mcp import session as session_module
2681
+
2682
+ monkeypatch.setattr(session_module, "SPLIT_ALIGNMENT", 0x100)
2683
+ monkeypatch.setattr(session_module, "MIN_SPLIT_BYTES", 0x100)
2684
+ self._with_unreadable_space(fake_process, 0x10_0000)
2685
+ address = fake_process.poke(WRITABLE_BASE + 0x40, int, 31337)
2686
+ batches = []
2687
+ original = fake_process.search_by_value
2688
+
2689
+ def counting(*args, **kwargs):
2690
+ batches.append(kwargs["memory_regions"])
2691
+ return original(*args, **kwargs)
2692
+
2693
+ fake_process.search_by_value = counting
2694
+ toolset = make_toolset(config(scan_batch_bytes=0x1000))
2695
+ session_id = toolset.open_process(pid=4242)["session_id"]
2696
+ scan = toolset.scan_value(session_id, "int", "31337", bufflength=4)
2697
+
2698
+ assert scan["count"] == 1 and not scan.get("partial")
2699
+ assert scan["sample"][0]["address"] == "0x%X" % address
2700
+ # One batch per 4 KiB readable region, none for the unreadable 1 MiB
2701
+ # (256 pieces of 4 KiB before the fix).
2702
+ assert len(batches) == 2
2703
+ assert all(region.is_readable for batch in batches for region in batch)
2704
+
2705
+ def test_unreadable_regions_are_not_cut_for_the_pointer_map(
2706
+ self, make_toolset, fake_process, monkeypatch
2707
+ ):
2708
+ """The map skips unreadable regions itself, so cutting them first only
2709
+ cost time and memory -- millions of pieces on Windows (#127)."""
2710
+ from PyMemoryEditor.mcp import session as session_module
2711
+
2712
+ monkeypatch.setattr(session_module, "SPLIT_ALIGNMENT", 0x100)
2713
+ monkeypatch.setattr(session_module, "MIN_SPLIT_BYTES", 0x100)
2714
+ self._with_unreadable_space(fake_process, 0x10_0000)
2715
+ seen = {}
2716
+
2717
+ def capture(target_address, **kwargs):
2718
+ seen["regions"] = kwargs["memory_regions"]
2719
+ return iter(())
2720
+
2721
+ fake_process.scan_pointer_paths = capture
2722
+ toolset = make_toolset(config(scan_batch_bytes=0x400))
2723
+ opened = toolset.open_process(pid=4242)
2724
+ toolset.find_pointer_paths(opened["session_id"], hex(WRITABLE_BASE))
2725
+
2726
+ assert len(seen["regions"]) == 8 # the two 4 KiB regions, as before
2727
+ assert all(region.is_readable for region in seen["regions"])
2728
+
2659
2729
  def test_the_library_does_not_swallow_a_progress_abort(self):
2660
2730
  """find_pointer_paths stops the map by raising from progress_callback;
2661
2731
  that only works if the library lets the exception through."""
File without changes
File without changes
File without changes
File without changes