PyMemoryEditor 3.4.0__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.
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PKG-INFO +7 -4
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/__init__.py +1 -1
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/mcp/toolset.py +15 -2
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/conf.py +1 -1
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/pyproject.toml +11 -1
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/mcp_server/test_toolset.py +70 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/.flake8 +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/.gitignore +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/.readthedocs.yaml +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/CODE_OF_CONDUCT.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/CONTRIBUTING.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/LICENSE +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/Makefile +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/__main__.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/__init__.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/_auto_refresh_dialog.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/_gc.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/_icon.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/_widgets.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/application.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/assets/icon.svg +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/cheat_entry.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/cheat_poll_worker.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/cheat_table.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/log_console_dialog.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/main_window.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/memory_map_dialog.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/memory_viewer_dialog.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/modules_dialog.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/open_process_dialog.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/pointer_chain_dialog.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/pointer_scan_dialog.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/results_view.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/scan_types.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/scan_worker.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/scanner_panel.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/threads_dialog.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/app/value_types.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/enums.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/linux/functions.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/linux/libc.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/linux/process.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/linux/types.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/macos/__init__.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/macos/functions.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/macos/libsystem.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/macos/process.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/macos/types.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/mcp/__init__.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/mcp/__main__.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/mcp/config.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/mcp/policy.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/mcp/procinfo.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/mcp/server.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/mcp/session.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/__init__.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/_guard.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/abstract.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/errors.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/info.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/module_info.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/pointer_scan.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/region.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/remote_pointer.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/scanning.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/thread_info.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/process/util.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/py.typed +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/util/__init__.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/util/convert.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/util/pattern.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/util/scan.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/util/scan_numpy.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/enums/__init__.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/enums/memory_allocation_states.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/enums/memory_protections.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/enums/memory_types.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/enums/process_operations.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/enums/standard_access_rights.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/functions.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/process.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/types.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/README.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/SECURITY.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/assets/screenshots/app.png +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/assets/social-preview.html +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/assets/social-preview.png +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/_static/.gitkeep +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/_static/custom.css +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/_templates/layout.html +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/api/enums.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/api/errors.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/api/index.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/api/memory-region.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/api/module-info.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/api/openprocess.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/api/pointer-path.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/api/remote-pointer.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/api/thread-info.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/api/utilities.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/app.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/contributing.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/funding.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/glossary.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/guide/allocate-free.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/guide/logging.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/guide/memory-regions.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/guide/modules-threads.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/guide/opening-process.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/guide/pattern-scan.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/guide/pointer-scan.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/guide/pointers.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/guide/read-write.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/guide/searching.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/index.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/installation.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/license.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/mcp.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/platform-notes.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/quickstart.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/requirements.txt +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/troubleshooting.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/docs/why.md +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/app/__init__.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/app/conftest.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/app/test_app_cheat_entry.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/app/test_app_gc.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/app/test_app_pointer_parsing.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/app/test_app_scan_request.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/app/test_app_smoke.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/app/test_app_value_types.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/app/test_app_widgets.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/app/test_auto_refresh_dialog.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/app/test_cheat_poll_worker.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/app/test_main_window_lifecycle.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/app/test_open_process_dialog.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/app/test_refine_scan_worker.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/app/test_results_model.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/conftest.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/core/__init__.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/core/test_abstract_process.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/core/test_errors.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/core/test_logger.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/mcp_server/__init__.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/mcp_server/conftest.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/mcp_server/test_argument_fuzz.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/mcp_server/test_fake_fidelity.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/mcp_server/test_live.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/mcp_server/test_parsing.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/mcp_server/test_policy.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/mcp_server/test_registry.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/mcp_server/test_server.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/mcp_server/test_session.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/memory/__init__.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/memory/test_allocate_free.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/memory/test_bufflength_inference.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/memory/test_editor.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/memory/test_narrow_width_consistency.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/memory/test_partial_io.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/memory/test_read_into.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/memory/test_search_argument_errors.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/memory/test_str_boundary.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/memory/test_str_decode_consistency.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/memory/test_typed_accessors.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/memory/test_unaligned_scan.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/memory/test_write_safety.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/memory/test_write_span.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/memory/test_write_str_bytes_width.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/__init__.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_bitness.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_bitness_fallback_warns.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_closed_generators.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_linux_error_hints.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_linux_pid_reuse.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_linux_proc_decoding.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_linux_snapshot_passthrough.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_linux_types.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_macos_close.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_macos_load_commands.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_macos_protect.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_macos_region_walk.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_macos_snapshot.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_macos_threads.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_macos_transient_reads.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_macos_types.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_win32_backend_guards.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_win32_permissions.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_win32_region_walk.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_win32_toolhelp.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_win32_wow64.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/pointer/__init__.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/pointer/test_pointer_chain.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/pointer/test_pointer_scan.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/pointer/test_remote_pointer.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/process/__init__.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/process/test_foreign_process.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/process/test_memory_region.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/process/test_module_enumeration.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/process/test_partial_name_match.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/process/test_process_enumeration.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/process/test_process_lookup.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/process/test_thread_enumeration.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/scan/__init__.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/scan/_fakes.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/scan/test_chunking_integration.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/scan/test_pattern_compile.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/scan/test_pattern_scan.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/scan/test_region_snapshot.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/scan/test_scan.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/scan/test_scan_numpy.py +0 -0
- {pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/scan/test_scan_properties.py +0 -0
- {pymemoryeditor-3.4.0 → 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.
|
|
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
|
|
@@ -38,7 +38,8 @@ Classifier: Typing :: Typed
|
|
|
38
38
|
Requires-Python: >=3.10
|
|
39
39
|
Provides-Extra: app
|
|
40
40
|
Requires-Dist: psutil<8,>=5.9; extra == 'app'
|
|
41
|
-
Requires-Dist: pyside6<
|
|
41
|
+
Requires-Dist: pyside6<6.12,>=6.5; (python_version < '3.12') and extra == 'app'
|
|
42
|
+
Requires-Dist: pyside6<7,>=6.5; (python_version >= '3.12') and extra == 'app'
|
|
42
43
|
Provides-Extra: dev
|
|
43
44
|
Requires-Dist: build; extra == 'dev'
|
|
44
45
|
Requires-Dist: flake8; extra == 'dev'
|
|
@@ -46,7 +47,8 @@ Requires-Dist: hypothesis; extra == 'dev'
|
|
|
46
47
|
Requires-Dist: mcp<3,>=2; extra == 'dev'
|
|
47
48
|
Requires-Dist: mypy; extra == 'dev'
|
|
48
49
|
Requires-Dist: psutil<8,>=5.9; extra == 'dev'
|
|
49
|
-
Requires-Dist: pyside6<
|
|
50
|
+
Requires-Dist: pyside6<6.12,>=6.5; (python_version < '3.12') and extra == 'dev'
|
|
51
|
+
Requires-Dist: pyside6<7,>=6.5; (python_version >= '3.12') and extra == 'dev'
|
|
50
52
|
Requires-Dist: pytest; extra == 'dev'
|
|
51
53
|
Requires-Dist: pytest-cov; extra == 'dev'
|
|
52
54
|
Requires-Dist: pytest-qt; extra == 'dev'
|
|
@@ -60,7 +62,8 @@ Provides-Extra: tests
|
|
|
60
62
|
Requires-Dist: hypothesis; extra == 'tests'
|
|
61
63
|
Requires-Dist: mcp<3,>=2; extra == 'tests'
|
|
62
64
|
Requires-Dist: psutil<8,>=5.9; extra == 'tests'
|
|
63
|
-
Requires-Dist: pyside6<
|
|
65
|
+
Requires-Dist: pyside6<6.12,>=6.5; (python_version < '3.12') and extra == 'tests'
|
|
66
|
+
Requires-Dist: pyside6<7,>=6.5; (python_version >= '3.12') and extra == 'tests'
|
|
64
67
|
Requires-Dist: pytest; extra == 'tests'
|
|
65
68
|
Requires-Dist: pytest-cov; extra == 'tests'
|
|
66
69
|
Requires-Dist: pytest-qt; extra == 'tests'
|
|
@@ -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
|
|
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.
|
|
26
|
+
release = "3.4.2"
|
|
27
27
|
|
|
28
28
|
version = ".".join(release.split(".")[:2])
|
|
29
29
|
|
|
@@ -87,8 +87,18 @@ tests = [
|
|
|
87
87
|
# psutil 7 removed nothing the app uses (Process.name/create_time,
|
|
88
88
|
# pid_exists, process_iter with pid/name/username, and the three exceptions);
|
|
89
89
|
# the app suite passes on 7.2.2.
|
|
90
|
+
#
|
|
91
|
+
# PySide6 6.12.0 is excluded below Python 3.12: its Linux wheels drop a
|
|
92
|
+
# reference to ``None`` on ordinary void Qt calls (upstream PYSIDE-3474), so
|
|
93
|
+
# a long enough session -- a CI worker that has run the app suite -- aborts
|
|
94
|
+
# with ``Fatal Python error: none_dealloc: deallocating None``. On 3.12+ the
|
|
95
|
+
# singletons are immortal (PEP 683) and the leak is harmless, which is why
|
|
96
|
+
# only the 3.10/3.11 cells of the matrix were exposed. The crash took the
|
|
97
|
+
# xdist worker down, and the session then hung until the job's 20-minute
|
|
98
|
+
# timeout. Lift the cap once a 6.12.x release passes the app suite on 3.11.
|
|
90
99
|
app = [
|
|
91
|
-
"PySide6>=6.5,<
|
|
100
|
+
"PySide6>=6.5,<6.12; python_version < '3.12'",
|
|
101
|
+
"PySide6>=6.5,<7; python_version >= '3.12'",
|
|
92
102
|
"psutil>=5.9,<8",
|
|
93
103
|
]
|
|
94
104
|
# The Model Context Protocol server (PyMemoryEditor.mcp), which lets an AI
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/enums/memory_allocation_states.py
RENAMED
|
File without changes
|
{pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/enums/memory_protections.py
RENAMED
|
File without changes
|
|
File without changes
|
{pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/enums/process_operations.py
RENAMED
|
File without changes
|
{pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/PyMemoryEditor/win32/enums/standard_access_rights.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_bitness_fallback_warns.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pymemoryeditor-3.4.0 → pymemoryeditor-3.4.2}/tests/platforms/test_linux_snapshot_passthrough.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|