wineconsole: Use NtCreateFile to create renderer object.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2020-07-16 17:50:33 +02:00 committed by Alexandre Julliard
parent c4789b08f3
commit 919a94aa95
3 changed files with 30 additions and 9 deletions

View File

@ -46,6 +46,13 @@
/* console handle type */
typedef unsigned int condrv_handle_t;
/* convert an object handle to a server handle */
static inline condrv_handle_t condrv_handle( HANDLE handle )
{
if ((int)(INT_PTR)handle != (INT_PTR)handle) return 0xfffffff0; /* some invalid handle */
return (INT_PTR)handle;
}
/* structure for console char/attribute info */
typedef struct
{

View File

@ -637,10 +637,18 @@ static struct inner_data* WINECON_Init(HINSTANCE hInst, DWORD pid, LPCWSTR appna
enum init_return (*backend)(struct inner_data*),
INT nCmdShow)
{
OBJECT_ATTRIBUTES attr = {sizeof(attr)};
struct inner_data* data = NULL;
DWORD ret;
struct config_data cfg;
STARTUPINFOW si;
UNICODE_STRING string;
IO_STATUS_BLOCK io;
condrv_handle_t h;
NTSTATUS status;
static const WCHAR renderer_pathW[] = {'\\','D','e','v','i','c','e','\\','C','o','n','D','r','v',
'\\','R','e','n','d','e','r','e','r',0};
data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*data));
if (!data) return 0;
@ -682,12 +690,22 @@ static struct inner_data* WINECON_Init(HINSTANCE hInst, DWORD pid, LPCWSTR appna
ret = !wine_server_call_err( req );
data->hConIn = wine_server_ptr_handle( reply->handle_in );
data->hSynchro = wine_server_ptr_handle( reply->event );
}
SERVER_END_REQ;
if (!ret) goto error;
WINE_TRACE("using hConIn %p, hSynchro event %p\n", data->hConIn, data->hSynchro);
RtlInitUnicodeString(&string, renderer_pathW);
attr.ObjectName = &string;
status = NtCreateFile(&data->hSynchro, FILE_READ_DATA | FILE_WRITE_DATA | FILE_WRITE_PROPERTIES
| FILE_READ_PROPERTIES | SYNCHRONIZE, &attr, &io, NULL, FILE_ATTRIBUTE_NORMAL,
0, FILE_OPEN, FILE_NON_DIRECTORY_FILE, NULL, 0);
if (status) goto error;
h = condrv_handle(data->hConIn);
if (!DeviceIoControl(data->hSynchro, IOCTL_CONDRV_ATTACH_RENDERER, &h, sizeof(h), NULL, 0, NULL, NULL))
goto error;
SERVER_START_REQ(create_console_output)
{
req->handle_in = wine_server_obj_handle( data->hConIn );

View File

@ -1847,7 +1847,6 @@ DECL_HANDLER(alloc_console)
obj_handle_t in = 0;
obj_handle_t evt = 0;
struct process *process;
struct thread *renderer;
struct console_input *console;
int fd;
int attach = 0;
@ -1865,8 +1864,7 @@ DECL_HANDLER(alloc_console)
switch (req->pid)
{
case 0:
/* renderer is current, console to be attached to parent process */
renderer = current;
/* console to be attached to parent process */
if (!(process = get_process_from_id( current->process->parent_id )))
{
if (fd != -1) close( fd );
@ -1876,15 +1874,13 @@ DECL_HANDLER(alloc_console)
attach = 1;
break;
case 0xffffffff:
/* no renderer, console to be attached to current process */
renderer = NULL;
/* console to be attached to current process */
process = current->process;
grab_object( process );
attach = 1;
break;
default:
/* renderer is current, console to be attached to req->pid */
renderer = current;
/* console to be attached to req->pid */
if (!(process = get_process_from_id( req->pid )))
{
if (fd != -1) close( fd );
@ -1899,7 +1895,7 @@ DECL_HANDLER(alloc_console)
goto the_end;
}
if ((console = (struct console_input*)create_console_input( renderer, fd )))
if ((console = (struct console_input*)create_console_input( NULL, fd )))
{
if ((in = alloc_handle( current->process, console, req->access, req->attributes )))
{