ntdll: Change module load order so it matches InLoadOrderModuleList.

Signed-off-by: Piotr Caban <piotr@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Piotr Caban 2018-03-14 14:47:25 +01:00 committed by Alexandre Julliard
parent 77d9c17554
commit 47da086af9
1 changed files with 10 additions and 5 deletions

View File

@ -89,6 +89,7 @@ typedef struct _wine_modref
LDR_MODULE ldr; LDR_MODULE ldr;
dev_t dev; dev_t dev;
ino_t ino; ino_t ino;
int alloc_deps;
int nDeps; int nDeps;
struct _wine_modref **deps; struct _wine_modref **deps;
} WINE_MODREF; } WINE_MODREF;
@ -483,15 +484,16 @@ static FARPROC find_forwarded_export( HMODULE module, const char *forward, LPCWS
if (!imports_fixup_done && current_modref) if (!imports_fixup_done && current_modref)
{ {
WINE_MODREF **deps; WINE_MODREF **deps;
if (current_modref->nDeps) if (current_modref->alloc_deps)
deps = RtlReAllocateHeap( GetProcessHeap(), 0, current_modref->deps, deps = RtlReAllocateHeap( GetProcessHeap(), 0, current_modref->deps,
(current_modref->nDeps + 1) * sizeof(*deps) ); (current_modref->alloc_deps + 1) * sizeof(*deps) );
else else
deps = RtlAllocateHeap( GetProcessHeap(), 0, sizeof(*deps) ); deps = RtlAllocateHeap( GetProcessHeap(), 0, sizeof(*deps) );
if (deps) if (deps)
{ {
deps[current_modref->nDeps++] = wm; deps[current_modref->nDeps++] = wm;
current_modref->deps = deps; current_modref->deps = deps;
current_modref->alloc_deps++;
} }
} }
else if (process_attach( wm, NULL ) != STATUS_SUCCESS) else if (process_attach( wm, NULL ) != STATUS_SUCCESS)
@ -936,6 +938,7 @@ static NTSTATUS fixup_imports_ilonly( WINE_MODREF *wm, LPCWSTR load_path, void *
wm->ldr.Flags &= ~LDR_DONT_RESOLVE_REFS; wm->ldr.Flags &= ~LDR_DONT_RESOLVE_REFS;
wm->nDeps = 1; wm->nDeps = 1;
wm->alloc_deps = 1;
wm->deps = RtlAllocateHeap( GetProcessHeap(), 0, sizeof(WINE_MODREF *) ); wm->deps = RtlAllocateHeap( GetProcessHeap(), 0, sizeof(WINE_MODREF *) );
prev = current_modref; prev = current_modref;
@ -968,7 +971,7 @@ static NTSTATUS fixup_imports_ilonly( WINE_MODREF *wm, LPCWSTR load_path, void *
*/ */
static NTSTATUS fixup_imports( WINE_MODREF *wm, LPCWSTR load_path ) static NTSTATUS fixup_imports( WINE_MODREF *wm, LPCWSTR load_path )
{ {
int i, nb_imports; int i, dep, nb_imports;
const IMAGE_IMPORT_DESCRIPTOR *imports; const IMAGE_IMPORT_DESCRIPTOR *imports;
WINE_MODREF *prev, *imp; WINE_MODREF *prev, *imp;
DWORD size; DWORD size;
@ -993,7 +996,7 @@ static NTSTATUS fixup_imports( WINE_MODREF *wm, LPCWSTR load_path )
RtlActivateActivationContext( 0, wm->ldr.ActivationContext, &cookie ); RtlActivateActivationContext( 0, wm->ldr.ActivationContext, &cookie );
/* Allocate module dependency list */ /* Allocate module dependency list */
wm->nDeps = nb_imports; wm->alloc_deps = nb_imports;
wm->deps = RtlAllocateHeap( GetProcessHeap(), 0, nb_imports*sizeof(WINE_MODREF *) ); wm->deps = RtlAllocateHeap( GetProcessHeap(), 0, nb_imports*sizeof(WINE_MODREF *) );
/* load the imported modules. They are automatically /* load the imported modules. They are automatically
@ -1004,12 +1007,14 @@ static NTSTATUS fixup_imports( WINE_MODREF *wm, LPCWSTR load_path )
status = STATUS_SUCCESS; status = STATUS_SUCCESS;
for (i = 0; i < nb_imports; i++) for (i = 0; i < nb_imports; i++)
{ {
dep = wm->nDeps++;
if (!import_dll( wm->ldr.BaseAddress, &imports[i], load_path, &imp )) if (!import_dll( wm->ldr.BaseAddress, &imports[i], load_path, &imp ))
{ {
imp = NULL; imp = NULL;
status = STATUS_DLL_NOT_FOUND; status = STATUS_DLL_NOT_FOUND;
} }
wm->deps[i] = imp; wm->deps[dep] = imp;
} }
current_modref = prev; current_modref = prev;
if (wm->ldr.ActivationContext) RtlDeactivateActivationContext( 0, cookie ); if (wm->ldr.ActivationContext) RtlDeactivateActivationContext( 0, cookie );