Commit 32bc5695 authored by Eric Pouech's avatar Eric Pouech Committed by Alexandre Julliard

dbghelp: Unload overlapping modules in SymLoadModule*().

parent 5654af81
...@@ -992,17 +992,10 @@ DWORD64 WINAPI SymLoadModuleExW(HANDLE hProcess, HANDLE hFile, PCWSTR wImageNam ...@@ -992,17 +992,10 @@ DWORD64 WINAPI SymLoadModuleExW(HANDLE hProcess, HANDLE hFile, PCWSTR wImageNam
} }
if (altmodule) if (altmodule)
{ {
/* we have a conflict as the new module cannot be found by its base address /* We have a conflict as the new module cannot be found by its base address
* we need to get rid of one on the two modules * (it's hidden by altmodule).
* We need to decide which one the two modules we need to get rid of.
*/ */
if (lstrcmpW(module->modulename, altmodule->modulename) != 0)
{
/* module overlaps an existing but different module... unload new module and return error */
WARN("%ls overlaps %ls\n", module->modulename, altmodule->modulename);
module_remove(pcs, module);
SetLastError(ERROR_INVALID_PARAMETER);
return 0;
}
/* loading same module at same address... don't change anything */ /* loading same module at same address... don't change anything */
if (module->module.BaseOfImage == altmodule->module.BaseOfImage) if (module->module.BaseOfImage == altmodule->module.BaseOfImage)
{ {
...@@ -1010,9 +1003,10 @@ DWORD64 WINAPI SymLoadModuleExW(HANDLE hProcess, HANDLE hFile, PCWSTR wImageNam ...@@ -1010,9 +1003,10 @@ DWORD64 WINAPI SymLoadModuleExW(HANDLE hProcess, HANDLE hFile, PCWSTR wImageNam
SetLastError(ERROR_SUCCESS); SetLastError(ERROR_SUCCESS);
return 0; return 0;
} }
/* replace old module with new one, which will look like a shift of base address */ /* replace old module with new one */
WARN("Shift module %ls from %I64x to %I64x\n", WARN("Replace module %ls at %I64x by module %ls at %I64x\n",
module->modulename, altmodule->module.BaseOfImage, module->module.BaseOfImage); altmodule->module.ImageName, altmodule->module.BaseOfImage,
module->module.ImageName, module->module.BaseOfImage);
module_remove(pcs, altmodule); module_remove(pcs, altmodule);
} }
......
...@@ -456,7 +456,6 @@ static void test_modules_overlap(void) ...@@ -456,7 +456,6 @@ static void test_modules_overlap(void)
} }
else else
{ {
todo_wine_if(i == 6 || i == 7)
ok(base == tests[i].input.base, "SymLoadModuleEx failed: %lu\n", GetLastError()); ok(base == tests[i].input.base, "SymLoadModuleEx failed: %lu\n", GetLastError());
} }
for (j = 0; j < ARRAY_SIZE(tests[i].outputs); j++) for (j = 0; j < ARRAY_SIZE(tests[i].outputs); j++)
...@@ -471,13 +470,10 @@ static void test_modules_overlap(void) ...@@ -471,13 +470,10 @@ static void test_modules_overlap(void)
break; break;
} }
ok(nth.index == -1, "Expecting more modules\n"); ok(nth.index == -1, "Expecting more modules\n");
todo_wine_if(i == 6 || i == 7)
ok(nth.module.BaseOfImage == tests[i].outputs[j].base, "Wrong base\n"); ok(nth.module.BaseOfImage == tests[i].outputs[j].base, "Wrong base\n");
if (!nth.will_fail) if (!nth.will_fail)
{ {
todo_wine_if(i == 7)
ok(nth.module.ImageSize == tests[i].outputs[j].size, "Wrong size\n"); ok(nth.module.ImageSize == tests[i].outputs[j].size, "Wrong size\n");
todo_wine_if(i == 6 || i == 7)
ok(!strcasecmp(nth.module.ModuleName, tests[i].outputs[j].name), "Wrong name\n"); ok(!strcasecmp(nth.module.ModuleName, tests[i].outputs[j].name), "Wrong name\n");
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment