Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
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-winehq
Commits
3bb53815
Commit
3bb53815
authored
Feb 09, 2021
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
server: Return the NT name for the ProcessImageFileName query.
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
bb009426
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
102 additions
and
102 deletions
+102
-102
debug.c
dlls/kernelbase/debug.c
+3
-4
process.c
dlls/ntdll/unix/process.c
+7
-8
server_protocol.h
include/wine/server_protocol.h
+21
-21
file.h
server/file.h
+1
-0
mapping.c
server/mapping.c
+8
-0
process.c
server/process.c
+30
-34
protocol.def
server/protocol.def
+10
-11
request.h
server/request.h
+7
-8
trace.c
server/trace.c
+15
-16
No files found.
dlls/kernelbase/debug.c
View file @
3bb53815
...
...
@@ -1526,14 +1526,13 @@ BOOL WINAPI DECLSPEC_HOTPATCH QueryFullProcessImageNameW( HANDLE process, DWORD
NTSTATUS
status
;
DWORD
needed
;
/* FIXME: On Windows, ProcessImageFileName return an NT path. In Wine it
* is a DOS path and we depend on this. */
status
=
NtQueryInformationProcess
(
process
,
ProcessImageFileName
,
buffer
,
/* FIXME: Use ProcessImageFileName for the PROCESS_NAME_NATIVE case */
status
=
NtQueryInformationProcess
(
process
,
ProcessImageFileNameWin32
,
buffer
,
sizeof
(
buffer
)
-
sizeof
(
WCHAR
),
&
needed
);
if
(
status
==
STATUS_INFO_LENGTH_MISMATCH
)
{
dynamic_buffer
=
HeapAlloc
(
GetProcessHeap
(),
0
,
needed
+
sizeof
(
WCHAR
)
);
status
=
NtQueryInformationProcess
(
process
,
ProcessImageFileName
,
dynamic_buffer
,
status
=
NtQueryInformationProcess
(
process
,
ProcessImageFileName
Win32
,
dynamic_buffer
,
needed
,
&
needed
);
result
=
dynamic_buffer
;
}
...
...
dlls/ntdll/unix/process.c
View file @
3bb53815
...
...
@@ -1502,22 +1502,21 @@ NTSTATUS WINAPI NtQueryInformationProcess( HANDLE handle, PROCESSINFOCLASS class
case
ProcessImageFileName
:
/* FIXME: Should return a device path */
case
ProcessImageFileNameWin32
:
SERVER_START_REQ
(
get_dll_info
)
SERVER_START_REQ
(
get_process_image_name
)
{
UNICODE_STRING
*
image_file_name_
str
=
info
;
UNICODE_STRING
*
str
=
info
;
req
->
handle
=
wine_server_obj_handle
(
handle
);
req
->
base_address
=
0
;
/* main module */
wine_server_set_reply
(
req
,
image_file_name_str
?
image_file_name_
str
+
1
:
NULL
,
req
->
win32
=
(
class
==
ProcessImageFileNameWin32
);
wine_server_set_reply
(
req
,
str
?
str
+
1
:
NULL
,
size
>
sizeof
(
UNICODE_STRING
)
?
size
-
sizeof
(
UNICODE_STRING
)
:
0
);
ret
=
wine_server_call
(
req
);
if
(
ret
==
STATUS_BUFFER_TOO_SMALL
)
ret
=
STATUS_INFO_LENGTH_MISMATCH
;
len
=
sizeof
(
UNICODE_STRING
)
+
reply
->
filename_len
;
len
=
sizeof
(
UNICODE_STRING
)
+
reply
->
len
;
if
(
ret
==
STATUS_SUCCESS
)
{
image_file_name_str
->
MaximumLength
=
image_file_name_str
->
Length
=
reply
->
filename_
len
;
image_file_name_str
->
Buffer
=
(
PWSTR
)(
image_file_name_
str
+
1
);
str
->
MaximumLength
=
str
->
Length
=
reply
->
len
;
str
->
Buffer
=
(
PWSTR
)(
str
+
1
);
}
}
SERVER_END_REQ
;
...
...
include/wine/server_protocol.h
View file @
3bb53815
...
...
@@ -1028,6 +1028,23 @@ struct get_process_debug_info_reply
struct
get_process_image_name_request
{
struct
request_header
__header
;
obj_handle_t
handle
;
int
win32
;
char
__pad_20
[
4
];
};
struct
get_process_image_name_reply
{
struct
reply_header
__header
;
data_size_t
len
;
/* VARARG(name,unicode_str); */
char
__pad_12
[
4
];
};
struct
get_process_vm_counters_request
{
struct
request_header
__header
;
...
...
@@ -1130,23 +1147,6 @@ struct set_thread_info_reply
struct
get_dll_info_request
{
struct
request_header
__header
;
obj_handle_t
handle
;
mod_handle_t
base_address
;
};
struct
get_dll_info_reply
{
struct
reply_header
__header
;
client_ptr_t
entry_point
;
data_size_t
filename_len
;
/* VARARG(filename,unicode_str); */
char
__pad_20
[
4
];
};
struct
suspend_thread_request
{
struct
request_header
__header
;
...
...
@@ -5442,12 +5442,12 @@ enum request
REQ_terminate_thread
,
REQ_get_process_info
,
REQ_get_process_debug_info
,
REQ_get_process_image_name
,
REQ_get_process_vm_counters
,
REQ_set_process_info
,
REQ_get_thread_info
,
REQ_get_thread_times
,
REQ_set_thread_info
,
REQ_get_dll_info
,
REQ_suspend_thread
,
REQ_resume_thread
,
REQ_load_dll
,
...
...
@@ -5727,12 +5727,12 @@ union generic_request
struct
terminate_thread_request
terminate_thread_request
;
struct
get_process_info_request
get_process_info_request
;
struct
get_process_debug_info_request
get_process_debug_info_request
;
struct
get_process_image_name_request
get_process_image_name_request
;
struct
get_process_vm_counters_request
get_process_vm_counters_request
;
struct
set_process_info_request
set_process_info_request
;
struct
get_thread_info_request
get_thread_info_request
;
struct
get_thread_times_request
get_thread_times_request
;
struct
set_thread_info_request
set_thread_info_request
;
struct
get_dll_info_request
get_dll_info_request
;
struct
suspend_thread_request
suspend_thread_request
;
struct
resume_thread_request
resume_thread_request
;
struct
load_dll_request
load_dll_request
;
...
...
@@ -6010,12 +6010,12 @@ union generic_reply
struct
terminate_thread_reply
terminate_thread_reply
;
struct
get_process_info_reply
get_process_info_reply
;
struct
get_process_debug_info_reply
get_process_debug_info_reply
;
struct
get_process_image_name_reply
get_process_image_name_reply
;
struct
get_process_vm_counters_reply
get_process_vm_counters_reply
;
struct
set_process_info_reply
set_process_info_reply
;
struct
get_thread_info_reply
get_thread_info_reply
;
struct
get_thread_times_reply
get_thread_times_reply
;
struct
set_thread_info_reply
set_thread_info_reply
;
struct
get_dll_info_reply
get_dll_info_reply
;
struct
suspend_thread_reply
suspend_thread_reply
;
struct
resume_thread_reply
resume_thread_reply
;
struct
load_dll_reply
load_dll_reply
;
...
...
@@ -6280,7 +6280,7 @@ union generic_reply
/* ### protocol_version begin ### */
#define SERVER_PROTOCOL_VERSION 67
1
#define SERVER_PROTOCOL_VERSION 67
2
/* ### protocol_version end ### */
...
...
server/file.h
View file @
3bb53815
...
...
@@ -172,6 +172,7 @@ extern struct memory_view *find_mapped_view( struct process *process, client_ptr
extern
struct
memory_view
*
get_exe_view
(
struct
process
*
process
);
extern
struct
file
*
get_view_file
(
const
struct
memory_view
*
view
,
unsigned
int
access
,
unsigned
int
sharing
);
extern
const
pe_image_info_t
*
get_view_image_info
(
const
struct
memory_view
*
view
,
client_ptr_t
*
base
);
extern
int
get_view_nt_name
(
const
struct
memory_view
*
view
,
struct
unicode_str
*
name
);
extern
void
free_mapped_views
(
struct
process
*
process
);
extern
int
get_page_size
(
void
);
extern
struct
mapping
*
create_fd_mapping
(
struct
object
*
root
,
const
struct
unicode_str
*
name
,
struct
fd
*
fd
,
...
...
server/mapping.c
View file @
3bb53815
...
...
@@ -981,6 +981,14 @@ const pe_image_info_t *get_view_image_info( const struct memory_view *view, clie
return
&
view
->
image
;
}
/* get the file name for a mapped view */
int
get_view_nt_name
(
const
struct
memory_view
*
view
,
struct
unicode_str
*
name
)
{
if
(
!
view
->
fd
)
return
0
;
get_nt_name
(
view
->
fd
,
name
);
return
1
;
}
static
void
mapping_dump
(
struct
object
*
obj
,
int
verbose
)
{
struct
mapping
*
mapping
=
(
struct
mapping
*
)
obj
;
...
...
server/process.c
View file @
3bb53815
...
...
@@ -1456,6 +1456,36 @@ DECL_HANDLER(get_process_debug_info)
release_object
(
process
);
}
/* fetch the name of the process image */
DECL_HANDLER
(
get_process_image_name
)
{
struct
unicode_str
name
;
struct
memory_view
*
view
;
struct
process
*
process
=
get_process_from_handle
(
req
->
handle
,
PROCESS_QUERY_LIMITED_INFORMATION
);
if
(
!
process
)
return
;
if
((
view
=
get_exe_view
(
process
))
&&
get_view_nt_name
(
view
,
&
name
))
{
/* skip the \??\ prefix */
if
(
req
->
win32
&&
name
.
len
>
6
*
sizeof
(
WCHAR
)
&&
name
.
str
[
5
]
==
':'
)
{
name
.
str
+=
4
;
name
.
len
-=
4
*
sizeof
(
WCHAR
);
}
/* FIXME: else resolve symlinks in NT path */
reply
->
len
=
name
.
len
;
if
(
name
.
len
<=
get_reply_max_size
())
{
WCHAR
*
ptr
=
set_reply_data
(
name
.
str
,
name
.
len
);
/* change \??\ to \\?\ */
if
(
req
->
win32
&&
name
.
len
>
sizeof
(
WCHAR
)
&&
ptr
[
1
]
==
'?'
)
ptr
[
1
]
=
'\\'
;
}
else
set_error
(
STATUS_BUFFER_TOO_SMALL
);
}
release_object
(
process
);
}
/* retrieve information about a process memory usage */
DECL_HANDLER
(
get_process_vm_counters
)
{
...
...
@@ -1584,40 +1614,6 @@ DECL_HANDLER(unload_dll)
process_unload_dll
(
current
->
process
,
req
->
base
);
}
/* retrieve information about a module in a process */
DECL_HANDLER
(
get_dll_info
)
{
struct
process
*
process
;
if
((
process
=
get_process_from_handle
(
req
->
handle
,
PROCESS_QUERY_LIMITED_INFORMATION
)))
{
struct
process_dll
*
dll
;
if
(
req
->
base_address
)
dll
=
find_process_dll
(
process
,
req
->
base_address
);
else
/* NULL means main module */
dll
=
list_head
(
&
process
->
dlls
)
?
LIST_ENTRY
(
list_head
(
&
process
->
dlls
),
struct
process_dll
,
entry
)
:
NULL
;
if
(
dll
)
{
reply
->
entry_point
=
0
;
/* FIXME */
reply
->
filename_len
=
dll
->
namelen
;
if
(
dll
->
filename
)
{
if
(
dll
->
namelen
<=
get_reply_max_size
())
set_reply_data
(
dll
->
filename
,
dll
->
namelen
);
else
set_error
(
STATUS_BUFFER_TOO_SMALL
);
}
}
else
set_error
(
STATUS_DLL_NOT_FOUND
);
release_object
(
process
);
}
}
/* retrieve the process idle event */
DECL_HANDLER
(
get_process_idle_event
)
{
...
...
server/protocol.def
View file @
3bb53815
...
...
@@ -967,6 +967,16 @@ typedef struct
@END
/* Fetch the name of the process image */
@REQ(get_process_image_name)
obj_handle_t handle; /* process handle */
int win32; /* return a win32 filename? */
@REPLY
data_size_t len; /* len in bytes required to store filename */
VARARG(name,unicode_str); /* image name for main exe */
@END
/* Retrieve information about a process memory usage */
@REQ(get_process_vm_counters)
obj_handle_t handle; /* process handle */
...
...
@@ -1040,17 +1050,6 @@ typedef struct
#define SET_THREAD_INFO_DBG_HIDDEN 0x20
/* Retrieve information about a module */
@REQ(get_dll_info)
obj_handle_t handle; /* process handle */
mod_handle_t base_address; /* base address of module */
@REPLY
client_ptr_t entry_point;
data_size_t filename_len; /* buffer len in bytes required to store filename */
VARARG(filename,unicode_str); /* file name of module */
@END
/* Suspend a thread */
@REQ(suspend_thread)
obj_handle_t handle; /* thread handle */
...
...
server/request.h
View file @
3bb53815
...
...
@@ -131,12 +131,12 @@ DECL_HANDLER(terminate_process);
DECL_HANDLER
(
terminate_thread
);
DECL_HANDLER
(
get_process_info
);
DECL_HANDLER
(
get_process_debug_info
);
DECL_HANDLER
(
get_process_image_name
);
DECL_HANDLER
(
get_process_vm_counters
);
DECL_HANDLER
(
set_process_info
);
DECL_HANDLER
(
get_thread_info
);
DECL_HANDLER
(
get_thread_times
);
DECL_HANDLER
(
set_thread_info
);
DECL_HANDLER
(
get_dll_info
);
DECL_HANDLER
(
suspend_thread
);
DECL_HANDLER
(
resume_thread
);
DECL_HANDLER
(
load_dll
);
...
...
@@ -415,12 +415,12 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
(
req_handler
)
req_terminate_thread
,
(
req_handler
)
req_get_process_info
,
(
req_handler
)
req_get_process_debug_info
,
(
req_handler
)
req_get_process_image_name
,
(
req_handler
)
req_get_process_vm_counters
,
(
req_handler
)
req_set_process_info
,
(
req_handler
)
req_get_thread_info
,
(
req_handler
)
req_get_thread_times
,
(
req_handler
)
req_set_thread_info
,
(
req_handler
)
req_get_dll_info
,
(
req_handler
)
req_suspend_thread
,
(
req_handler
)
req_resume_thread
,
(
req_handler
)
req_load_dll
,
...
...
@@ -805,6 +805,11 @@ C_ASSERT( sizeof(struct get_process_debug_info_request) == 16 );
C_ASSERT
(
FIELD_OFFSET
(
struct
get_process_debug_info_reply
,
debug
)
==
8
);
C_ASSERT
(
FIELD_OFFSET
(
struct
get_process_debug_info_reply
,
debug_children
)
==
12
);
C_ASSERT
(
sizeof
(
struct
get_process_debug_info_reply
)
==
16
);
C_ASSERT
(
FIELD_OFFSET
(
struct
get_process_image_name_request
,
handle
)
==
12
);
C_ASSERT
(
FIELD_OFFSET
(
struct
get_process_image_name_request
,
win32
)
==
16
);
C_ASSERT
(
sizeof
(
struct
get_process_image_name_request
)
==
24
);
C_ASSERT
(
FIELD_OFFSET
(
struct
get_process_image_name_reply
,
len
)
==
8
);
C_ASSERT
(
sizeof
(
struct
get_process_image_name_reply
)
==
16
);
C_ASSERT
(
FIELD_OFFSET
(
struct
get_process_vm_counters_request
,
handle
)
==
12
);
C_ASSERT
(
sizeof
(
struct
get_process_vm_counters_request
)
==
16
);
C_ASSERT
(
FIELD_OFFSET
(
struct
get_process_vm_counters_reply
,
peak_virtual_size
)
==
8
);
...
...
@@ -848,12 +853,6 @@ C_ASSERT( FIELD_OFFSET(struct set_thread_info_request, affinity) == 24 );
C_ASSERT
(
FIELD_OFFSET
(
struct
set_thread_info_request
,
entry_point
)
==
32
);
C_ASSERT
(
FIELD_OFFSET
(
struct
set_thread_info_request
,
token
)
==
40
);
C_ASSERT
(
sizeof
(
struct
set_thread_info_request
)
==
48
);
C_ASSERT
(
FIELD_OFFSET
(
struct
get_dll_info_request
,
handle
)
==
12
);
C_ASSERT
(
FIELD_OFFSET
(
struct
get_dll_info_request
,
base_address
)
==
16
);
C_ASSERT
(
sizeof
(
struct
get_dll_info_request
)
==
24
);
C_ASSERT
(
FIELD_OFFSET
(
struct
get_dll_info_reply
,
entry_point
)
==
8
);
C_ASSERT
(
FIELD_OFFSET
(
struct
get_dll_info_reply
,
filename_len
)
==
16
);
C_ASSERT
(
sizeof
(
struct
get_dll_info_reply
)
==
24
);
C_ASSERT
(
FIELD_OFFSET
(
struct
suspend_thread_request
,
handle
)
==
12
);
C_ASSERT
(
sizeof
(
struct
suspend_thread_request
)
==
16
);
C_ASSERT
(
FIELD_OFFSET
(
struct
suspend_thread_reply
,
count
)
==
8
);
...
...
server/trace.c
View file @
3bb53815
...
...
@@ -1519,6 +1519,18 @@ static void dump_get_process_debug_info_reply( const struct get_process_debug_in
dump_varargs_pe_image_info
(
", image="
,
cur_size
);
}
static
void
dump_get_process_image_name_request
(
const
struct
get_process_image_name_request
*
req
)
{
fprintf
(
stderr
,
" handle=%04x"
,
req
->
handle
);
fprintf
(
stderr
,
", win32=%d"
,
req
->
win32
);
}
static
void
dump_get_process_image_name_reply
(
const
struct
get_process_image_name_reply
*
req
)
{
fprintf
(
stderr
,
" len=%u"
,
req
->
len
);
dump_varargs_unicode_str
(
", name="
,
cur_size
);
}
static
void
dump_get_process_vm_counters_request
(
const
struct
get_process_vm_counters_request
*
req
)
{
fprintf
(
stderr
,
" handle=%04x"
,
req
->
handle
);
...
...
@@ -1588,19 +1600,6 @@ static void dump_set_thread_info_request( const struct set_thread_info_request *
dump_varargs_unicode_str
(
", desc="
,
cur_size
);
}
static
void
dump_get_dll_info_request
(
const
struct
get_dll_info_request
*
req
)
{
fprintf
(
stderr
,
" handle=%04x"
,
req
->
handle
);
dump_uint64
(
", base_address="
,
&
req
->
base_address
);
}
static
void
dump_get_dll_info_reply
(
const
struct
get_dll_info_reply
*
req
)
{
dump_uint64
(
" entry_point="
,
&
req
->
entry_point
);
fprintf
(
stderr
,
", filename_len=%u"
,
req
->
filename_len
);
dump_varargs_unicode_str
(
", filename="
,
cur_size
);
}
static
void
dump_suspend_thread_request
(
const
struct
suspend_thread_request
*
req
)
{
fprintf
(
stderr
,
" handle=%04x"
,
req
->
handle
);
...
...
@@ -4482,12 +4481,12 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
(
dump_func
)
dump_terminate_thread_request
,
(
dump_func
)
dump_get_process_info_request
,
(
dump_func
)
dump_get_process_debug_info_request
,
(
dump_func
)
dump_get_process_image_name_request
,
(
dump_func
)
dump_get_process_vm_counters_request
,
(
dump_func
)
dump_set_process_info_request
,
(
dump_func
)
dump_get_thread_info_request
,
(
dump_func
)
dump_get_thread_times_request
,
(
dump_func
)
dump_set_thread_info_request
,
(
dump_func
)
dump_get_dll_info_request
,
(
dump_func
)
dump_suspend_thread_request
,
(
dump_func
)
dump_resume_thread_request
,
(
dump_func
)
dump_load_dll_request
,
...
...
@@ -4763,12 +4762,12 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
(
dump_func
)
dump_terminate_thread_reply
,
(
dump_func
)
dump_get_process_info_reply
,
(
dump_func
)
dump_get_process_debug_info_reply
,
(
dump_func
)
dump_get_process_image_name_reply
,
(
dump_func
)
dump_get_process_vm_counters_reply
,
NULL
,
(
dump_func
)
dump_get_thread_info_reply
,
(
dump_func
)
dump_get_thread_times_reply
,
NULL
,
(
dump_func
)
dump_get_dll_info_reply
,
(
dump_func
)
dump_suspend_thread_reply
,
(
dump_func
)
dump_resume_thread_reply
,
NULL
,
...
...
@@ -5044,12 +5043,12 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
"terminate_thread"
,
"get_process_info"
,
"get_process_debug_info"
,
"get_process_image_name"
,
"get_process_vm_counters"
,
"set_process_info"
,
"get_thread_info"
,
"get_thread_times"
,
"set_thread_info"
,
"get_dll_info"
,
"suspend_thread"
,
"resume_thread"
,
"load_dll"
,
...
...
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