server: Return the NT name for the ProcessImageFileName query.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
bb00942671
commit
3bb5381587
|
@ -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, ProcessImageFileNameWin32, dynamic_buffer,
|
||||
needed, &needed );
|
||||
result = dynamic_buffer;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 671
|
||||
#define SERVER_PROTOCOL_VERSION 672
|
||||
|
||||
/* ### protocol_version end ### */
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Reference in New Issue