29#ifndef DBGHELP_STATIC_LIB
38#define NOTE_GNU_BUILD_ID 3
42const 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);
static WCHAR baseW[MAX_PATH]
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
ACPI_SIZE strlen(const char *String)
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 void * heap_alloc(size_t len)
static BOOL heap_free(void *mem)
_In_ ULONG _Out_writes_bytes_opt_ InformationLength PAUX_MODULE_EXTENDED_INFO ModuleInfo
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
void user(int argc, const char *argv[])
int note(char *format,...)
static LPCWSTR LPCWSTR LPCWSTR env
void hash_table_init(struct pool *pool, struct hash_table *ht, unsigned num_buckets) DECLSPEC_HIDDEN
void vector_init(struct vector *v, unsigned elt_sz, unsigned bucket_sz) DECLSPEC_HIDDEN
const char * file_nameA(const char *str) DECLSPEC_HIDDEN
struct module * pe_load_builtin_module(struct process *pcs, const WCHAR *name, DWORD64 base, DWORD64 size) DECLSPEC_HIDDEN
WCHAR * get_dos_file_name(const WCHAR *filename) DECLSPEC_HIDDEN
int source_rb_compare(const void *key, const struct wine_rb_entry *entry) DECLSPEC_HIDDEN
void pool_init(struct pool *a, size_t arena_size) DECLSPEC_HIDDEN
void pool_destroy(struct pool *a) DECLSPEC_HIDDEN
BOOL(* enum_modules_cb)(const WCHAR *, ULONG_PTR addr, void *user)
struct module * pe_load_native_module(struct process *pcs, const WCHAR *name, HANDLE hFile, DWORD64 base, DWORD size) DECLSPEC_HIDDEN
void hash_table_destroy(struct hash_table *ht) DECLSPEC_HIDDEN
BOOL pe_load_debug_info(const struct process *pcs, struct module *module) DECLSPEC_HIDDEN
static cab_ULONG checksum(const cab_UBYTE *data, cab_UWORD bytes, cab_ULONG csum)
#define ERROR_MOD_NOT_FOUND
#define ReadFile(a, b, c, d, e)
#define INVALID_HANDLE_VALUE
#define CBA_DEFERRED_SYMBOL_LOAD_COMPLETE
BOOL(CALLBACK * PENUMLOADED_MODULES_CALLBACK)(PCSTR, ULONG, ULONG, PVOID)
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
#define CBA_DEFERRED_SYMBOL_LOAD_FAILURE
BOOL(CALLBACK * PSYM_ENUMMODULES_CALLBACK)(PCSTR, ULONG, PVOID)
BOOL(CALLBACK * PSYM_ENUMMODULES_CALLBACKW64)(PCWSTR, DWORD64, PVOID)
BOOL(CALLBACK * PENUMLOADED_MODULES_CALLBACK64)(PCSTR, DWORD64, ULONG, PVOID)
#define HeapFree(x, y, z)
BOOL(CALLBACK * PENUMLOADED_MODULES_CALLBACKW64)(PCWSTR, DWORD64, ULONG, PVOID)
#define WideCharToMultiByte
#define CBA_DEFERRED_SYMBOL_LOAD_START
#define MultiByteToWideChar
BOOL(CALLBACK * PSYM_ENUMMODULES_CALLBACK64)(PCSTR, DWORD64, PVOID)
#define ERROR_INVALID_NAME
DWORD calc_crc32(HANDLE handle)
BOOL validate_addr64(DWORD64 addr)
BOOL pcs_callback(const struct process *pcs, ULONG action, void *data)
struct process * process_find_by_handle(HANDLE hProcess)
struct cpu * dbghelp_current_cpu
BOOL WINAPI SymGetModuleInfoW(HANDLE hProcess, DWORD dwAddr, PIMAGEHLP_MODULEW ModuleInfo)
DWORD64 WINAPI SymLoadModuleEx(HANDLE hProcess, HANDLE hFile, PCSTR ImageName, PCSTR ModuleName, DWORD64 BaseOfDll, DWORD DllSize, PMODLOAD_DATA Data, DWORD Flags)
static BOOL native_synchronize_module_list(struct process *pcs)
DWORD WINAPI SymGetModuleBase(HANDLE hProcess, DWORD dwAddr)
static const WCHAR S_OcxW[]
BOOL WINAPI SymEnumerateModules(HANDLE hProcess, PSYM_ENUMMODULES_CALLBACK EnumModulesCallback, PVOID UserContext)
BOOL image_check_alternate(struct image_file_map *fmap, const struct module *module)
BOOL WINAPI SymUnloadModule(HANDLE hProcess, DWORD BaseOfDll)
static BOOL module_is_container_loaded(const struct process *pcs, const WCHAR *ImageName, DWORD64 base)
static struct module * module_get_container(const struct process *pcs, const struct module *inner)
static BOOL image_check_debug_link(const WCHAR *file, struct image_file_map *fmap, DWORD link_crc)
DWORD64 WINAPI SymLoadModuleExW(HANDLE hProcess, HANDLE hFile, PCWSTR wImageName, PCWSTR wModuleName, DWORD64 BaseOfDll, DWORD SizeOfDll, PMODLOAD_DATA Data, DWORD Flags)
BOOL WINAPI SymGetModuleInfoW64(HANDLE hProcess, DWORD64 dwAddr, PIMAGEHLP_MODULEW64 ModuleInfo)
static const WCHAR S_DllW[]
static const WCHAR S_ExeW[]
BOOL WINAPI EnumerateLoadedModulesW64(HANDLE hProcess, PENUMLOADED_MODULES_CALLBACKW64 EnumLoadedModulesCallback, PVOID UserContext)
static int match_ext(const WCHAR *ptr, size_t len)
PVOID WINAPI SymFunctionTableAccess(HANDLE hProcess, DWORD AddrBase)
void module_set_module(struct module *module, const WCHAR *name)
BOOL WINAPI EnumerateLoadedModules(HANDLE hProcess, PENUMLOADED_MODULES_CALLBACK EnumLoadedModulesCallback, PVOID UserContext)
PVOID WINAPI SymFunctionTableAccess64(HANDLE hProcess, DWORD64 AddrBase)
BOOL WINAPI SymUnloadModule64(HANDLE hProcess, DWORD64 BaseOfDll)
BOOL WINAPI SymEnumerateModulesW64(HANDLE hProcess, PSYM_ENUMMODULES_CALLBACKW64 EnumModulesCallback, PVOID UserContext)
static struct module * native_load_module(struct process *pcs, const WCHAR *name, ULONG_PTR addr)
DWORD64 WINAPI SymGetModuleBase64(HANDLE hProcess, DWORD64 dwAddr)
static const WCHAR S_DotSoW[]
struct module * module_is_already_loaded(const struct process *pcs, const WCHAR *name)
static const char * get_module_type(enum module_type type, BOOL virtual)
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)
struct module * module_find_by_addr(const struct process *pcs, DWORD64 addr, enum module_type type)
void module_reset_debug_info(struct module *module)
struct module * module_get_containee(const struct process *pcs, const struct module *outer)
BOOL module_get_debug(struct module_pair *pair)
static BOOL image_locate_debug_link(const struct module *module, struct image_file_map *fmap, const char *filename, DWORD crc)
static const WCHAR S_DrvW[]
DWORD64 WINAPI SymLoadModule64(HANDLE hProcess, HANDLE hFile, PCSTR ImageName, PCSTR ModuleName, DWORD64 BaseOfDll, DWORD SizeOfDll)
static const WCHAR S_AcmW[]
static BOOL native_fetch_file_info(struct process *process, const WCHAR *name, ULONG_PTR load_addr, DWORD_PTR *base, DWORD *size, DWORD *checksum)
const struct loader_ops no_loader_ops
WCHAR * get_wine_loader_name(struct process *pcs)
BOOL WINAPI SymRefreshModuleList(HANDLE hProcess)
static void dbghelp_str_WtoA(const WCHAR *src, char *dst, int dst_len)
static BOOL native_load_debug_info(struct process *process, struct module *module)
static const WCHAR S_VxdW[]
BOOL WINAPI SymEnumerateModules64(HANDLE hProcess, PSYM_ENUMMODULES_CALLBACK64 EnumModulesCallback, PVOID UserContext)
static BOOL image_locate_build_id_target(struct image_file_map *fmap, const BYTE *id, unsigned idlen)
static const WCHAR * get_filename(const WCHAR *name, const WCHAR *endptr)
BOOL module_remove(struct process *pcs, struct module *module)
const WCHAR S_WineLoaderW[]
static BOOL native_enum_modules(struct process *process, enum_modules_cb cb, void *user)
#define NOTE_GNU_BUILD_ID
BOOL WINAPI EnumerateLoadedModules64(HANDLE hProcess, PENUMLOADED_MODULES_CALLBACK64 EnumLoadedModulesCallback, PVOID UserContext)
static void module_fill_module(const WCHAR *in, WCHAR *out, size_t size)
BOOL WINAPI SymGetModuleInfo(HANDLE hProcess, DWORD dwAddr, PIMAGEHLP_MODULE ModuleInfo)
static const WCHAR *const ext[]
BOOL WINAPI SymGetModuleInfo64(HANDLE hProcess, DWORD64 dwAddr, PIMAGEHLP_MODULE64 ModuleInfo)
struct module * module_find_by_nameA(const struct process *pcs, const char *name)
static BOOL is_wine_loader(const WCHAR *module)
struct module * module_find_by_nameW(const struct process *pcs, const WCHAR *name)
DWORD WINAPI SymLoadModule(HANDLE hProcess, HANDLE hFile, PCSTR ImageName, PCSTR ModuleName, DWORD BaseOfDll, DWORD SizeOfDll)
BOOL WINAPI EnumProcessModules(HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded)
BOOL WINAPI GetModuleInformation(HANDLE hProcess, HMODULE hModule, LPMODULEINFO lpmodinfo, DWORD cb)
DWORD WINAPI GetModuleBaseNameW(HANDLE hProcess, HMODULE hModule, LPWSTR lpBaseName, DWORD nSize)
BOOL elf_map_handle(HANDLE handle, struct image_file_map *fmap)
GLint GLint GLint GLint GLint x
GLuint GLuint GLsizei GLenum type
GLenum const GLvoid * addr
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
static void image_unmap_section(struct image_section_map *ism)
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 void image_unmap_file(struct image_file_map *fmap)
_Check_return_ char *__cdecl getenv(_In_z_ const char *_VarName)
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
_In_ BOOL _In_ HANDLE hProcess
#define memcpy(s1, s2, n)
#define memmove(s1, s2, n)
static const char * ImageName
static HMODULE MODULEINFO DWORD cb
static BOOL read_bytes(parse_buffer *buf, LPVOID data, DWORD size)
#define IMAGE_DOS_SIGNATURE
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
static void wine_rb_init(struct wine_rb_tree *tree, wine_rb_compare_func_t compare)
WCHAR FileName[MAX_PATH+1]
CHAR LoadedImageName[256]
WCHAR CVData[MAX_PATH *3]
WCHAR LoadedImageName[256]
WCHAR LoadedImageName[256]
PENUMLOADED_MODULES_CALLBACK cb
PENUMLOADED_MODULES_CALLBACK64 cb
PSYM_ENUMMODULES_CALLBACK cb
PSYM_ENUMMODULES_CALLBACK64 cb
struct image_file_map * alternate
struct image_file_map * fmap
unsigned short is_virtual
struct symt_ht ** addr_sorttab
struct wine_rb_tree sources_offsets_tree
IMAGEHLP_MODULEW64 module
struct hash_table ht_types
struct module_format * format_info[DFI_LAST]
struct hash_table ht_symbols
const struct loader_ops * loader
static const WCHAR modW[]
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
_Must_inspect_result_ _In_ ULONG Flags