diff options
Diffstat (limited to 'winsup/utils/dumper.h')
-rw-r--r-- | winsup/utils/dumper.h | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/winsup/utils/dumper.h b/winsup/utils/dumper.h new file mode 100644 index 000000000..673a0037e --- /dev/null +++ b/winsup/utils/dumper.h @@ -0,0 +1,131 @@ +/* dumper.h + + Copyright 1999 Cygnus Solutions. + + Written by Egor Duda <deo@logos-m.ru> + +This file is part of Cygwin. + +This software is a copyrighted work licensed under the terms of the +Cygwin license. Please consult the file "CYGWIN_LICENSE" for +details. */ + +#ifndef _DUMPER_H_ +#define _DUMPER_H_ + +#include <windows.h> + +typedef struct +{ + LPBYTE base; + DWORD size; +} process_mem_region; + +typedef struct +{ + DWORD tid; + HANDLE hThread; + CONTEXT context; +} process_thread; + +typedef struct +{ + LPVOID base_address; + char* name; +} process_module; + +enum process_entity_type +{ + pr_ent_memory, + pr_ent_thread, + pr_ent_module +}; + +typedef struct _process_entity +{ + process_entity_type type; + union + { + process_thread thread; + process_mem_region memory; + process_module module; + } u; + asection* section; + struct _process_entity* next; +} process_entity; + +class exclusion +{ +public: + int last; + int size; + int step; + process_mem_region* region; + + exclusion ( int step ) { last = size = 0; + this->step = step; + region = NULL; } + ~exclusion () { free ( region ); } + int add ( LPBYTE mem_base, DWORD mem_size ); + int sort_and_check (); +}; + +#define PAGE_BUFFER_SIZE 4096 + +class dumper +{ + DWORD pid; + DWORD tid; /* thread id of active thread */ + HANDLE hProcess; + process_entity* list; + process_entity* last; + exclusion* excl_list; + + char* file_name; + bfd* core_bfd; + + asection* status_section; + + int memory_num; + int module_num; + int thread_num; + + void close (); + void dumper_abort (); + + process_entity* add_process_entity_to_list ( process_entity_type type ); + int add_thread ( DWORD tid, HANDLE hThread ); + int add_mem_region ( LPBYTE base, DWORD size ); + + /* break mem_region by excl_list and add add all subregions */ + int split_add_mem_region ( LPBYTE base, DWORD size ); + + int add_module ( LPVOID base_address ); + + int collect_memory_sections (); + int dump_memory_region ( asection* to, process_mem_region* memory ); + int dump_thread ( asection* to, process_thread* thread ); + int dump_module ( asection* to, process_module* module ); + +public: + int sane (); + + int collect_process_information (); + + dumper ( DWORD pid, DWORD tid, const char* name ); + ~dumper (); + + int init_core_dump (); + int prepare_core_dump (); + int write_core_dump (); +}; + +extern int deb_printf ( const char* format, ... ); + +extern char* psapi_get_module_name ( HANDLE hProcess, DWORD BaseAddress ); + +extern int parse_pe ( const char* file_name, exclusion* excl_list ); + +extern BOOL verbose; + +#endif |