diff options
Diffstat (limited to 'overlay/mgdb/gdb/winnt-nat.c')
-rw-r--r-- | overlay/mgdb/gdb/winnt-nat.c | 94 |
1 files changed, 88 insertions, 6 deletions
diff --git a/overlay/mgdb/gdb/winnt-nat.c b/overlay/mgdb/gdb/winnt-nat.c index 564c7f2..2d9999d 100644 --- a/overlay/mgdb/gdb/winnt-nat.c +++ b/overlay/mgdb/gdb/winnt-nat.c @@ -33,12 +33,14 @@ struct regcache; struct winnt_process { - int pfd; - pid_t pid; - pid_t syspid; - pid_t systid; - pid_t flags; - struct __dbg_event event; + int pfd; + pid_t pid; + pid_t syspid; + pid_t systid; + pid_t flags; + int nmodules; + struct __dbg_module_info * modules; + struct __dbg_event event; }; static size_t pcnt; @@ -93,6 +95,28 @@ static int winnt_plist_add (pid_t pid, int pfd) : -1; } +static void winnt_free_modules(struct winnt_process * pidinfo) +{ + struct __dbg_module_info * module; + struct __dbg_module_info * modules_base; + struct __dbg_module_info * modules_cap; + + if (!pidinfo->modules) + return; + + modules_base = pidinfo->modules; + modules_cap = &modules_base[pidinfo->nmodules]; + + for (module=modules_base; module<modules_cap; module++) + if (module->module_name) + free(module->module_name); + + free(pidinfo->modules); + + pidinfo->modules = 0; + pidinfo->nmodules = 0; +} + static void winnt_plist_remove (pid_t pid) { struct winnt_process * pdbg; @@ -100,7 +124,9 @@ static void winnt_plist_remove (pid_t pid) for (pdbg=plist, pcap=&plist[pcnt]; pdbg<pcap; pdbg++) { if (pdbg->pid == pid) { + winnt_free_modules(pdbg); pdbg->pid = 0; + pdbg->pfd = 0; return; } } @@ -156,6 +182,60 @@ static char * winnt_pid_to_exec_file (struct target_ops * t, int pid) return outbuf; } +static void winnt_get_modules(struct winnt_process * pidinfo) +{ + void * addr; + struct __dbg_module_info * module; + struct __dbg_module_info * modules; + struct __dbg_module_info * modules_cap; + ssize_t nbytes; + size_t nmodules; + + winnt_free_modules(pidinfo); + + if (!(addr = calloc(2048,sizeof(*modules)))) + return; + + nbytes = __dbg_info_get( + pidinfo->pfd,0, + __DBG_INFO_CACHED_MODULE_LIST, + addr,2048*sizeof(*modules)); + + if (nbytes < 0) { + free(addr); + return; + }; + + nmodules = nbytes / sizeof(*modules); + modules = (struct __dbg_module_info *)calloc(nmodules,sizeof(*modules)); + + if (!modules) { + free(addr); + return; + } + + memcpy(modules,addr,nmodules*sizeof(*modules)); + free(addr); + + module = modules; + modules_cap = &modules[nmodules]; + + for (; module<modules_cap; ) { + nbytes = __dbg_info_get( + pidinfo->pfd,module->module_key, + __DBG_INFO_MODULE_RPATH, + outbuf,WINNT_OUTBUF_SIZE); + + if (nbytes > 0) + module->module_name = strdup(outbuf); + + module++; + } + + pidinfo->modules = modules; + pidinfo->nmodules = nmodules; +} + static void winnt_fetch_registers ( struct target_ops * t, struct regcache * rcache, @@ -421,6 +501,7 @@ static void winnt_attach (struct target_ops * t, const char * args, int from_tty } winnt_prepare(t,pid,pfd,from_tty); + winnt_get_modules(winnt_process_record(pid)); } static void winnt_mourn_inferior (struct target_ops * t) @@ -637,6 +718,7 @@ static void winnt_create_inferior( /* init loop */ winnt_prepare(t,pid,pfd,0); + winnt_get_modules(winnt_process_record(pid)); } static char * winnt_pid_to_str (struct target_ops * t, ptid_t ptid) |