memhub: alloc 失败打印归属 site/ctx 与存活块 order 分布(新增 dump_alive_orders);free 被 _is_valid_ptr 拒绝时首次打印现场;接通 big_alloc_count gzip: ub: uchar*= buf 补空格(*= 被词法合并为单 OP,注解止于 uchar) 新增 traceback 模块;删除 dbgstack.vp;其余模块随新语法与尺寸口径同步
74 lines
3.4 KiB
Plaintext
74 lines
3.4 KiB
Plaintext
import t
|
||
from stdint import *
|
||
from w32.win32base import *
|
||
|
||
MEM_COMMIT: t.CDefine = 0x00001000
|
||
MEM_RESERVE: t.CDefine = 0x00002000
|
||
MEM_DECOMMIT: t.CDefine = 0x00004000
|
||
MEM_RELEASE: t.CDefine = 0x00008000
|
||
MEM_FREE: t.CDefine = 0x00010000
|
||
MEM_RESET: t.CDefine = 0x00080000
|
||
MEM_TOP_DOWN: t.CDefine = 0x00100000
|
||
MEM_WRITE_WATCH: t.CDefine = 0x00200000
|
||
MEM_PHYSICAL: t.CDefine = 0x00400000
|
||
MEM_LARGE_PAGES: t.CDefine = 0x20000000
|
||
|
||
PAGE_NOACCESS: t.CDefine = 0x01
|
||
PAGE_READONLY: t.CDefine = 0x02
|
||
PAGE_READWRITE: t.CDefine = 0x04
|
||
PAGE_WRITECOPY: t.CDefine = 0x08
|
||
PAGE_EXECUTE: t.CDefine = 0x10
|
||
PAGE_EXECUTE_READ: t.CDefine = 0x20
|
||
PAGE_EXECUTE_READWRITE: t.CDefine = 0x40
|
||
PAGE_EXECUTE_WRITECOPY: t.CDefine = 0x80
|
||
PAGE_GUARD: t.CDefine = 0x100
|
||
PAGE_NOCACHE: t.CDefine = 0x200
|
||
PAGE_WRITECOMBINE: t.CDefine = 0x400
|
||
|
||
HEAP_NO_SERIALIZE: t.CDefine = 0x00000001
|
||
HEAP_GROWABLE: t.CDefine = 0x00000002
|
||
HEAP_GENERATE_EXCEPTIONS: t.CDefine = 0x00000004
|
||
HEAP_ZERO_MEMORY: t.CDefine = 0x00000008
|
||
HEAP_REALLOC_IN_PLACE_ONLY: t.CDefine = 0x00000010
|
||
|
||
class MEMORY_BASIC_INFORMATION():
|
||
BaseAddress: VOIDPTR
|
||
AllocationBase: VOIDPTR
|
||
AllocationProtect: DWORD
|
||
RegionSize: sizet
|
||
State: DWORD
|
||
Protect: DWORD
|
||
Type: DWORD
|
||
|
||
extern def VirtualAlloc(lpAddress: VOIDPTR, dwSize: sizet, flAllocationType: ULONG, flProtect: ULONG) -> VOIDPTR
|
||
extern def VirtualFree(lpAddress: VOIDPTR, dwSize: sizet, dwFreeType: ULONG) -> BOOL
|
||
extern def VirtualProtect(lpAddress: VOIDPTR, dwSize: sizet, flNewProtect: ULONG, lpflOldProtect: ULONG | t.CPtr) -> BOOL
|
||
extern def VirtualQuery(lpAddress: t.CConst | VOIDPTR, lpBuffer: MEMORY_BASIC_INFORMATION | t.CPtr, dwLength: sizet) -> sizet
|
||
extern def VirtualLock(lpAddress: VOIDPTR, dwSize: sizet) -> BOOL
|
||
extern def VirtualUnlock(lpAddress: VOIDPTR, dwSize: sizet) -> BOOL
|
||
extern def GetProcessHeap() -> HANDLE
|
||
extern def HeapCreate(flOptions: ULONG, dwInitialSize: sizet, dwMaximumSize: sizet) -> HANDLE
|
||
extern def HeapDestroy(hHeap: HANDLE) -> BOOL
|
||
extern def HeapAlloc(hHeap: HANDLE, dwFlags: ULONG, dwBytes: sizet) -> VOIDPTR
|
||
extern def HeapReAlloc(hHeap: HANDLE, dwFlags: ULONG, lpMem: VOIDPTR, dwBytes: sizet) -> VOIDPTR
|
||
extern def HeapFree(hHeap: HANDLE, dwFlags: ULONG, lpMem: VOIDPTR) -> BOOL
|
||
extern def HeapSize(hHeap: HANDLE, dwFlags: ULONG, lpMem: t.CConst | VOIDPTR) -> sizet
|
||
extern def HeapValidate(hHeap: HANDLE, dwFlags: ULONG, lpMem: t.CConst | VOIDPTR) -> BOOL
|
||
extern def HeapCompact(hHeap: HANDLE, dwFlags: ULONG) -> sizet
|
||
extern def GlobalAlloc(uFlags: UINT, dwBytes: sizet) -> VOIDPTR
|
||
extern def GlobalFree(hMem: VOIDPTR) -> VOIDPTR
|
||
extern def GlobalLock(hMem: VOIDPTR) -> VOIDPTR
|
||
extern def GlobalUnlock(hMem: VOIDPTR) -> BOOL
|
||
extern def GlobalSize(hMem: VOIDPTR) -> sizet
|
||
extern def LocalAlloc(uFlags: UINT, dwBytes: sizet) -> VOIDPTR
|
||
extern def LocalFree(hMem: VOIDPTR) -> VOIDPTR
|
||
|
||
# 跨进程/本进程读内存(memoryapi.h / kernel32.dll)
|
||
# BOOL ReadProcessMemory(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer,
|
||
# SIZE_T nSize, SIZE_T *lpNumberOfBytesRead);
|
||
# 该导出的签名恰为 dbghelp 的 PREAD_PROCESS_MEMORY_ROUTINE64:StackWalk64 的回调槽
|
||
# 要求填这个函数(includes/traceback.vp 在 Install 时用 GetProcAddress 取其地址传入,
|
||
# 见 includes/w32/win32dbghelp.vp 的 StackWalk64)。
|
||
# 返回 0 = 失败(GetLastError 取原因)。
|
||
extern def ReadProcessMemory(hProcess: HANDLE, lpBaseAddress: t.CConst | VOIDPTR, lpBuffer: VOIDPTR, nSize: sizet, lpNumberOfBytesRead: sizet | t.CPtr) -> BOOL
|