[PATCH 6/6] [DbgHelp]: now using a unicode Mask for internal sym_enum function
Eric Pouech
eric.pouech at orange.fr
Mon Jan 2 14:06:17 CST 2012
A+
---
dlls/dbghelp/symbol.c | 155 +++++++++++++++++++++++++++----------------------
1 files changed, 84 insertions(+), 71 deletions(-)
diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c
index 2dfd44e..7d51d9c 100644
--- a/dlls/dbghelp/symbol.c
+++ b/dlls/dbghelp/symbol.c
@@ -134,6 +134,8 @@ static void symt_add_module_ht(struct module* module, struct symt_ht* ht)
}
}
+static const WCHAR starW[] = {'*',0};
+
/* transforms a dbghelp's regular expression into a POSIX one
* Here are the valid dbghelp reg ex characters:
* * 0 or more characters
@@ -188,19 +190,6 @@ static void compile_regexW(const WCHAR* str, int numchar, regexw_t* re, BOOL _ca
HeapFree(GetProcessHeap(), 0, mask);
}
-static void compile_regex(const char* str, int numchar, regexw_t* re, BOOL _case)
-{
- DWORD sz;
- WCHAR* strW;
-
- sz = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
- if ((strW = HeapAlloc(GetProcessHeap(), 0, sz * sizeof(WCHAR))))
- MultiByteToWideChar(CP_ACP, 0, str, -1, strW, sz);
-
- compile_regexW(strW, numchar, re, _case);
- HeapFree(GetProcessHeap(), 0, strW);
-}
-
static BOOL compile_file_regexW(regexw_t* re, const WCHAR* srcfile)
{
WCHAR *mask, *p;
@@ -1045,7 +1034,7 @@ static BOOL symt_enum_locals_helper(struct module_pair* pair,
return TRUE;
}
-static BOOL symt_enum_locals(struct process* pcs, const char* mask,
+static BOOL symt_enum_locals(struct process* pcs, PCWSTR mask,
const struct sym_enum* se)
{
struct module_pair pair;
@@ -1065,7 +1054,7 @@ static BOOL symt_enum_locals(struct process* pcs, const char* mask,
BOOL ret;
regexw_t preg;
- compile_regex(mask ? mask : "*", -1, &preg,
+ compile_regexW(mask ? mask : starW, -1, &preg,
dbghelp_options & SYMOPT_CASE_INSENSITIVE);
ret = symt_enum_locals_helper(&pair, &preg, se, (struct symt_function*)sym,
&((struct symt_function*)sym)->vchildren);
@@ -1106,11 +1095,11 @@ void copy_symbolW(SYMBOL_INFOW* siw, const SYMBOL_INFO* si)
*
* Core routine for most of the enumeration of symbols
*/
-static BOOL sym_enum(HANDLE hProcess, ULONG64 BaseOfDll, PCSTR Mask,
+static BOOL sym_enum(HANDLE hProcess, ULONG64 BaseOfDll, PCWSTR Mask,
const struct sym_enum* se)
{
struct module_pair pair;
- const char* bang;
+ PCWSTR bang;
regexw_t mod_regex, sym_regex;
pair.pcs = process_find_by_handle(hProcess);
@@ -1118,15 +1107,15 @@ static BOOL sym_enum(HANDLE hProcess, ULONG64 BaseOfDll, PCSTR Mask,
if (BaseOfDll == 0)
{
/* do local variables ? */
- if (!Mask || !(bang = strchr(Mask, '!')))
+ if (!Mask || !(bang = strchrW(Mask, '!')))
return symt_enum_locals(pair.pcs, Mask, se);
if (bang == Mask) return FALSE;
- compile_regex(Mask, bang - Mask, &mod_regex, TRUE);
- compile_regex(bang + 1, -1, &sym_regex,
- dbghelp_options & SYMOPT_CASE_INSENSITIVE);
-
+ compile_regexW(Mask, bang - Mask, &mod_regex, TRUE);
+ compile_regexW(bang + 1, -1, &sym_regex,
+ dbghelp_options & SYMOPT_CASE_INSENSITIVE);
+
for (pair.requested = pair.pcs->lmodules; pair.requested; pair.requested = pair.requested->next)
{
if (pair.requested->type == DMT_PE && module_get_debug(&pair))
@@ -1161,20 +1150,36 @@ static BOOL sym_enum(HANDLE hProcess, ULONG64 BaseOfDll, PCSTR Mask,
return FALSE;
/* we always ignore module name from Mask when BaseOfDll is defined */
- if (Mask && (bang = strchr(Mask, '!')))
+ if (Mask && (bang = strchrW(Mask, '!')))
{
if (bang == Mask) return FALSE;
Mask = bang + 1;
}
- compile_regex(Mask ? Mask : "*", -1, &sym_regex,
- dbghelp_options & SYMOPT_CASE_INSENSITIVE);
+ compile_regexW(Mask ? Mask : starW, -1, &sym_regex,
+ dbghelp_options & SYMOPT_CASE_INSENSITIVE);
symt_enum_module(&pair, &sym_regex, se);
regfreeW(&sym_regex);
return TRUE;
}
+static inline BOOL doSymEnumSymbols(HANDLE hProcess, ULONG64 BaseOfDll, PCWSTR Mask,
+ PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback,
+ PVOID UserContext)
+{
+ struct sym_enum se;
+
+ se.cb = EnumSymbolsCallback;
+ se.user = UserContext;
+ se.index = 0;
+ se.tag = 0;
+ se.addr = 0;
+ se.sym_info = (PSYMBOL_INFO)se.buffer;
+
+ return sym_enum(hProcess, BaseOfDll, Mask, &se);
+}
+
/******************************************************************
* SymEnumSymbols (DBGHELP.@)
*
@@ -1190,20 +1195,23 @@ BOOL WINAPI SymEnumSymbols(HANDLE hProcess, ULONG64 BaseOfDll, PCSTR Mask,
PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback,
PVOID UserContext)
{
- struct sym_enum se;
+ BOOL ret;
+ PWSTR maskW = NULL;
- TRACE("(%p %s %s %p %p)\n",
+ TRACE("(%p %s %s %p %p)\n",
hProcess, wine_dbgstr_longlong(BaseOfDll), debugstr_a(Mask),
EnumSymbolsCallback, UserContext);
- se.cb = EnumSymbolsCallback;
- se.user = UserContext;
- se.index = 0;
- se.tag = 0;
- se.addr = 0;
- se.sym_info = (PSYMBOL_INFO)se.buffer;
-
- return sym_enum(hProcess, BaseOfDll, Mask, &se);
+ if (Mask)
+ {
+ DWORD sz = MultiByteToWideChar(CP_ACP, 0, Mask, -1, NULL, 0);
+ if (!(maskW = HeapAlloc(GetProcessHeap(), 0, sz * sizeof(WCHAR))))
+ return FALSE;
+ MultiByteToWideChar(CP_ACP, 0, Mask, -1, maskW, sz);
+ }
+ ret = doSymEnumSymbols(hProcess, BaseOfDll, maskW, EnumSymbolsCallback, UserContext);
+ HeapFree(GetProcessHeap(), 0, maskW);
+ return ret;
}
struct sym_enumW
@@ -1234,21 +1242,16 @@ BOOL WINAPI SymEnumSymbolsW(HANDLE hProcess, ULONG64 BaseOfDll, PCWSTR Mask,
{
struct sym_enumW sew;
BOOL ret = FALSE;
- char* maskA = NULL;
+
+ TRACE("(%p %s %s %p %p)\n",
+ hProcess, wine_dbgstr_longlong(BaseOfDll), debugstr_w(Mask),
+ EnumSymbolsCallback, UserContext);
sew.ctx = UserContext;
sew.cb = EnumSymbolsCallback;
sew.sym_info = (PSYMBOL_INFOW)sew.buffer;
- if (Mask)
- {
- unsigned len = WideCharToMultiByte(CP_ACP, 0, Mask, -1, NULL, 0, NULL, NULL);
- maskA = HeapAlloc(GetProcessHeap(), 0, len);
- if (!maskA) return FALSE;
- WideCharToMultiByte(CP_ACP, 0, Mask, -1, maskA, len, NULL, NULL);
- }
- ret = SymEnumSymbols(hProcess, BaseOfDll, maskA, sym_enumW, &sew);
- HeapFree(GetProcessHeap(), 0, maskA);
+ ret = doSymEnumSymbols(hProcess, BaseOfDll, Mask, sym_enumW, &sew);
return ret;
}
@@ -1918,21 +1921,13 @@ BOOL WINAPI SymMatchStringW(PCWSTR string, PCWSTR re, BOOL _case)
return ret;
}
-/******************************************************************
- * SymSearch (DBGHELP.@)
- */
-BOOL WINAPI SymSearch(HANDLE hProcess, ULONG64 BaseOfDll, DWORD Index,
- DWORD SymTag, PCSTR Mask, DWORD64 Address,
- PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback,
- PVOID UserContext, DWORD Options)
+static inline BOOL doSymSearch(HANDLE hProcess, ULONG64 BaseOfDll, DWORD Index,
+ DWORD SymTag, PCWSTR Mask, DWORD64 Address,
+ PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback,
+ PVOID UserContext, DWORD Options)
{
struct sym_enum se;
- TRACE("(%p %s %u %u %s %s %p %p %x)\n",
- hProcess, wine_dbgstr_longlong(BaseOfDll), Index, SymTag, Mask,
- wine_dbgstr_longlong(Address), EnumSymbolsCallback,
- UserContext, Options);
-
if (Options != SYMSEARCH_GLOBALSONLY)
{
FIXME("Unsupported searching with options (%x)\n", Options);
@@ -1951,6 +1946,36 @@ BOOL WINAPI SymSearch(HANDLE hProcess, ULONG64 BaseOfDll, DWORD Index,
}
/******************************************************************
+ * SymSearch (DBGHELP.@)
+ */
+BOOL WINAPI SymSearch(HANDLE hProcess, ULONG64 BaseOfDll, DWORD Index,
+ DWORD SymTag, PCSTR Mask, DWORD64 Address,
+ PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback,
+ PVOID UserContext, DWORD Options)
+{
+ LPWSTR maskW = NULL;
+ BOOLEAN ret;
+
+ TRACE("(%p %s %u %u %s %s %p %p %x)\n",
+ hProcess, wine_dbgstr_longlong(BaseOfDll), Index, SymTag, Mask,
+ wine_dbgstr_longlong(Address), EnumSymbolsCallback,
+ UserContext, Options);
+
+ if (Mask)
+ {
+ DWORD sz = MultiByteToWideChar(CP_ACP, 0, Mask, -1, NULL, 0);
+
+ if (!(maskW = HeapAlloc(GetProcessHeap(), 0, sz * sizeof(WCHAR))))
+ return FALSE;
+ MultiByteToWideChar(CP_ACP, 0, Mask, -1, maskW, sz);
+ }
+ ret = doSymSearch(hProcess, BaseOfDll, Index, SymTag, maskW, Address,
+ EnumSymbolsCallback, UserContext, Options);
+ HeapFree(GetProcessHeap(), 0, maskW);
+ return ret;
+}
+
+/******************************************************************
* SymSearchW (DBGHELP.@)
*/
BOOL WINAPI SymSearchW(HANDLE hProcess, ULONG64 BaseOfDll, DWORD Index,
@@ -1959,8 +1984,6 @@ BOOL WINAPI SymSearchW(HANDLE hProcess, ULONG64 BaseOfDll, DWORD Index,
PVOID UserContext, DWORD Options)
{
struct sym_enumW sew;
- BOOL ret = FALSE;
- char* maskA = NULL;
TRACE("(%p %s %u %u %s %s %p %p %x)\n",
hProcess, wine_dbgstr_longlong(BaseOfDll), Index, SymTag, debugstr_w(Mask),
@@ -1971,18 +1994,8 @@ BOOL WINAPI SymSearchW(HANDLE hProcess, ULONG64 BaseOfDll, DWORD Index,
sew.cb = EnumSymbolsCallback;
sew.sym_info = (PSYMBOL_INFOW)sew.buffer;
- if (Mask)
- {
- unsigned len = WideCharToMultiByte(CP_ACP, 0, Mask, -1, NULL, 0, NULL, NULL);
- maskA = HeapAlloc(GetProcessHeap(), 0, len);
- if (!maskA) return FALSE;
- WideCharToMultiByte(CP_ACP, 0, Mask, -1, maskA, len, NULL, NULL);
- }
- ret = SymSearch(hProcess, BaseOfDll, Index, SymTag, maskA, Address,
- sym_enumW, &sew, Options);
- HeapFree(GetProcessHeap(), 0, maskA);
-
- return ret;
+ return doSymSearch(hProcess, BaseOfDll, Index, SymTag, Mask, Address,
+ sym_enumW, &sew, Options);
}
/******************************************************************
More information about the wine-patches
mailing list