Jacek Caban : wineconsole: Use NtCreateFile to create renderer object.
Alexandre Julliard
julliard at winehq.org
Thu Jul 16 19:01:23 CDT 2020
Module: wine
Branch: master
Commit: 919a94aa954f543b49728f1750ea23aab21cc41c
URL: https://source.winehq.org/git/wine.git/?a=commit;h=919a94aa954f543b49728f1750ea23aab21cc41c
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Jul 16 17:50:33 2020 +0200
wineconsole: Use NtCreateFile to create renderer object.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
include/wine/condrv.h | 7 +++++++
programs/wineconsole/wineconsole.c | 20 +++++++++++++++++++-
server/console.c | 12 ++++--------
3 files changed, 30 insertions(+), 9 deletions(-)
diff --git a/include/wine/condrv.h b/include/wine/condrv.h
index 80613d6b7f..bf00262d70 100644
--- a/include/wine/condrv.h
+++ b/include/wine/condrv.h
@@ -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
{
diff --git a/programs/wineconsole/wineconsole.c b/programs/wineconsole/wineconsole.c
index 5040800946..4e0309f18b 100644
--- a/programs/wineconsole/wineconsole.c
+++ b/programs/wineconsole/wineconsole.c
@@ -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 );
diff --git a/server/console.c b/server/console.c
index f56d4ba380..4ff433be4e 100644
--- a/server/console.c
+++ b/server/console.c
@@ -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 )))
{
More information about the wine-cvs
mailing list