29 #ifndef DBGHELP_STATIC_LIB 38 #define NOTE_GNU_BUILD_ID 3 42 const WCHAR S_WineLoaderW[] = {
'<',
'w',
'i',
'n',
'e',
'-',
'l',
'o',
'a',
'd',
'e',
'r',
'>',
'\0'};
63 if (
l >=
len)
return 0;
77 if (*
ptr ==
'/' || *
ptr ==
'\\')
break;
85 static const WCHAR wineW[] = {
'w',
'i',
'n',
'e',0};
86 static const WCHAR suffixW[] = {
'6',
'4',0};
152 static const WCHAR wineW[] = {
'w',
'i',
'n',
'e',0};
153 static const WCHAR suffixW[] = {
'6',
'4',0};
188 case DMT_ELF:
return virtual ?
"Virtual ELF" :
"ELF";
189 case DMT_PE:
return virtual ?
"Virtual PE" :
"PE";
190 case DMT_MACHO:
return virtual ?
"Virtual Mach-O" :
"Mach-O";
191 default:
return "---";
213 TRACE(
"=> %s %s-%s %s\n",
330 const struct module* inner)
395 sizeof(
pair->effective->module.ImageName));
405 else ret =
pair->pcs->loader->load_debug_info(
pair->pcs,
pair->effective);
409 pair->effective->module.NumSyms =
pair->effective->ht_symbols.num_elts;
485 #ifndef DBGHELP_STATIC_LIB 491 #ifndef DBGHELP_STATIC_LIB 505 WARN(
"Bad CRC for file %s (got %08x while expecting %08x)\n",
debugstr_w(
file), crc, link_crc);
546 static const WCHAR globalDebugDirW[] = {
'/',
'u',
's',
'r',
'/',
'l',
'i',
'b',
'/',
'd',
'e',
'b',
'u',
'g',
'/'};
548 static const WCHAR globalDebugDirW[] = {
'\0'};
550 static const WCHAR dotDebugW[] = {
'.',
'd',
'e',
'b',
'u',
'g',
'/'};
551 const size_t globalDebugDirLen =
ARRAY_SIZE(globalDebugDirW);
559 if (!fmap_link)
return FALSE;
565 (globalDebugDirLen +
path_len + 6 + 1 + filename_len + 1) *
sizeof(
WCHAR));
571 if ((slash2 =
wcsrchr(slash,
'/'))) slash = slash2 + 1;
572 if ((slash2 =
wcsrchr(slash,
'\\'))) slash = slash2 + 1;
579 memcpy(slash, dotDebugW,
sizeof(dotDebugW));
587 if ((slash2 =
wcsrchr(slash,
'/'))) slash = slash2 + 1;
588 if ((slash2 =
wcsrchr(slash,
'\\'))) slash = slash2 + 1;
595 memcpy(
p, globalDebugDirW, globalDebugDirLen *
sizeof(
WCHAR));
596 slash += globalDebugDirLen;
623 static const WCHAR globalDebugDirW[] = {
'/',
'u',
's',
'r',
'/',
'l',
'i',
'b',
'/',
'd',
'e',
'b',
'u',
'g',
'/'};
624 static const WCHAR buildidW[] = {
'.',
'b',
'u',
'i',
'l',
'd',
'-',
'i',
'd',
'/'};
625 static const WCHAR dotDebug0W[] = {
'.',
'd',
'e',
'b',
'u',
'g',0};
629 const BYTE* idend =
id + idlen;
632 if (!fmap_link)
return FALSE;
635 sizeof(globalDebugDirW) +
sizeof(buildidW) +
636 (idlen * 2 + 1) *
sizeof(
WCHAR) +
sizeof(dotDebug0W));
638 memcpy(
z, globalDebugDirW,
sizeof(globalDebugDirW));
640 memcpy(
z, buildidW,
sizeof(buildidW));
645 *
z++ =
"0123456789abcdef"[*
id >> 4 ];
646 *
z++ =
"0123456789abcdef"[*
id & 0x0F];
653 *
z++ =
"0123456789abcdef"[*
id >> 4 ];
654 *
z++ =
"0123456789abcdef"[*
id & 0x0F];
657 memcpy(
z, dotDebug0W,
sizeof(dotDebug0W));
673 if (
note[1] == idlen &&
678 fmap->alternate = fmap_link;
689 TRACE(
"not found\n");
727 const char* dbg_link;
742 WARN(
"Couldn't load linked debug file for %s\n",
767 PWSTR wImageName, wModuleName;
771 TRACE(
"(%p %p %s %s %s %08x %p %08x)\n",
781 else wImageName =
NULL;
788 else wModuleName =
NULL;
807 TRACE(
"(%p %p %s %s %s %08x %p %08x)\n",
812 FIXME(
"Unsupported load data parameter %p for %s\n",
820 if (!wImageName)
return FALSE;
831 pcs->
loader->synchronize_module_list(pcs);
834 if (!wImageName && !
hFile)
return 0;
855 module = pcs->
loader->load_module(pcs, wImageName, BaseOfDll);
920 FIXME(
"This shouldn't happen\n");
934 if (!pcs)
return FALSE;
950 if (!pcs)
return FALSE;
982 x.
cb = EnumModulesCallback;
983 x.user = UserContext;
1004 return x->cb(
x->module,
base,
x->user);
1013 x.
cb = EnumModulesCallback;
1014 x.user = UserContext;
1030 if (!pcs)
return FALSE;
1044 #ifndef DBGHELP_STATIC_LIB 1071 x.
cb = EnumLoadedModulesCallback;
1072 x.user = UserContext;
1102 x.
cb = EnumLoadedModulesCallback;
1103 x.user = UserContext;
1122 if (!hMods)
return FALSE;
1127 FIXME(
"If this happens, bump the number in mod\n");
1132 for (
i = 0;
i < sz;
i++)
1143 return sz != 0 &&
i == sz;
1151 dst[dst_len - 1] = 0;
1278 if (!pcs)
return FALSE;
1357 return pcs->
loader->synchronize_module_list(pcs);
WCHAR * get_wine_loader_name(struct process *pcs)
BOOL WINAPI SymEnumerateModules(HANDLE hProcess, PSYM_ENUMMODULES_CALLBACK EnumModulesCallback, PVOID UserContext)
BOOL(CALLBACK * PENUMLOADED_MODULES_CALLBACKW64)(PCWSTR, DWORD64, ULONG, PVOID)
#define memmove(s1, s2, n)
BOOL pcs_callback(const struct process *pcs, ULONG action, void *data)
static void dbghelp_str_WtoA(const WCHAR *src, char *dst, int dst_len)
BOOL WINAPI SymUnloadModule(HANDLE hProcess, DWORD BaseOfDll)
struct module * module_find_by_nameW(const struct process *pcs, const WCHAR *name)
static struct module * native_load_module(struct process *pcs, const WCHAR *name, ULONG_PTR addr)
BOOL WINAPI SymGetModuleInfo(HANDLE hProcess, DWORD dwAddr, PIMAGEHLP_MODULE ModuleInfo)
static BOOL image_check_debug_link(const WCHAR *file, struct image_file_map *fmap, DWORD link_crc)
BOOL image_check_alternate(struct image_file_map *fmap, const struct module *module)
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
BOOL(CALLBACK * PENUMLOADED_MODULES_CALLBACK64)(PCSTR, DWORD64, ULONG, PVOID)
#define CBA_DEFERRED_SYMBOL_LOAD_COMPLETE
#define WideCharToMultiByte
void module_reset_debug_info(struct module *module)
static BOOL native_load_debug_info(struct process *process, struct module *module)
ACPI_SIZE strlen(const char *String)
struct module * module_find_by_addr(const struct process *pcs, DWORD64 addr, enum module_type type)
GLsizei const GLchar ** path
static struct module * module_get_container(const struct process *pcs, const struct module *inner)
char * wine_dbgstr_w(const wchar_t *wstr)
struct process * process_find_by_handle(HANDLE hProcess)
struct hash_table ht_symbols
BOOL WINAPI SymUnloadModule64(HANDLE hProcess, DWORD64 BaseOfDll)
struct module * module_is_already_loaded(const struct process *pcs, const WCHAR *name)
struct image_file_map * fmap
DWORD64 WINAPI SymLoadModuleExW(HANDLE hProcess, HANDLE hFile, PCWSTR wImageName, PCWSTR wModuleName, DWORD64 BaseOfDll, DWORD SizeOfDll, PMODLOAD_DATA Data, DWORD Flags)
#define NOTE_GNU_BUILD_ID
BOOL validate_addr64(DWORD64 addr)
static int match_ext(const WCHAR *ptr, size_t len)
#define INVALID_HANDLE_VALUE
_In_ BOOL _In_ HANDLE hProcess
GLint GLint GLint GLint GLint x
static BOOL CALLBACK enum_modW64_64(PCWSTR name, DWORD64 base, PVOID user)
BOOL WINAPI SymGetModuleInfoW(HANDLE hProcess, DWORD dwAddr, PIMAGEHLP_MODULEW ModuleInfo)
static BOOL read_bytes(parse_buffer *buf, LPVOID data, DWORD size)
struct wine_rb_tree sources_offsets_tree
ACPI_BUFFER *RetBuffer ACPI_BUFFER *RetBuffer char ACPI_WALK_RESOURCE_CALLBACK void *Context ACPI_BUFFER *RetBuffer UINT16 ACPI_RESOURCE **ResourcePtr ACPI_GENERIC_ADDRESS *Reg UINT32 *ReturnValue UINT8 UINT8 *Slp_TypB ACPI_PHYSICAL_ADDRESS PhysicalAddress64 UINT32 UINT32 *TimeElapsed UINT32 ACPI_STATUS const char UINT32 ACPI_STATUS const char UINT32 const char const char * ModuleName
static const WCHAR S_OcxW[]
static BOOL image_locate_build_id_target(struct image_file_map *fmap, const BYTE *id, unsigned idlen)
static BOOL CALLBACK enum_load_modW64_64(PCWSTR name, DWORD64 base, ULONG size, PVOID user)
BOOL WINAPI EnumerateLoadedModules(HANDLE hProcess, PENUMLOADED_MODULES_CALLBACK EnumLoadedModulesCallback, PVOID UserContext)
BOOL(CALLBACK * PENUMLOADED_MODULES_CALLBACK)(PCSTR, ULONG, ULONG, PVOID)
static void * heap_alloc(size_t len)
DWORD64 WINAPI SymGetModuleBase64(HANDLE hProcess, DWORD64 dwAddr)
WCHAR FileName[MAX_PATH+1]
#define IMAGE_DOS_SIGNATURE
DWORD WINAPI SymLoadModule(HANDLE hProcess, HANDLE hFile, PCSTR ImageName, PCSTR ModuleName, DWORD BaseOfDll, DWORD SizeOfDll)
WCHAR LoadedImageName[256]
BOOL WINAPI SymEnumerateModules64(HANDLE hProcess, PSYM_ENUMMODULES_CALLBACK64 EnumModulesCallback, PVOID UserContext)
BOOL module_get_debug(struct module_pair *pair)
namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval OVERLAPPED LPLOOKUPSERVICE_COMPLETION_ROUTINE HANDLE * handle
static const WCHAR S_ExeW[]
BOOL pe_load_debug_info(const struct process *pcs, struct module *module) DECLSPEC_HIDDEN
BOOL(CALLBACK * PSYM_ENUMMODULES_CALLBACK)(PCSTR, ULONG, PVOID)
BOOL(CALLBACK * PSYM_ENUMMODULES_CALLBACKW64)(PCWSTR, DWORD64, PVOID)
int source_rb_compare(const void *key, const struct wine_rb_entry *entry) DECLSPEC_HIDDEN
const char * file_nameA(const char *str) DECLSPEC_HIDDEN
WINE_DEFAULT_DEBUG_CHANNEL(dbghelp)
static const WCHAR * get_filename(const WCHAR *name, const WCHAR *endptr)
static BOOL native_enum_modules(struct process *process, enum_modules_cb cb, void *user)
_In_ ULONG _Out_writes_bytes_opt_ InformationLength PAUX_MODULE_EXTENDED_INFO ModuleInfo
int note(char *format,...)
static BOOL is_wine_loader(const WCHAR *module)
PENUMLOADED_MODULES_CALLBACK64 cb
static const WCHAR S_DrvW[]
void vector_init(struct vector *v, unsigned elt_sz, unsigned bucket_sz) DECLSPEC_HIDDEN
#define CBA_DEFERRED_SYMBOL_LOAD_FAILURE
BOOL WINAPI EnumerateLoadedModules64(HANDLE hProcess, PENUMLOADED_MODULES_CALLBACK64 EnumLoadedModulesCallback, PVOID UserContext)
DWORD WINAPI GetModuleBaseNameW(HANDLE hProcess, HMODULE hModule, LPWSTR lpBaseName, DWORD nSize)
BOOL WINAPI EnumerateLoadedModulesW64(HANDLE hProcess, PENUMLOADED_MODULES_CALLBACKW64 EnumLoadedModulesCallback, PVOID UserContext)
BOOL WINAPI SymEnumerateModulesW64(HANDLE hProcess, PSYM_ENUMMODULES_CALLBACKW64 EnumModulesCallback, PVOID UserContext)
static void wine_rb_init(struct wine_rb_tree *tree, wine_rb_compare_func_t compare)
struct module * pe_load_native_module(struct process *pcs, const WCHAR *name, HANDLE hFile, DWORD64 base, DWORD size) DECLSPEC_HIDDEN
static BOOL module_is_container_loaded(const struct process *pcs, const WCHAR *ImageName, DWORD64 base)
DWORD64 WINAPI SymLoadModule64(HANDLE hProcess, HANDLE hFile, PCSTR ImageName, PCSTR ModuleName, DWORD64 BaseOfDll, DWORD SizeOfDll)
struct image_file_map * alternate
_Must_inspect_result_ _In_ ULONG Flags
static const WCHAR S_AcmW[]
BOOL WINAPI EnumProcessModules(HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded)
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
const struct loader_ops * loader
WCHAR LoadedImageName[256]
BOOL elf_map_handle(HANDLE handle, struct image_file_map *fmap)
static BOOL CALLBACK enum_modW64_32(PCWSTR name, DWORD64 base, PVOID user)
struct module * pe_load_builtin_module(struct process *pcs, const WCHAR *name, DWORD64 base, DWORD64 size) DECLSPEC_HIDDEN
static void image_unmap_file(struct image_file_map *fmap)
void module_set_module(struct module *module, const WCHAR *name)
PSYM_ENUMMODULES_CALLBACK cb
static const char * ImageName
void pool_init(struct pool *a, size_t arena_size) DECLSPEC_HIDDEN
BOOL WINAPI SymGetModuleInfoW64(HANDLE hProcess, DWORD64 dwAddr, PIMAGEHLP_MODULEW64 ModuleInfo)
static const char * get_module_type(enum module_type type, BOOL virtual)
GLenum const GLvoid * addr
static void image_unmap_section(struct image_section_map *ism)
BOOL module_remove(struct process *pcs, struct module *module)
#define memcpy(s1, s2, n)
struct module * module_new(struct process *pcs, const WCHAR *name, enum module_type type, BOOL virtual, DWORD64 mod_addr, DWORD64 size, ULONG_PTR stamp, ULONG_PTR checksum)
static cab_ULONG checksum(const cab_UBYTE *data, cab_UWORD bytes, cab_ULONG csum)
static BOOL image_find_section(struct image_file_map *fmap, const char *name, struct image_section_map *ism)
static const char * image_map_section(struct image_section_map *ism)
static const WCHAR S_DotSoW[]
static const WCHAR modW[]
const struct loader_ops no_loader_ops
void hash_table_destroy(struct hash_table *ht) DECLSPEC_HIDDEN
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
static const WCHAR S_VxdW[]
PVOID WINAPI SymFunctionTableAccess64(HANDLE hProcess, DWORD64 AddrBase)
_Check_return_ char *__cdecl getenv(_In_z_ const char *_VarName)
void pool_destroy(struct pool *a) DECLSPEC_HIDDEN
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
BOOL pe_map_file(HANDLE file, struct image_file_map *fmap, enum module_type mt) DECLSPEC_HIDDEN
PSYM_ENUMMODULES_CALLBACK64 cb
struct module * module_get_containee(const struct process *pcs, const struct module *outer)
const WCHAR S_WineLoaderW[]
unsigned short is_virtual
BOOL(CALLBACK * PSYM_ENUMMODULES_CALLBACK64)(PCSTR, DWORD64, PVOID)
struct hash_table ht_types
#define ReadFile(a, b, c, d, e)
WCHAR CVData[MAX_PATH *3]
DWORD calc_crc32(HANDLE handle)
#define CBA_DEFERRED_SYMBOL_LOAD_START
BOOL WINAPI GetModuleInformation(HANDLE hProcess, HMODULE hModule, LPMODULEINFO lpmodinfo, DWORD cb)
static LPCWSTR LPCWSTR LPCWSTR env
#define MultiByteToWideChar
void hash_table_init(struct pool *pool, struct hash_table *ht, unsigned num_buckets) DECLSPEC_HIDDEN
DWORD64 WINAPI SymLoadModuleEx(HANDLE hProcess, HANDLE hFile, PCSTR ImageName, PCSTR ModuleName, DWORD64 BaseOfDll, DWORD DllSize, PMODLOAD_DATA Data, DWORD Flags)
static HMODULE MODULEINFO DWORD cb
static void module_fill_module(const WCHAR *in, WCHAR *out, size_t size)
static const WCHAR S_DllW[]
BOOL WINAPI SymRefreshModuleList(HANDLE hProcess)
static WCHAR baseW[MAX_PATH]
#define ERROR_MOD_NOT_FOUND
PENUMLOADED_MODULES_CALLBACK cb
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
#define ERROR_INVALID_NAME
struct module * module_find_by_nameA(const struct process *pcs, const char *name)
WCHAR * get_dos_file_name(const WCHAR *filename) DECLSPEC_HIDDEN
struct symt_ht ** addr_sorttab
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
GLuint GLuint GLsizei GLenum type
DWORD WINAPI SymGetModuleBase(HANDLE hProcess, DWORD dwAddr)
PVOID WINAPI SymFunctionTableAccess(HANDLE hProcess, DWORD AddrBase)
static const WCHAR *const ext[]
struct module_format * format_info[DFI_LAST]
IMAGEHLP_MODULEW64 module
void user(int argc, const char *argv[])
#define HeapFree(x, y, z)
struct cpu * dbghelp_current_cpu
CHAR LoadedImageName[256]
BOOL WINAPI SymGetModuleInfo64(HANDLE hProcess, DWORD64 dwAddr, PIMAGEHLP_MODULE64 ModuleInfo)
static BOOL CALLBACK enum_load_modW64_32(PCWSTR name, DWORD64 base, ULONG size, PVOID user)
static BOOL image_locate_debug_link(const struct module *module, struct image_file_map *fmap, const char *filename, DWORD crc)
static BOOL native_fetch_file_info(struct process *process, const WCHAR *name, ULONG_PTR load_addr, DWORD_PTR *base, DWORD *size, DWORD *checksum)
static BOOL heap_free(void *mem)
static BOOL native_synchronize_module_list(struct process *pcs)
BOOL(* enum_modules_cb)(const WCHAR *, ULONG_PTR addr, void *user)
GLuint const GLchar * name