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
482a26e1
Commit
482a26e1
authored
Mar 26, 2021
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ntdll: Use the same builtin check for process creation and initial image loading.
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
34652f37
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
43 additions
and
44 deletions
+43
-44
loader.c
dlls/ntdll/unix/loader.c
+40
-7
process.c
dlls/ntdll/unix/process.c
+2
-37
unix_private.h
dlls/ntdll/unix/unix_private.h
+1
-0
No files found.
dlls/ntdll/unix/loader.c
View file @
482a26e1
...
...
@@ -1452,6 +1452,42 @@ NTSTATUS load_builtin( const pe_image_info_t *image_info, const WCHAR *filename,
}
/***************************************************************************
* is_builtin_path
*/
BOOL
is_builtin_path
(
const
UNICODE_STRING
*
path
,
WORD
*
machine
)
{
static
const
WCHAR
wow64W
[]
=
{
'\\'
,
'?'
,
'?'
,
'\\'
,
'c'
,
':'
,
'\\'
,
'w'
,
'i'
,
'n'
,
'd'
,
'o'
,
'w'
,
's'
,
'\\'
,
's'
,
'y'
,
's'
,
'w'
,
'o'
,
'w'
,
'6'
,
'4'
};
unsigned
int
len
;
*
machine
=
current_machine
;
if
(
path
->
Length
>
wcslen
(
system_dir
)
*
sizeof
(
WCHAR
)
&&
!
wcsnicmp
(
path
->
Buffer
,
system_dir
,
wcslen
(
system_dir
)
))
{
#ifndef _WIN64
if
(
NtCurrentTeb64
()
&&
NtCurrentTeb64
()
->
TlsSlots
[
WOW64_TLS_FILESYSREDIR
])
*
machine
=
IMAGE_FILE_MACHINE_AMD64
;
#endif
goto
found
;
}
if
((
is_win64
||
is_wow64
)
&&
path
->
Length
>
sizeof
(
wow64W
)
&&
!
wcsnicmp
(
path
->
Buffer
,
wow64W
,
ARRAY_SIZE
(
wow64W
)
))
{
*
machine
=
IMAGE_FILE_MACHINE_I386
;
goto
found
;
}
return
FALSE
;
found:
/* check that there are no other path components */
len
=
wcslen
(
system_dir
);
while
(
len
<
path
->
Length
/
sizeof
(
WCHAR
)
&&
path
->
Buffer
[
len
]
==
'\\'
)
len
++
;
while
(
len
<
path
->
Length
/
sizeof
(
WCHAR
)
&&
path
->
Buffer
[
len
]
!=
'\\'
)
len
++
;
return
len
==
path
->
Length
/
sizeof
(
WCHAR
);
}
/***********************************************************************
* open_main_image
*/
...
...
@@ -1507,7 +1543,7 @@ NTSTATUS load_main_exe( const WCHAR *name, const char *unix_name, const WCHAR *c
NTSTATUS
status
;
SIZE_T
size
;
struct
stat
st
;
const
WCHAR
*
p
;
WORD
machine
;
/* special case for Unix file name */
if
(
unix_name
&&
unix_name
[
0
]
==
'/'
&&
!
stat
(
unix_name
,
&
st
))
...
...
@@ -1523,13 +1559,10 @@ NTSTATUS load_main_exe( const WCHAR *name, const char *unix_name, const WCHAR *c
if
(
status
!=
STATUS_DLL_NOT_FOUND
)
return
status
;
/* if path is in system dir, we can load the builtin even if the file itself doesn't exist */
if
(
!
wcsnicmp
(
*
image
,
system_dir
,
wcslen
(
system_dir
)
))
init_unicode_string
(
&
nt_name
,
*
image
);
if
(
is_builtin_path
(
&
nt_name
,
&
machine
))
{
p
=
*
image
+
wcslen
(
system_dir
);
while
(
*
p
==
'\\'
)
p
++
;
if
(
wcschr
(
p
,
'\\'
))
goto
failed
;
init_unicode_string
(
&
nt_name
,
*
image
);
status
=
find_builtin_dll
(
&
nt_name
,
module
,
&
size
,
image_info
,
current_machine
,
FALSE
);
status
=
find_builtin_dll
(
&
nt_name
,
module
,
&
size
,
image_info
,
machine
,
FALSE
);
if
(
status
!=
STATUS_DLL_NOT_FOUND
)
return
status
;
}
/* if name contains a path, bail out */
...
...
dlls/ntdll/unix/process.c
View file @
482a26e1
...
...
@@ -226,33 +226,6 @@ static startup_info_t *create_startup_info( const RTL_USER_PROCESS_PARAMETERS *p
}
/***************************************************************************
* is_builtin_path
*/
static
BOOL
is_builtin_path
(
UNICODE_STRING
*
path
,
BOOL
*
is_64bit
)
{
static
const
WCHAR
wow64W
[]
=
{
'\\'
,
'?'
,
'?'
,
'\\'
,
'c'
,
':'
,
'\\'
,
'w'
,
'i'
,
'n'
,
'd'
,
'o'
,
'w'
,
's'
,
'\\'
,
's'
,
'y'
,
's'
,
'w'
,
'o'
,
'w'
,
'6'
,
'4'
};
*
is_64bit
=
is_win64
;
if
(
path
->
Length
>
wcslen
(
system_dir
)
*
sizeof
(
WCHAR
)
&&
!
wcsnicmp
(
path
->
Buffer
,
system_dir
,
wcslen
(
system_dir
)
))
{
#ifndef _WIN64
if
(
NtCurrentTeb64
()
&&
NtCurrentTeb64
()
->
TlsSlots
[
WOW64_TLS_FILESYSREDIR
])
*
is_64bit
=
TRUE
;
#endif
return
TRUE
;
}
if
((
is_win64
||
is_wow64
)
&&
path
->
Length
>
sizeof
(
wow64W
)
&&
!
wcsnicmp
(
path
->
Buffer
,
wow64W
,
ARRAY_SIZE
(
wow64W
)
))
{
*
is_64bit
=
FALSE
;
return
TRUE
;
}
return
FALSE
;
}
/***********************************************************************
* get_so_file_info
*/
...
...
@@ -373,17 +346,9 @@ static NTSTATUS get_pe_file_info( UNICODE_STRING *path, HANDLE *handle, pe_image
if
((
status
=
NtOpenFile
(
handle
,
GENERIC_READ
,
&
attr
,
&
io
,
FILE_SHARE_READ
|
FILE_SHARE_DELETE
,
FILE_SYNCHRONOUS_IO_NONALERT
)))
{
BOOL
is_64bit
;
if
(
is_builtin_path
(
path
,
&
is_64bit
))
if
(
is_builtin_path
(
path
,
&
info
->
machine
))
{
TRACE
(
"assuming %u-bit builtin for %s
\n
"
,
is_64bit
?
64
:
32
,
debugstr_us
(
path
));
/* assume current arch */
#if defined(__i386__) || defined(__x86_64__)
info
->
machine
=
is_64bit
?
IMAGE_FILE_MACHINE_AMD64
:
IMAGE_FILE_MACHINE_I386
;
#else
info
->
machine
=
current_machine
;
#endif
TRACE
(
"assuming %04x builtin for %s
\n
"
,
info
->
machine
,
debugstr_us
(
path
));
return
STATUS_SUCCESS
;
}
return
status
;
...
...
dlls/ntdll/unix/unix_private.h
View file @
482a26e1
...
...
@@ -143,6 +143,7 @@ extern char **build_envp( const WCHAR *envW ) DECLSPEC_HIDDEN;
extern
NTSTATUS
exec_wineloader
(
char
**
argv
,
int
socketfd
,
const
pe_image_info_t
*
pe_info
)
DECLSPEC_HIDDEN
;
extern
NTSTATUS
load_builtin
(
const
pe_image_info_t
*
image_info
,
const
WCHAR
*
filename
,
void
**
addr_ptr
,
SIZE_T
*
size_ptr
)
DECLSPEC_HIDDEN
;
extern
BOOL
is_builtin_path
(
const
UNICODE_STRING
*
path
,
WORD
*
machine
)
DECLSPEC_HIDDEN
;
extern
NTSTATUS
load_main_exe
(
const
WCHAR
*
name
,
const
char
*
unix_name
,
const
WCHAR
*
curdir
,
WCHAR
**
image
,
void
**
module
,
SECTION_IMAGE_INFORMATION
*
image_info
)
DECLSPEC_HIDDEN
;
extern
NTSTATUS
load_start_exe
(
WCHAR
**
image
,
void
**
module
,
SECTION_IMAGE_INFORMATION
*
image_info
)
DECLSPEC_HIDDEN
;
...
...
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