ntdll: Support loading builtin dlls with an explicit path name also

when loadorder is set to builtin only.
This commit is contained in:
Alexandre Julliard 2006-02-21 11:56:16 +01:00
parent 19e29d6035
commit 68ea200f32
1 changed files with 34 additions and 33 deletions

View File

@ -1349,7 +1349,7 @@ static NTSTATUS load_native_dll( LPCWSTR load_path, LPCWSTR name, HANDLE file,
WINE_MODREF *wm;
NTSTATUS status;
TRACE( "loading %s\n", debugstr_w(name) );
TRACE("Trying native dll %s\n", debugstr_w(name));
attr.Length = sizeof(attr);
attr.RootDirectory = 0;
@ -1456,6 +1456,8 @@ static NTSTATUS load_builtin_dll( LPCWSTR load_path, LPCWSTR path, HANDLE file,
UNICODE_STRING nt_name;
ANSI_STRING unix_name;
TRACE("Trying built-in %s\n", debugstr_w(path));
if (!RtlDosPathNameToNtPathName_U( path, &nt_name, NULL, NULL ))
return STATUS_DLL_NOT_FOUND;
@ -1481,6 +1483,8 @@ static NTSTATUS load_builtin_dll( LPCWSTR load_path, LPCWSTR path, HANDLE file,
{
int file_exists;
TRACE("Trying built-in %s\n", debugstr_w(name));
/* we don't want to depend on the current codepage here */
len = strlenW( name ) + 1;
if (len >= sizeof(dllname)) return STATUS_NAME_TOO_LONG;
@ -1652,7 +1656,6 @@ overflow:
*/
static NTSTATUS load_dll( LPCWSTR load_path, LPCWSTR libname, DWORD flags, WINE_MODREF** pwm )
{
int i;
enum loadorder_type loadorder[LOADORDER_NTYPES];
WCHAR buffer[32];
WCHAR *filename;
@ -1696,28 +1699,28 @@ static NTSTATUS load_dll( LPCWSTR load_path, LPCWSTR libname, DWORD flags, WINE_
MODULE_GetLoadOrderW( loadorder, main_exe ? main_exe->ldr.BaseDllName.Buffer : NULL, filename );
nts = STATUS_DLL_NOT_FOUND;
for (i = 0; i < LOADORDER_NTYPES; i++)
{
if (loadorder[i] == LOADORDER_INVALID) break;
switch (loadorder[i])
switch(loadorder[0])
{
case LOADORDER_DLL:
TRACE("Trying native dll %s\n", debugstr_w(filename));
if (!handle) continue; /* it cannot possibly be loaded */
if (handle)
{
nts = load_native_dll( load_path, filename, handle, flags, pwm );
if (nts == STATUS_INVALID_FILE_FOR_SECTION)
{
/* not in PE format, maybe it's a builtin */
nts = load_builtin_dll( load_path, filename, handle, flags, pwm );
}
break;
case LOADORDER_BI:
TRACE("Trying built-in %s\n", debugstr_w(filename));
if (nts == STATUS_DLL_NOT_FOUND && loadorder[1] == LOADORDER_BI)
nts = load_builtin_dll( load_path, filename, 0, flags, pwm );
break;
case LOADORDER_BI:
nts = load_builtin_dll( load_path, filename, handle, flags, pwm );
if (!handle) break; /* nothing else we can try */
/* file is not a builtin library, try without using the specified file */
nts = load_builtin_dll( load_path, filename, 0, flags, pwm );
if (nts == STATUS_DLL_NOT_FOUND && loadorder[1] == LOADORDER_DLL)
nts = load_native_dll( load_path, filename, handle, flags, pwm );
break;
default:
nts = STATUS_INTERNAL_ERROR;
break;
}
@ -1734,8 +1737,6 @@ static NTSTATUS load_dll( LPCWSTR load_path, LPCWSTR libname, DWORD flags, WINE_
if (filename != buffer) RtlFreeHeap( GetProcessHeap(), 0, filename );
return nts;
}
if (nts != STATUS_DLL_NOT_FOUND) break;
}
WARN("Failed to load module %s; status=%lx\n", debugstr_w(libname), nts);
if (handle) NtClose( handle );