static RDebugMap* r_debug_native_map_alloc (RDebug *dbg, ut64 addr, int size) { #if __APPLE__ return xnu_map_alloc (dbg, addr, size); #elif __WINDOWS__ && !__CYGWIN__ RDebugMap *map = NULL; LPVOID base = NULL; HANDLE process = w32_open_process (PROCESS_ALL_ACCESS, FALSE, dbg->pid); if (process == INVALID_HANDLE_VALUE) { return map; } base = VirtualAllocEx (process, (LPVOID)(size_t)addr, (SIZE_T)size, MEM_COMMIT, PAGE_READWRITE); CloseHandle (process); if (!base) { eprintf ("Failed to allocate memory\n"); return map; } r_debug_map_sync (dbg); map = r_debug_map_get (dbg, (ut64)(size_t)base); return map; #else // malloc not implemented for this platform return NULL; #endif }
RDebugMap *xnu_map_alloc (RDebug *dbg, ut64 addr, int size) { RDebugMap *map = NULL; kern_return_t ret; unsigned char *base = (unsigned char *)addr; boolean_t anywhere = !VM_FLAGS_ANYWHERE; if (addr == -1) anywhere = VM_FLAGS_ANYWHERE; ret = vm_allocate (pid_to_task (dbg->tid), (vm_address_t*)&base, (vm_size_t)size, anywhere); if (ret != KERN_SUCCESS) { printf("vm_allocate failed\n"); return NULL; } r_debug_map_sync (dbg); // update process memory maps map = r_debug_map_get (dbg, (ut64)base); return map; }