/****************************************************************** * macho_synchronize_module_list * * Rescans the debuggee's modules list and synchronizes it with * the one from 'pcs', ie: * - if a module is in debuggee and not in pcs, it's loaded into pcs * - if a module is in pcs and not in debuggee, it's unloaded from pcs */ BOOL macho_synchronize_module_list(struct process* pcs) { struct module* module; struct macho_sync ms; TRACE("(%p/%p)\n", pcs, pcs->handle); for (module = pcs->lmodules; module; module = module->next) { if (module->type == DMT_MACHO && !module->is_virtual) module->format_info[DFI_MACHO]->u.macho_info->in_use = 0; } ms.pcs = pcs; ms.macho_info.flags = MACHO_INFO_MODULE; if (!macho_enum_modules_internal(pcs, NULL, macho_enum_sync_cb, &ms)) return FALSE; module = pcs->lmodules; while (module) { if (module->type == DMT_MACHO && !module->is_virtual && !module->format_info[DFI_MACHO]->u.macho_info->in_use && !module->format_info[DFI_MACHO]->u.macho_info->is_loader) { module_remove(pcs, module); /* restart all over */ module = pcs->lmodules; } else module = module->next; } return TRUE; }
/****************************************************************** * SymUnloadModule (DBGHELP.@) * */ BOOL WINAPI SymUnloadModule(HANDLE hProcess, DWORD BaseOfDll) { struct process* pcs; struct module* module; pcs = process_find_by_handle(hProcess); if (!pcs) return FALSE; module = module_find_by_addr(pcs, BaseOfDll, DMT_UNKNOWN); if (!module) return FALSE; return module_remove(pcs, module); }