From: Andrew Nguyen Subject: dbghelp: Implement SymEnumSourceFilesW. Message-Id: <4DD661C4.8030201@codeweavers.com> Date: Fri, 20 May 2011 07:42:44 -0500 This fixes bug 27222. --- dlls/dbghelp/dbghelp.spec | 2 +- dlls/dbghelp/source.c | 102 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 1 deletions(-) diff --git a/dlls/dbghelp/dbghelp.spec b/dlls/dbghelp/dbghelp.spec index 398847f..d408d57 100644 --- a/dlls/dbghelp/dbghelp.spec +++ b/dlls/dbghelp/dbghelp.spec @@ -45,7 +45,7 @@ @ stub SymEnumProcesses @ stub SymEnumSourceFileTokens @ stdcall SymEnumSourceFiles(ptr int64 str ptr ptr) -@ stub SymEnumSourceFilesW +@ stdcall SymEnumSourceFilesW(ptr int64 wstr ptr ptr) @ stub SymEnumSourceLines @ stub SymEnumSourceLinesW @ stub SymEnumSym diff --git a/dlls/dbghelp/source.c b/dlls/dbghelp/source.c index 5f12b9f..fd5316a 100644 --- a/dlls/dbghelp/source.c +++ b/dlls/dbghelp/source.c @@ -202,6 +202,108 @@ BOOL WINAPI SymEnumSourceFiles(HANDLE hProcess, ULONG64 ModBase, PCSTR Mask, return TRUE; } +struct enum_sources_files_context +{ + PSYM_ENUMSOURCEFILES_CALLBACKW callbackW; + PVOID caller_context; + WCHAR *conversion_buffer; + size_t conversion_buffer_len; + DWORD callback_error; +}; + +static BOOL CALLBACK enum_source_files_A_to_W(PSOURCEFILE source_file, PVOID context) +{ + struct enum_sources_files_context *ctx = context; + SOURCEFILEW source_fileW; + DWORD len; + + len = MultiByteToWideChar(CP_ACP, 0, source_file->FileName, -1, NULL, 0); + if (len > ctx->conversion_buffer_len) + { + if (!ctx->conversion_buffer) + { + ctx->conversion_buffer = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + if (!ctx->conversion_buffer) + { + ctx->callback_error = ERROR_OUTOFMEMORY; + return FALSE; + } + } + else + { + WCHAR *ptr = HeapReAlloc(GetProcessHeap(), 0, ctx->conversion_buffer, len * sizeof(WCHAR)); + if (!ptr) + { + ctx->callback_error = ERROR_OUTOFMEMORY; + return FALSE; + } + + ctx->conversion_buffer = ptr; + } + + ctx->conversion_buffer_len = len; + } + + MultiByteToWideChar(CP_ACP, 0, source_file->FileName, -1, ctx->conversion_buffer, len); + + source_fileW.ModBase = source_file->ModBase; + source_fileW.FileName = ctx->conversion_buffer; + return ctx->callbackW(&source_fileW, ctx->caller_context); +} + +/****************************************************************** + * SymEnumSourceFilesW (DBGHELP.@) + * + */ +BOOL WINAPI SymEnumSourceFilesW(HANDLE hProcess, ULONG64 ModBase, PCWSTR Mask, + PSYM_ENUMSOURCEFILES_CALLBACKW cbSrcFiles, + PVOID UserContext) +{ + char *maskA = NULL; + PSYM_ENUMSOURCEFILES_CALLBACK callback; + PVOID context; + struct enum_sources_files_context callback_context = {cbSrcFiles, UserContext}; + BOOL ret; + + if (Mask) + { + DWORD len = WideCharToMultiByte(CP_ACP, 0, Mask, -1, NULL, 0, NULL, NULL); + + maskA = HeapAlloc(GetProcessHeap(), 0, len); + if (!maskA) + { + SetLastError(ERROR_OUTOFMEMORY); + return FALSE; + } + + WideCharToMultiByte(CP_ACP, 0, Mask, -1, maskA, len, NULL, NULL); + } + + if (cbSrcFiles) + { + callback = enum_source_files_A_to_W; + context = &callback_context; + } + else + { + callback = NULL; + context = UserContext; + } + + ret = SymEnumSourceFiles(hProcess, ModBase, maskA, callback, context); + + if (callback_context.callback_error) + { + SetLastError(callback_context.callback_error); + ret = FALSE; + } + + HeapFree(GetProcessHeap(), 0, callback_context.conversion_buffer); + HeapFree(GetProcessHeap(), 0, maskA); + + return ret; +} + /****************************************************************** * SymGetSourceFileToken (DBGHELP.@) * -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.16 (GNU/Linux) Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/ iQIcBAEBAgAGBQJN1mHLAAoJEK/FbHgLAxL2fA4P/R/7BMgbvUcTYxBWAQgJZV0D RvZxveOvjYZ/VRvlIRrxHMnfU7x1ZkNfl/82gsS65eo29QH5Uj+B/hS0AcS1VbH2 Ld2pMhPZRHE+noE8sL0jbTfqLtTip3P3MYUfs1cCtRauXiPgEXUe+7wlOKMDgIUv fFh78S1BZfpzYe8UzQnQZlUzIIpOjrJxXLS9reJmYzFQwhSOyAO2upSKiLYX2Ywg YHlzgqQFY4NMgwr6zoROybH/5RnDvRWPWbUnFh1TKnmdDr8HAQvEf2va+xLQqJq5 aiNnDx6Chxr3035pTGf62wMwGYd4DzmmiHCS5qG2RmlUsJQf0JCvrBhQmC8HgzEo fcAR0G9zjL0H78qD/UEtEp9XBXlaI9psonZaOHAG+uZo2qWmoka2DjfFu4JeKyrg mRs8lWM1HDEp5jzwHHym5gd10JF1C1QyBf0r5laVWwYGyDV2hclRxbBJIFAJVfH3 eUokU8+048peY3W62SRAOempzH4xX6yFBEYOcwHeuFl02/GRVUm/0aRYzHpK9Lq+ bzrnM8ieBOanVFsxCKveZ3fmVZKY1iSNYeYjjX8d3w6Jg2u41pYwd/wQPsFh1OYb 1rFm0K2SWLL5qy26RvhkzpYM5QvmOKUb7qU9C7oRAMb1eMIhN8X+XKlE+kk6jQB5 mukFIjiCzlcEdhH6W7D4 =tS8s -----END PGP SIGNATURE-----