Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
afb6f169
Commit
afb6f169
authored
Nov 24, 2021
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ntdll: Add a helper function to append .dll to a module name.
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
eb6a9151
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
43 additions
and
35 deletions
+43
-35
loader.c
dlls/ntdll/loader.c
+43
-35
No files found.
dlls/ntdll/loader.c
View file @
afb6f169
...
...
@@ -184,8 +184,7 @@ static WINE_MODREF *last_failed_modref;
static
LDR_DDAG_NODE
*
node_ntdll
,
*
node_kernel32
;
static
NTSTATUS
load_dll
(
const
WCHAR
*
load_path
,
const
WCHAR
*
libname
,
const
WCHAR
*
default_ext
,
DWORD
flags
,
WINE_MODREF
**
pwm
);
static
NTSTATUS
load_dll
(
const
WCHAR
*
load_path
,
const
WCHAR
*
libname
,
DWORD
flags
,
WINE_MODREF
**
pwm
);
static
NTSTATUS
process_attach
(
LDR_DDAG_NODE
*
node
,
LPVOID
lpReserved
);
static
FARPROC
find_ordinal_export
(
HMODULE
module
,
const
IMAGE_EXPORT_DIRECTORY
*
exports
,
DWORD
exp_size
,
DWORD
ordinal
,
LPCWSTR
load_path
);
...
...
@@ -602,6 +601,26 @@ static NTSTATUS build_import_name( WCHAR buffer[256], const char *import, int le
}
/**********************************************************************
* append_dll_ext
*/
static
WCHAR
*
append_dll_ext
(
const
WCHAR
*
name
)
{
const
WCHAR
*
ext
=
wcsrchr
(
name
,
'.'
);
if
(
!
ext
||
wcschr
(
ext
,
'/'
)
||
wcschr
(
ext
,
'\\'
))
{
WCHAR
*
ret
=
RtlAllocateHeap
(
GetProcessHeap
(),
0
,
wcslen
(
name
)
*
sizeof
(
WCHAR
)
+
sizeof
(
L".dll"
)
);
if
(
!
ret
)
return
NULL
;
wcscpy
(
ret
,
name
);
wcscat
(
ret
,
L".dll"
);
return
ret
;
}
return
NULL
;
}
/***********************************************************************
* is_import_dll_system
*/
...
...
@@ -741,7 +760,7 @@ static FARPROC find_forwarded_export( HMODULE module, const char *forward, LPCWS
if
(
!
(
wm
=
find_basename_module
(
mod_name
)))
{
TRACE
(
"delay loading %s for '%s'
\n
"
,
debugstr_w
(
mod_name
),
forward
);
if
(
load_dll
(
load_path
,
mod_name
,
NULL
,
0
,
&
wm
)
==
STATUS_SUCCESS
&&
if
(
load_dll
(
load_path
,
mod_name
,
0
,
&
wm
)
==
STATUS_SUCCESS
&&
!
(
wm
->
ldr
.
Flags
&
LDR_DONT_RESOLVE_REFS
))
{
if
(
!
imports_fixup_done
&&
current_modref
)
...
...
@@ -934,7 +953,7 @@ static BOOL import_dll( HMODULE module, const IMAGE_IMPORT_DESCRIPTOR *descr, LP
}
status
=
build_import_name
(
buffer
,
name
,
len
);
if
(
!
status
)
status
=
load_dll
(
load_path
,
buffer
,
NULL
,
0
,
&
wmImp
);
if
(
!
status
)
status
=
load_dll
(
load_path
,
buffer
,
0
,
&
wmImp
);
if
(
status
)
{
...
...
@@ -1204,7 +1223,7 @@ static NTSTATUS fixup_imports_ilonly( WINE_MODREF *wm, LPCWSTR load_path, void *
prev
=
current_modref
;
current_modref
=
wm
;
assert
(
!
wm
->
ldr
.
DdagNode
->
Dependencies
.
Tail
);
if
(
!
(
status
=
load_dll
(
load_path
,
L"mscoree.dll"
,
NULL
,
0
,
&
imp
))
if
(
!
(
status
=
load_dll
(
load_path
,
L"mscoree.dll"
,
0
,
&
imp
))
&&
!
add_module_dependency_after
(
wm
->
ldr
.
DdagNode
,
imp
->
ldr
.
DdagNode
,
NULL
))
status
=
STATUS_NO_MEMORY
;
current_modref
=
prev
;
...
...
@@ -2882,29 +2901,15 @@ done:
*
* Find the file (or already loaded module) for a given dll name.
*/
static
NTSTATUS
find_dll_file
(
const
WCHAR
*
load_path
,
const
WCHAR
*
libname
,
const
WCHAR
*
default_ext
,
UNICODE_STRING
*
nt_name
,
WINE_MODREF
**
pwm
,
HANDLE
*
mapping
,
SECTION_IMAGE_INFORMATION
*
image_info
,
struct
file_id
*
id
)
static
NTSTATUS
find_dll_file
(
const
WCHAR
*
load_path
,
const
WCHAR
*
libname
,
UNICODE_STRING
*
nt_name
,
WINE_MODREF
**
pwm
,
HANDLE
*
mapping
,
SECTION_IMAGE_INFORMATION
*
image_info
,
struct
file_id
*
id
)
{
WCHAR
*
ext
,
*
dllname
;
WCHAR
*
fullname
=
NULL
;
NTSTATUS
status
;
ULONG
wow64_old_value
=
0
;
*
pwm
=
NULL
;
dllname
=
NULL
;
if
(
default_ext
)
/* first append default extension */
{
if
(
!
(
ext
=
wcsrchr
(
libname
,
'.'
))
||
wcschr
(
ext
,
'/'
)
||
wcschr
(
ext
,
'\\'
))
{
if
(
!
(
dllname
=
RtlAllocateHeap
(
GetProcessHeap
(),
0
,
(
wcslen
(
libname
)
+
wcslen
(
default_ext
)
+
1
)
*
sizeof
(
WCHAR
))))
return
STATUS_NO_MEMORY
;
wcscpy
(
dllname
,
libname
);
wcscat
(
dllname
,
default_ext
);
libname
=
dllname
;
}
}
/* Win 7/2008R2 and up seem to re-enable WoW64 FS redirection when loading libraries */
RtlWow64EnableFsRedirectionEx
(
0
,
&
wow64_old_value
);
...
...
@@ -2913,14 +2918,11 @@ static NTSTATUS find_dll_file( const WCHAR *load_path, const WCHAR *libname, con
if
(
!
contains_path
(
libname
))
{
WCHAR
*
fullname
=
NULL
;
status
=
find_actctx_dll
(
libname
,
&
fullname
);
if
(
status
==
STATUS_SUCCESS
)
{
TRACE
(
"found %s for %s
\n
"
,
debugstr_w
(
fullname
),
debugstr_w
(
libname
)
);
RtlFreeHeap
(
GetProcessHeap
(),
0
,
dllname
);
libname
=
dllname
=
fullname
;
libname
=
fullname
;
}
else
{
...
...
@@ -2945,7 +2947,7 @@ static NTSTATUS find_dll_file( const WCHAR *load_path, const WCHAR *libname, con
if
(
status
==
STATUS_IMAGE_MACHINE_TYPE_MISMATCH
)
status
=
STATUS_INVALID_IMAGE_FORMAT
;
done:
RtlFreeHeap
(
GetProcessHeap
(),
0
,
d
llname
);
RtlFreeHeap
(
GetProcessHeap
(),
0
,
fu
llname
);
if
(
wow64_old_value
)
RtlWow64EnableFsRedirectionEx
(
1
,
&
wow64_old_value
);
return
status
;
}
...
...
@@ -2957,8 +2959,7 @@ done:
* Load a PE style module according to the load order.
* The loader_section must be locked while calling this function.
*/
static
NTSTATUS
load_dll
(
const
WCHAR
*
load_path
,
const
WCHAR
*
libname
,
const
WCHAR
*
default_ext
,
DWORD
flags
,
WINE_MODREF
**
pwm
)
static
NTSTATUS
load_dll
(
const
WCHAR
*
load_path
,
const
WCHAR
*
libname
,
DWORD
flags
,
WINE_MODREF
**
pwm
)
{
UNICODE_STRING
nt_name
;
struct
file_id
id
;
...
...
@@ -2969,7 +2970,7 @@ static NTSTATUS load_dll( const WCHAR *load_path, const WCHAR *libname, const WC
TRACE
(
"looking for %s in %s
\n
"
,
debugstr_w
(
libname
),
debugstr_w
(
load_path
)
);
nts
=
find_dll_file
(
load_path
,
libname
,
default_ext
,
&
nt_name
,
pwm
,
&
mapping
,
&
image_info
,
&
id
);
nts
=
find_dll_file
(
load_path
,
libname
,
&
nt_name
,
pwm
,
&
mapping
,
&
image_info
,
&
id
);
if
(
*
pwm
)
/* found already loaded module */
{
...
...
@@ -3060,10 +3061,11 @@ NTSTATUS WINAPI DECLSPEC_HOTPATCH LdrLoadDll(LPCWSTR path_name, DWORD flags,
{
WINE_MODREF
*
wm
;
NTSTATUS
nts
;
WCHAR
*
dllname
=
append_dll_ext
(
libname
->
Buffer
);
RtlEnterCriticalSection
(
&
loader_section
);
nts
=
load_dll
(
path_name
,
libname
->
Buffer
,
L".dll"
,
flags
,
&
wm
);
nts
=
load_dll
(
path_name
,
dllname
?
dllname
:
libname
->
Buffer
,
flags
,
&
wm
);
if
(
nts
==
STATUS_SUCCESS
&&
!
(
wm
->
ldr
.
Flags
&
LDR_DONT_RESOLVE_REFS
))
{
...
...
@@ -3077,6 +3079,7 @@ NTSTATUS WINAPI DECLSPEC_HOTPATCH LdrLoadDll(LPCWSTR path_name, DWORD flags,
*
hModule
=
(
wm
)
?
wm
->
ldr
.
DllBase
:
NULL
;
RtlLeaveCriticalSection
(
&
loader_section
);
RtlFreeHeap
(
GetProcessHeap
(),
0
,
dllname
);
return
nts
;
}
...
...
@@ -3122,6 +3125,7 @@ NTSTATUS WINAPI LdrGetDllHandleEx( ULONG flags, LPCWSTR load_path, ULONG *dll_ch
struct
file_id
id
;
NTSTATUS
status
;
WINE_MODREF
*
wm
;
WCHAR
*
dllname
;
HANDLE
mapping
;
TRACE
(
"flag %#x, load_path %p, dll_characteristics %p, name %p, base %p.
\n
"
,
...
...
@@ -3136,9 +3140,12 @@ NTSTATUS WINAPI LdrGetDllHandleEx( ULONG flags, LPCWSTR load_path, ULONG *dll_ch
if
(
flags
&
~
supported_flags
)
FIXME
(
"Unsupported flags %#x.
\n
"
,
flags
);
if
(
dll_characteristics
)
FIXME
(
"dll_characteristics unsupported.
\n
"
);
dllname
=
append_dll_ext
(
name
->
Buffer
);
RtlEnterCriticalSection
(
&
loader_section
);
status
=
find_dll_file
(
load_path
,
name
->
Buffer
,
L".dll"
,
&
nt_name
,
&
wm
,
&
mapping
,
&
image_info
,
&
id
);
status
=
find_dll_file
(
load_path
,
dllname
?
dllname
:
name
->
Buffer
,
&
nt_name
,
&
wm
,
&
mapping
,
&
image_info
,
&
id
);
if
(
wm
)
*
base
=
wm
->
ldr
.
DllBase
;
else
...
...
@@ -3157,6 +3164,7 @@ NTSTATUS WINAPI LdrGetDllHandleEx( ULONG flags, LPCWSTR load_path, ULONG *dll_ch
}
RtlLeaveCriticalSection
(
&
loader_section
);
RtlFreeHeap
(
GetProcessHeap
(),
0
,
dllname
);
TRACE
(
"%s -> %p (load path %s)
\n
"
,
debugstr_us
(
name
),
status
?
NULL
:
*
base
,
debugstr_w
(
load_path
)
);
return
status
;
}
...
...
@@ -3839,7 +3847,7 @@ static void init_wow64( CONTEXT *context )
NTSTATUS
status
;
static
const
WCHAR
wow64_path
[]
=
L"C:
\\
windows
\\
system32
\\
wow64.dll"
;
if
((
status
=
load_dll
(
NULL
,
wow64_path
,
NULL
,
0
,
&
wm
)))
if
((
status
=
load_dll
(
NULL
,
wow64_path
,
0
,
&
wm
)))
{
ERR
(
"could not load %s, status %x
\n
"
,
debugstr_w
(
wow64_path
),
status
);
NtTerminateProcess
(
GetCurrentProcess
(),
status
);
...
...
@@ -3987,7 +3995,7 @@ void WINAPI LdrInitializeThunk( CONTEXT *context, ULONG_PTR unknown2, ULONG_PTR
if
(
NtCurrentTeb
()
->
WowTebOffset
)
init_wow64
(
context
);
if
((
status
=
load_dll
(
NULL
,
L"kernel32.dll"
,
NULL
,
0
,
&
kernel32
))
!=
STATUS_SUCCESS
)
if
((
status
=
load_dll
(
NULL
,
L"kernel32.dll"
,
0
,
&
kernel32
))
!=
STATUS_SUCCESS
)
{
MESSAGE
(
"wine: could not load kernel32.dll, status %x
\n
"
,
status
);
NtTerminateProcess
(
GetCurrentProcess
(),
status
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment